Vulnerability of amphibians to global warming

Patrice Pottier, Michael R. Kearney, Nicholas C. Wu, Julie E. Rej, Alexander R. Gunderson, A. Nayelli Rivera-Villanueva, Pietro Pollo, Samantha Burke, Szymon M. Drobniak, Shinichi Nakagawa

latest update: 16 December 2024

Introduction

This is the master file for the data processing, analysis and visualization for Pottier et al. 2024. Vulnerability of amphibians to global warming

This code goes through every step of the pipeline used to assess the vulnerability of amphibians to global warming. However, it is not entirely reproducible. This code requires extensive computational power and most computations used the computational cluster Katana supported by Research Technology Services at UNSW Sydney (https://research.unsw.edu.au/katana). All code ran on Katana are indicated under each header, along with the location of the specific files one can use to reproduce the results.

Therefore, the present file is mostly here to walk the reader through the analyses. Where one wants to reproduce the analysis, please see the folder /R, where the files used to produce these results in an HPC environment are provided. The /pbs folder also describes the resources requested to run each individual R file, and these can be adapted to different supercomputers.

This file contains nearly 40,000 lines of code, and it is highly recommended to navigate the knitted version of the code (html file; or https://p-pottier.github.io/Vulnerability_amphibians_global_warming/). If opening this code in Rstudio or VScode, please use the headers to navigate this document. At the bottom of the headers on the knitted page, you also have the option to visualize this document using a light or dark theme.

While not all data and RData files are provided in this repository due to memory size limits in Github, all files are available upon request. Outputs from intermediate files are also presented throughout. Please feel free to contact Patrice Pottier () if you have any questions, find mistakes in the code, or if you would like to access specific files. We will also archive all files to a permanent repository upon journal acceptance.

Note that species level occurrences are named “populations” in this code, and assemblages are referred to as “communities”.

Data processing

Load packages and data

Load packages

pacman::p_load(tidyverse,
               kableExtra,
               viridis,
               viridisLite,
               maps,
               ape,
               naniar,
               patchwork,
               R.utils,
               ggtree, # devtools::install_github("YuLab-SMU/ggtree")
               ggtreeExtra, # devtools::install_github("xiangpin/ggtreeExtra")
               phytools,
               tidytree,
               ggnewscale, 
               RColorBrewer,
               ggdist,
               ggstatsplot,
               here,
               ggExtra,
               ggbeeswarm,
               raster,
               sp,
               rasterSp,# remotes::install_github("RS-eco/rasterSp", build_vignettes = T)
               rgeos,
               letsR, 
               rredlist,
               taxize,# remotes::install_github("ropensci/taxize")
               rredlist, #remotes::install_github("ropensci/rredlist")
               rgdal,
               rgeos,
               purrr,
               parallel,
               doParallel,
               abind,
               curl,
               zoo,
               sf,
               data.table,
               purrr,
               RNetCDF, 
               NicheMapR, # devtools::install_github("https://github.com/mrke/NicheMapR")
               microclima,
               letsR,
               MCMCglmm,
               mgcv, 
               gamm4,
               rlang,
               future,
               furrr,
               future.apply, 
               futile.logger,
               rnaturalearth,
               rnaturalearthdata,
               rnaturalearthhires,
               metafor,
               ggspatial,
               lwgeom,
               cowplot,
               lme4,
               ggeffects,
               optimx,
               emmeans)  

'%!in%' <- function(x,y)!('%in%'(x,y)) # Function opposite of %in%

Load data and phylogenetic tree

d <- read_csv("data/data_Pottier_et_al_2022.csv")  # Curated data from Pottier et al. (2022) Scientific Data
tree <- read.tree("data/Jetz_Pyron_2018_consensus.tre")  # Load consensus tree from Jetz and Pyron (2018) Nature Ecology and Evolution
tree_metadata <- read_csv("data/Jetz_Pyron_metadata_tree.csv")  # Metadata for species in the tree
Johnson <- read_csv("data/data_Johnson_et_al_2023.csv")  # Body mass data from Johnson et al. (2023) Global Ecology and Biogeography
ecotype <- read_csv("data/ecotype_data.csv")  # Ecotype data from Wu et al. (2024). in prep; and supplemented by data from Pietro Pollo and A. Nayelli Rivera-Villanueva

Load and process data from the IUCN

IUCN_polygons <- shapefile("data/amphibian_IUCN_maps/AMPHIBIANS.shp")

IUCN_polygons <- IUCN_polygons[IUCN_polygons$presence == 1, ]  # Only keep extant amphibians
IUCN_polygons <- IUCN_polygons[IUCN_polygons$category != "EX", ]  # Remove extinct species 
IUCN_polygons <- IUCN_polygons[IUCN_polygons$category != "EW", ]
IUCN_polygons@data$binomial <- IUCN_polygons@data$sci_name

saveRDS(IUCN_polygons, file = "RData/General_data/raster_IUCN_polygons.rds")

# create a table with IUCN species names, taxonomic information, and threat
# status
IUCN_data <- data.frame(tip.label = IUCN_polygons@data$binomial, order = IUCN_polygons@data$order_,
    family = IUCN_polygons@data$family, IUCN_status = IUCN_polygons@data$category)

Process training data for the imputation

Here, we generate a dataset with 3 acclimation temperatures per species with ~90% missing data (5213 species in total).

Filtering training data

Here, we focus on data for which we possess the acclimation or acclimatisation temperatures

# Process data from Pottier et al. 2022
d.training <- filter(d, 
                      d$acclimation_temp!="NA"|
                        ambient_temp!="NA"|
                        substrate_temp!="NA"|
                        water_temp!="NA"|
                        field_body_temp!="NA", # Remove data without acclimation or acclimatisation temperatures
                     life_stage_tested=="adults"|life_stage_tested=="larvae") # Take data from both adults and larvae

# Take the acclimatisation temperature (preferably the field body temperature or microenvironmental temperature) as the acclimation temperature
d.training <- d.training %>% 
  mutate(acclimation_temp = ifelse(!is.na(acclimation_temp), acclimation_temp, # Take acclimation temperature when available
                                   ifelse(!is.na(field_body_temp), field_body_temp, # Otherwise take the field body temperature
                                          ifelse(!is.na(substrate_temp), substrate_temp, # Otherwise take the substrate temperature
                                                 ifelse(!is.na(water_temp), water_temp, ambient_temp))))) # Otherwise take the water temperature or ambient temperature

Match species names with the IUCN red list

d.training$tip.label <- d.training$species  # Rename species name to tip.label

tree$tip.label <- gsub("_", " ", tree$tip.label)  # Remove underscore between species names in the tree

d.training <- data.frame(d.training[d.training$tip.label %in% tree$tip.label, ])  # Only get species for which we have phylogenetic information

d.not_IUCN <- d.training[d.training$tip.label %!in% IUCN_data$tip.label, ]  # Identify species not listed in the IUCN
d.not_IUCN$tip.label <- as.factor(d.not_IUCN$tip.label)  # 63 species not matching IUCN red list 

# Rename species name in the data and phylogenetic tree to match IUCN data

### Dendropsophus labialis --> Dendropsophus molitor in redlist
d.training$tip.label[d.training$tip.label == "Dendropsophus labialis"] <- "Dendropsophus molitor"
tree$tip.label[tree$tip.label == "Dendropsophus labialis"] <- "Dendropsophus molitor"

### Hyla andersonii --> Dryophytes andersonii in redlist
d.training$tip.label[d.training$tip.label == "Hyla andersonii"] <- "Dryophytes andersonii"
tree$tip.label[tree$tip.label == "Hyla andersonii"] <- "Dryophytes andersonii"

### Hyla chrysoscelis --> Dryophytes chrysoscelis in redlist
d.training$tip.label[d.training$tip.label == "Hyla chrysoscelis"] <- "Dryophytes chrysoscelis"
tree$tip.label[tree$tip.label == "Hyla chrysoscelis"] <- "Dryophytes chrysoscelis"

### Hyla cinerea --> Dryophytes cinereus in redlist
d.training$tip.label[d.training$tip.label == "Hyla cinerea"] <- "Dryophytes cinereus"
tree$tip.label[tree$tip.label == "Hyla cinerea"] <- "Dryophytes cinereus"

### Hyla squirella --> Dryophytes squirellus in redlist
d.training$tip.label[d.training$tip.label == "Hyla squirella"] <- "Dryophytes squirellus"
tree$tip.label[tree$tip.label == "Hyla squirella"] <- "Dryophytes squirellus"

### Hyla versicolor --> Dryophytes versicolor in redlist
d.training$tip.label[d.training$tip.label == "Hyla versicolor"] <- "Dryophytes versicolor"
tree$tip.label[tree$tip.label == "Hyla versicolor"] <- "Dryophytes versicolor"

### Hyla walkeri --> Dryophytes walkeri in redlist
d.training$tip.label[d.training$tip.label == "Hyla walkeri"] <- "Dryophytes walkeri"
tree$tip.label[tree$tip.label == "Hyla walkeri"] <- "Dryophytes walkeri"

### Hynobius fuca --> Hynobius fucus in redlist
d.training$tip.label[d.training$tip.label == "Hynobius fuca"] <- "Hynobius fucus"
tree$tip.label[tree$tip.label == "Hynobius fuca"] <- "Hynobius fucus"

### Hypsiboas cinerascens --> Boana cinerascens in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas cinerascens"] <- "Boana cinerascens"
tree$tip.label[tree$tip.label == "Hypsiboas cinerascens"] <- "Boana cinerascens"

### Hypsiboas faber ---> Boana faber in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas faber"] <- "Boana faber"
tree$tip.label[tree$tip.label == "Hypsiboas faber"] <- "Boana faber"

### Hypsiboas geographicus --> Boana geographica in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas geographicus"] <- "Boana geographica"
tree$tip.label[tree$tip.label == "Hypsiboas geographicus"] <- "Boana geographica"

### Hypsiboas lanciformis --> Boana lanciformis in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas lanciformis"] <- "Boana lanciformis"
tree$tip.label[tree$tip.label == "Hypsiboas lanciformis"] <- "Boana lanciformis"

### Hypsiboas punctatus --> Boana punctata in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas punctatus"] <- "Boana punctata"
tree$tip.label[tree$tip.label == "Hypsiboas punctatus"] <- "Boana punctata"

### Pachymedusa dacnicolor --> Agalychnis dacnicolor in redlist
d.training$tip.label[d.training$tip.label == "Pachymedusa dacnicolor"] <- "Agalychnis dacnicolor"
tree$tip.label[tree$tip.label == "Pachymedusa dacnicolor"] <- "Agalychnis dacnicolor"

### Rana berlandieri --> Lithobates berlandieri in redlist
d.training$tip.label[d.training$tip.label == "Rana berlandieri"] <- "Lithobates berlandieri"
tree$tip.label[tree$tip.label == "Rana berlandieri"] <- "Lithobates berlandieri"

### Rana catesbeiana --> Lithobates catesbeianus in redlist
d.training$tip.label[d.training$tip.label == "Rana catesbeiana"] <- "Lithobates catesbeianus"
tree$tip.label[tree$tip.label == "Rana catesbeiana"] <- "Lithobates catesbeianus"

### Rana clamitans --> Lithobates clamitans in redlist
d.training$tip.label[d.training$tip.label == "Rana clamitans"] <- "Lithobates clamitans"
tree$tip.label[tree$tip.label == "Rana clamitans"] <- "Lithobates clamitans"

### Rana palmipes --> Lithobates palmipes in redlist
d.training$tip.label[d.training$tip.label == "Rana palmipes"] <- "Lithobates palmipes"
tree$tip.label[tree$tip.label == "Rana palmipes"] <- "Lithobates palmipes"

### Rana palustris --> Lithobates palustris in redlist
d.training$tip.label[d.training$tip.label == "Rana palustris"] <- "Lithobates palustris"
tree$tip.label[tree$tip.label == "Rana palustris"] <- "Lithobates palustris"

### Rana pipiens --> Lithobates pipiens in redlist
d.training$tip.label[d.training$tip.label == "Rana pipiens"] <- "Lithobates pipiens"
tree$tip.label[tree$tip.label == "Rana pipiens"] <- "Lithobates pipiens"

### Rana sphenocephala --> Lithobates sphenocephalus in redlist
d.training$tip.label[d.training$tip.label == "Rana sphenocephala"] <- "Lithobates sphenocephalus"
tree$tip.label[tree$tip.label == "Rana sphenocephala"] <- "Lithobates sphenocephalus"

### Rana sylvatica --> Lithobates sylvaticus in redlist
d.training$tip.label[d.training$tip.label == "Rana sylvatica"] <- "Lithobates sylvaticus"
tree$tip.label[tree$tip.label == "Rana sylvatica"] <- "Lithobates sylvaticus"

### Rana virgatipes --> Lithobates virgatipes in redlist
d.training$tip.label[d.training$tip.label == "Rana virgatipes"] <- "Lithobates virgatipes"
tree$tip.label[tree$tip.label == "Rana virgatipes"] <- "Lithobates virgatipes"

### Rana warszewitschii --> Lithobates warszewitschii in redlist
d.training$tip.label[d.training$tip.label == "Rana warszewitschii"] <- "Lithobates warszewitschii"
tree$tip.label[tree$tip.label == "Rana warszewitschii"] <- "Lithobates warszewitschii"

### Rhinella schneideri ---> Rhinella diptycha in redlist
d.training$tip.label[d.training$tip.label == "Rhinella schneideri"] <- "Rhinella diptycha"

### Syncope bassleri --> Chiasmocleis bassleri in redlist
d.training$tip.label[d.training$tip.label == "Syncope bassleri"] <- "Chiasmocleis bassleri"
tree$tip.label[tree$tip.label == "Syncope bassleri"] <- "Chiasmocleis bassleri"

### Ecnomiohyla miotympanum --> Rheohyla miotympanum in redlist
d.training$tip.label[d.training$tip.label == "Ecnomiohyla miotympanum"] <- "Rheohyla miotympanum"
tree$tip.label[tree$tip.label == "Ecnomiohyla miotympanum"] <- "Rheohyla miotympanum"

### Eupemphix nattereri --> Physalaemus nattereri in redlist
d.training$tip.label[d.training$tip.label == "Eupemphix nattereri"] <- "Physalaemus nattereri"
tree$tip.label[tree$tip.label == "Eupemphix nattereri"] <- "Physalaemus nattereri"

### Hylarana labialis --> Chalcorana labialis in redlist
d.training$tip.label[d.training$tip.label == "Hylarana labialis"] <- "Chalcorana labialis"
tree$tip.label[tree$tip.label == "Hylarana labialis"] <- "Chalcorana labialis"

### Hypsiboas albomarginatus --> Boana albomarginata in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas albomarginatus"] <- "Boana albomarginata"
tree$tip.label[tree$tip.label == "Hypsiboas albomarginatus"] <- "Boana albomarginata"

### Hypsiboas albopunctatus --> Boana albopunctata in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas albopunctatus"] <- "Boana albopunctata"
tree$tip.label[tree$tip.label == "Hypsiboas albopunctatus"] <- "Boana albopunctata"

### Hypsiboas boans --> Boana boans in redlist
d.training$tip.label[d.training$tip.label == "Hypsiboas boans"] <- "Boana boans"
tree$tip.label[tree$tip.label == "Hypsiboas boans"] <- "Boana boans"

### Hypsiboas crepitans --> Boana crepitans
d.training$tip.label[d.training$tip.label == "Hypsiboas crepitans"] <- "Boana crepitans"
tree$tip.label[tree$tip.label == "Hypsiboas crepitans"] <- "Boana crepitans"

### Hypsiboas curupi --> Boana curupi
d.training$tip.label[d.training$tip.label == "Hypsiboas curupi"] <- "Boana curupi"
tree$tip.label[tree$tip.label == "Hypsiboas curupi"] <- "Boana curupi"

### Hypsiboas fasciatus --> Boana fasciata
d.training$tip.label[d.training$tip.label == "Hypsiboas fasciatus"] <- "Boana fasciata"
tree$tip.label[tree$tip.label == "Hypsiboas fasciatus"] <- "Boana fasciata"

### Hypsiboas pardalis --> Boana pardalis
d.training$tip.label[d.training$tip.label == "Hypsiboas pardalis"] <- "Boana pardalis"
tree$tip.label[tree$tip.label == "Hypsiboas pardalis"] <- "Boana pardalis"

### Hypsiboas pellucens --> Boana pellucens
d.training$tip.label[d.training$tip.label == "Hypsiboas pellucens"] <- "Boana pellucens"
tree$tip.label[tree$tip.label == "Hypsiboas pellucens"] <- "Boana pellucens"

### Hypsiboas pulchellus --> Boana pulchella
d.training$tip.label[d.training$tip.label == "Hypsiboas pulchellus"] <- "Boana pulchella"
tree$tip.label[tree$tip.label == "Hypsiboas pulchellus"] <- "Boana pulchella"

### Hypsiboas raniceps --> Boana raniceps
d.training$tip.label[d.training$tip.label == "Hypsiboas raniceps"] <- "Boana raniceps"

### Hypsiboas rosenbergi --> Boana raniceps
d.training$tip.label[d.training$tip.label == "Hypsiboas rosenbergi"] <- "Boana raniceps"
tree$tip.label[tree$tip.label == "Hypsiboas rosenbergi"] <- "Boana raniceps"

### Hypsiboas semilineatus --> Boana semilineata
d.training$tip.label[d.training$tip.label == "Hypsiboas semilineatus"] <- "Boana semilineata"
tree$tip.label[tree$tip.label == "Hypsiboas semilineatus"] <- "Boana semilineata"

### Phyllomedusa nordestina --> Pithecopus nordestinus
d.training$tip.label[d.training$tip.label == "Phyllomedusa nordestina"] <- "Pithecopus nordestinus"
tree$tip.label[tree$tip.label == "Phyllomedusa nordestina"] <- "Pithecopus nordestinus"

### Phyllomedusa rohdei --> Pithecopus rohdei
d.training$tip.label[d.training$tip.label == "Phyllomedusa rohdei"] <- "Pithecopus rohdei"
tree$tip.label[tree$tip.label == "Phyllomedusa rohdei"] <- "Pithecopus rohdei"

### Rana bwana--> Lithobates bwana
d.training$tip.label[d.training$tip.label == "Rana bwana"] <- "Lithobates bwana"
tree$tip.label[tree$tip.label == "Rana bwana"] <- "Lithobates bwana"

### Rana vaillanti --> Lithobates vaillanti
d.training$tip.label[d.training$tip.label == "Rana vaillanti"] <- "Lithobates vaillanti"
tree$tip.label[tree$tip.label == "Rana vaillanti"] <- "Lithobates vaillanti"

### Rhinella humboldti --> Rhinella granulosa
d.training$tip.label[d.training$tip.label == "Rhinella humboldti"] <- "Rhinella granulosa"

### Scinax agilis --> Ololygon agilis
d.training$tip.label[d.training$tip.label == "Scinax agilis"] <- "Ololygon agilis"
tree$tip.label[tree$tip.label == "Scinax agilis"] <- "Ololygon agilis"

### Scinax aromothyella --> Ololygon aromothyella
d.training$tip.label[d.training$tip.label == "Scinax aromothyella"] <- "Ololygon aromothyella"
tree$tip.label[tree$tip.label == "Scinax aromothyella"] <- "Ololygon aromothyella"

### Scinax strigilatus --> Ololygon strigilata
d.training$tip.label[d.training$tip.label == "Scinax strigilatus"] <- "Ololygon strigilata"
tree$tip.label[tree$tip.label == "Scinax strigilatus"] <- "Ololygon strigilata"

### Sphaenorhynchus pauloalvini --> Gabohyla pauloalvini
d.training$tip.label[d.training$tip.label == "Sphaenorhynchus pauloalvini"] <- "Gabohyla pauloalvini"
tree$tip.label[tree$tip.label == "Sphaenorhynchus pauloalvini"] <- "Gabohyla pauloalvini"

####### Species not matching IUCN or not having distribution ranges ##########

# Hypsiboas almendarizae --> not in IUCN Elachistocleis muiraquitan --> not in
# IUCN Epipedobates darwinwallacei --> not in IUCN Hyloxalus yasuni --> not in
# IUCN Pristimantis reichlei --> not in IUCN Pristimantis bicantus --> not in
# IUCN Plethodon chlorobryonis --> not in IUCN Plethodon grobmani --> not in
# IUCN Plethodon ocmulgee --> not in IUCN Plethodon variolatus --> not in IUCN
# Rhinella azarai --> not in IUCN Trachycephalus cunauaru --> not in IUCN
# Scinax strigilatus --> in the IUCN, but no geographical distribution
# Uperoleia marmorata --> in the IUCN, but no geographical distribution

saveRDS(tree, "Rdata/General_data/tree_for_imputation.rds")  # Save the modified phylogenetic tree

d.not_IUCN <- d.training[d.training$tip.label %!in% IUCN_data$tip.label, ]  # Check if all replacements were done correctly
unique(d.not_IUCN$species)  # All good, 14 species not captured

d.training <- d.training[d.training$tip.label %in% IUCN_data$tip.label, ]  # Only get species for which we have IUCN ranges
d.training <- unique(d.training)

species <- distinct(data.frame(tip.label = d.training$tip.label))  # List of unique species names (524 species with phylogeny and distribution range)

d.training %>%
    group_by(tip.label) %>%
    summarise(n = n()) %>%
    ungroup() %>%
    summarise(mean = mean(n), min = min(n), max = max(n))  # 5.08 estimates per species on average

d.training %>%
    group_by(tip.label) %>%
    summarise(n = n()) %>%
    filter(n > 1) %>%
    ungroup()  # 287 species with more than one estimate.

Merge ecotype data with the training data and do additional processing

# Select relevant variables
d.training <- dplyr::select(d.training, tip.label, order, family, acclimated, acclimation_temp,
    acclimation_time, life_stage_tested, SVL, body_mass, endpoint, medium_test_temp,
    ramping, mean_UTL, error_UTL, n_UTL, error_type)

d.training <- left_join(d.training, dplyr::select(unique(IUCN_data), tip.label, IUCN_status))  # Update IUCN status

# Process ecotype data
ecotype$tip.label <- ecotype$binomial  # Rename species name
ecotype$order_name <- str_to_title(ecotype$order_name)
ecotype$family_name <- str_to_title(ecotype$family_name)
ecotype$binomial_tree_phylo <- gsub("_", " ", ecotype$binomial_tree_phylo)

ecotype_sp <- ecotype

# Match the different variables in the ecotype data to the training data
ecotype_IUCN_match <- ecotype_sp[ecotype_sp$binomial_IUCN %in% d.training$tip.label,
    ] %>%
    mutate(matched_var = "binomial_IUCN")
ecotype_binomial_match <- ecotype_sp[ecotype_sp$binomial %in% d.training$tip.label,
    ] %>%
    mutate(matched_var = "binomial")
ecotype_phylo_match <- ecotype_sp[ecotype_sp$binomial_tree_phylo %in% d.training$tip.label,
    ] %>%
    mutate(matched_var = "binomial_tree_phylo")


# Combine the datasets and create the 'tip.label' column based on the
# 'matched_var' colum
combined_data <- bind_rows(ecotype_IUCN_match, ecotype_binomial_match, ecotype_phylo_match) %>%
    mutate(tip.label = case_when(matched_var == "binomial_IUCN" ~ binomial_IUCN,
        matched_var == "binomial" ~ binomial, matched_var == "binomial_tree_phylo" ~
            binomial_tree_phylo))

ecotype_sp <- combined_data %>%
    distinct(tip.label, .keep_all = TRUE)

# Merge ecotype information in the training data
d.training <- left_join(d.training, dplyr::select(ecotype_sp, tip.label, ecotype,
    second_ecotype, strategy, Notes))


d.training <- d.training %>%
    mutate(sd_UTL = ifelse(error_type == "se" & is.na(n_UTL) == "TRUE", NA, ifelse(error_type ==
        "sd", error_UTL, error_UTL * sqrt(n_UTL))))  # Convert SE to SD

Process list of species to impute

Select species to be imputed

Here, we focus on species for which we have ecotype data, geographical distribution range, and matching the phylogenetic tree from Jetz and Pyron (2018)

# Filter species for which we have IUCN distribution range and phylogenetic
# position

tree_sp <- data.frame(tip.label = tree$tip.label)  # Data frame with all species in the phylogenetic tree

tree_sp <- data.frame(tip.label = tree_sp[tree_sp$tip.label %in% IUCN_data$tip.label,
    ])  # Only get species for which we have IUCN ranges (5792)

ecotype_sp <- dplyr::select(ecotype, order_name, family_name, ecotype, second_ecotype,
    strategy, Notes, SVL_cm, mass_g, binomial, binomial_IUCN, binomial_tree_phylo)

# Match the different variables in the ecotype data to the phylogenetic tree
ecotype_IUCN_match <- ecotype_sp[ecotype_sp$binomial_IUCN %in% tree_sp$tip.label,
    ] %>%
    mutate(matched_var = "binomial_IUCN")
ecotype_binomial_match <- ecotype_sp[ecotype_sp$binomial %in% tree_sp$tip.label,
    ] %>%
    mutate(matched_var = "binomial")
ecotype_phylo_match <- ecotype_sp[ecotype_sp$binomial_tree_phylo %in% tree_sp$tip.label,
    ] %>%
    mutate(matched_var = "binomial_tree_phylo")

# Combine the datasets and create the 'tip.label' column based on the
# 'matched_var' colum
combined_data <- bind_rows(ecotype_IUCN_match, ecotype_binomial_match, ecotype_phylo_match) %>%
    mutate(tip.label = case_when(matched_var == "binomial_IUCN" ~ binomial_IUCN,
        matched_var == "binomial" ~ binomial, matched_var == "binomial_tree_phylo" ~
            binomial_tree_phylo))

ecotype_sp <- combined_data %>%
    distinct(tip.label, .keep_all = TRUE)


# Remove obligate cave-dwellers
ecotype_sp <- ecotype_sp %>%
    filter(strategy != "Obligate cave-dweller" | is.na(strategy) == TRUE)

# Add a mention for paedomorphic species
ecotype_sp <- ecotype_sp %>%
    mutate(strategy = ifelse(strategy == "Paedomorphic" | Notes == "Paedomorphic",
        "Paedomorphic", NA)) %>%
    dplyr::select(-Notes)

## Now we create a list of data-deficient species that match the phylogeny and
## for which we know the ecotype

data_deficient_sp <- data.frame(tip.label = tree_sp[tree_sp$tip.label %!in% d.training$tip.label,
    ])  # Data frame with all species we do not have data for (5268)

data_deficient_sp <- data.frame(tip.label = data_deficient_sp[data_deficient_sp$tip.label %in%
    ecotype_sp$tip.label, ])  # Focus on species we have ecotype data (4822)


data_deficient_sp <- left_join(data_deficient_sp, ecotype_sp, by = "tip.label")  # Assign ecotype data to each species. 
data_deficient_sp <- left_join(data_deficient_sp, dplyr::select(unique(IUCN_data),
    tip.label, IUCN_status))

data_deficient_sp <- dplyr::select(data_deficient_sp, tip.label, order = order_name,
    family = family_name, IUCN_status, ecotype, second_ecotype, strategy, SVL = SVL_cm,
    mass_g)  # 4822 species

# Add body mass data from Johnson et al. 2023

Johnson$tip.label <- Johnson$Species
Johnson$tip.label <- gsub("_", " ", Johnson$tip.label)
Johnson$mass_Johnson <- Johnson$Body_mass

data_deficient_sp <- left_join(data_deficient_sp, dplyr::select(Johnson, tip.label,
    mass_Johnson), by = "tip.label")

# Choose the body mass from Niky and Wu (2023) when available, otherwise take
# it from Johnson et al. 2023
data_deficient_sp <- data_deficient_sp %>%
    mutate(body_mass = ifelse(is.na(mass_g) == FALSE, mass_g, mass_Johnson))


# Remove Caecilians because we did not have data for this Order.
data_deficient_sp <- filter(data_deficient_sp, order != "Gymnophiona")


# All species that will be imputed (4679 species)
all_species <- dplyr::select(data_deficient_sp, -mass_g, -mass_Johnson)

Process species in the training data that will be imputed

We will also generate 3 new estimates per species, for the species we already have in the training dataset. This will allow us to standardise CTmax estimates using the same parameters.

species_training <- dplyr::select(d.training, tip.label, order, family, IUCN_status)
# Match with the ecotype dataset
species_training <- left_join(species_training, dplyr::select(ecotype_sp, tip.label,
    ecotype, second_ecotype, SVL = SVL_cm, mass_g))
# Match with Johnson et al. body mass data
species_training <- left_join(species_training, dplyr::select(Johnson, tip.label,
    mass_Johnson))
# Take the data from Johnson et al. when available
species_training <- species_training %>%
    mutate(body_mass = ifelse(is.na(mass_g) == FALSE, mass_g, mass_Johnson)) %>%
    dplyr::select(-mass_g, -mass_Johnson)

Merge datasets of species we need to impute and assign predictors

data_to_imp <- full_join(species_training, all_species) 
data_to_imp <- distinct(data_to_imp)

data_to_imp  <- data_to_imp %>% mutate(ramping=1, # most common ramping
                                       acclimated="acclimated", # acclimated animals
                                       acclimation_temp = NA, #  will be determined from biophysical models
                                       acclimation_time=10, # most common acclimation time
                                       endpoint="OS", # Most common endpoint; most precise one too
                                       medium_test_temp="body_water", # Body or water temperature recorded during assay
                                       life_stage_tested="adults",
                                       imputed="yes")  

Combine training data and list of species to impute

d.training <- mutate(d.training, imputed = "no")  # add a column 'imputed'

d.training <- mutate(d.training, medium_test_temp = ifelse(medium_test_temp == "body" |
    medium_test_temp == "water", "body_water", "ambient"))

data_for_imp <- full_join(d.training, data_to_imp)  # Join the train data to the data to impute 

data_for_imp <- mutate(data_for_imp, species = tip.label)  # Add another column for species so we can use this as a random effect as well.

data_for_imp <- mutate(data_for_imp, row_n = as.character(row_number()))


# Manually add missing ecotypes

# Subset the data_for_imp dataframe to remove the rows with missing ecotype
# values
data_with_ecotypes <- data_for_imp[!is.na(data_for_imp$ecotype), ]

# Identify missing species
missing_ecotypes <- data_for_imp[is.na(data_for_imp$ecotype), ]

# Manually add missing ecotypes
missing_ecotypes[missing_ecotypes$tip.label == "Cophixalus australis", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Oreobates gemcare", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Oreobates granulosus", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Dryophytes walkeri", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Hynobius fucus", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Kalophrynus limbooliati", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Pristimantis festae", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Pristimantis matidiktyo", "ecotype"] <- "Ground-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Pristimantis pharangobates", "ecotype"] <- "Ground-dwelling"

missing_ecotypes[missing_ecotypes$tip.label == "Chalcorana labialis", "ecotype"] <- "Stream-dwelling"
missing_ecotypes[missing_ecotypes$tip.label == "Hyloxalus italoi", "ecotype"] <- "Stream-dwelling"

missing_ecotypes[missing_ecotypes$tip.label == "Cynops orientalis", "ecotype"] <- "Aquatic"
missing_ecotypes[missing_ecotypes$tip.label == "Paramesotriton labiatus", "ecotype"] <- "Aquatic"

missing_ecotypes[missing_ecotypes$tip.label == "Dendropsophus molitor", "ecotype"] <- "Arboreal"
missing_ecotypes[missing_ecotypes$tip.label == "Polypedates braueri", "ecotype"] <- "Arboreal"

# Merge the two data frames based on matching tip.label values
data_for_imp <- rbind(data_with_ecotypes, missing_ecotypes)

# Save the preliminary data for the imputation (we still need to add the
# temperature)
saveRDS(data_for_imp, "RData/General_data/pre_data_for_imputation.rds")

Match species to their geographical distribution

IUCN_polygons <- readRDS(file = "RData/General_data/raster_IUCN_polygons.rds")  # Save processed IUCN polygons

polygon <- subset(IUCN_polygons, IUCN_polygons@data$binomial %in% data_for_imp$tip.label)

# Rasterize at a 1-degree resolution
raster_polygon <- lets.presab(polygon, resol = 1)
presence_absence <- data.frame(raster_polygon$Presence_and_Absence_Matrix)

# Pivot longer
presence_absence <- pivot_longer(presence_absence, cols = Acanthixalus.sonjae:Zachaenus.parvulus,
    names_to = "tip.label", values_to = "Presence")
presence <- filter(presence_absence, Presence == "1")  # Only keep rows where species are present

saveRDS(presence, file = "RData/General_data/species_coordinates.rds")

distinct_coord <- distinct(dplyr::select(presence, -Presence, -tip.label))  # Coordinates where species are present (14119 grid cells)
distinct_coord <- distinct_coord %>%
    rename(x = Longitude.x., y = Latitude.y.)

saveRDS(distinct_coord, file = "RData/General_data/distinct_coordinates.rds")

Adjust coordinates to land masses

Rasterizing at a 1-degree resolution produces data points that do not necessarily match land masses. Therefore, these coordinates must be adjusted

Loop over coordinates and find matching land

This code ran on an HPC environment, where the original code can be found in R/Data_wrangling/Adjusting_coordinates.R and the resources used in pbs/Data_wrangling/Adjusting_coordinates.pbs

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)

# Function to check if coordinate is on land
check_if_point_on_land <- function(lon, lat) {
    point <- st_point(c(lon, lat))
    point_sf <- st_sf(geometry = st_sfc(point), crs = 4326)  # specify the CRS when you create the st_point
    st_transform(point_sf, st_crs(land_polygon))  # transform the point to match the CRS of the land_polygon
    st_intersects(land_polygon, point_sf, sparse = FALSE)[1, 1]
}


adjust_coordinates_to_land <- function(lon, lat) {
    if (check_if_point_on_land(lon, lat)) {
        return(c(lon, lat))
    }

    steps <- seq(-0.45, 0.45, by = 0.05)

    # Iterate over both longitude and latitude in the full range of steps
    for (dx in steps) {
        for (dy in steps) {
            if (check_if_point_on_land(lon + dx, lat + dy)) {
                return(c(lon + dx, lat + dy))
            }
        }
    }

    return(NULL)  # return NULL if no land found
}

distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates.rds")

distinct_coord_adj <- as.data.frame(distinct_coord %>%
    rename(lon = x, lat = y))

# Iterate through each row in the dataframe
for (i in 1:nrow(distinct_coord_adj)) {
    print(paste("Processing lon: ", distinct_coord_adj$lon[i], ", lat: ", distinct_coord_adj$lat[i]))
    adjusted_coords <- adjust_coordinates_to_land(distinct_coord_adj$lon[i], distinct_coord_adj$lat[i])
    if (!is.null(adjusted_coords)) {
        print(paste("Adjusted lon: ", adjusted_coords[1], ", lat: ", adjusted_coords[2]))
        distinct_coord_adj$lon[i] <- adjusted_coords[1]
        distinct_coord_adj$lat[i] <- adjusted_coords[2]
    } else {
        print(paste("No suitable land coordinates found for lon: ", distinct_coord_adj$lon[i],
            ", lat: ", distinct_coord_adj$lat[i]))
    }
}

saveRDS(distinct_coord_adj, file = "RData/General_data/distinct_coordinates_adj.rds")

Adjust coordinates not matching land masses

Some coordinates were not adjusted properly, and had to undergo further processing.

species_occurrence <- readRDS("RData/General_data/species_coordinates.rds")
species_occurrence <- rename(species_occurrence, lon = Longitude.x., lat = Latitude.y.)

n_species <- unique(species_occurrence$tip.label)  # 5213 

distinct_coord_adj <- readRDS("RData/General_data/distinct_coordinates_adj.rds")

# Identify coordinates that did not intersect with land masses
failed_coords <- data.frame(lon = c(-124.5, 38.5, -123.5, 129.5, -107.5, -74.5, -68.5,
    -65.5, 122.5, 97.5, 120.5, 126.5, -14.5, -9.5, 107.5, -0.5, 0.5, -0.5, 0.5, 6.5,
    150.5, -5.5, 50.5, 17.5, 25.5, 122.5, -64.5), lat = c(45.5, 41.5, 37.5, 27.5,
    23.5, 19.5, 19.5, 17.5, 15.5, 13.5, 10.5, 10.5, 9.5, 4.5, 3.5, 0.5, 0.5, -0.5,
    -0.5, -0.5, -8.5, -16.5, -16.5, -33.5, -34.5, -34.5, -41.5))


distinct_coord_adj <- distinct_coord_adj %>%
    mutate(id = paste(lon, lat))

failed_coords <- failed_coords %>%
    mutate(id = paste(lon, lat))

# Replace the coordinates
distinct_coord_adj <- distinct_coord_adj %>%
    rowwise() %>%
    mutate(across(c(lon, lat), ~if_else(id %in% failed_coords$id, NA_real_, .))) %>%
    dplyr::select(-id)

# Get original distinct coordinates
distinct_coord <- readRDS("RData/General_data/distinct_coordinates.rds")

distinct_coord_adj <- cbind(distinct_coord, distinct_coord_adj)


distinct_coord_adj <- filter(distinct_coord_adj, is.na(lat) == FALSE)

saveRDS(distinct_coord_adj, file = "RData/General_data/distinct_coordinates_adjusted.rds")

##
species_occurrence <- species_occurrence %>%
    mutate(id = paste(lon, lat))

species_occurrence <- species_occurrence %>%
    rowwise() %>%
    mutate(across(c(lon, lat), ~if_else(id %in% failed_coords$id, NA_real_, .))) %>%
    dplyr::select(-id)

species_occurrence <- filter(species_occurrence, is.na(lat) == FALSE)

n_species <- unique(species_occurrence$tip.label)  # 5203. All good.


### Updating species occurrence dataset

distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

# Match body mass data to coordinates
presence <- readRDS(file = "RData/General_data/species_coordinates.rds")
presence <- dplyr::rename(presence, lon = Longitude.x., lat = Latitude.y.)
presence$tip.label <- gsub("\\.", " ", presence$tip.label)

presence_adjusted <- presence %>%
    dplyr::left_join(distinct_coord, by = c(lon = "x", lat = "y"))

presence <- dplyr::rename(presence_adjusted, original_lon = lon, original_lat = lat,
    lon = lon.y, lat = lat.y)

presence <- dplyr::filter(presence, is.na(lon) == FALSE)


saveRDS(presence, file = "RData/General_data/species_coordinates_adjusted.rds")


##### Adjust coordinates that were not properly adjusted ############

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")

distinct_coord <- distinct_coord %>%
    mutate(lon = case_when(lon == -17.95 & lat == 27.7 ~ -17.95, lon == 54.05 & lat ==
        26.5 ~ 54.05, lon == 107.5 & lat == 10.5 ~ 107.5, lon == "0.05" & lat ==
        5.65 ~ 0.05, lon == 134.05 & lat == -0.95 ~ 134.05, lon == 55.25 & lat ==
        -4.5 ~ 55.23, lon == 133.5 & lat == -11.5 ~ 133.45, lon == -38.95 & lat ==
        -14.1 ~ -38.97, lon == -5.75 & lat == -15.95 ~ -5.7, lon == 49.05 & lat ==
        -19.15 ~ 49.02, lon == 30.05 & lat == -31.25 ~ 30.05, lon == 147.05 & lat ==
        -38.5 ~ 147.05, lon == 174.5 & lat == -35.5 ~ 174.45, TRUE ~ lon), lat = case_when(lon ==
        -17.95 & lat == 27.7 ~ 27.75, lon == 54.05 & lat == 26.5 ~ 26.8, lon == 107.5 &
        lat == 10.5 ~ 10.55, lon == "0.05" & lat == 5.65 ~ 5.7, lon == 134.05 & lat ==
        -0.95 ~ -0.85, lon == 55.25 & lat == -4.5 ~ -4.5, lon == 133.5 & lat == -11.5 ~
        -11.5, lon == -38.95 & lat == -14.1 ~ -14.1, lon == -5.75 & lat == -15.95 ~
        -15.95, lon == 49.05 & lat == -19.15 ~ -19.15, lon == 30.05 & lat == -31.25 ~
        -31.2, lon == 147.05 & lat == -38.5 ~ -38.45, lon == 174.5 & lat == -35.5 ~
        -35.5, TRUE ~ lat))
saveRDS(distinct_coord, file = "RData/General_data/distinct_coordinates_adjusted.rds")

### Same for species coordinates

species_coordinates <- readRDS("RData/General_data/species_coordinates_adjusted.rds")

species_coordinates <- species_coordinates %>%
    mutate(lon = case_when(lon == -17.95 & lat == 27.7 ~ -17.95, lon == 54.05 & lat ==
        26.5 ~ 54.05, lon == 107.5 & lat == 10.5 ~ 107.5, lon == "0.05" & lat ==
        5.65 ~ 0.05, lon == 134.05 & lat == -0.95 ~ 134.05, lon == 55.25 & lat ==
        -4.5 ~ 55.23, lon == 133.5 & lat == -11.5 ~ 133.45, lon == -38.95 & lat ==
        -14.1 ~ -38.97, lon == -5.75 & lat == -15.95 ~ -5.7, lon == 49.05 & lat ==
        -19.15 ~ 49.02, lon == 30.05 & lat == -31.25 ~ 30.05, lon == 147.05 & lat ==
        -38.5 ~ 147.05, lon == 174.5 & lat == -35.5 ~ 174.45, TRUE ~ lon), lat = case_when(lon ==
        -17.95 & lat == 27.7 ~ 27.75, lon == 54.05 & lat == 26.5 ~ 26.8, lon == 107.5 &
        lat == 10.5 ~ 10.55, lon == "0.05" & lat == 5.65 ~ 5.7, lon == 134.05 & lat ==
        -0.95 ~ -0.85, lon == 55.25 & lat == -4.5 ~ -4.5, lon == 133.5 & lat == -11.5 ~
        -11.5, lon == -38.95 & lat == -14.1 ~ -14.1, lon == -5.75 & lat == -15.95 ~
        -15.95, lon == 49.05 & lat == -19.15 ~ -19.15, lon == 30.05 & lat == -31.25 ~
        -31.2, lon == 147.05 & lat == -38.5 ~ -38.45, lon == 174.5 & lat == -35.5 ~
        -35.5, TRUE ~ lat))

saveRDS(species_coordinates, file = "RData/General_data/species_coordinates_adjusted.rds")

Biophysical modelling

This code assumes that you have downloaded NCEP and TerraClimate data locally. NCEP data can be downloaded at https://psl.noaa.gov/thredds/catalog/Datasets/ncep.reanalysis2/gaussian_grid/catalog.html ; and TerraClimate data can be downloaded at https://www.climatologylab.org/terraclimate.html

This code ran on an HPC environment, where the original code can be found in R/Biophysical_modelling/ and the resources used in pbs/Biophysical_modelling/ These folders contain R files for each microhabitat (Substrate/ for terrestrial conditions; Pond/ for aquatic conditions; Arboreal/ for arboreal conditions) and climatic scenario (/current for 2006-2015; 2C/ for +2 degrees of warming above pre-industrial levels; or 4C/ for +4 degrees of warming above pre-industrial levels).

For each conditions, R files are separated in batches to reduce memory and time requirements. There are also files with the suffix “…problematic_locations or”…failed_locations”. The former refer to locations that did not run properly in parallel (e.g. got stuck in endless loops) and had to run in regular for loops; while failed locations are locations that were identified as failing, post-hoc, and that needed small adjustments (i.e., increase in the error tolerance for calculating soil temperatures in NicheMapR). All geographical coordinates eventually ran without error.

Once all R scripts have finished running, you can combine the outputs from all files using the “Combining_outputs…” file for each microhabitat and climatic scenario.

Models for arboreal species also require further adjustments because they ran on a subset of species. You can find the script to subset arboreal species in R/Data_wrangling/Filtering_data_for_arboreal_species.R, as well as some code to match the row numbers known to be “problematic locations” in this subsetted dataset in R/Data_wrangling/Matching_row_numbers_problematic_locations_arboreal.R

Vegetated substrate

Current climate

Function to process coordinates

# Set up parallel processing
plan(multicore(workers = 16))

# Set the global timeout
options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes


# Function to process each location
process_location <- function(loc) {

    print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))

    # Set parameters
    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    coords <- c(loc$lon, loc$lat)

    ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)

    micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish, scenario = 0,
            minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1, ERR = ERR, spatial = "data/NCEP")
    }, timeout = 600, onTimeout = "warning")

    # If the process takes longer than 10 minutes, break.

    if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "micro_ncep exceeded time limit"))
    } else {
        micro <- micro_result
    }

    # When the first micro_ncep fails, try again with different ERR
    if (max(micro$metout[, 1] == 0)) {
        while (max(micro$metout[, 1] == 0)) {
            ERR <- ERR + 0.5

            # Use withTimeout() for the micro_ncep() function inside the while
            # loop as well
            micro_result <- withTimeout({
                NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish,
                  scenario = 0, minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1,
                  ERR = ERR, spatial = "data/NCEP")
            }, timeout = 600, onTimeout = "warning")

            if (inherits(micro_result, "try-error") || is.null(micro_result)) {
                print(paste("micro_ncep inside while loop exceeded time limit for location with lon =",
                  loc$lon, "lat =", loc$lat))
                return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat),
                  error_message = "micro_ncep inside while loop exceeded time limit"))
            } else {
                micro <- micro_result
            }

            # If ERR exceeds 5, break the loop regardless of the value of
            # micro$metout[,1]
            if (ERR >= 5) {
                break
            }
        }
    }

    # If even after adjusting ERR micro_ncep fails, return an error message
    if (max(micro$metout[, 1] == 0)) {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    # Another explicit check
    if (!max(micro$metout[, 1] == 0)) {
        assign("micro", micro, envir = globalenv())
    } else {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    success <- FALSE
    result <- NULL

    # Use withTimeout() for the ectotherm() function as well
    ecto_result <- withTimeout({
        tryCatch({
            ecto <- NicheMapR::ectotherm(live = 0, Ww_g = loc$median_mass, shape = 4,
                pct_wet = 80)
            list(success = TRUE, ecto = ecto)
        }, error = function(e) {
            list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = paste("Failed on ectotherm call:",
                as.character(conditionMessage(e))))
        })
    }, timeout = 200, onTimeout = "warning")

    if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
        print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "ectotherm() exceeded time limit"))
    }

    if (!ecto_result$success) {
        return(ecto_result)
    }

    gc()

    # Assign the successful ecto result to the global environment
    ecto <- ecto_result$ecto
    assign("ecto", ecto, envir = globalenv())
    environ <- as.data.frame(ecto$environ)

    # Max and mean daily temperatures
    daily_temp <- environ %>%
        dplyr::mutate(YEAR = YEAR + 2004, ERR = ERR) %>%
        dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat = paste(loc$lat)) %>%
        dplyr::summarize(max_temp = max(TC), mean_temp = mean(TC), .groups = "drop")

    # Create a function to calculate the rolling weekly temperature
    calc_yearly_rolling_mean <- function(data) {
        data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        return(data)
    }

    # Calculate the rolling mean for each year and location
    daily_temp <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::group_modify(~calc_yearly_rolling_mean(.))

    # Identify the warmest 91 days (3 months) of each year
    daily_temp_warmest_days <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::top_n(91, max_temp)

    # Calculate the mean overall maximum temperature for the warmest days of
    # each year
    overall_temp_warmest_days <- daily_temp_warmest_days %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
            0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
            0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
            max = max(max_temp), .groups = "drop")

    result <- list(daily_temp, daily_temp_warmest_days, overall_temp_warmest_days)

    return(list(success = ecto_result$success, result = result))  # Return a list with a success flag and the result.

}

Function to process coordinates in chunks

Processing the coordinates in chunks is very useful for debugging.

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Substrate/current/results/1st_batch/results_biophysical_modelling_substrate_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Substrate/current/results",
        folder, sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Substrate/current/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Substrate/current/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)



#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Substrate/current/daily_temp_substrate.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Substrate/current/daily_temp_warmest_days_substrate.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Substrate/current/overall_temp_warmest_days_substrate.rds")

####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Substrate/current/missing_coordinates.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Substrate/current/missing_coordinates_row_n.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Substrate/current/row_n_duplicated_coordinates.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Substrate/current/duplicated_coordinates.rds")

Future climate (+2C)

Here, we assume a climate projection assuming 2 degrees of warming.

Function to process coordinates

# Set up parallel processing
plan(multicore(workers = 16))

# Set the global timeout
options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes


# Function to process each location
process_location <- function(loc) {

    print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))

    # Set parameters
    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    coords <- c(loc$lon, loc$lat)

    # Check if current index falls within any of the problematic ranges
    ERR <- 1.5

    micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish, scenario = 2,
            minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1, ERR = ERR, spatial = "data/NCEP",
            terra_source = "data/TerraClimate/data")
    }, timeout = 600, onTimeout = "warning")

    if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "micro_ncep exceeded time limit"))
    } else {
        micro <- micro_result
    }

    # When the first micro_ncep fails, try again with different ERR
    if (max(micro$metout[, 1] == 0)) {
        while (max(micro$metout[, 1] == 0)) {
            ERR <- ERR + 0.5

            # Use withTimeout() for the micro_ncep() function inside the while
            # loop as well
            micro_result <- withTimeout({
                NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish,
                  scenario = 2, minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1,
                  ERR = ERR, spatial = "data/NCEP", terra_source = "data/TerraClimate/data")
            }, timeout = 600, onTimeout = "warning")

            if (inherits(micro_result, "try-error") || is.null(micro_result)) {
                print(paste("micro_ncep inside while loop exceeded time limit for location with lon =",
                  loc$lon, "lat =", loc$lat))
                return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat),
                  error_message = "micro_ncep inside while loop exceeded time limit"))
            } else {
                micro <- micro_result
            }

            # If ERR exceeds 5, break the loop regardless of the value of
            # micro$metout[,1]
            if (ERR >= 5) {
                break
            }
        }
    }

    # If even after adjusting ERR micro_ncep fails, return an error message
    if (max(micro$metout[, 1] == 0)) {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    # Another explicit check
    if (!max(micro$metout[, 1] == 0)) {
        assign("micro", micro, envir = globalenv())
    } else {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    success <- FALSE
    result <- NULL

    # Use withTimeout() for the ectotherm() function as well
    ecto_result <- withTimeout({
        tryCatch({
            ecto <- NicheMapR::ectotherm(live = 0, Ww_g = loc$median_mass, shape = 4,
                pct_wet = 80)
            list(success = TRUE, ecto = ecto)
        }, error = function(e) {
            list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = paste("Failed on ectotherm call:",
                as.character(conditionMessage(e))))
        })
    }, timeout = 300, onTimeout = "warning")

    if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
        print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "ectotherm() exceeded time limit"))
    }

    if (!ecto_result$success) {
        return(ecto_result)
    }

    gc()

    # Assign the successful ecto result to the global environment
    ecto <- ecto_result$ecto
    assign("ecto", ecto, envir = globalenv())
    environ <- as.data.frame(ecto$environ)

    # Max and mean daily temperatures
    daily_temp <- environ %>%
        dplyr::mutate(YEAR = YEAR + 2004, ERR = ERR) %>%
        dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat = paste(loc$lat)) %>%
        dplyr::summarize(max_temp = max(TC), mean_temp = mean(TC), .groups = "drop")

    # Create a function to calculate the rolling weekly temperature
    calc_yearly_rolling_mean <- function(data) {
        data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        return(data)
    }

    # Calculate the rolling mean for each year and location
    daily_temp <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::group_modify(~calc_yearly_rolling_mean(.))

    # Identify the warmest 91 days (3 months) of each year
    daily_temp_warmest_days <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::top_n(91, max_temp)

    # Calculate the mean overall maximum temperature for the warmest days of
    # each year
    overall_temp_warmest_days <- daily_temp_warmest_days %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
            0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
            0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
            max = max(max_temp), .groups = "drop")

    result <- list(daily_temp, daily_temp_warmest_days, overall_temp_warmest_days)

    return(list(success = ecto_result$success, result = result))  # Return a list with a success flag and the result.

}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 1800)  # Set a global timeout for 50 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Substrate/2C/results/1st_batch/results_biophysical_modelling_substrate_future2C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch", "6th_batch",
    "7th_batch", "8th_batch", "9th_batch", "10th_batch", "11th_batch", "12th_batch",
    "13th_batch", "14th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Substrate/2C/results", folder,
        sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Substrate/2C/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Substrate/2C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Substrate/2C/daily_temp_substrate_2C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Substrate/2C/daily_temp_warmest_days_substrate_2C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Substrate/2C/overall_temp_warmest_days_substrate_2C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Substrate/2C/missing_coordinates.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Substrate/2C/missing_coordinates_row_n.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Substrate/2C/row_n_duplicated_coordinates.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Substrate/2C/duplicated_coordinates.rds")

Future climate (+4C)

Function to process coordinates

# # Set up parallel processing
plan(multicore(workers = 16))

# Set the global timeout
options(future.globals.timeout = 2700)  # Set a global timeout for 45 minutes


# Function to process each location
process_location <- function(loc) {

    print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))

    # Set parameters
    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    coords <- c(loc$lon, loc$lat)

    # Check if current index falls within any of the problematic ranges
    ERR <- 1.5

    micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish, scenario = 4,
            minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1, ERR = ERR, spatial = "data/NCEP",
            terra_source = "data/TerraClimate/data")
    }, timeout = 600, onTimeout = "warning")

    if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "micro_ncep exceeded time limit"))
    } else {
        micro <- micro_result
    }

    # When the first micro_ncep fails, try again with different ERR
    if (max(micro$metout[, 1] == 0)) {
        while (max(micro$metout[, 1] == 0)) {
            ERR <- ERR + 0.5

            # Use withTimeout() for the micro_ncep() function inside the while
            # loop as well
            micro_result <- withTimeout({
                NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish,
                  scenario = 4, minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1,
                  ERR = ERR, spatial = "data/NCEP", terra_source = "data/TerraClimate/data")
            }, timeout = 600, onTimeout = "warning")

            if (inherits(micro_result, "try-error") || is.null(micro_result)) {
                print(paste("micro_ncep inside while loop exceeded time limit for location with lon =",
                  loc$lon, "lat =", loc$lat))
                return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat),
                  error_message = "micro_ncep inside while loop exceeded time limit"))
            } else {
                micro <- micro_result
            }

            # If ERR exceeds 5, break the loop regardless of the value of
            # micro$metout[,1]
            if (ERR >= 5) {
                break
            }
        }
    }

    # If even after adjusting ERR micro_ncep fails, return an error message
    if (max(micro$metout[, 1] == 0)) {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    # Another explicit check
    if (!max(micro$metout[, 1] == 0)) {
        assign("micro", micro, envir = globalenv())
    } else {
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "Failed on micro_ncep call"))
    }

    success <- FALSE
    result <- NULL

    # Use withTimeout() for the ectotherm() function as well
    ecto_result <- withTimeout({
        tryCatch({
            ecto <- NicheMapR::ectotherm(live = 0, Ww_g = loc$median_mass, shape = 4,
                pct_wet = 80)
            list(success = TRUE, ecto = ecto)
        }, error = function(e) {
            list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = paste("Failed on ectotherm call:",
                as.character(conditionMessage(e))))
        })
    }, timeout = 300, onTimeout = "warning")

    if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
        print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon,
            "lat =", loc$lat))
        return(list(success = FALSE, loc = c(lon = loc$lon, lat = loc$lat), error_message = "ectotherm() exceeded time limit"))
    }

    if (!ecto_result$success) {
        return(ecto_result)
    }

    gc()

    # Assign the successful ecto result to the global environment
    ecto <- ecto_result$ecto
    assign("ecto", ecto, envir = globalenv())
    environ <- as.data.frame(ecto$environ)

    # Max and mean daily temperatures
    daily_temp <- environ %>%
        dplyr::mutate(YEAR = YEAR + 2004, ERR = ERR) %>%
        dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat = paste(loc$lat)) %>%
        dplyr::summarize(max_temp = max(TC), mean_temp = mean(TC), .groups = "drop")

    # Create a function to calculate the rolling weekly temperature
    calc_yearly_rolling_mean <- function(data) {
        data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean,
            align = "right", partial = TRUE, fill = NA)
        return(data)
    }

    # Calculate the rolling mean for each year and location
    daily_temp <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::group_modify(~calc_yearly_rolling_mean(.))

    # Identify the warmest 91 days (3 months) of each year
    daily_temp_warmest_days <- daily_temp %>%
        dplyr::group_by(YEAR, lon, lat) %>%
        dplyr::top_n(91, max_temp)

    # Calculate the mean overall maximum temperature for the warmest days of
    # each year
    overall_temp_warmest_days <- daily_temp_warmest_days %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
            0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
            0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
            max = max(max_temp), .groups = "drop")

    result <- list(daily_temp, daily_temp_warmest_days, overall_temp_warmest_days)

    return(list(success = ecto_result$success, result = result))  # Return a list with a success flag and the result.

}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 2700)  # Set a global timeout for 45 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Substrate/4C/results/1st_batch/results_biophysical_modelling_substrate_future4C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch", "6th_batch",
    "7th_batch", "8th_batch", "9th_batch", "10th_batch", "11th_batch", "12th_batch",
    "13th_batch", "14th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Substrate/4C/results", folder,
        sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Substrate/4C/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Substrate/4C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)


#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")
# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Substrate/4C/daily_temp_substrate_4C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Substrate/4C/daily_temp_warmest_days_substrate_4C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Substrate/4C/overall_temp_warmest_days_substrate_4C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Substrate/4C/missing_coordinates.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Substrate/4C/missing_coordinates_row_n.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Substrate/4C/row_n_duplicated_coordinates.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Substrate/4C/duplicated_coordinates.rds")

Ponds or wetlands

Current climate

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 3600)  # Set a global timeout for 1 hour


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=0,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 0.01,
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
    micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=0,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 0.01,
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
        micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(
        container=1, # container model
        conth=1500, # shallow pond of 1.5m depth
        contw=12000,# pond of 12m width
        contype=1, # container sunk into the ground like a pond
        rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
        continit = 1500, # Initial container water level (1.5m)
        conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
        contwet=100, # 100% of container surface area acting as free water exchanger
        contonly=1)
      
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 2000, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

Processing the coordinates in chunks is very useful for debugging.

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 3600)  # Set a global timeout for 60 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Pond/current/results/1st_batch/results_biophysical_modelling_pond_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "21st_batch", "22nd_batch", "23rd_batch",
    "31st_batch", "32nd_batch", "33rd_batch")
folders2 <- paste0(4:20, "th_batch")
folders3 <- paste0(24:30, "th_batch")
folders4 <- paste0(34:36, "th_batch")

folders <- c(folders, folders2, folders3, folders4)

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Pond/current/results", folder,
        sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Pond/current/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Pond/current/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")
# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Pond/current/daily_temp_pond.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Pond/current/daily_temp_warmest_days_pond.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Pond/current/overall_temp_warmest_days_pond.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Pond/current/missing_coordinates.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Pond/current/missing_coordinates_row_n.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Pond/current/row_n_duplicated_coordinates.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Pond/current/duplicated_coordinates.rds")

Future climate (+2C)

Here, we assume a climate projection assuming 2 degrees of warming.

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 3600)  # Set a global timeout for 60 minutes


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=2,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 0.01,
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP',
                          terra_source = 'data/TerraClimate/data')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
    micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=2,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 0.01,
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP',
                              terra_source = 'data/TerraClimate/data')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
        micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(
        container=1, # container model
        conth=1500, # shallow pond of 1.5m depth
        contw=12000,# pond of 12m width
        contype=1, # container sunk into the ground like a pond
        rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
        continit = 1500, # Initial container water level (1.5m)
        conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
        contwet=100, # 100% of container surface area acting as free water exchanger
        contonly=1)
      
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 2000, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 3600)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Pond/2C/results/1st_batch/results_biophysical_modelling_pond_future2C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "21st_batch", "22nd_batch", "23rd_batch",
    "31st_batch", "32nd_batch", "33rd_batch")
folders2 <- paste0(4:20, "th_batch")
folders3 <- paste0(24:30, "th_batch")
folders4 <- paste0(34:36, "th_batch")

folders <- c(folders, folders2, folders3, folders4)

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {

    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Pond/2C/results", folder, sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {

    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Pond/2C/results", folder,
        "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Pond/2C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Pond/2C/daily_temp_pond_2C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Pond/2C/daily_temp_warmest_days_pond_2C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Pond/2C/overall_temp_warmest_days_pond_2C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Pond/2C/missing_coordinates_2C.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Pond/2C/missing_coordinates_row_n_2C.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Pond/2C/row_n_duplicated_coordinates_2C.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Pond/2C/duplicated_coordinates_2C.rds")

Future climate (+4C)

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 3600)  # Set a global timeout for 60 minutes


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=4,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 0.01,
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP',
                          terra_source = 'data/TerraClimate/data')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
    micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=4,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 0.01,
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP',
                              terra_source = 'data/TerraClimate/data')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
        micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 13] <- 0 # Make sure the pond stays in the shade
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(
        container=1, # container model
        conth=1500, # shallow pond of 1.5m depth
        contw=12000,# pond of 12m width
        contype=1, # container sunk into the ground like a pond
        rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
        continit = 1500, # Initial container water level (1.5m)
        conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
        contwet=100, # 100% of container surface area acting as free water exchanger
        contonly=1)
      
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 2000, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

    data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

    presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
        body_mass), by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 3600)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Pond/4C/results/1st_batch/results_biophysical_modelling_pond_future4C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 14092

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "21st_batch", "22nd_batch", "23rd_batch",
    "31st_batch", "32nd_batch", "33rd_batch")
folders2 <- paste0(4:20, "th_batch")
folders3 <- paste0(24:30, "th_batch")
folders4 <- paste0(34:36, "th_batch")

folders <- c(folders, folders2, folders3, folders4)

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {

    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Pond/4C/results", folder, sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {

    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Pond/4C/results", folder,
        "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Pond/4C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")
# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Pond/4C/daily_temp_pond_4C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Pond/4C/daily_temp_warmest_days_pond_4C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Pond/4C/overall_temp_warmest_days_pond_4C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Pond/4C/missing_coordinates_4C.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Pond/4C/missing_coordinates_row_n_4C.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Pond/4C/row_n_duplicated_coordinates_4C.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Pond/4C/duplicated_coordinates_4C.rds")

Above-ground vegetation

Filter data to arboreal or semi-arboreal species

"%!in%" <- function(x, y) !(x %in% y)  # Function opposite of %in%

# Generate list of coordinates for arboreal species, specifically
data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

data_for_imp <- data_for_imp %>%
    mutate(arboreal = ifelse(ecotype == "Arboreal" | second_ecotype == "Arboreal" |
        second_ecotype == "Semi-arboreal" | second_ecotype == "Semi-Arboreal", "yes",
        "no")) %>%
    mutate(arboreal = ifelse(is.na(arboreal) == TRUE, "no", arboreal))

data_arboreal <- filter(data_for_imp, arboreal == "yes")

saveRDS(data_arboreal, file = "RData/General_data/data_arboreal_sp.rds")

### Adjust species coordinates
species_coordinates_adj <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")
species_coordinates_adj_arboreal <- species_coordinates_adj[species_coordinates_adj$tip.label %in%
    data_arboreal$tip.label, ]

saveRDS(species_coordinates_adj_arboreal, file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")


# Now get list of unique coordinates
distinct_coord <- distinct(dplyr::select(species_coordinates_adj_arboreal, -Presence,
    -tip.label))
distinct_coord <- distinct_coord %>%
    rename(x = original_lon, y = original_lat)

saveRDS(distinct_coord, file = "RData/General_data/distinct_coordinates_adjusted_arboreal.rds")

Current climate

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=0,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 2, # 2 meters above ground
                          windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                          microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=0,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 2, # 2 meters above ground
                              windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                              microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2m)
  micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2m)
  micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2m)
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(live=0, 
                                   Ww_g = loc$median_mass, 
                                   shape = 4, 
                                   pct_wet = 80)
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 200, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

Processing the coordinates in chunks is very useful for debugging.

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted_arboreal.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

    data <- readRDS(file = "RData/General_data/data_arboreal_sp.rds")

    presence_body_mass <- merge(presence, dplyr::select(data, tip.label, body_mass),
        by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Arboreal/current/results/1st_batch/results_biophysical_modelling_arboreal_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 6614

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch", "6th_batch",
    "7th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Arboreal/current/results",
        folder, sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Arboreal/current/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Arboreal/current/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Arboreal/current/daily_temp_arboreal.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Arboreal/current/daily_temp_warmest_days_arboreal.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Arboreal/current/overall_temp_warmest_days_arboreal.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Arboreal/current/missing_coordinates.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Arboreal/current/missing_coordinates_row_n.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Arboreal/current/row_n_duplicated_coordinates.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Arboreal/current/duplicated_coordinates.rds")

Future climate (+2C)

Here, we assume a climate projection assuming 2 degrees of warming.

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=2,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 2, # 2 meters above ground
                          windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                          microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP',
                          terra_source = 'data/TerraClimate/data')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=2,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 2, # 2 meters above ground
                              windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                              microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP',
                              terra_source = 'data/TerraClimate/data')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2m)
  micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2m)
  micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2m)
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(live=0, 
                                   Ww_g = loc$median_mass, 
                                   shape = 4, 
                                   pct_wet = 80)
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 200, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted_arboreal.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

    data <- readRDS(file = "RData/General_data/data_arboreal_sp.rds")

    presence_body_mass <- merge(presence, dplyr::select(data, tip.label, body_mass),
        by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Arboreal/2C/results/1st_batch/results_biophysical_modelling_arboreal_future2C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 6614

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch", "6th_batch",
    "7th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Arboreal/2C/results", folder,
        sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Arboreal/2C/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Arboreal/2C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Arboreal/2C/daily_temp_arboreal_2C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Arboreal/2C/daily_temp_warmest_days_arboreal_2C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Arboreal/2C/overall_temp_warmest_days_arboreal_2C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Arboreal/2C/missing_coordinates_2C.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Arboreal/2C/missing_coordinates_row_n_2C.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Arboreal/2C/row_n_duplicated_coordinates_2C.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Arboreal/2C/duplicated_coordinates_2C.rds")

Future climate (+4C)

Function to process coordinates

# Set up parallel processing
plan(multicore(workers=16))

# Set the global timeout
options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes


# Function to process each location
process_location <- function(loc) {
  
  print(paste("Processing location with lon =", loc$lon, "lat =", loc$lat))
  
  # Set parameters
  dstart <- "01/01/2005"
  dfinish <- "31/12/2015"
  
  coords<- c(loc$lon, loc$lat)
  
  ERR <- 1.5  # Adjusting ERR based on the locations (locations with snow sometimes need a higher value)
  
  micro_result <- withTimeout({
    NicheMapR::micro_ncep(loc = coords, 
                          dstart = dstart, 
                          dfinish = dfinish, 
                          scenario=4,
                          minshade=85,
                          maxshade=90,
                          Usrhyt = 2, # 2 meters above ground
                          windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                          microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                          cap = 1,
                          ERR = ERR, 
                          spatial = 'data/NCEP',
                          terra_source = 'data/TerraClimate/data')
  }, timeout = 600, onTimeout = "warning")
  
  # If the process takes longer than 10 minutes, break.
  
  if (inherits(micro_result, "try-error") || is.null(micro_result)) {
    print(paste("micro_ncep exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "micro_ncep exceeded time limit"))
  } else {
    micro <- micro_result
  }
  
  
  # When the first micro_ncep fails, try again with different ERR
  if (max(micro$metout[,1] == 0)) {
    while(max(micro$metout[,1] == 0)){
      ERR <- ERR + 0.5
      
      # Use withTimeout() for the micro_ncep() function inside the while loop as well
      micro_result <- withTimeout({
        NicheMapR::micro_ncep(loc = coords, 
                              dstart = dstart, 
                              dfinish = dfinish, 
                              scenario=4,
                              minshade=85,
                              maxshade=90,
                              Usrhyt = 2, # 2 meters above ground
                              windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                              microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                              cap = 1,
                              ERR = ERR, 
                              spatial = 'data/NCEP',
                              terra_source = 'data/TerraClimate/data')
      }, timeout = 600, onTimeout = "warning")
      
      if (inherits(micro_result, "try-error") || is.null(micro_result)) {
        print(paste("micro_ncep inside while loop exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
        return(list(success = FALSE, 
                    loc = c(lon = loc$lon, lat = loc$lat), 
                    error_message = "micro_ncep inside while loop exceeded time limit"))
      } else {
        micro <- micro_result
      }
      
      # If ERR exceeds 5, break the loop regardless of the value of micro$metout[,1]
      if(ERR >= 5){
        break
      }
    }
  }
  
  # If even after adjusting ERR micro_ncep fails, return an error message
  if (max(micro$metout[,1] == 0)) {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  # Another explicit check
  if (!max(micro$metout[,1] == 0)) {
    assign("micro", micro, envir = globalenv())
  } else {
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "Failed on micro_ncep call"))
  }
  
  success <- FALSE
  result <- NULL
  
  micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2m)
  micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2m)
  micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2m)
  
  # Use withTimeout() for the ectotherm() function as well
  ecto_result <- withTimeout({
    tryCatch({
      ecto <- NicheMapR::ectotherm(live=0, 
                                   Ww_g = loc$median_mass, 
                                   shape = 4, 
                                   pct_wet = 80)
      list(success = TRUE, ecto = ecto)
    }, error = function(e) {
      list(success = FALSE,
           loc = c(lon = loc$lon, lat = loc$lat),
           error_message = paste("Failed on ectotherm call:", as.character(conditionMessage(e))))
    })
  }, timeout = 200, onTimeout = "warning")
  
  if (inherits(ecto_result, "try-error") || is.null(ecto_result)) {
    print(paste("ectotherm() exceeded time limit for location with lon =", loc$lon, "lat =", loc$lat))
    return(list(success = FALSE, 
                loc = c(lon = loc$lon, lat = loc$lat), 
                error_message = "ectotherm() exceeded time limit"))
  }
  
  if(!ecto_result$success){
    return(ecto_result)
  }
  
  gc()
  
  # Assign the successful ecto result to the global environment
  ecto <- ecto_result$ecto
  assign("ecto", ecto, envir = globalenv())
  environ <- as.data.frame(ecto$environ)
  
  # Max and mean daily temperatures
  daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004,
                  ERR = ERR) %>%
    dplyr::group_by(ERR, YEAR, DOY, lon = paste(loc$lon), lat=paste(loc$lat)) %>%
    dplyr::summarize(max_temp = max(TC),
                     mean_temp = mean(TC), .groups = 'drop')
  
  # Create a function to calculate the rolling weekly temperature
  calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean, align = "right", partial = TRUE, fill = NA)
    return(data)
  }
  
  # Calculate the rolling mean for each year and location
  daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))
  
  # Identify the warmest 91 days (3 months) of each year
  daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR, lon, lat) %>%
    dplyr::top_n(91, max_temp)
  
  # Calculate the mean overall maximum temperature for the warmest days of each year
  overall_temp_warmest_days <- daily_temp_warmest_days %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp),
                     median = median(max_temp),
                     fifth_percentile = quantile(max_temp, 0.05),
                     first_quartile = quantile(max_temp, 0.25),
                     third_quartile = quantile(max_temp, 0.75),
                     ninetyfifth_percentile = quantile(max_temp, 0.95),
                     min = min(max_temp),
                     max = max(max_temp), .groups = 'drop')
  
  result <- list(daily_temp, 
                 daily_temp_warmest_days, 
                 overall_temp_warmest_days)
  
  return(list(success = ecto_result$success, result = result)) # Return a list with a success flag and the result.
  
}

Function to process coordinates in chunks

# Function to process a chunk of locations
process_chunk <- function(start_index, end_index) {
    # Read in distinct coordinates
    distinct_coord <- readRDS(file = "RData/General_data/distinct_coordinates_adjusted_arboreal.rds")

    distinct_coord <- distinct_coord[, 3:4]
    distinct_coord <- rename(distinct_coord, x = lon, y = lat)

    # Adjust the range of locations
    distinct_coord <- distinct_coord[start_index:end_index, ]
    loc_list <- split(distinct_coord, seq(nrow(distinct_coord)))
    loc_list <- lapply(loc_list, unlist)

    # Match body mass data to coordinates
    presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

    data <- readRDS(file = "RData/General_data/data_arboreal_sp.rds")

    presence_body_mass <- merge(presence, dplyr::select(data, tip.label, body_mass),
        by = "tip.label")
    median_body_mass <- presence_body_mass %>%
        dplyr::group_by(lon, lat) %>%
        dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
        dplyr::ungroup()

    median_body_mass <- mutate(median_body_mass, median_mass = ifelse(is.na(median_mass) ==
        TRUE, 8.4, median_mass))

    # Convert loc_list back into a data frame
    loc_df <- do.call("rbind", loc_list)
    loc_df <- as.data.frame(loc_df)
    names(loc_df) <- c("lon", "lat")

    # Join loc_df and median_body_mass
    loc_df <- dplyr::left_join(loc_df, median_body_mass, by = c("lon", "lat"))

    # Convert loc_df back into a list
    loc_list <- split(loc_df, seq(nrow(loc_df)))

    # # Set up parallel processing
    plan(multicore(workers = 16))

    # Set the global timeout
    options(future.globals.timeout = 1800)  # Set a global timeout for 30 minutes

    dstart <- "01/01/2005"
    dfinish <- "31/12/2015"

    Sys.time()

    results <- future.apply::future_lapply(loc_list, process_location, future.packages = c("NicheMapR",
        "microclima", "dplyr", "zoo", "R.utils"))

    Sys.time()

    saveRDS(results, file = paste0("RData/Biophysical_modelling/Arboreal/4C/results/1st_batch/results_biophysical_modelling_arboreal_future4C_",
        start_index, "-", end_index, ".rds"))

}

Process all locations

dstart <- "01/01/2005"
dfinish <- "31/12/2015"

Sys.time()

chunk_size <- 16

# Define start and end row numbers in distinct_coord
start_row <- 1
end_row <- 6614

# Calculate total chunks for the specified range
total_chunks <- ceiling((end_row - start_row + 1)/chunk_size)

# Loop through each chunk
for (i in seq(total_chunks)) {
    # Calculate start and end indices for the current chunk
    start_index <- ((i - 1) * chunk_size) + start_row
    end_index <- min(i * chunk_size + start_row - 1, end_row)

    # Call the process_chunk function with a timeout of 600 seconds
    result <- process_chunk(start_index, end_index)
}

Sys.time()

Combine outputs

Note that some coordinates failed to run with the code provided above, and hence ran using slightly different parameters (higher error tolerance for calculating soil temperatures; not in parallel session). See details [HERE] Note also that the year 2005 was taken out as a burn in to allow the models to fully converge.

# List of folders for each type of file
folders <- c("1st_batch", "2nd_batch", "3rd_batch", "4th_batch", "5th_batch", "6th_batch",
    "7th_batch")

# Initialize empty lists to store the combined dataframes
combined_daily_temp <- list()
combined_daily_temp_warmest_days <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the folder
    path_to_rds <- paste("RData/Biophysical_modelling/Arboreal/4C/results", folder,
        sep = "/")

    # Get the list of all rds files in the folder
    rds_files <- list.files(path = path_to_rds, pattern = "*.rds", full.names = TRUE)

    # Read all the files into a list
    nested_list_results <- lapply(rds_files, readRDS)

    # Extract 'result' from each sublist in nested_list_results
    nested_list_results <- lapply(nested_list_results, function(x) lapply(x, function(y) y[["result"]]))

    # Flatten the list
    flattened_list <- do.call("c", nested_list_results)

    # Combine all dataframes for each metric and store them in the respective
    # lists
    combined_daily_temp[[folder]] <- do.call("rbind", lapply(flattened_list, function(x) x[[1]]))
    combined_daily_temp_warmest_days[[folder]] <- do.call("rbind", lapply(flattened_list,
        function(x) x[[2]]))
}

# Combine the dataframes from all folders
combined_daily_temp <- do.call("rbind", combined_daily_temp)
combined_daily_temp_warmest_days <- do.call("rbind", combined_daily_temp_warmest_days)

# Convert to numeric values
combined_daily_temp$lon <- as.numeric(combined_daily_temp$lon)
combined_daily_temp$lat <- as.numeric(combined_daily_temp$lat)

combined_daily_temp_warmest_days$lon <- as.numeric(combined_daily_temp_warmest_days$lon)
combined_daily_temp_warmest_days$lat <- as.numeric(combined_daily_temp_warmest_days$lat)

######################################################################################################

# Initialize empty lists to store the combined dataframes
combined_daily_temp_problematic <- list()
combined_daily_temp_warmest_days_problematic <- list()

# Loop over each folder
for (folder in folders) {
    # Get the path to the subfolder 'problematic_locations'
    path_to_subfolder <- paste("RData/Biophysical_modelling/Arboreal/4C/results",
        folder, "problematic_locations", sep = "/")

    # Check if the subfolder exists
    if (dir.exists(path_to_subfolder)) {
        # Get the list of all rds files in the subfolder
        rds_files <- list.files(path = path_to_subfolder, pattern = "*.rds", full.names = TRUE)

        # Read all the files into a list
        nested_list_results <- lapply(rds_files, readRDS)

        # Extract the four dataframes from each list and unlist 'lat' and 'lon'
        # columns
        combined_daily_temp_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[1]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))
        combined_daily_temp_warmest_days_subfolder <- do.call("rbind", lapply(nested_list_results,
            function(x) {
                df <- x[[2]]
                if (is.list(df$lat))
                  df$lat <- unlist(df$lat)
                if (is.list(df$lon))
                  df$lon <- unlist(df$lon)
                df
            }))

        # Store the combined dataframes in the respective lists
        combined_daily_temp_problematic[[folder]] <- combined_daily_temp_subfolder
        combined_daily_temp_warmest_days_problematic[[folder]] <- combined_daily_temp_warmest_days_subfolder
    }
}

# Combine the dataframes from all subfolders
combined_daily_temp_problematic <- do.call("rbind", combined_daily_temp_problematic)
combined_daily_temp_warmest_days_problematic <- do.call("rbind", combined_daily_temp_warmest_days_problematic)

#################################################################################################################

# Get the path to the 'failed_locations' folder
path_to_failed_locations <- "RData/Biophysical_modelling/Arboreal/4C/results/failed_locations"

# Initialize empty lists to store the combined dataframes
combined_daily_temp_failed <- list()
combined_daily_temp_warmest_days_failed <- list()

# Get the list of .rds files in the 'failed_locations' folder
rds_files_failed <- list.files(path = path_to_failed_locations, pattern = "*.rds",
    full.names = TRUE)

# Loop over each .rds file
for (file_failed in rds_files_failed) {
    # Read the .rds file into a list
    nested_list_results_failed <- readRDS(file_failed)

    # Extract the four dataframes from the list
    combined_daily_temp_failed_subfolder <- nested_list_results_failed[["result"]][[1]]
    combined_daily_temp_warmest_days_failed_subfolder <- nested_list_results_failed[["result"]][[2]]

    # Store the combined dataframes in the respective lists
    combined_daily_temp_failed[[file_failed]] <- combined_daily_temp_failed_subfolder
    combined_daily_temp_warmest_days_failed[[file_failed]] <- combined_daily_temp_warmest_days_failed_subfolder
}

# Combine the dataframes from all files in the 'failed_locations' folder
combined_daily_temp_failed <- do.call("rbind", combined_daily_temp_failed)
combined_daily_temp_warmest_days_failed <- do.call("rbind", combined_daily_temp_warmest_days_failed)

#####################################################################################################

# Combine files
combined_daily_temp_all <- rbind(combined_daily_temp, combined_daily_temp_problematic,
    combined_daily_temp_failed)
combined_daily_temp_warmest_days_all <- rbind(combined_daily_temp_warmest_days, combined_daily_temp_warmest_days_problematic,
    combined_daily_temp_warmest_days_failed)

# Remove the first year (burn-in)
combined_daily_temp_all <- filter(combined_daily_temp_all, YEAR != "2005")
combined_daily_temp_warmest_days_all <- filter(combined_daily_temp_warmest_days_all,
    YEAR != "2005")

# Calculate the overall temperature across coordinates
combined_overall_temp_all <- combined_daily_temp_warmest_days_all %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarize(mean = mean(max_temp), median = median(max_temp), fifth_percentile = quantile(max_temp,
        0.05), first_quartile = quantile(max_temp, 0.25), third_quartile = quantile(max_temp,
        0.75), ninetyfifth_percentile = quantile(max_temp, 0.95), min = min(max_temp),
        max = max(max_temp), .groups = "drop")

# Save files
saveRDS(combined_daily_temp_all, file = "RData/Biophysical_modelling/Arboreal/4C/daily_temp_arboreal_4C.rds")
saveRDS(combined_daily_temp_warmest_days_all, file = "RData/Biophysical_modelling/Arboreal/4C/daily_temp_warmest_days_arboreal_4C.rds")
saveRDS(combined_overall_temp_all, file = "RData/Biophysical_modelling/Arboreal/4C/overall_temp_warmest_days_arboreal_4C.rds")


####################################################################################################

## Check for missing coordinates again

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- mutate(distinct_coord, lon_lat = paste(lon, lat))

combined_daily_temp_warmest_days_all <- mutate(combined_daily_temp_warmest_days_all,
    lon_lat = paste(lon, lat))

# Function opposite of %in%
"%!in%" <- function(x, y) !(x %in% y)

missing_coord <- distinct_coord[distinct_coord$lon_lat %!in% combined_daily_temp_warmest_days_all$lon_lat,
    ]
missing_coord
missing_coord_row_numbers <- data.frame(row_n = which(distinct_coord$lon_lat %!in%
    combined_daily_temp_warmest_days_all$lon_lat))
missing_coord_row_numbers

###
check_dup <- group_by(combined_daily_temp_all, lon, lat, YEAR, DOY) %>%
    summarise(n = n())
loc_with_more_than_one <- filter(check_dup, n > 1)
loc_with_more_than_one <- mutate(loc_with_more_than_one, lon_lat = paste(lon, lat))
row_n_dup <- data.frame(row_n = which(distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat))
row_n_dup
dup_coord <- distinct_coord[distinct_coord$lon_lat %in% loc_with_more_than_one$lon_lat,
    ]
dup_coord

# Save the combined data
saveRDS(missing_coord, file = "RData/Biophysical_modelling/Arboreal/4C/missing_coordinates_4C.rds")
saveRDS(missing_coord_row_numbers, file = "RData/Biophysical_modelling/Arboreal/4C/missing_coordinates_row_n_4C.rds")
saveRDS(row_n_dup, file = "RData/Biophysical_modelling/Arboreal/4C/row_n_duplicated_coordinates_4C.rds")
saveRDS(dup_coord, file = "RData/Biophysical_modelling/Arboreal/4C/duplicated_coordinates_4C.rds")

Data imputation

Here, the data was imputed assuming that animals were acclimated to either the median, 5% or 95% percentile mean maximum temperature experienced across their range of distribution in the warmest three-months of each year.

Add ecologicall-relevant temperatures to the training data

This code ran on an HPC environment, where the original code can be found in R/Data_wrangling/Adding_temperatures_to_data_for_imputation.R and the resources used in pbs/Data_wrangling/Adding_temperatures_to_data_for_imputation.pbs

## Load preliminary data for imputation
data_for_imp <- readRDS(file="RData/General_data/pre_data_for_imputation.rds")

## Load occurence data
species_occurrence <- readRDS(file="RData/General_data/species_coordinates_adjusted.rds")
# Combine temperature data 

### Maximum temperature

overall_temp<-readRDS("Rdata/Biophysical_modelling/Substrate/current/overall_temp_warmest_days_substrate.rds")

overall_temp$lon <- as.numeric(overall_temp$lon)
overall_temp$lat <- as.numeric(overall_temp$lat)

# Merge coordinates with the mean maximum temperature of the warmest days across the species distribution
species_occurrence_temp <- merge(species_occurrence, overall_temp, by.x = c("lat", "lon"), by.y = c("lat", "lon"))

# Group by species and calculate mean for each variable
species_temp_values <- species_occurrence_temp %>%
  group_by(tip.label) %>%
  summarize(
    mean_mean = mean(mean),
    mean_median = mean(median),
    mean_fifth_percentile = mean(fifth_percentile),
    mean_first_quartile = mean(first_quartile),
    mean_third_quartile = mean(third_quartile),
    mean_ninetyfifth_percentile = mean(ninetyfifth_percentile),
    mean_min = mean(min),
    mean_max = mean(max),
    .groups = 'drop'
  )


# Filter the relevant columns (here adding data from the 5th and 95th percentiles)
species_temp_values_filtered <- species_temp_values %>% 
  dplyr::select(tip.label, mean_median, mean_fifth_percentile, mean_ninetyfifth_percentile)

# Pivot the data frame into long format
species_temp_values_long <- species_temp_values_filtered %>% 
  pivot_longer(cols = c(mean_median, mean_fifth_percentile, mean_ninetyfifth_percentile),
               names_to = "temp_range",
               values_to = "acclimation_temp") %>% 
  mutate(tip.label = gsub("\\.", "_", tip.label), # replace dots with underscores
         temp_range = gsub("^mean_", "", temp_range)) # remove "mean_" from temp_range

# Reorder the columns
species_temp_values_long <- species_temp_values_long %>% 
  dplyr::select(tip.label, temp_range, acclimation_temp)

# Rename the "mean_median" column to "median", etc.
names(species_temp_values_long)[2:3] <- c("temp_range", "acclimation_temp")
species_temp_values_long$tip.label <-  gsub("_", " ", species_temp_values_long$tip.label)

# Join with data for imputation

species_temp_values_long$tip.label[species_temp_values_long$tip.label=="Scinax x signatus"] <- "Scinax x-signatus" # Rename
species_temp_values_long$tip.label[species_temp_values_long$tip.label=="Pristimantis w nigrum"] <- "Pristimantis w-nigrum" # Rename

# Split data_for_imp into two data frames
data_for_imp_nonNA <- data_for_imp %>% 
  filter(!is.na(acclimation_temp))

data_for_imp_NA <- data_for_imp %>% 
  filter(is.na(acclimation_temp)) %>% 
  dplyr::select(-acclimation_temp)  # Remove the NA acclimation_temp column


# Perform a full join on data_for_imp_NA and species_temp_values_long
data_for_imp_NA <- full_join(data_for_imp_NA, species_temp_values_long, by = "tip.label")

# Combine the two data frames
data_for_imp_with_temp <- bind_rows(data_for_imp_nonNA, data_for_imp_NA)


saveRDS(data_for_imp_with_temp, file="RData/General_data/data_for_imputation_with_temp.rds")

Function to perfom the imputation

The .R file for this code can be found in R/Imputation/Functions_BACE.R

####################### supporting functions

# these functions below are from: https://github.com/matthiasspeidel/hmi

#' Standardizing function
#'
#' Function to standardize variables that are numeric (continuous and count variables) but no rounded continuous, semicontinuous, intercepts or categorical variables.
#' @param X A n times p data.frame with p fixed (or random) effects variables.
#' @return A n times p data.frame with the standardized versions of the numeric variables.
#' @export
stand <- function(X) {
    # if(!is.data.frame(X)) stop('X has to be a data.frame.') if(ncol(X) == 0)
    # return(X) types <- array(NA, dim = ncol(X)) for(i in 1:length(types)){
    # types[i] <- get_type(X[, i]) } need_stand_X <- types %in% c('cont',
    # 'count', 'roundedcont', 'semicont')
    X_stand <- X
    tmp <- scale(X)
    X_stand <- matrix(tmp, ncol = ncol(tmp))  # this avoids having attributes delivered by scale().
    return(X_stand)
}

#' Sample imputation.
#'
#' Function to sample values in a variable from other (observed) values in this variable.
#' So this imputation does not use further covariates.
#' @param variable A vector of size \code{n} with missing values.
#' @return A list with a n times 1 data.frame without missing values and
#'  a list with the chains of the Gibbs-samples for the fixed effects and variance parameters.
#' @examples
#' set.seed(123)
#' sample_imp(c(1, NA, 3, NA, 5))
#' @export
sample_imp <- function(variable) {

    if (is.data.frame(variable)) {
        stop("You passed a data.frame instead of a vector to sample_imp.")
    }
    if (all(is.na(variable)))
        stop("Variable consists only of NAs.")

    ret <- data.frame(target = variable)

    need_replacement <- is.na(variable) | is.infinite(variable)
    ret[need_replacement, 1] <- sample(size = sum(need_replacement), variable[!need_replacement],
        replace = TRUE)
    return(ret)
}





##################### imputation function

# inter = muitplier for iteration
b_mice <- function(cycle = 1, data = dat, Ainv = Ainv, iter1 = 10, iter2 = 20, iter3 = 60) {

    # Standard deviation of thermal tolerance estimates (sd_UTL)

    # formula
    forms_sd_UTL <- as.formula(paste("ln_sd_UTL ~ 
                                    life_stage_tested +",
        "acclimation_temp", "+", "endpoint2", "+", "acclimated", "+", paste0("ln_acclimation_time_stand",
            cycle), "+", paste0("medium_test_temp2_fill", cycle), "+", paste0("ramping_stand",
            cycle), "+", paste0("mean_UTL_stand", cycle)))

    prior_sd_UTL <- list(R = list(V = 1, nu = 0.002), G = list(G1 = list(V = 1, nu = 0.002,
        alpha.mu = 0, alpha.V = 1000)))
    # model
    mod_sd_UTL <- MCMCglmm(forms_sd_UTL, random = ~species, pl = TRUE, pr = TRUE,
        nitt = 13000 * iter1, thin = 10 * iter1, burnin = 3000 * iter1, singular.ok = TRUE,
        verbose = FALSE, prior = prior_sd_UTL, data = data)
    # processing
    pre_sd_UTL <- as.vector(predict(mod_sd_UTL, marginal = NULL))  # prediction
    # creating a new variable
    data[[paste0("ln_sd_UTL_stand", cycle + 1)]] <- data$ln_sd_UTL
    # filling in with predicted values
    data[[paste0("ln_sd_UTL_stand", cycle + 1)]][sd_UTL_mpos] <- pre_sd_UTL[sd_UTL_mpos]
    data[[paste0("ln_sd_UTL_stand", cycle + 1)]] <- stand(data[[paste0("ln_sd_UTL_stand",
        cycle + 1)]])[, 1]

    # Adding variance column
    data[[paste0("var_UTL_stand", cycle + 1)]] <- (data[[paste0("ln_sd_UTL_stand",
        cycle + 1)]])^2

    # data
    print("1 out of 5 models done")

    # Acclimation time

    # formula
    forms_acclimation_time <- as.formula(paste("ln_acclimation_time ~ 
                                              life_stage_tested +",
        paste0("ln_sd_UTL_stand", cycle + 1), "+", paste0("mean_UTL_stand", cycle)))

    prior_acclimation_time <- list(R = list(V = 1, nu = 0.002), G = list(G1 = list(V = 1,
        nu = 0.002, alpha.mu = 0, alpha.V = 1000)))
    # model
    mod_acclimation_time <- MCMCglmm(forms_acclimation_time, random = ~species, pl = TRUE,
        pr = TRUE, nitt = 13000 * iter1, thin = 10 * iter1, burnin = 3000 * iter1,
        singular.ok = TRUE, verbose = FALSE, prior = prior_acclimation_time, data = data)
    # processing
    pre_acclimation_time <- as.vector(predict(mod_acclimation_time, marginal = NULL))  # prediction
    # creating a new variable
    data[[paste0("ln_acclimation_time_stand", cycle + 1)]] <- data$ln_acclimation_time
    # filling in with predicted values
    data[[paste0("ln_acclimation_time_stand", cycle + 1)]][acclimation_time_mpos] <- pre_acclimation_time[acclimation_time_mpos]
    data[[paste0("ln_acclimation_time_stand", cycle + 1)]] <- stand(data[[paste0("ln_acclimation_time_stand",
        cycle + 1)]])[, 1]

    # data
    print("2 out of 5 models done")

    # Ramping rate

    # formula
    forms_ramping <- as.formula(paste("ramping ~ 
                                    life_stage_tested +",
        paste0("ln_sd_UTL_stand", cycle + 1), "+", paste0("mean_UTL_stand", cycle)))

    # prior
    prior_ramping <- list(R = list(V = 1, nu = 0.002), G = list(G1 = list(V = 1,
        nu = 0.002, alpha.mu = 0, alpha.V = 1000)))
    # model
    mod_ramping <- MCMCglmm(forms_ramping, random = ~species, pl = TRUE, pr = TRUE,
        nitt = 13000 * iter1, thin = 10 * iter1, burnin = 3000 * iter1, singular.ok = TRUE,
        prior = prior_ramping, verbose = FALSE, data = data)
    # processing
    pre_ramping <- as.vector(predict(mod_ramping, marginal = NULL))  # prediction
    # creating a new variable
    data[[paste0("ramping_stand", cycle + 1)]] <- data$ramping
    # filling in with predicted values
    data[[paste0("ramping_stand", cycle + 1)]][ramping_mpos] <- pre_ramping[ramping_mpos]
    data[[paste0("ramping_stand", cycle + 1)]] <- stand(data[[paste0("ramping_stand",
        cycle + 1)]])[, 1]

    # data
    print("3 out of 5 models done")

    # Medium for measuring CTmax (ambient, water/body)

    # formula
    forms_medium <- as.formula(paste("medium_test_temp2 ~ 
                                   life_stage_tested +",
        paste0("ln_sd_UTL_stand", cycle + 1), "+", paste0("mean_UTL_stand", cycle)))

    forms_medium_prior <- as.formula(paste(" ~ life_stage_tested +", paste0("ln_sd_UTL_stand",
        cycle + 1), "+", paste0("mean_UTL_stand", cycle)))

    # prior
    prior_medium <- list(B = list(mu = rep(0, 4), V = gelman.prior(forms_medium_prior,
        data = data, scale = sqrt(1 + 1))), R = list(V = 1, fix = 1), G = list(G1 = list(V = 1,
        nu = 0.002, alpha.mu = 0, alpha.V = 1000)))
    # model
    mod_medium <- MCMCglmm(forms_medium, random = ~species, ginverse = list(tip.label = Ainv),
        pl = TRUE, pr = TRUE, family = "threshold", nitt = 13000 * iter3, thin = 10 *
            iter3, burnin = 3000 * iter3, singular.ok = TRUE, prior = prior_medium,
        verbose = FALSE, data = data)
    # processing
    pre_medium <- as.vector(predict(mod_medium, marginal = NULL))  # prediction
    pre_medium_b <- levels(data$medium_test_temp2)[round(pre_medium, 0) + 1]
    # creating a new variable
    data[[paste0("medium_test_temp2_fill", cycle + 1)]] <- data$medium_test_temp2
    # filling in with predicted values
    data[[paste0("medium_test_temp2_fill", cycle + 1)]][medium_test_temp2_mpos] <- pre_medium_b[medium_test_temp2_mpos]

    # data
    print("4 out of 5 models done")

    # Thermal tolerance (mean_UTL)

    # formula
    forms_mean_UTL <- as.formula(paste("mean_UTL ~ 
                                   acclimation_temp_stand +",
        paste0("ln_acclimation_time_stand", cycle + 1), "+", paste0("ramping_stand",
            cycle + 1), "+", paste0("medium_test_temp2_fill", cycle + 1), "+", "endpoint2",
        "+", "acclimated", "+", "life_stage_tested", "+", "ecotype"))

    # prior
    prior_mean_UTL <- list(R = list(V = 1, nu = 0.002), G = list(G1 = list(V = diag(2)/2,
        nu = 2, alpha.mu = rep(0, 2), alpha.V = diag(2) * 1000), G2 = list(V = diag(2)/2,
        nu = 2, alpha.mu = rep(0, 2), alpha.V = diag(2) * 1000)))

    mev <- noquote(paste0("var_UTL_stand", cycle + 1))  # Variance for mev argument

    # model
    mod_mean_UTL <- MCMCglmm(forms_mean_UTL, random = ~us(1 + acclimation_temp_stand):tip.label +
        us(1 + acclimation_temp_stand):species, ginverse = list(tip.label = Ainv),
        pl = TRUE, pr = TRUE, nitt = 13000 * iter3, thin = 10 * iter3, burnin = 3000 *
            iter3, singular.ok = TRUE, prior = prior_mean_UTL, verbose = FALSE, mev = data$mev,
        data = data)

    print("5 out of 5 models done")

    # processing
    predictions <- predict(mod_mean_UTL, marginal = NULL, interval = "confidence")  # prediction
    pre_mean_UTL <- predictions[, 1]
    data[["lower_mean_UTL"]] <- predictions[, 2]
    data[["upper_mean_UTL"]] <- predictions[, 3]
    # creating a new variable
    data[[paste0("mean_UTL_stand", cycle + 1)]] <- data$mean_UTL
    # filling in with predicted values
    data[[paste0("mean_UTL_stand", cycle + 1)]][mean_UTL_mpos] <- pre_mean_UTL[mean_UTL_mpos]
    data[[paste0("mean_UTL_stand", cycle + 1)]] <- data[[paste0("mean_UTL_stand",
        cycle + 1)]]
    data[[paste0("filled_mean_UTL", cycle)]] <- data[[paste0("mean_UTL_stand", cycle +
        1)]]  # row estimation
    data[[paste0("mean_UTL_stand", cycle + 1)]] <- stand(data[[paste0("mean_UTL_stand",
        cycle + 1)]])[, 1]

    data
}

Data processing

This code can be found in R/Imputation/Running_imputation.R

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/General_data/data_for_imputation_with_temp.rds")


# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

Run imputation

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_imputation.R and the resources used in pbs/Imputation/Running_imputation.pbs

# Cycle 1
system.time(dat1 <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1, file = "RData/Imputation/results/imputation_1st_cycle.Rds")

#########

# Cycle 2
system.time(dat2 <- b_mice(cycle = 2, data = dat1, Ainv = Ainv))

saveRDS(dat2, file = "RData/Imputation/results/imputation_2nd_cycle.Rds")

########

# Cycle 3
system.time(dat3 <- b_mice(cycle = 3, data = dat2, Ainv = Ainv))

saveRDS(dat3, file = "RData/Imputation/results/imputation_3rd_cycle.Rds")

#########

# Cycle 4
system.time(dat4 <- b_mice(cycle = 4, data = dat3, Ainv = Ainv))

saveRDS(dat4, file = "RData/Imputation/results/imputation_4th_cycle.Rds")

########

# Cycle 5
system.time(dat5 <- b_mice(cycle = 5, data = dat4, Ainv = Ainv))

saveRDS(dat5, file = "RData/Imputation/results/imputation_5th_cycle.Rds")

Run imputation cross-validation

Prepare datasets for the cross-validation

Here, we created five datasets in which we removed heat tolerance estimates for 5% of the species in the experimental dataset (16 species), and 5% of the data-deficient species (234 species); maintaining the same proportion of missing data.

We specifically removed original data that fit the characteristics of the data to be imputed, i.e., ramping=1, # most common heating rate acclimated=“acclimated”, # acclimated animals endpoint=“OS”, # Most common endpoint; most precise one too life_stage_tested==“adults” # adult animals

This code can be found in R/Data_wrangling/Generating_data_for_imputation.Rmd

data_for_imp <- readRDS("RData/General_data/data_for_imputation_with_temp.rds")

# Only consider observations that are comparable to the data we impute
training_data_for_crossV <- filter(data_for_imp, imputed == "no" & ramping == "1" &
    acclimated == "acclimated" & endpoint == "OS" & life_stage_tested == "adults")

training_species_crossV <- distinct(data.frame(tip.label = training_data_for_crossV$tip.label))  # 77 species 

imp_data_for_crossV <- filter(data_for_imp, imputed == "yes")
imp_data_for_crossV <- imp_data_for_crossV[imp_data_for_crossV$tip.label %!in% training_data_for_crossV$tip.label,
    ]  # Make sure we get species not in the original data
imp_species_crossV <- distinct(data.frame(tip.label = imp_data_for_crossV$tip.label))

First set

### First set
set.seed(123)
first_training_sample_16sp_crossV <- data.frame(tip.label = sample(training_species_crossV$tip.label,
    16))  # Sample of 16 species
first_imp_sample_234sp_crossV <- data.frame(tip.label = sample(imp_species_crossV$tip.label,
    234))  # Sample of 234 species

first_crossV <- mutate(data_for_imp, sp_to_validate = ifelse((data_for_imp$tip.label %in%
    first_training_sample_16sp_crossV$tip.label) == TRUE, "yes", "no"))  # Flag species to validate

first_crossV <- mutate(first_crossV, dat_to_validate = ifelse(sp_to_validate == "yes" &
    ramping == 1 & endpoint == "OS" & life_stage_tested == "adults", "yes", "no"))  # Flag data to validate

first_crossV <- filter(first_crossV, !(dat_to_validate == "yes" & imputed == "yes"))  # Remove the fake data for species we want to cross-validate

first_crossV <- mutate(first_crossV, mean_UTL = ifelse(dat_to_validate == "yes",
    NA, mean_UTL))  # Set values as NA for these 16 species

first_crossV <- first_crossV[first_crossV$tip.label %!in% first_imp_sample_234sp_crossV$tip.label,
    ]  # Remove the data for 234 fully imputed species

saveRDS(first_crossV, "RData/Imputation/data/Data_crossV_1st_set.rds")

Second set

### Second set
remaining_sp <- data.frame(tip.label = training_species_crossV[training_species_crossV$tip.label %!in%
    first_training_sample_16sp_crossV$tip.label, ])

set.seed(385)
second_training_sample_16sp_crossV <- data.frame(tip.label = sample(remaining_sp$tip.label,
    16))  # Sample of 16 species
second_imp_sample_234sp_crossV <- data.frame(tip.label = sample(imp_species_crossV$tip.label,
    234))  # Sample of 234 species

second_crossV <- mutate(data_for_imp, sp_to_validate = ifelse((data_for_imp$tip.label %in%
    second_training_sample_16sp_crossV$tip.label) == TRUE, "yes", "no"))  # flag species to validate

second_crossV <- mutate(second_crossV, dat_to_validate = ifelse(sp_to_validate ==
    "yes" & ramping == 1 & endpoint == "OS" & life_stage_tested == "adults", "yes",
    "no"))  # flag data to validate

second_crossV <- filter(second_crossV, !(dat_to_validate == "yes" & imputed == "yes"))  # Remove the fake data for species we want to cross-validate

second_crossV <- mutate(second_crossV, mean_UTL = ifelse(dat_to_validate == "yes",
    NA, mean_UTL))  # Set values as NA for these 16 species

second_crossV <- second_crossV[second_crossV$tip.label %!in% second_imp_sample_234sp_crossV$tip.label,
    ]  # Remove the data for 234 fully imputed species

saveRDS(second_crossV, "RData/Imputation/data/Data_crossV_2nd_set.rds")

Third set

### Third set
remaining_sp <- data.frame(tip.label = remaining_sp[remaining_sp$tip.label %!in%
    second_training_sample_16sp_crossV$tip.label, ])
set.seed(390)
third_training_sample_16sp_crossV <- data.frame(tip.label = sample(remaining_sp$tip.label,
    16))  # Sample of 16 species
third_imp_sample_234sp_crossV <- data.frame(tip.label = sample(imp_species_crossV$tip.label,
    234))  # Sample of 234 species

third_crossV <- mutate(data_for_imp, sp_to_validate = ifelse((data_for_imp$tip.label %in%
    third_training_sample_16sp_crossV$tip.label) == TRUE, "yes", "no"))  # flag species to validate

third_crossV <- mutate(third_crossV, dat_to_validate = ifelse(sp_to_validate == "yes" &
    ramping == 1 & endpoint == "OS" & life_stage_tested == "adults", "yes", "no"))  # flag data relevant for validation for these species

third_crossV <- filter(third_crossV, !(dat_to_validate == "yes" & imputed == "yes"))  # Remove the fake data for species we want to cross-validate

third_crossV <- mutate(third_crossV, mean_UTL = ifelse(dat_to_validate == "yes",
    NA, mean_UTL))  # Set values as NA for these 15 species 15 species

third_crossV <- third_crossV[third_crossV$tip.label %!in% third_imp_sample_234sp_crossV$tip.label,
    ]  # Remove the data 234 fully-imputed species

saveRDS(third_crossV, "RData/Imputation/data/Data_crossV_3rd_set.rds")

Fourth set

### Fourth set
remaining_sp <- data.frame(tip.label = remaining_sp[remaining_sp$tip.label %!in%
    third_training_sample_16sp_crossV$tip.label, ])
set.seed(369)
fourth_training_sample_16sp_crossV <- data.frame(tip.label = sample(remaining_sp$tip.label,
    16))  # Sample of 16 species
fourth_imp_sample_234sp_crossV <- data.frame(tip.label = sample(imp_species_crossV$tip.label,
    234))  # Sample of 234 species

fourth_crossV <- mutate(data_for_imp, sp_to_validate = ifelse((data_for_imp$tip.label %in%
    fourth_training_sample_16sp_crossV$tip.label) == TRUE, "yes", "no"))  # flag species to validate

fourth_crossV <- mutate(fourth_crossV, dat_to_validate = ifelse(sp_to_validate ==
    "yes" & ramping == 1 & endpoint == "OS" & life_stage_tested == "adults", "yes",
    "no"))  # flag data relevant for validation for these species

fourth_crossV <- filter(fourth_crossV, !(dat_to_validate == "yes" & imputed == "yes"))  # Remove the fake data for species we want to cross-validate

fourth_crossV <- mutate(fourth_crossV, mean_UTL = ifelse(dat_to_validate == "yes",
    NA, mean_UTL))  # Set values as NA for these 15 species 15 species

fourth_crossV <- fourth_crossV[fourth_crossV$tip.label %!in% fourth_imp_sample_234sp_crossV$tip.label,
    ]  # Remove the data 234 fully-imputed species

saveRDS(fourth_crossV, "RData/Imputation/data/Data_crossV_4th_set.rds")

Fifth set

### Fifth set
remaining_sp <- data.frame(tip.label = remaining_sp[remaining_sp$tip.label %!in%
    fourth_training_sample_16sp_crossV$tip.label, ])  # 13
set.seed(536)
fifth_training_sample_16sp_crossV <- rbind(data.frame(tip.label = sample(training_species_crossV$tip.label,
    3)), remaining_sp)  # Sample of 3 extra species species because we have only 13 remaining

fifth_imp_sample_234sp_crossV <- data.frame(tip.label = sample(imp_species_crossV$tip.label,
    234))  # Sample of 234 species

fifth_crossV <- mutate(data_for_imp, sp_to_validate = ifelse((data_for_imp$tip.label %in%
    fifth_training_sample_16sp_crossV$tip.label) == TRUE, "yes", "no"))  # flag species to validate

fifth_crossV <- mutate(fifth_crossV, dat_to_validate = ifelse(sp_to_validate == "yes" &
    ramping == 1 & endpoint == "OS" & life_stage_tested == "adults", "yes", "no"))  # flag data relevant for validation for these species

fifth_crossV <- filter(fifth_crossV, !(dat_to_validate == "yes" & imputed == "yes"))  # Remove the fake data for species we want to cross-validate

fifth_crossV <- mutate(fifth_crossV, mean_UTL = ifelse(dat_to_validate == "yes",
    NA, mean_UTL))  # Set values as NA for these 15 species 15 species

fifth_crossV <- fifth_crossV[fifth_crossV$tip.label %!in% fifth_imp_sample_234sp_crossV$tip.label,
    ]  # Remove the data 234 fully-imputed species

saveRDS(fifth_crossV, "RData/Imputation/data/Data_crossV_5th_set.rds")

Run the cross-validation

First set

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_cross_validation_1st_set.R and the resources used in pbs/Imputation/Running_cross_validation_1st_set.pbs

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Imputation/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/Imputation/data/Data_crossV_1st_set.rds")

# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm

length(unique(data_for_imp$species))

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

## -------------------------------------------------------------------------------------------------------------------------------------------

# cycle 1
system.time(dat1_crossV <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1_crossV, file = "RData/Imputation/results/1st_cross_validation_1st_cycle.Rds")

#########

# cycle 2
system.time(dat2_crossV <- b_mice(cycle = 2, data = dat1_crossV, Ainv = Ainv))

saveRDS(dat2_crossV, file = "RData/Imputation/results/1st_cross_validation_2nd_cycle.Rds")

########

# cycle 3
system.time(dat3_crossV<- b_mice(cycle = 3, data = dat2_crossV, Ainv = Ainv))

saveRDS(dat3_crossV, file = "RData/Imputation/results/1st_cross_validation_3rd_cycle.Rds")

########

# cycle 4
system.time(dat4_crossV<- b_mice(cycle = 4, data = dat3_crossV, Ainv = Ainv))

saveRDS(dat4_crossV, file = "RData/Imputation/results/1st_cross_validation_4th_cycle.Rds")

########

# cycle 5
system.time(dat5_crossV<- b_mice(cycle = 5, data = dat4_crossV, Ainv = Ainv))

saveRDS(dat5_crossV, file = "RData/Imputation/results/1st_cross_validation_5th_cycle.Rds")

Second set

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_cross_validation_2nd_set.R and the resources used in pbs/Imputation/Running_cross_validation_2nd_set.pbs

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Imputation/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/Imputation/data/Data_crossV_2nd_set.rds")



# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm


length(unique(data_for_imp$species))

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

## -------------------------------------------------------------------------------------------------------------------------------------------

# cycle 1
system.time(dat1_crossV <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1_crossV, file = "RData/Imputation/results/2nd_cross_validation_1st_cycle.Rds")

#########

# cycle 2
system.time(dat2_crossV <- b_mice(cycle = 2, data = dat1_crossV, Ainv = Ainv))

saveRDS(dat2_crossV, file = "RData/Imputation/results/2nd_cross_validation_2nd_cycle.Rds")

########

# cycle 3
system.time(dat3_crossV<- b_mice(cycle = 3, data = dat2_crossV, Ainv = Ainv))

saveRDS(dat3_crossV, file = "RData/Imputation/results/2nd_cross_validation_3rd_cycle.Rds")

########

# cycle 4
system.time(dat4_crossV<- b_mice(cycle = 4, data = dat3_crossV, Ainv = Ainv))

saveRDS(dat4_crossV, file = "RData/Imputation/results/2nd_cross_validation_4th_cycle.Rds")

########

# cycle 5
system.time(dat5_crossV<- b_mice(cycle = 5, data = dat4_crossV, Ainv = Ainv))

saveRDS(dat5_crossV, file = "RData/Imputation/results/2nd_cross_validation_5th_cycle.Rds")

Third set

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_cross_validation_3rd_set.R and the resources used in pbs/Imputation/Running_cross_validation_3rd_set.pbs

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Imputation/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/Imputation/data/Data_crossV_3rd_set.rds")



# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm


# Taking out missing species from the tree

length(unique(data_for_imp$species))

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

## -------------------------------------------------------------------------------------------------------------------------------------------

# cycle 1
system.time(dat1_crossV <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1_crossV, file = "RData/Imputation/results/3rd_cross_validation_1st_cycle.Rds")

#########

# cycle 2
system.time(dat2_crossV <- b_mice(cycle = 2, data = dat1_crossV, Ainv = Ainv))

saveRDS(dat2_crossV, file = "RData/Imputation/results/3rd_cross_validation_2nd_cycle.Rds")

########

# cycle 3
system.time(dat3_crossV<- b_mice(cycle = 3, data = dat2_crossV, Ainv = Ainv))

saveRDS(dat3_crossV, file = "RData/Imputation/results/3rd_cross_validation_3rd_cycle.Rds")


########

# cycle 4
system.time(dat4_crossV<- b_mice(cycle = 4, data = dat3_crossV, Ainv = Ainv))

saveRDS(dat4_crossV, file = "RData/Imputation/results/3rd_cross_validation_4th_cycle.Rds")

########

# cycle 5
system.time(dat5_crossV<- b_mice(cycle = 5, data = dat4_crossV, Ainv = Ainv))

saveRDS(dat5_crossV, file = "RData/Imputation/results/3rd_cross_validation_5th_cycle.Rds")

Fourth set

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_cross_validation_4th_set.R and the resources used in pbs/Imputation/Running_cross_validation_4th_set.pbs

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Imputation/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/Imputation/data/Data_crossV_4th_set.rds")



# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm

length(unique(data_for_imp$species))

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

## -------------------------------------------------------------------------------------------------------------------------------------------

# cycle 1
system.time(dat1_crossV <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1_crossV, file = "RData/Imputation/results/4th_cross_validation_1st_cycle.Rds")

#########

# cycle 2
system.time(dat2_crossV <- b_mice(cycle = 2, data = dat1_crossV, Ainv = Ainv))

saveRDS(dat2_crossV, file = "RData/Imputation/results/4th_cross_validation_2nd_cycle.Rds")

########

# cycle 3
system.time(dat3_crossV<- b_mice(cycle = 3, data = dat2_crossV, Ainv = Ainv))

saveRDS(dat3_crossV, file = "RData/Imputation/results/4th_cross_validation_3rd_cycle.Rds")


########

# cycle 4
system.time(dat4_crossV<- b_mice(cycle = 4, data = dat3_crossV, Ainv = Ainv))

saveRDS(dat4_crossV, file = "RData/Imputation/results/4th_cross_validation_4th_cycle.Rds")

########

# cycle 5
system.time(dat5_crossV<- b_mice(cycle = 5, data = dat4_crossV, Ainv = Ainv))

saveRDS(dat5_crossV, file = "RData/Imputation/results/4th_cross_validation_5th_cycle.Rds")

Fifth set

This code ran on an HPC environment, where the original code can be found in R/Imputation/Running_cross_validation_5th_set.R and the resources used in pbs/Imputation/Running_cross_validation_5th_set.pbs

# Load functions for the Bayesian Augmentation with Chain Equations (BACE)
source("R/Imputation/Functions_BACE.R")

# Load data and tree
tree<- readRDS("RData/General_data/tree_for_imputation.rds")

# Load data
data_for_imp<- readRDS("RData/Imputation/data/Data_crossV_5th_set.rds")



# Transform variables

data_for_imp <- data_for_imp %>% 
  mutate(
    acclimated = factor(acclimated),
    life_stage_tested = factor(life_stage_tested),
    ln_acclimation_time = log(acclimation_time),
    ln_sd_UTL = log(sd_UTL),
    ln_body_mass = log(body_mass),
    medium_test_temp2 = factor(medium_test_temp),
    life_stage_tested=factor(life_stage_tested,
                             levels=c("adult", "adults", "larvae"),
                             labels=c("adults", "adults", "larvae")), # Correct typo
    endpoint2 = factor(endpoint, 
                       levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                       labels=c("LRR", "OS", "LRR", "other", "other", "other")) # Take LOE as LRR 
  )

data_for_imp<- dplyr::select(data_for_imp, -family) # Remove family to run MCMCglmm

length(unique(data_for_imp$species))

# Make sure everything matches

matchpos <- match(data_for_imp$tip.label, tree$tip.label)

data_for_imp$matchpos <- matchpos

dat <- data_for_imp %>% filter(is.na(matchpos) == F) 

tree_imputation <- drop.tip(tree, tree$tip.label[-match(dat$tip.label, tree$tip.label)]) # Pruned tree that only contains species in the data 

tree_imputation<-force.ultrametric(tree_imputation, method="extend") # Force the tree to be ultrametric

# Phylogenetic co-variance matrix
Ainv<-inverseA(tree_imputation)$Ainv

# Standardize variables
#######################

# acclimation_temp
dat$acclimation_temp_stand<- stand(dat$acclimation_temp)[,1]

# mean_UTL
mean_UTL_mpos <- is.na(dat$mean_UTL) 
dat$mean_UTL_stand1 <- stand(dat$mean_UTL)[,1]
dat$mean_UTL_stand1[mean_UTL_mpos] <- 0


# acclimation_time
acclimation_time_mpos <- is.na(dat$ln_acclimation_time)
dat$ln_acclimation_time_stand1 <- stand(dat$ln_acclimation_time)[,1]
dat$ln_acclimation_time_stand1[acclimation_time_mpos] <- 0

# ramping
ramping_mpos <- is.na(dat$ramping) 
dat$ramping_stand1 <- stand(dat$ramping)[,1]
dat$ramping_stand1[ramping_mpos] <- 0

# medium_test_temp2 
medium_test_temp2_mpos <- is.na(dat$medium_test_temp2)
dat$medium_test_temp2_fill1 <- sample_imp(dat$medium_test_temp2)[[1]]

# sd_UTL 
sd_UTL_mpos <- is.na(dat$ln_sd_UTL)
dat$ln_sd_UTL_stand1 <- stand(dat$ln_sd_UTL)[,1]
dat$ln_sd_UTL_stand1[sd_UTL_mpos] <- 0

# body_mass
body_mass_mpos <- is.na(dat$ln_body_mass)
dat$ln_body_mass_stand1 <- stand(dat$ln_body_mass)[,1]
dat$ln_body_mass_stand1[body_mass_mpos] <- 0

## -------------------------------------------------------------------------------------------------------------------------------------------

# cycle 1
system.time(dat1_crossV <- b_mice(cycle = 1, data = dat, Ainv = Ainv))

saveRDS(dat1_crossV, file = "RData/Imputation/results/5th_cross_validation_1st_cycle.Rds")

#########

# cycle 2
system.time(dat2_crossV <- b_mice(cycle = 2, data = dat1_crossV, Ainv = Ainv))

saveRDS(dat2_crossV, file = "RData/Imputation/results/5th_cross_validation_2nd_cycle.Rds")

########

# cycle 3
system.time(dat3_crossV<- b_mice(cycle = 3, data = dat2_crossV, Ainv = Ainv))

saveRDS(dat3_crossV, file = "RData/Imputation/results/5th_cross_validation_3rd_cycle.Rds")

########

# cycle 4
system.time(dat4_crossV<- b_mice(cycle = 4, data = dat3_crossV, Ainv = Ainv))

saveRDS(dat4_crossV, file = "RData/Imputation/results/5th_cross_validation_4th_cycle.Rds")

########

# cycle 5
system.time(dat5_crossV<- b_mice(cycle = 5, data = dat4_crossV, Ainv = Ainv))

saveRDS(dat5_crossV, file = "RData/Imputation/results/5th_cross_validation_5th_cycle.Rds")

Predict CTmax across the distribution range of each species

Vegetated substrate

Combine species data with operative body temperatures

Here, we merge the distribution data of each species with the daily temperatures they experience in each coordinate during the warmest 3-month period of each year

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/ and the resources used in pbs/Climate_vulnerability/Substrate/

These files are named as Combining_species_data_with_temp_data_substrate and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Current climate

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Substrate/current/daily_temp_warmest_days_substrate.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

### Remove species that are paedomorphic as they live exclusively in water
pre_data_for_imputation <- readRDS("RData/General_data/pre_data_for_imputation.rds")
pre_data_for_imputation <- dplyr::select(pre_data_for_imputation, tip.label, strategy)
paedomorphic_species <- filter(pre_data_for_imputation, strategy == "Paedomorphic")

species_occurrence <- anti_join(species_occurrence, paedomorphic_species, by = "tip.label")

### Combine datasets
species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Substrate/current/species_daily_temp_warmest_days_substrate_current.rds")

Future climate (+2C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Substrate/2C/daily_temp_warmest_days_substrate_2C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

### Remove species that are paedomorphic as they live exclusively in water
pre_data_for_imputation <- readRDS("RData/General_data/pre_data_for_imputation.rds")
pre_data_for_imputation <- dplyr::select(pre_data_for_imputation, tip.label, strategy)
paedomorphic_species <- filter(pre_data_for_imputation, strategy == "Paedomorphic")

species_occurrence <- anti_join(species_occurrence, paedomorphic_species, by = "tip.label")

### Combine datasets
species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Substrate/2C/species_daily_temp_warmest_days_substrate_future2C.rds")

Future climate (+4C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Substrate/4C/daily_temp_warmest_days_substrate_4C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

### Remove species that are paedomorphic as they live exclusively in water
pre_data_for_imputation <- readRDS("RData/General_data/pre_data_for_imputation.rds")
pre_data_for_imputation <- dplyr::select(pre_data_for_imputation, tip.label, strategy)
paedomorphic_species <- filter(pre_data_for_imputation, strategy == "Paedomorphic")

species_occurrence <- anti_join(species_occurrence, paedomorphic_species, by = "tip.label")

### Combine datasets
species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Substrate/4C/species_daily_temp_warmest_days_substrate_future4C.rds")

Predict CTmax across the distribution range of each species

Here, we run meta-analytic models for each species to estimate the model parameters, and use model predictions to project their CTmax across their range of distribution. These predictions are made assuming that animals are acclimated to the mean or maximum weekly temperature in each day surveyed.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/ and the resources used in pbs/Climate_vulnerability/Substrate/

These files are named as Predicting_CTmax_across_coordinates_substrate and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Function to run meta-analytic models

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean or maximum weekly
# temperature

species_meta <- function(species_name, species_data, temp_species) {

    cat("Processing:", species_name, "\n")

    dat <- dplyr::filter(species_data, tip.label == species_name)
    dat2 <- dplyr::filter(temp_species, tip.label == species_name)

    # Fit a meta-analytic model
    fit <- metafor::rma(yi = CTmax, sei = se, mod = ~acclimation_temp, data = dat)

    int_slope <- coef(fit)
    se <- fit$se

    cat("Get model coefficients:\n")
    coefs <- data.frame(tip.label = dat$tip.label, intercept = coef(fit)[1], intercept_se = fit$se[1],
        slope = coef(fit)[2], slope_se = fit$se[2])
    print(head(coefs))

    prediction_mean <- predict(fit, newmods = dat2$mean_weekly_temp)
    prediction_max <- predict(fit, newmods = dat2$max_weekly_temp)

    cat("Generate predictions, mean temp:\n")
    print(head(prediction_mean))
    cat("Generate predictions, max temp:\n")
    print(head(prediction_max))

    daily_CTmax_substrate_mean_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_mean$pred,
        predicted_CTmax_se = prediction_mean$se))), -max_weekly_temp)
    daily_CTmax_substrate_max_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_max$pred,
        predicted_CTmax_se = prediction_max$se))), -mean_weekly_temp)

    return(list(coefs, daily_CTmax_substrate_mean_acc_current, daily_CTmax_substrate_max_acc_current))

}

Current climate

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Substrate/current/species_daily_temp_warmest_days_substrate_current.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

# Find common species between species_data and temp_species. This is needed
# because paedomorphic species were taken out from substrate temperature data
common_species <- intersect(unique(species_data$tip.label), unique(temp_species$tip.label))

# Filter both datasets to include only the matching species
species_data <- species_data %>%
    filter(tip.label %in% common_species)
temp_species <- temp_species %>%
    filter(tip.label %in% common_species)

saveRDS(temp_species, file = "RData/Biophysical_modelling/Substrate/current/species_daily_temp_warmest_days_substrate_current_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_substrate_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_1, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_1, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_1, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_substrate_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_2, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_2, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_2, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_substrate_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_3, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_3, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_3, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_substrate_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_4, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_4, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_4, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_substrate_current_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_5 <- do.call(rbind, lapply(result_list_5,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_5, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_5, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_5, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_substrate_current_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_6 <- do.call(rbind, lapply(result_list_6,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_6, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_6, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_6, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_substrate_current_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_7 <- do.call(rbind, lapply(result_list_7,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_7, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_7, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_7, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_substrate_current_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_8 <- do.call(rbind, lapply(result_list_8,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_8, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_8, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_8, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_substrate_current_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_9 <- do.call(rbind, lapply(result_list_9,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_9, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_9, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_9, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_substrate_current_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_current_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_current_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_current_10, file = "RData/Climate_vulnerability/Substrate/current/temp_files_ARR/species_ARR_substrate_current_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current_10, file = "RData/Climate_vulnerability/Substrate/current/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_current_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_current_10, file = "RData/Climate_vulnerability/Substrate/current/temp_files_max_acc/daily_CTmax_substrate_max_acc_current_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save

species_ARR_substrate_current <- distinct(rbind(species_ARR_substrate_current_1,
    species_ARR_substrate_current_2, species_ARR_substrate_current_3, species_ARR_substrate_current_4,
    species_ARR_substrate_current_5, species_ARR_substrate_current_6, species_ARR_substrate_current_7,
    species_ARR_substrate_current_8, species_ARR_substrate_current_9, species_ARR_substrate_current_10))

daily_CTmax_substrate_mean_acc_current <- rbind(daily_CTmax_substrate_mean_acc_current_1,
    daily_CTmax_substrate_mean_acc_current_2, daily_CTmax_substrate_mean_acc_current_3,
    daily_CTmax_substrate_mean_acc_current_4, daily_CTmax_substrate_mean_acc_current_5,
    daily_CTmax_substrate_mean_acc_current_6, daily_CTmax_substrate_mean_acc_current_7,
    daily_CTmax_substrate_mean_acc_current_8, daily_CTmax_substrate_mean_acc_current_9,
    daily_CTmax_substrate_mean_acc_current_10)

daily_CTmax_substrate_max_acc_current <- rbind(daily_CTmax_substrate_max_acc_current_1,
    daily_CTmax_substrate_max_acc_current_2, daily_CTmax_substrate_max_acc_current_3,
    daily_CTmax_substrate_max_acc_current_4, daily_CTmax_substrate_max_acc_current_5,
    daily_CTmax_substrate_max_acc_current_6, daily_CTmax_substrate_max_acc_current_7,
    daily_CTmax_substrate_max_acc_current_8, daily_CTmax_substrate_max_acc_current_9,
    daily_CTmax_substrate_max_acc_current_10)


saveRDS(species_ARR_substrate_current, file = "RData/Climate_vulnerability/Substrate/current/species_ARR_substrate_current.rds")
saveRDS(daily_CTmax_substrate_mean_acc_current, file = "RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_mean_acc_current.rds")
saveRDS(daily_CTmax_substrate_max_acc_current, file = "RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_max_acc_current.rds")

Future climate (+2C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Substrate/2C/species_daily_temp_warmest_days_substrate_future2C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

# Find common species between species_data and temp_species. This is needed
# because paedomorphic species were taken out from substrate temperature data
common_species <- intersect(unique(species_data$tip.label), unique(temp_species$tip.label))

# Filter both datasets to include only the matching species
species_data <- species_data %>%
    filter(tip.label %in% common_species)
temp_species <- temp_species %>%
    filter(tip.label %in% common_species)

saveRDS(temp_species, file = "RData/Biophysical_modelling/Substrate/2C/species_daily_temp_warmest_days_substrate_future2C_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_substrate_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_1, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_1, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_1, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_substrate_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_2, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_2, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_2, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_substrate_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_3, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_3, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_3, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_substrate_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_4, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_4, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_4, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_substrate_future2C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_5 <- do.call(rbind, lapply(result_list_5,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_5 <- do.call(rbind, lapply(result_list_5,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_5, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_5, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_5, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_substrate_future2C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_6 <- do.call(rbind, lapply(result_list_6,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_6 <- do.call(rbind, lapply(result_list_6,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_6, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_6, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_6, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_substrate_future2C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_7 <- do.call(rbind, lapply(result_list_7,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_7 <- do.call(rbind, lapply(result_list_7,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_7, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_7, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_7, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_substrate_future2C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_8 <- do.call(rbind, lapply(result_list_8,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_8 <- do.call(rbind, lapply(result_list_8,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_8, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_8, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_8, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_substrate_future2C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_9 <- do.call(rbind, lapply(result_list_9,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_9 <- do.call(rbind, lapply(result_list_9,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_9, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_9, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_9, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_substrate_future2C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future2C_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future2C_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future2C_10, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_ARR/species_ARR_substrate_future2C_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C_10, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future2C_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C_10, file = "RData/Climate_vulnerability/Substrate/future2C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future2C_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_substrate_future2C <- distinct(rbind(species_ARR_substrate_future2C_1,
    species_ARR_substrate_future2C_2, species_ARR_substrate_future2C_3, species_ARR_substrate_future2C_4,
    species_ARR_substrate_future2C_5, species_ARR_substrate_future2C_6, species_ARR_substrate_future2C_7,
    species_ARR_substrate_future2C_8, species_ARR_substrate_future2C_9, species_ARR_substrate_future2C_10))

daily_CTmax_substrate_mean_acc_future2C <- rbind(daily_CTmax_substrate_mean_acc_future2C_1,
    daily_CTmax_substrate_mean_acc_future2C_2, daily_CTmax_substrate_mean_acc_future2C_3,
    daily_CTmax_substrate_mean_acc_future2C_4, daily_CTmax_substrate_mean_acc_future2C_5,
    daily_CTmax_substrate_mean_acc_future2C_6, daily_CTmax_substrate_mean_acc_future2C_7,
    daily_CTmax_substrate_mean_acc_future2C_8, daily_CTmax_substrate_mean_acc_future2C_9,
    daily_CTmax_substrate_mean_acc_future2C_10)

daily_CTmax_substrate_max_acc_future2C <- rbind(daily_CTmax_substrate_max_acc_future2C_1,
    daily_CTmax_substrate_max_acc_future2C_2, daily_CTmax_substrate_max_acc_future2C_3,
    daily_CTmax_substrate_max_acc_future2C_4, daily_CTmax_substrate_max_acc_future2C_5,
    daily_CTmax_substrate_max_acc_future2C_6, daily_CTmax_substrate_max_acc_future2C_7,
    daily_CTmax_substrate_max_acc_future2C_8, daily_CTmax_substrate_max_acc_future2C_9,
    daily_CTmax_substrate_max_acc_future2C_10)


saveRDS(species_ARR_substrate_future2C, file = "RData/Climate_vulnerability/Substrate/future2C/species_ARR_substrate_future2C.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future2C, file = "RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_mean_acc_future2C.rds")
saveRDS(daily_CTmax_substrate_max_acc_future2C, file = "RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_max_acc_future2C.rds")

Future climate (+4C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Substrate/4C/species_daily_temp_warmest_days_substrate_future4C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

# Find common species between species_data and temp_species. This is needed
# because paedomorphic species were taken out from substrate temperature data
common_species <- intersect(unique(species_data$tip.label), unique(temp_species$tip.label))

# Filter both datasets to include only the matching species
species_data <- species_data %>%
    filter(tip.label %in% common_species)
temp_species <- temp_species %>%
    filter(tip.label %in% common_species)

saveRDS(temp_species, file = "RData/Biophysical_modelling/Substrate/4C/species_daily_temp_warmest_days_substrate_future4C_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_substrate_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_1, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_1, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_1, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_substrate_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_2, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_2, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_2, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_substrate_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_3, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_3, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_3, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_substrate_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_4, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_4, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_4, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_substrate_future4C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_5 <- do.call(rbind, lapply(result_list_5,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_5 <- do.call(rbind, lapply(result_list_5,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_5, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_5, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_5th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_5, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_substrate_future4C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_6 <- do.call(rbind, lapply(result_list_6,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_6 <- do.call(rbind, lapply(result_list_6,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_6, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_6, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_6th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_6, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_substrate_future4C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_7 <- do.call(rbind, lapply(result_list_7,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_7 <- do.call(rbind, lapply(result_list_7,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_7, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_7, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_7th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_7, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_substrate_future4C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_8 <- do.call(rbind, lapply(result_list_8,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_8 <- do.call(rbind, lapply(result_list_8,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_8, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_8, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_8th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_8, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_substrate_future4C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_9 <- do.call(rbind, lapply(result_list_9,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_9 <- do.call(rbind, lapply(result_list_9,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_9, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_9, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_9th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_9, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_substrate_future4C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_substrate_mean_acc_future4C_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[2]]))
daily_CTmax_substrate_max_acc_future4C_10 <- do.call(rbind, lapply(result_list_10,
    function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_substrate_future4C_10, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_ARR/species_ARR_substrate_future4C_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C_10, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_mean_acc/daily_CTmax_substrate_mean_acc_future4C_10th_chunk.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C_10, file = "RData/Climate_vulnerability/Substrate/future4C/temp_files_max_acc/daily_CTmax_substrate_max_acc_future4C_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save

species_ARR_substrate_future4C <- distinct(rbind(species_ARR_substrate_future4C_1,
    species_ARR_substrate_future4C_2, species_ARR_substrate_future4C_3, species_ARR_substrate_future4C_4,
    species_ARR_substrate_future4C_5, species_ARR_substrate_future4C_6, species_ARR_substrate_future4C_7,
    species_ARR_substrate_future4C_8, species_ARR_substrate_future4C_9, species_ARR_substrate_future4C_10))

daily_CTmax_substrate_mean_acc_future4C <- rbind(daily_CTmax_substrate_mean_acc_future4C_1,
    daily_CTmax_substrate_mean_acc_future4C_2, daily_CTmax_substrate_mean_acc_future4C_3,
    daily_CTmax_substrate_mean_acc_future4C_4, daily_CTmax_substrate_mean_acc_future4C_5,
    daily_CTmax_substrate_mean_acc_future4C_6, daily_CTmax_substrate_mean_acc_future4C_7,
    daily_CTmax_substrate_mean_acc_future4C_8, daily_CTmax_substrate_mean_acc_future4C_9,
    daily_CTmax_substrate_mean_acc_future4C_10)

daily_CTmax_substrate_max_acc_future4C <- rbind(daily_CTmax_substrate_max_acc_future4C_1,
    daily_CTmax_substrate_max_acc_future4C_2, daily_CTmax_substrate_max_acc_future4C_3,
    daily_CTmax_substrate_max_acc_future4C_4, daily_CTmax_substrate_max_acc_future4C_5,
    daily_CTmax_substrate_max_acc_future4C_6, daily_CTmax_substrate_max_acc_future4C_7,
    daily_CTmax_substrate_max_acc_future4C_8, daily_CTmax_substrate_max_acc_future4C_9,
    daily_CTmax_substrate_max_acc_future4C_10)


saveRDS(species_ARR_substrate_future4C, file = "RData/Climate_vulnerability/Substrate/future4C/species_ARR_substrate_future4C.rds")
saveRDS(daily_CTmax_substrate_mean_acc_future4C, file = "RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_mean_acc_future4C.rds")
saveRDS(daily_CTmax_substrate_max_acc_future4C, file = "RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_max_acc_future4C.rds")

Pond or wetland

Combine species data with operative body temperatures

Here, we merge the distribution data of each species with the daily temperatures they experience in each coordinate during the warmest 3-month period of each year

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/ and the resources used in pbs/Climate_vulnerability/Pond/

These files are named as Combining_species_data_with_temp_data_pond and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Current climate

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Pond/current/daily_temp_warmest_days_pond.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Pond/current/species_daily_temp_warmest_days_pond_current.rds")

Future climate (+2C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Pond/2C/daily_temp_warmest_days_pond_2C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Pond/2C/species_daily_temp_warmest_days_pond_future2C.rds")

Future climate (+4C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Pond/4C/daily_temp_warmest_days_pond_4C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Pond/4C/species_daily_temp_warmest_days_pond_future4C.rds")

Predict CTmax across the distribution range of each species

Here, we run meta-analytic models for each species to estimate the model parameters, and use model predictions to project their CTmax across their range of distribution. These predictions are made assuming that animals are acclimated to the mean or maximum weekly temperature in each day surveyed.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/ and the resources used in pbs/Climate_vulnerability/Pond/

These files are named as Predicting_CTmax_across_coordinates_pond and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Function to run meta-analytic models

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean or maximum weekly
# temperature

species_meta <- function(species_name, species_data, temp_species) {

    cat("Processing:", species_name, "\n")

    dat <- dplyr::filter(species_data, tip.label == species_name)
    dat2 <- dplyr::filter(temp_species, tip.label == species_name)

    # Fit a meta-analytic model
    fit <- metafor::rma(yi = CTmax, sei = se, mod = ~acclimation_temp, data = dat)

    int_slope <- coef(fit)
    se <- fit$se

    cat("Get model coefficients:\n")
    coefs <- data.frame(tip.label = dat$tip.label, intercept = coef(fit)[1], intercept_se = fit$se[1],
        slope = coef(fit)[2], slope_se = fit$se[2])
    print(head(coefs))

    prediction_mean <- predict(fit, newmods = dat2$mean_weekly_temp)
    prediction_max <- predict(fit, newmods = dat2$max_weekly_temp)

    cat("Generate predictions, mean temp:\n")
    print(head(prediction_mean))
    cat("Generate predictions, max temp:\n")
    print(head(prediction_max))

    daily_CTmax_pond_mean_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_mean$pred,
        predicted_CTmax_se = prediction_mean$se))), -max_weekly_temp)
    daily_CTmax_pond_max_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_max$pred,
        predicted_CTmax_se = prediction_max$se))), -mean_weekly_temp)

    return(list(coefs, daily_CTmax_pond_mean_acc_current, daily_CTmax_pond_max_acc_current))

}

Current climate

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Pond/current/species_daily_temp_warmest_days_pond_current.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Pond/current/species_daily_temp_warmest_days_pond_current_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_pond_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_1, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_1st_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_1, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_1st_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_1, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_pond_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_2, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_2, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_2, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_pond_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_3, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_3, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_3, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_pond_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_4, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_4th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_4, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_4th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_4, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_pond_current_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_5, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_5th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_5, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_5th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_5, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_pond_current_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_6, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_6th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_6, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_6th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_6, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_pond_current_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_7, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_7th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_7, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_7th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_7, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_pond_current_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_8, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_8th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_8, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_8th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_8, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_pond_current_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_9, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_9th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_9, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_9th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_9, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_pond_current_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_current_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[2]]))
daily_CTmax_pond_max_acc_current_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_current_10, file = "RData/Climate_vulnerability/Pond/current/temp_files_ARR/species_ARR_pond_current_10th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_current_10, file = "RData/Climate_vulnerability/Pond/current/temp_files_mean_acc/daily_CTmax_pond_mean_acc_current_10th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_current_10, file = "RData/Climate_vulnerability/Pond/current/temp_files_max_acc/daily_CTmax_pond_max_acc_current_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_pond_current <- distinct(rbind(species_ARR_pond_current_1, species_ARR_pond_current_2,
    species_ARR_pond_current_3, species_ARR_pond_current_4, species_ARR_pond_current_5,
    species_ARR_pond_current_6, species_ARR_pond_current_7, species_ARR_pond_current_8,
    species_ARR_pond_current_9, species_ARR_pond_current_10))

daily_CTmax_pond_mean_acc_current <- rbind(daily_CTmax_pond_mean_acc_current_1, daily_CTmax_pond_mean_acc_current_2,
    daily_CTmax_pond_mean_acc_current_3, daily_CTmax_pond_mean_acc_current_4, daily_CTmax_pond_mean_acc_current_5,
    daily_CTmax_pond_mean_acc_current_6, daily_CTmax_pond_mean_acc_current_7, daily_CTmax_pond_mean_acc_current_8,
    daily_CTmax_pond_mean_acc_current_9, daily_CTmax_pond_mean_acc_current_10)

daily_CTmax_pond_max_acc_current <- rbind(daily_CTmax_pond_max_acc_current_1, daily_CTmax_pond_max_acc_current_2,
    daily_CTmax_pond_max_acc_current_3, daily_CTmax_pond_max_acc_current_4, daily_CTmax_pond_max_acc_current_5,
    daily_CTmax_pond_max_acc_current_6, daily_CTmax_pond_max_acc_current_7, daily_CTmax_pond_max_acc_current_8,
    daily_CTmax_pond_max_acc_current_9, daily_CTmax_pond_max_acc_current_10)


saveRDS(species_ARR_pond_current, file = "RData/Climate_vulnerability/Pond/current/species_ARR_pond_current.rds")
saveRDS(daily_CTmax_pond_mean_acc_current, file = "RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_mean_acc_current.rds")
saveRDS(daily_CTmax_pond_max_acc_current, file = "RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_max_acc_current.rds")

Future climate (+2C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Pond/2C/species_daily_temp_warmest_days_pond_future2C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Pond/2C/species_daily_temp_warmest_days_pond_future2C_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_pond_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_1, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_1, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_1, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_pond_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_2, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_2, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_2, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_pond_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_3, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_3, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_3, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_pond_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_4, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_4, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_4, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_pond_future2C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_5, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_5th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_5, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_5th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_5, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_pond_future2C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_6, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_6th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_6, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_6th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_6, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_pond_future2C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_7, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_7th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_7, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_7th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_7, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_pond_future2C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_8, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_8th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_8, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_8th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_8, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_pond_future2C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_9, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_9th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_9, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_9th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_9, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_pond_future2C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future2C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future2C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future2C_10, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_ARR/species_ARR_pond_future2C_10th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C_10, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future2C_10th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C_10, file = "RData/Climate_vulnerability/Pond/future2C/temp_files_max_acc/daily_CTmax_pond_max_acc_future2C_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save

species_ARR_pond_future2C <- distinct(rbind(species_ARR_pond_future2C_1, species_ARR_pond_future2C_2,
    species_ARR_pond_future2C_3, species_ARR_pond_future2C_4, species_ARR_pond_future2C_5,
    species_ARR_pond_future2C_6, species_ARR_pond_future2C_7, species_ARR_pond_future2C_8,
    species_ARR_pond_future2C_9, species_ARR_pond_future2C_10))

daily_CTmax_pond_mean_acc_future2C <- rbind(daily_CTmax_pond_mean_acc_future2C_1,
    daily_CTmax_pond_mean_acc_future2C_2, daily_CTmax_pond_mean_acc_future2C_3, daily_CTmax_pond_mean_acc_future2C_4,
    daily_CTmax_pond_mean_acc_future2C_5, daily_CTmax_pond_mean_acc_future2C_6, daily_CTmax_pond_mean_acc_future2C_7,
    daily_CTmax_pond_mean_acc_future2C_8, daily_CTmax_pond_mean_acc_future2C_9, daily_CTmax_pond_mean_acc_future2C_10)

daily_CTmax_pond_max_acc_future2C <- rbind(daily_CTmax_pond_max_acc_future2C_1, daily_CTmax_pond_max_acc_future2C_2,
    daily_CTmax_pond_max_acc_future2C_3, daily_CTmax_pond_max_acc_future2C_4, daily_CTmax_pond_max_acc_future2C_5,
    daily_CTmax_pond_max_acc_future2C_6, daily_CTmax_pond_max_acc_future2C_7, daily_CTmax_pond_max_acc_future2C_8,
    daily_CTmax_pond_max_acc_future2C_9, daily_CTmax_pond_max_acc_future2C_10)


saveRDS(species_ARR_pond_future2C, file = "RData/Climate_vulnerability/Pond/future2C/species_ARR_pond_future2C.rds")
saveRDS(daily_CTmax_pond_mean_acc_future2C, file = "RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_mean_acc_future2C.rds")
saveRDS(daily_CTmax_pond_max_acc_future2C, file = "RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_max_acc_future2C.rds")

Future climate (+4C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Pond/4C/species_daily_temp_warmest_days_pond_future4C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Pond/4C/species_daily_temp_warmest_days_pond_future4C_adj.rds")

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_pond_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_1, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_1, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_1, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_pond_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_2, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_2, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_2, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_pond_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_3, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_3, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_3, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_pond_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_4, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_4, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_4, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_4th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[5]]
result_list_5 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_5 <- c(result_list_5, result_chunk)
}

species_ARR_pond_future4C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_5 <- do.call(rbind, lapply(result_list_5, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_5)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_5, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_5th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_5, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_5th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_5, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_5th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[6]]
result_list_6 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_6 <- c(result_list_6, result_chunk)
}

species_ARR_pond_future4C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_6 <- do.call(rbind, lapply(result_list_6, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_6)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_6, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_6th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_6, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_6th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_6, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_6th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[7]]
result_list_7 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_7 <- c(result_list_7, result_chunk)
}

species_ARR_pond_future4C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_7 <- do.call(rbind, lapply(result_list_7, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_7)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_7, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_7th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_7, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_7th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_7, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_7th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[8]]
result_list_8 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_8 <- c(result_list_8, result_chunk)
}

species_ARR_pond_future4C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_8 <- do.call(rbind, lapply(result_list_8, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_8)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_8, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_8th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_8, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_8th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_8, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_8th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[9]]
result_list_9 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_9 <- c(result_list_9, result_chunk)
}

species_ARR_pond_future4C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_9 <- do.call(rbind, lapply(result_list_9, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_9)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_9, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_9th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_9, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_9th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_9, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_9th_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[10]]
result_list_10 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_10 <- c(result_list_10, result_chunk)
}

species_ARR_pond_future4C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[1]]))
daily_CTmax_pond_mean_acc_future4C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[2]]))
daily_CTmax_pond_max_acc_future4C_10 <- do.call(rbind, lapply(result_list_10, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_10)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_pond_future4C_10, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_ARR/species_ARR_pond_future4C_10th_chunk.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C_10, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_mean_acc/daily_CTmax_pond_mean_acc_future4C_10th_chunk.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C_10, file = "RData/Climate_vulnerability/Pond/future4C/temp_files_max_acc/daily_CTmax_pond_max_acc_future4C_10th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_pond_future4C <- distinct(rbind(species_ARR_pond_future4C_1, species_ARR_pond_future4C_2,
    species_ARR_pond_future4C_3, species_ARR_pond_future4C_4, species_ARR_pond_future4C_5,
    species_ARR_pond_future4C_6, species_ARR_pond_future4C_7, species_ARR_pond_future4C_8,
    species_ARR_pond_future4C_9, species_ARR_pond_future4C_10))

daily_CTmax_pond_mean_acc_future4C <- rbind(daily_CTmax_pond_mean_acc_future4C_1,
    daily_CTmax_pond_mean_acc_future4C_2, daily_CTmax_pond_mean_acc_future4C_3, daily_CTmax_pond_mean_acc_future4C_4,
    daily_CTmax_pond_mean_acc_future4C_5, daily_CTmax_pond_mean_acc_future4C_6, daily_CTmax_pond_mean_acc_future4C_7,
    daily_CTmax_pond_mean_acc_future4C_8, daily_CTmax_pond_mean_acc_future4C_9, daily_CTmax_pond_mean_acc_future4C_10)

daily_CTmax_pond_max_acc_future4C <- rbind(daily_CTmax_pond_max_acc_future4C_1, daily_CTmax_pond_max_acc_future4C_2,
    daily_CTmax_pond_max_acc_future4C_3, daily_CTmax_pond_max_acc_future4C_4, daily_CTmax_pond_max_acc_future4C_5,
    daily_CTmax_pond_max_acc_future4C_6, daily_CTmax_pond_max_acc_future4C_7, daily_CTmax_pond_max_acc_future4C_8,
    daily_CTmax_pond_max_acc_future4C_9, daily_CTmax_pond_max_acc_future4C_10)


saveRDS(species_ARR_pond_future4C, file = "RData/Climate_vulnerability/Pond/future4C/species_ARR_pond_future4C.rds")
saveRDS(daily_CTmax_pond_mean_acc_future4C, file = "RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_mean_acc_future4C.rds")
saveRDS(daily_CTmax_pond_max_acc_future4C, file = "RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_max_acc_future4C.rds")

Above-ground vegetation

Combine species data with operative body temperatures

Here, we merge the distribution data of each species with the daily temperatures they experience in each coordinate during the warmest 3-month period of each year

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/ and the resources used in pbs/Climate_vulnerability/Arboreal/

These files are named as Combining_species_data_with_temp_data_arboreal and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Current climate

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Arboreal/current/daily_temp_warmest_days_arboreal.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Arboreal/current/species_daily_temp_warmest_days_arboreal_current.rds")

Future climate (+2C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Arboreal/2C/daily_temp_warmest_days_arboreal_2C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Arboreal/2C/species_daily_temp_warmest_days_arboreal_future2C.rds")

Future climate (+4C)

### Daily temperature of the warmest days
daily_temp_warmest_days <- readRDS("RData/Biophysical_modelling/Arboreal/4C/daily_temp_warmest_days_arboreal_4C.rds")

species_occurrence <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

species_temp_warmest_days <- merge(daily_temp_warmest_days, species_occurrence, by = c("lon",
    "lat"))

saveRDS(species_temp_warmest_days, file = "RData/Biophysical_modelling/Arboreal/4C/species_daily_temp_warmest_days_arboreal_future4C.rds")

Predict CTmax across the distribution range of each species

Here, we run meta-analytic models for each species to estimate the model parameters, and use model predictions to project their CTmax across their range of distribution. These predictions are made assuming that animals are acclimated to the mean or maximum weekly temperature in each day surveyed.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/ and the resources used in pbs/Climate_vulnerability/Arboreal/

These files are named as Predicting_CTmax_across_coordinates_arboreal and the file suffix denotes the climatic scenario (**_current** for 2006-2015; **_future2C** for +2 degrees of warming above pre-industrial levels; or **_future_4C** for +4 degrees of warming above pre-industrial levels).

Function to run meta-analytic models

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean or maximum weekly
# temperature

## Create function
species_meta <- function(species_name, species_data, temp_species) {

    cat("Processing:", species_name, "\n")

    dat <- dplyr::filter(species_data, tip.label == species_name)
    dat2 <- dplyr::filter(temp_species, tip.label == species_name)

    # Fit a meta-analytic model
    fit <- metafor::rma(yi = CTmax, sei = se, mod = ~acclimation_temp, data = dat)

    int_slope <- coef(fit)
    se <- fit$se

    cat("Get model coefficients:\n")
    coefs <- data.frame(tip.label = dat$tip.label, intercept = coef(fit)[1], intercept_se = fit$se[1],
        slope = coef(fit)[2], slope_se = fit$se[2])
    print(head(coefs))

    prediction_mean <- predict(fit, newmods = dat2$mean_weekly_temp)
    prediction_max <- predict(fit, newmods = dat2$max_weekly_temp)

    cat("Generate predictions, mean temp:\n")
    print(head(prediction_mean))
    cat("Generate predictions, max temp:\n")
    print(head(prediction_max))

    daily_CTmax_arboreal_mean_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_mean$pred,
        predicted_CTmax_se = prediction_mean$se))), -max_weekly_temp)
    daily_CTmax_arboreal_max_acc_current <- dplyr::select((cbind(dat2, cbind(predicted_CTmax = prediction_max$pred,
        predicted_CTmax_se = prediction_max$se))), -mean_weekly_temp)

    return(list(coefs, daily_CTmax_arboreal_mean_acc_current, daily_CTmax_arboreal_max_acc_current))

}

Current climate

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Arboreal/current/species_daily_temp_warmest_days_arboreal_current.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Arboreal/current/species_daily_temp_warmest_days_arboreal_current_adj.rds")

species_data <- filter(species_data, tip.label %in% temp_species$tip.label)

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_arboreal_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_current_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_current_1, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_ARR/species_ARR_arboreal_current_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_current_1, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_current_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_current_1, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_max_acc/daily_CTmax_arboreal_max_acc_current_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_arboreal_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_current_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_current_2, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_ARR/species_ARR_arboreal_current_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_current_2, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_current_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_current_2, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_max_acc/daily_CTmax_arboreal_max_acc_current_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_arboreal_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_current_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_current_3, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_ARR/species_ARR_arboreal_current_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_current_3, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_current_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_current_3, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_max_acc/daily_CTmax_arboreal_max_acc_current_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_arboreal_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_current_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_current_4, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_ARR/species_ARR_arboreal_current_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_current_4, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_current_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_current_4, file = "RData/Climate_vulnerability/Arboreal/current/temp_files_max_acc/daily_CTmax_arboreal_max_acc_current_4th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_arboreal_current <- distinct(rbind(species_ARR_arboreal_current_1, species_ARR_arboreal_current_2,
    species_ARR_arboreal_current_3, species_ARR_arboreal_current_4))

daily_CTmax_arboreal_mean_acc_current <- rbind(daily_CTmax_arboreal_mean_acc_current_1,
    daily_CTmax_arboreal_mean_acc_current_2, daily_CTmax_arboreal_mean_acc_current_3,
    daily_CTmax_arboreal_mean_acc_current_4)

daily_CTmax_arboreal_max_acc_current <- rbind(daily_CTmax_arboreal_max_acc_current_1,
    daily_CTmax_arboreal_max_acc_current_2, daily_CTmax_arboreal_max_acc_current_3,
    daily_CTmax_arboreal_max_acc_current_4)


saveRDS(species_ARR_arboreal_current, file = "RData/Climate_vulnerability/Arboreal/current/species_ARR_arboreal_current.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_current, file = "RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_mean_acc_current.rds")
saveRDS(daily_CTmax_arboreal_max_acc_current, file = "RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_max_acc_current.rds")

Future climate (+2C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Arboreal/2C/species_daily_temp_warmest_days_arboreal_future2C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Arboreal/2C/species_daily_temp_warmest_days_arboreal_future2C_adj.rds")

species_data <- filter(species_data, tip.label %in% temp_species$tip.label)

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_arboreal_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future2C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future2C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future2C_1, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_ARR/species_ARR_arboreal_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future2C_1, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future2C_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future2C_1, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future2C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_arboreal_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future2C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future2C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future2C_2, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_ARR/species_ARR_arboreal_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future2C_2, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future2C_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future2C_2, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future2C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_arboreal_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future2C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future2C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future2C_3, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_ARR/species_ARR_arboreal_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future2C_3, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future2C_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future2C_3, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future2C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_arboreal_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future2C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future2C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future2C_4, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_ARR/species_ARR_arboreal_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future2C_4, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future2C_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future2C_4, file = "RData/Climate_vulnerability/Arboreal/future2C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future2C_4th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_arboreal_future2C <- distinct(rbind(species_ARR_arboreal_future2C_1,
    species_ARR_arboreal_future2C_2, species_ARR_arboreal_future2C_3, species_ARR_arboreal_future2C_4))

daily_CTmax_arboreal_mean_acc_future2C <- rbind(daily_CTmax_arboreal_mean_acc_future2C_1,
    daily_CTmax_arboreal_mean_acc_future2C_2, daily_CTmax_arboreal_mean_acc_future2C_3,
    daily_CTmax_arboreal_mean_acc_future2C_4)

daily_CTmax_arboreal_max_acc_future2C <- rbind(daily_CTmax_arboreal_max_acc_future2C_1,
    daily_CTmax_arboreal_max_acc_future2C_2, daily_CTmax_arboreal_max_acc_future2C_3,
    daily_CTmax_arboreal_max_acc_future2C_4)


saveRDS(species_ARR_arboreal_future2C, file = "RData/Climate_vulnerability/Arboreal/future2C/species_ARR_arboreal_future2C.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future2C, file = "RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_mean_acc_future2C.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future2C, file = "RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_max_acc_future2C.rds")

Future climate (+4C)

Load data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
    upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
    mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
    group_by(tip.label)

temp_species <- readRDS("RData/Biophysical_modelling/Arboreal/4C/species_daily_temp_warmest_days_arboreal_future4C.rds")
temp_species$tip.label <- gsub("_", " ", temp_species$tip.label)

temp_species$tip.label[temp_species$tip.label == "Scinax x signatus"] <- "Scinax x-signatus"
temp_species$tip.label[temp_species$tip.label == "Pristimantis w nigrum"] <- "Pristimantis w-nigrum"

saveRDS(temp_species, file = "RData/Biophysical_modelling/Arboreal/4C/species_daily_temp_warmest_days_arboreal_future4C_adj.rds")

species_data <- filter(species_data, tip.label %in% temp_species$tip.label)

# Run meta-analytic models to calculate species-level ARR and intercept; and
# predict the CTmax of each day once acclimated to the mean weekly temperature

temp_species <- temp_species %>%
    dplyr::select(tip.label, lon, lat, YEAR, DOY, max_temp, mean_weekly_temp, max_weekly_temp)
Run the models in chunks
# Create chunks of 3 species at a time
species_list <- unique(species_data$tip.label)
chunk_size <- 3
num_chunks <- ceiling(length(species_list)/chunk_size)

# Split the species list into chunks
chunk_species_list <- split(species_list, cut(1:length(species_list), breaks = num_chunks,
    labels = FALSE))

# Now, create larger chunks of small chunks Running all chunks at once will
# require an enormous amount of RAM, so we proceed with 175 chunks at a time in
# 10 batches.
larger_chunk_size <- 175
num_larger_chunks <- ceiling(num_chunks/larger_chunk_size)

# Split the chunk list into larger chunks
larger_chunk_list <- split(chunk_species_list, cut(1:length(chunk_species_list),
    breaks = num_larger_chunks, labels = FALSE))


# Set up parallel processing
cl <- makeCluster(16)

# Load packages on nodes
clusterEvalQ(cl, {
    library(dplyr)
    library(metafor)
})

# Check processing time
Sys.time()

# Processing for first larger chunk
current_larger_chunk <- larger_chunk_list[[1]]
result_list_1 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_1 <- c(result_list_1, result_chunk)
}

species_ARR_arboreal_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future4C_1 <- do.call(rbind, lapply(result_list_1,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future4C_1 <- do.call(rbind, lapply(result_list_1, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_1)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future4C_1, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_ARR/species_ARR_arboreal_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future4C_1, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future4C_1st_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future4C_1, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future4C_1st_chunk.rds")

################################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[2]]
result_list_2 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_2 <- c(result_list_2, result_chunk)
}

species_ARR_arboreal_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future4C_2 <- do.call(rbind, lapply(result_list_2,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future4C_2 <- do.call(rbind, lapply(result_list_2, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_2)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future4C_2, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_ARR/species_ARR_arboreal_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future4C_2, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future4C_2nd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future4C_2, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future4C_2nd_chunk.rds")

###################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[3]]
result_list_3 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_3 <- c(result_list_3, result_chunk)
}

species_ARR_arboreal_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future4C_3 <- do.call(rbind, lapply(result_list_3,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future4C_3 <- do.call(rbind, lapply(result_list_3, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_3)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future4C_3, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_ARR/species_ARR_arboreal_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future4C_3, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future4C_3rd_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future4C_3, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future4C_3rd_chunk.rds")

######################

Sys.time()

# Processing for second larger chunk
current_larger_chunk <- larger_chunk_list[[4]]
result_list_4 <- list()

# Loop over the small chunks within the current larger chunk
for (i in seq_along(current_larger_chunk)) {
    current_species <- current_larger_chunk[[i]]

    # Filter data for only the species in the current chunk
    chunk_species_data <- dplyr::filter(species_data, tip.label %in% current_species)
    chunk_temp_species <- dplyr::filter(temp_species, tip.label %in% current_species)

    # Export only the filtered data and the current species list to the cluster
    clusterExport(cl, c("chunk_species_data", "chunk_temp_species", "current_species",
        "species_meta"))

    # Call species_meta for each species in the chunk
    result_chunk <- parallel::parLapply(cl, current_species, function(x) species_meta(x,
        chunk_species_data, chunk_temp_species))

    result_list_4 <- c(result_list_4, result_chunk)
}

species_ARR_arboreal_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[1]]))
daily_CTmax_arboreal_mean_acc_future4C_4 <- do.call(rbind, lapply(result_list_4,
    function(x) x[[2]]))
daily_CTmax_arboreal_max_acc_future4C_4 <- do.call(rbind, lapply(result_list_4, function(x) x[[3]]))

rm(chunk_species_data)
rm(chunk_temp_species)
rm(result_chunk)
rm(result_list_4)

Sys.time()

# Save the results for first chunk
saveRDS(species_ARR_arboreal_future4C_4, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_ARR/species_ARR_arboreal_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future4C_4, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_mean_acc/daily_CTmax_arboreal_mean_acc_future4C_4th_chunk.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future4C_4, file = "RData/Climate_vulnerability/Arboreal/future4C/temp_files_max_acc/daily_CTmax_arboreal_max_acc_future4C_4th_chunk.rds")

######################

# Stop the cluster
stopCluster(cl)
gc()
Combine chunks
# Combine results from all chunks and save
species_ARR_arboreal_future4C <- distinct(rbind(species_ARR_arboreal_future4C_1,
    species_ARR_arboreal_future4C_2, species_ARR_arboreal_future4C_3, species_ARR_arboreal_future4C_4))

daily_CTmax_arboreal_mean_acc_future4C <- rbind(daily_CTmax_arboreal_mean_acc_future4C_1,
    daily_CTmax_arboreal_mean_acc_future4C_2, daily_CTmax_arboreal_mean_acc_future4C_3,
    daily_CTmax_arboreal_mean_acc_future4C_4)

daily_CTmax_arboreal_max_acc_future4C <- rbind(daily_CTmax_arboreal_max_acc_future4C_1,
    daily_CTmax_arboreal_max_acc_future4C_2, daily_CTmax_arboreal_max_acc_future4C_3,
    daily_CTmax_arboreal_max_acc_future4C_4)


saveRDS(species_ARR_arboreal_future4C, file = "RData/Climate_vulnerability/Arboreal/future4C/species_ARR_arboreal_future4C.rds")
saveRDS(daily_CTmax_arboreal_mean_acc_future4C, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_mean_acc_future4C.rds")
saveRDS(daily_CTmax_arboreal_max_acc_future4C, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_max_acc_future4C.rds")

Climate vulnerability assessment

Vegetated substrate

Here, we assume that animals are acclimated daily to the mean weekly temperature experienced prior to each day.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate.R and the resources used in pbs/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate.pbs

Weighted means and standard errors were calculated according to Formula 22 in Higgins & Thompson (2002). Quantifying heterogeneity in a meta-analysis. Stat Med 21:1539–1558

Current climate

daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")

Future climate (+2C)

daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")

Future climate (+4C)

daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate.R and the resources used in pbs/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate.pbs

community_df_mean_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_current), function(i) {
    row <- community_df_mean_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")


################################# Do the same for mean future 2C
################################# #########################

community_df_mean_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future2C), function(i) {
    row <- community_df_mean_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")



################################# Do the same for mean future 4C
################################# #########################

community_df_mean_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future4C), function(i) {
    row <- community_df_mean_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

Subset of arboreal species

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_arboreal_species.R and the resources used in pbs/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_arboreal_species.pbs

The code to clip the grid cells to match land masses can be found in R/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate_arboreal_species.R and the resources used in pbs/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate_arboreal_species.pbs

##############################################################################################################
############### Acclimation to mean weekly temperature on substrate, current climate ######################

pop_vulnerability_mean_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_vulnerability_mean_current_arb <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")

# Filter to arboreal species
pop_vulnerability_mean_current <- pop_vulnerability_mean_current[pop_vulnerability_mean_current$tip.label %in% pop_vulnerability_mean_current_arb$tip.label,]

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)), 
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_arboreal_sp.rds")

rm(community_vulnerability_mean_current)

###################################################################################################################
############### Acclimation to mean weekly temperature on substrate, future climate (+2C) ######################

pop_vulnerability_mean_2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_vulnerability_mean_2C_arb <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")

# Filter to arboreal species
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C[pop_vulnerability_mean_2C$tip.label %in% pop_vulnerability_mean_2C_arb$tip.label,]

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)), 
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_arboreal_sp.rds")

rm(community_vulnerability_mean_2C)

###################################################################################################################
############### Acclimation to mean weekly temperature on substrate, future climate (+4C) ######################

pop_vulnerability_mean_4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")
pop_vulnerability_mean_4C_arb <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

# Filter to arboreal species
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C[pop_vulnerability_mean_4C$tip.label %in% pop_vulnerability_mean_4C_arb$tip.label,]

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)), 
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_arboreal_sp.rds")


####################################################################################
################### Clipping grid cells to match land masses #######################
####################################################################################

################################# Current climate #######################################

community_df_mean_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_arboreal_sp.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
  cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy,
                                           lon + dx, lat - dy,
                                           lon + dx, lat + dy,
                                           lon - dx, lat + dy,
                                           lon - dx, lat - dy), ncol = 2, byrow = TRUE)))
  cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
  st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
  library(tidyverse)
  library(sf)
  library(rnaturalearth)
  library(rnaturalearthhires)
  library(lwgeom)
  library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_current), function(i) {
  row <- community_df_mean_current[i, ]
  cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
  clipped_cell <- st_intersection(cell_polygon, land_polygon)
  
  if (nrow(clipped_cell) > 0) {  # check that clipped_cell is not an empty sf data frame
    clipped_cell$lon <- row$lon
    clipped_cell$lat <- row$lat
    clipped_cell$community_CTmax <- row$community_CTmax
    clipped_cell$community_CTmax_se <- row$community_CTmax_se
    clipped_cell$community_max_temp <- row$community_max_temp
    clipped_cell$community_max_temp_se <- row$community_max_temp_se
    clipped_cell$community_TSM <- row$community_TSM
    clipped_cell$community_TSM_se <- row$community_TSM_se
    clipped_cell$n_species <- row$n_species
    clipped_cell$n_species_overheating <- row$n_species_overheating
    clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
    clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
    clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
    clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
    clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict
    
    return(clipped_cell)
  } else {
    return(NULL)
  }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells_arboreal_sp.rds")


################################# Future climate (+2C)   ##################################

community_df_mean_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_arboreal_sp.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
  cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy,
                                           lon + dx, lat - dy,
                                           lon + dx, lat + dy,
                                           lon - dx, lat + dy,
                                           lon - dx, lat - dy), ncol = 2, byrow = TRUE)))
  cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
  st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
  library(tidyverse)
  library(sf)
  library(rnaturalearth)
  library(rnaturalearthhires)
  library(lwgeom)
  library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future2C), function(i) {
  row <- community_df_mean_future2C[i, ]
  cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
  clipped_cell <- st_intersection(cell_polygon, land_polygon)
  
  if (nrow(clipped_cell) > 0) {  # check that clipped_cell is not an empty sf data frame
    clipped_cell$lon <- row$lon
    clipped_cell$lat <- row$lat
    clipped_cell$community_CTmax <- row$community_CTmax
    clipped_cell$community_CTmax_se <- row$community_CTmax_se
    clipped_cell$community_max_temp <- row$community_max_temp
    clipped_cell$community_max_temp_se <- row$community_max_temp_se
    clipped_cell$community_TSM <- row$community_TSM
    clipped_cell$community_TSM_se <- row$community_TSM_se
    clipped_cell$n_species <- row$n_species
    clipped_cell$n_species_overheating <- row$n_species_overheating
    clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
    clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
    clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
    clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
    clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict
    
    return(clipped_cell)
  } else {
    return(NULL)
  }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells_arboreal_sp.rds")



################################# Future climate (+4C) ########################################

community_df_mean_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_arboreal_sp.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
  cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy,
                                           lon + dx, lat - dy,
                                           lon + dx, lat + dy,
                                           lon - dx, lat + dy,
                                           lon - dx, lat - dy), ncol = 2, byrow = TRUE)))
  cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
  st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
  library(tidyverse)
  library(sf)
  library(rnaturalearth)
  library(rnaturalearthhires)
  library(lwgeom)
  library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future4C), function(i) {
  row <- community_df_mean_future4C[i, ]
  cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
  clipped_cell <- st_intersection(cell_polygon, land_polygon)
  
  if (nrow(clipped_cell) > 0) {  # check that clipped_cell is not an empty sf data frame
    clipped_cell$lon <- row$lon
    clipped_cell$lat <- row$lat
    clipped_cell$community_CTmax <- row$community_CTmax
    clipped_cell$community_CTmax_se <- row$community_CTmax_se
    clipped_cell$community_max_temp <- row$community_max_temp
    clipped_cell$community_max_temp_se <- row$community_max_temp_se
    clipped_cell$community_TSM <- row$community_TSM
    clipped_cell$community_TSM_se <- row$community_TSM_se
    clipped_cell$n_species <- row$n_species
    clipped_cell$n_species_overheating <- row$n_species_overheating
    clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
    clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
    clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
    clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
    clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict
    
    return(clipped_cell)
  } else {
    return(NULL)
  }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells_arboreal_sp.rds")

Pond or wetland

Here, we assume that animals are acclimated daily to the mean weekly temperature experienced prior to each day.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond.R and the resources used in pbs/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond.pbs

Weighted means and standard errors were calculated according to Formula 22 in Higgins & Thompson (2002). Quantifying heterogeneity in a meta-analysis. Stat Med 21:1539–1558

Current climate

daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")

Future climate (+2C)

daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")

Future climate (+4C)

daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Clipping_grid_cells_pond.R and the resources used in pbs/Climate_vulnerability/Pond/Clipping_grid_cells_pond.pbs

community_df_mean_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_current), function(i) {
    row <- community_df_mean_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")


################################# Do the same for mean future 2C
################################# #########################

community_df_mean_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future2C), function(i) {
    row <- community_df_mean_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")



################################# Do the same for mean future 4C
################################# #########################

community_df_mean_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future4C), function(i) {
    row <- community_df_mean_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

Above-ground vegetation

Here, we assume that animals are acclimated daily to the mean weekly temperature experienced prior to each day.

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal.R and the resources used in pbs/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal.pbs

Weighted means and standard errors were calculated according to Formula 22 in Higgins & Thompson (2002). Quantifying heterogeneity in a meta-analysis. Stat Med 21:1539–1558

Current climate

daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")

Future climate (+2C)

daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")

Future climate (+4C)

daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Clipping_grid_cells_arboreal.R and the resources used in pbs/Climate_vulnerability/Arboreal/Clipping_grid_cells_arboreal.pbs

community_df_mean_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_current), function(i) {
    row <- community_df_mean_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")


################################# Do the same for mean future 2C
################################# #########################

community_df_mean_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future2C), function(i) {
    row <- community_df_mean_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")



################################# Do the same for mean future 4C
################################# #########################

community_df_mean_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_mean_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_mean_future4C), function(i) {
    row <- community_df_mean_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")

Data exploration and summaries

Population-level data

Overview of the datasets

Vegetated substrate

Current climate
# Load data
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")

kable(head(pop_sub_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 39.98908 4.511444 27.49703 0.5640217 12.43264 4.511444 0 0.0e+00 0 0.00e+00 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 39.94793 5.140802 28.11521 0.7375726 11.77718 5.140802 0 0.0e+00 0 1.00e-07 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.10568 2.994119 27.49391 0.4345626 12.52263 2.994119 0 0.0e+00 0 0.00e+00 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 39.96916 4.789386 27.87452 0.7030635 12.03742 4.789386 0 1.4e-06 0 4.24e-05 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.10494 2.999076 27.17083 0.4061500 12.84422 2.999076 0 0.0e+00 0 0.00e+00 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 39.83716 6.545874 27.64199 0.6936346 12.14957 6.545874 0 0.0e+00 0 8.00e-07 0 0 0 -0.5 6.5
Future climate (+2C)
# Load data
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")

kable(head(pop_sub_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.07114 3.474365 28.10160 0.5579338 11.90477 3.474365 0 0.0e+00 0 0.0000000 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.04391 3.929021 28.72451 0.6948312 11.23654 3.929021 0 0.0e+00 0 0.0000001 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.17528 2.223076 27.96704 0.4191247 12.11475 2.223076 0 0.0e+00 0 0.0000000 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.05892 3.653073 28.52474 0.6999964 11.46329 3.653073 0 6.8e-06 0 0.0002045 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.17137 2.258792 27.64496 0.3972899 12.43235 2.258792 0 0.0e+00 0 0.0000000 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 39.96322 4.871988 28.22187 0.6965914 11.67015 4.871988 0 9.0e-07 0 0.0000261 0 0 0 -0.5 6.5
Future climate (+4C)
# Load data
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

kable(head(pop_sub_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.21668 1.919900 29.33575 0.5847588 10.83930 1.919900 0 0.00e+00 0e+00 0.0000000 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.19928 2.186185 30.01605 0.6481885 10.11402 2.186185 0 1.00e-07 0e+00 0.0000016 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.28841 1.554146 28.95367 0.4144662 11.34288 1.554146 0 0.00e+00 0e+00 0.0000000 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.21597 1.951563 29.88231 0.7412744 10.28378 1.951563 0 2.76e-05 7e-07 0.0008336 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.28151 1.547718 28.61743 0.3911445 11.66422 1.547718 0 0.00e+00 0e+00 0.0000000 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 40.12299 2.883553 29.35210 0.7227937 10.67789 2.883553 0 9.40e-06 1e-07 0.0002845 0 0 0 -0.5 6.5

Pond or wetland

Current climate
# Load data
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")

kable(head(pop_pond_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.12142 2.778655 26.42222 0.3267298 13.57842 2.778655 0 0 0 0 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.11113 2.898319 26.33136 0.3593094 13.64646 2.898319 0 0 0 0 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.20766 1.857587 27.09084 0.2763299 13.03188 1.857587 0 0 0 0 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.11388 2.839007 26.38464 0.2914183 13.63919 2.839007 0 0 0 0 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.21134 1.832755 27.11520 0.2841698 13.00945 1.832755 0 0 0 0 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 39.96080 4.791702 25.25868 0.3218876 14.63013 4.791702 0 0 0 0 0 0 0 -0.5 6.5
Future climate (+2C)
# Load data
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")

kable(head(pop_pond_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.23332 1.683957 27.31245 0.3308270 12.84941 1.683957 0 0 0 0 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.23304 1.712315 27.27147 0.3590141 12.85409 1.712315 0 0 0 0 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.30246 1.500733 27.92074 0.2724560 12.41353 1.500733 0 0 0 0 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.23957 1.638277 27.35264 0.2965129 12.82004 1.638277 0 0 0 0 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.30629 1.512145 27.95502 0.2781772 12.38921 1.512145 0 0 0 0 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 40.10374 2.965873 26.29957 0.3085789 13.70488 2.965873 0 0 0 0 0 0 0 -0.5 6.5
Future climate (+4C)
# Load data
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

kable(head(pop_pond_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.40632 2.286515 28.82448 0.3489392 11.70777 2.286515 0 0 0 0 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.40846 2.319777 28.87492 0.3679164 11.68146 2.319777 0 0 0 0 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.48945 3.210875 29.35713 0.2646245 11.19841 3.210875 0 0 0 0 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.43397 2.561734 28.98423 0.2944050 11.54253 2.561734 0 0 0 0 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.49296 3.259129 29.39339 0.2790567 11.17269 3.259129 0 0 0 0 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 40.28693 1.500615 27.78416 0.3000444 12.50691 1.500615 0 0 0 0 0 0 0 -0.5 6.5

Above-ground vegetation

Current climate
# Load data
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")

kable(head(pop_arb_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 39.98052 4.614039 27.09566 0.4785521 12.81254 4.614039 0 0e+00 0 0.0e+00 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 39.93806 5.255807 27.48481 0.6116997 12.37592 5.255807 0 0e+00 0 0.0e+00 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.09495 3.114133 27.06597 0.3899019 12.93484 3.114133 0 0e+00 0 0.0e+00 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 39.96101 4.884643 27.47563 0.6209588 12.42651 4.884643 0 1e-07 0 3.8e-06 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.09575 3.102568 26.91175 0.3857633 13.08930 3.102568 0 0e+00 0 0.0e+00 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 39.82503 6.706676 27.04198 0.6098642 12.73293 6.706676 0 0e+00 0 0.0e+00 0 0 0 -0.5 6.5
Future climate (+2C)
# Load data
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")

kable(head(pop_arb_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.06338 3.558020 27.71739 0.4786351 12.26436 3.558020 0 0e+00 0 0.00e+00 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.03367 4.032642 28.13511 0.5841255 11.78944 4.032642 0 0e+00 0 0.00e+00 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.16682 2.301188 27.56933 0.3832526 12.49497 2.301188 0 0e+00 0 0.00e+00 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.05091 3.736134 28.14061 0.6248420 11.83496 3.736134 0 5e-07 0 1.48e-05 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.16311 2.336728 27.38994 0.3780957 12.67134 2.336728 0 0e+00 0 0.00e+00 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 39.95280 4.999105 27.64377 0.6144162 12.24088 4.999105 0 1e-07 0 2.80e-06 0 0 0 -0.5 6.5
Future climate (+4C)
# Load data
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

kable(head(pop_arb_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Acanthixalus sonjae -7.5 5.5 40.21213 1.945054 28.97567 0.5110117 11.17535 1.945054 0 0.0e+00 0 0.0000000 0 0 0 -7.5 5.5
Acanthixalus sonjae -7.5 6.5 40.19537 2.200921 29.48198 0.5725145 10.61936 2.200921 0 0.0e+00 0 0.0000000 0 0 0 -7.5 6.5
Acanthixalus sonjae -2.5 5.5 40.28343 1.541577 28.58393 0.3811469 11.70445 1.541577 0 0.0e+00 0 0.0000000 0 0 0 -2.5 5.5
Acanthixalus sonjae -2.5 6.5 40.21093 1.982208 29.51412 0.6789194 10.63372 1.982208 0 3.9e-06 0 0.0001168 0 0 0 -2.5 6.5
Acanthixalus sonjae -0.5 5.5 40.27578 1.545703 28.35889 0.3702133 11.91259 1.545703 0 0.0e+00 0 0.0000000 0 0 0 -0.5 5.5
Acanthixalus sonjae -0.5 6.5 40.11236 2.998551 28.81230 0.6550556 11.20044 2.998551 0 1.0e-06 0 0.0000317 0 0 0 -0.5 6.5

Number of populations predicted to overheat

Vegetated substrate

# Load data
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_pop_current <- n_distinct(pop_sub_current[pop_sub_current$overheating_risk > 0,
    ])
n_pop_future2C <- n_distinct(pop_sub_future2C[pop_sub_future2C$overheating_risk >
    0, ])
n_pop_future4C <- n_distinct(pop_sub_future4C[pop_sub_future4C$overheating_risk >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_pop_overheating = c(n_pop_current, n_pop_future2C,
    n_pop_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_pop_overheating
Current Climate 836
Future Climate (+2C) 1424
Future Climate (+4C) 4248

Pond or wetland

# Load data
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_pop_current <- n_distinct(pop_pond_current[pop_pond_current$overheating_risk >
    0, ])
n_pop_future2C <- n_distinct(pop_pond_future2C[pop_pond_future2C$overheating_risk >
    0, ])
n_pop_future4C <- n_distinct(pop_pond_future4C[pop_pond_future4C$overheating_risk >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_pop_overheating = c(n_pop_current, n_pop_future2C,
    n_pop_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_pop_overheating
Current Climate 0
Future Climate (+2C) 0
Future Climate (+4C) 56

Above-ground vegetation

# Load data
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_pop_current <- n_distinct(pop_arb_current[pop_arb_current$overheating_risk > 0,
    ])
n_pop_future2C <- n_distinct(pop_arb_future2C[pop_arb_future2C$overheating_risk >
    0, ])
n_pop_future4C <- n_distinct(pop_arb_future4C[pop_arb_future4C$overheating_risk >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_pop_overheating = c(n_pop_current, n_pop_future2C,
    n_pop_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_pop_overheating
Current Climate 152
Future Climate (+2C) 283
Future Climate (+4C) 748

Arboreal species on substrate conditions

# Filter substrate data to only arboreal species
pop_sub_current_arb_subset <- filter(pop_sub_current, tip.label %in% pop_arb_current$tip.label)
pop_sub_future2C_arb_subset <- filter(pop_sub_future2C, tip.label %in% pop_arb_future2C$tip.label)
pop_sub_future4C_arb_subset <- filter(pop_sub_future4C, tip.label %in% pop_arb_future4C$tip.label)


# Counts for each climatic scenario
n_pop_current <- n_distinct(pop_sub_current_arb_subset[pop_sub_current_arb_subset$overheating_risk >
    0, ])
n_pop_future2C <- n_distinct(pop_sub_future2C_arb_subset[pop_sub_future2C_arb_subset$overheating_risk >
    0, ])
n_pop_future4C <- n_distinct(pop_sub_future4C_arb_subset[pop_sub_future4C_arb_subset$overheating_risk >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_pop_overheating = c(n_pop_current, n_pop_future2C,
    n_pop_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_pop_overheating
Current Climate 320
Future Climate (+2C) 533
Future Climate (+4C) 1137

Number of species predicted to overheat

Vegetated substrate

# Counts for each climatic scenario
n_sp_current <- n_distinct(pop_sub_current$tip.label[pop_sub_current$overheating_risk >
    0])
n_sp_future2C <- n_distinct(pop_sub_future2C$tip.label[pop_sub_future2C$overheating_risk >
    0])
n_sp_future4C <- n_distinct(pop_sub_future4C$tip.label[pop_sub_future4C$overheating_risk >
    0])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_sp_current, n_sp_future2C,
    n_sp_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 104
Future Climate (+2C) 168
Future Climate (+4C) 391

Pond or wetland

# Counts for each climatic scenario
n_sp_current <- n_distinct(pop_pond_current$tip.label[pop_pond_current$overheating_risk >
    0])
n_sp_future2C <- n_distinct(pop_pond_future2C$tip.label[pop_pond_future2C$overheating_risk >
    0])
n_sp_future4C <- n_distinct(pop_pond_future4C$tip.label[pop_pond_future4C$overheating_risk >
    0])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_sp_current, n_sp_future2C,
    n_sp_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 0
Future Climate (+2C) 0
Future Climate (+4C) 11

Above-ground vegetation

# Counts for each climatic scenario
n_sp_current <- n_distinct(pop_arb_current$tip.label[pop_arb_current$overheating_risk >
    0])
n_sp_future2C <- n_distinct(pop_arb_future2C$tip.label[pop_arb_future2C$overheating_risk >
    0])
n_sp_future4C <- n_distinct(pop_arb_future4C$tip.label[pop_arb_future4C$overheating_risk >
    0])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_sp_current, n_sp_future2C,
    n_sp_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 13
Future Climate (+2C) 16
Future Climate (+4C) 56

Arboreal species on substrate conditions

# Counts for each climatic scenario
n_sp_current <- n_distinct(pop_sub_current_arb_subset$tip.label[pop_sub_current_arb_subset$overheating_risk >
    0])
n_sp_future2C <- n_distinct(pop_sub_future2C_arb_subset$tip.label[pop_sub_future2C_arb_subset$overheating_risk >
    0])
n_sp_future4C <- n_distinct(pop_sub_future4C_arb_subset$tip.label[pop_sub_future4C_arb_subset$overheating_risk >
    0])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_sp_current, n_sp_future2C,
    n_sp_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 15
Future Climate (+2C) 34
Future Climate (+4C) 83

Data summaries

Vegetated substrate

kable(summary(pop_sub_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:203854 Min. :-166.800 Min. :-54.500 Min. :26.17 Min. : 0.09331 Min. : 1.106 Min. : 0.2772 Min. : 3.02 Min. : 0.09331 Min. :0.000e+00 Min. :0.000e+00 Min. : 0.00000 Min. :0.000000 Min. :0.000000 Min. :0.0000000 Min. :0.000000 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.500 1st Qu.:-11.500 1st Qu.:36.70 1st Qu.: 1.18867 1st Qu.:23.116 1st Qu.: 0.7492 1st Qu.:10.71 1st Qu.: 1.18867 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.: 0.00000 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.000000 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.500 Median : 0.500 Median :38.18 Median : 2.23987 Median :26.220 Median : 0.9502 Median :12.44 Median : 2.23987 Median :0.000e+00 Median :0.000e+00 Median : 0.00000 Median :0.000000 Median :0.000000 Median :0.0000000 Median :0.000000 Median : -37.500 Median : 0.500
NA Mean : -2.776 Mean : 6.275 Mean :37.96 Mean : 2.80390 Mean :24.879 Mean : 1.1976 Mean :12.81 Mean : 2.80390 Mean :1.712e-05 Mean :6.414e-04 Mean : 0.01558 Mean :0.019349 Mean :0.004101 Mean :0.0004022 Mean :0.007339 Mean : -2.749 Mean : 6.287
NA 3rd Qu.: 43.500 3rd Qu.: 24.500 3rd Qu.:39.65 3rd Qu.: 3.90903 3rd Qu.:27.761 3rd Qu.: 1.3664 3rd Qu.:14.52 3rd Qu.: 3.90903 3rd Qu.:0.000e+00 3rd Qu.:1.870e-06 3rd Qu.: 0.00000 3rd Qu.:0.000056 3rd Qu.:0.000000 3rd Qu.:0.0000000 3rd Qu.:0.000000 3rd Qu.: 43.500 3rd Qu.: 24.500
NA Max. : 178.050 Max. : 71.500 Max. :46.38 Max. :38.05593 Max. :31.130 Max. :11.4393 Max. :36.85 Max. :38.05593 Max. :1.477e-02 Max. :1.206e-01 Max. :13.43828 Max. :3.638659 Max. :1.000000 Max. :1.0000000 Max. :2.000000 Max. : 178.500 Max. : 71.500
kable(summary(pop_sub_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:203853 Min. :-166.800 Min. :-54.500 Min. :26.34 Min. : 0.09907 Min. : 1.601 Min. : 0.2740 Min. : 2.47 Min. : 0.09907 Min. :0.00000 Min. :0.000e+00 Min. : 0.0000 Min. :0.000000 Min. :0.000000 Min. :0.00000 Min. :0.00000 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.500 1st Qu.:-11.500 1st Qu.:36.81 1st Qu.: 0.99026 1st Qu.:24.284 1st Qu.: 0.7296 1st Qu.:10.02 1st Qu.: 0.99026 1st Qu.:0.00000 1st Qu.:0.000e+00 1st Qu.: 0.0000 1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.500 Median : 0.500 Median :38.30 Median : 1.77887 Median :27.024 Median : 0.9139 Median :11.67 Median : 1.77887 Median :0.00000 Median :1.000e-08 Median : 0.0000 Median :0.000000 Median :0.000000 Median :0.00000 Median :0.00000 Median : -37.500 Median : 0.500
NA Mean : -2.776 Mean : 6.276 Mean :38.07 Mean : 2.29021 Mean :25.791 Mean : 1.1596 Mean :12.04 Mean : 2.29021 Mean :0.00003 Mean :9.717e-04 Mean : 0.0273 Mean :0.029313 Mean :0.006985 Mean :0.00101 Mean :0.01138 Mean : -2.749 Mean : 6.287
NA 3rd Qu.: 43.500 3rd Qu.: 24.500 3rd Qu.:39.76 3rd Qu.: 3.08589 3rd Qu.:28.526 3rd Qu.: 1.3001 3rd Qu.:13.63 3rd Qu.: 3.08589 3rd Qu.:0.00000 3rd Qu.:8.040e-06 3rd Qu.: 0.0000 3rd Qu.:0.000243 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.: 43.500 3rd Qu.: 24.500
NA Max. : 178.050 Max. : 71.500 Max. :46.49 Max. :42.18184 Max. :32.315 Max. :12.5131 Max. :35.89 Max. :42.18184 Max. :0.02908 Max. :1.680e-01 Max. :26.4663 Max. :5.069180 Max. :1.000000 Max. :1.00000 Max. :2.00000 Max. : 178.500 Max. : 71.500
kable(summary(pop_sub_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:203853 Min. :-166.800 Min. :-54.500 Min. :26.55 Min. : 0.09718 Min. : 1.434 Min. : 0.2730 Min. : 0.9714 Min. : 0.09718 Min. :0.000e+00 Min. :0.0000000 Min. : 0.00000 Min. : 0.000000 Min. :0.00000 Min. :0.000000 Min. :0.00000 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.500 1st Qu.:-11.500 1st Qu.:36.99 1st Qu.: 0.75769 1st Qu.:26.464 1st Qu.: 0.7322 1st Qu.: 8.5317 1st Qu.: 0.75769 1st Qu.:0.000e+00 1st Qu.:0.0000000 1st Qu.: 0.00000 1st Qu.: 0.000000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.500 Median : 0.500 Median :38.49 Median : 1.35678 Median :28.721 Median : 0.9325 Median :10.0737 Median : 1.35678 Median :0.000e+00 Median :0.0000008 Median : 0.00000 Median : 0.000025 Median :0.00000 Median :0.000000 Median :0.00000 Median : -37.500 Median : 0.500
NA Mean : -2.776 Mean : 6.276 Mean :38.25 Mean : 1.64280 Mean :27.664 Mean : 1.1794 Mean :10.4602 Mean : 1.64280 Mean :1.753e-04 Mean :0.0027500 Mean : 0.15954 Mean : 0.082958 Mean :0.02084 Mean :0.007137 Mean :0.02714 Mean : -2.749 Mean : 6.287
NA 3rd Qu.: 43.500 3rd Qu.: 24.500 3rd Qu.:39.95 3rd Qu.: 2.03537 3rd Qu.:30.174 3rd Qu.: 1.3211 3rd Qu.:11.9791 3rd Qu.: 2.03537 3rd Qu.:5.000e-08 3rd Qu.:0.0002325 3rd Qu.: 0.00005 3rd Qu.: 0.007013 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.: 43.500 3rd Qu.: 24.500
NA Max. : 178.050 Max. : 71.500 Max. :46.73 Max. :31.71911 Max. :35.135 Max. :12.0536 Max. :36.3159 Max. :31.71911 Max. :2.277e-01 Max. :0.4193273 Max. :207.17805 Max. :12.649514 Max. :1.00000 Max. :1.000000 Max. :7.00000 Max. : 178.500 Max. : 71.500

Pond or wetland

kable(summary(pop_pond_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:204809 Min. :-166.80 Min. :-54.50 Min. :26.37 Min. : 0.09255 Min. :-9.592 Min. :0.1390 Min. : 5.128 Min. : 0.09255 Min. :0.000e+00 Min. :0.000e+00 Min. :0.00e+00 Min. :0.0000000 Min. :0 Min. :0 Min. :0 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.50 1st Qu.:-11.50 1st Qu.:36.84 1st Qu.: 0.80518 1st Qu.:21.572 1st Qu.:0.3703 1st Qu.:12.467 1st Qu.: 0.80518 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.:0.00e+00 1st Qu.:0.0000000 1st Qu.:0 1st Qu.:0 1st Qu.:0 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.50 Median : 0.50 Median :38.35 Median : 1.48021 Median :24.762 Median :0.4911 Median :14.219 Median : 1.48021 Median :0.000e+00 Median :0.000e+00 Median :0.00e+00 Median :0.0000000 Median :0 Median :0 Median :0 Median : -37.500 Median : 0.500
NA Mean : -3.05 Mean : 6.43 Mean :38.14 Mean : 1.92864 Mean :23.195 Mean :0.7617 Mean :14.763 Mean : 1.92864 Mean :1.680e-10 Mean :1.530e-07 Mean :1.53e-07 Mean :0.0000046 Mean :0 Mean :0 Mean :0 Mean : -3.023 Mean : 6.441
NA 3rd Qu.: 42.50 3rd Qu.: 25.50 3rd Qu.:39.86 3rd Qu.: 2.42313 3rd Qu.:26.310 3rd Qu.:0.9840 3rd Qu.:16.490 3rd Qu.: 2.42313 3rd Qu.:0.000e+00 3rd Qu.:0.000e+00 3rd Qu.:0.00e+00 3rd Qu.:0.0000000 3rd Qu.:0 3rd Qu.:0 3rd Qu.:0 3rd Qu.: 42.500 3rd Qu.: 25.500
NA Max. : 178.05 Max. : 71.50 Max. :46.71 Max. :35.52709 Max. :30.137 Max. :5.8776 Max. :43.618 Max. :35.52709 Max. :1.813e-05 Max. :4.258e-03 Max. :1.65e-02 Max. :0.1284366 Max. :0 Max. :0 Max. :0 Max. : 178.500 Max. : 71.500
kable(summary(pop_pond_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:204808 Min. :-166.80 Min. :-54.50 Min. :26.55 Min. : 0.09301 Min. :-8.232 Min. :0.1393 Min. : 4.31 Min. : 0.09301 Min. :0.000e+00 Min. :0.000e+00 Min. :0.0000000 Min. :0.0000000 Min. :0 Min. :0 Min. :0 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.50 1st Qu.:-11.50 1st Qu.:36.98 1st Qu.: 0.72129 1st Qu.:22.779 1st Qu.:0.3784 1st Qu.:11.59 1st Qu.: 0.72129 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.:0.0000000 1st Qu.:0.0000000 1st Qu.:0 1st Qu.:0 1st Qu.:0 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.50 Median : 0.50 Median :38.49 Median : 1.28760 Median :25.859 Median :0.5097 Median :13.32 Median : 1.28760 Median :0.000e+00 Median :0.000e+00 Median :0.0000000 Median :0.0000000 Median :0 Median :0 Median :0 Median : -37.500 Median : 0.500
NA Mean : -3.05 Mean : 6.43 Mean :38.28 Mean : 1.57883 Mean :24.349 Mean :0.7727 Mean :13.85 Mean : 1.57883 Mean :9.700e-09 Mean :1.831e-06 Mean :0.0000088 Mean :0.0000552 Mean :0 Mean :0 Mean :0 Mean : -3.023 Mean : 6.441
NA 3rd Qu.: 42.50 3rd Qu.: 25.50 3rd Qu.:40.00 3rd Qu.: 1.90669 3rd Qu.:27.407 3rd Qu.:0.9844 3rd Qu.:15.55 3rd Qu.: 1.90669 3rd Qu.:0.000e+00 3rd Qu.:0.000e+00 3rd Qu.:0.0000000 3rd Qu.:0.0000000 3rd Qu.:0 3rd Qu.:0 3rd Qu.:0 3rd Qu.: 42.500 3rd Qu.: 25.500
NA Max. : 178.05 Max. : 71.50 Max. :46.90 Max. :32.96062 Max. :31.782 Max. :6.0906 Max. :42.57 Max. :32.96062 Max. :8.619e-04 Max. :2.934e-02 Max. :0.7842886 Max. :0.8852190 Max. :0 Max. :0 Max. :0 Max. : 178.500 Max. : 71.500
kable(summary(pop_pond_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:204808 Min. :-166.80 Min. :-54.50 Min. :26.78 Min. : 0.0937 Min. :-5.07 Min. :0.1369 Min. : 2.682 Min. : 0.0937 Min. :0.000e+00 Min. :0.000e+00 Min. : 0.000000 Min. :0.000000 Min. :0.0000000 Min. :0.00e+00 Min. :0 Min. :-166.500 Min. :-54.500
Class :character 1st Qu.: -66.50 1st Qu.:-11.50 1st Qu.:37.19 1st Qu.: 0.8691 1st Qu.:24.69 1st Qu.:0.3980 1st Qu.:10.144 1st Qu.: 0.8691 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.: 0.000000 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.00e+00 1st Qu.:0 1st Qu.: -66.500 1st Qu.:-11.500
Mode :character Median : -37.50 Median : 0.50 Median :38.70 Median : 1.4866 Median :27.58 Median :0.5530 Median :11.868 Median : 1.4866 Median :0.000e+00 Median :0.000e+00 Median : 0.000000 Median :0.000000 Median :0.0000000 Median :0.00e+00 Median :0 Median : -37.500 Median : 0.500
NA Mean : -3.05 Mean : 6.43 Mean :38.50 Mean : 1.7275 Mean :26.22 Mean :0.7995 Mean :12.375 Mean : 1.7275 Mean :1.450e-06 Mean :5.916e-05 Mean : 0.001316 Mean :0.001785 Mean :0.0002734 Mean :5.86e-05 Mean :0 Mean : -3.023 Mean : 6.441
NA 3rd Qu.: 42.50 3rd Qu.: 25.50 3rd Qu.:40.23 3rd Qu.: 2.1799 3rd Qu.:29.16 3rd Qu.:1.0338 3rd Qu.:14.097 3rd Qu.: 2.1799 3rd Qu.:0.000e+00 3rd Qu.:0.000e+00 3rd Qu.: 0.000000 3rd Qu.:0.000000 3rd Qu.:0.0000000 3rd Qu.:0.00e+00 3rd Qu.:0 3rd Qu.: 42.500 3rd Qu.: 25.500
NA Max. : 178.05 Max. : 71.50 Max. :47.23 Max. :29.0510 Max. :34.55 Max. :6.6509 Max. :39.834 Max. :29.0510 Max. :3.208e-02 Max. :1.762e-01 Max. :29.195841 Max. :5.315933 Max. :1.0000000 Max. :1.00e+00 Max. :0 Max. : 178.500 Max. : 71.500

Above-ground vegetation

kable(summary(pop_arb_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:56210 Min. :-158.20 Min. :-51.950 Min. :29.03 Min. : 0.1771 Min. : 2.168 Min. :0.2319 Min. : 3.699 Min. : 0.1771 Min. :0.000e+00 Min. :0.000e+00 Min. :0.000000 Min. :0.0000000 Min. :0.000000 Min. :0.0000000 Min. :0.000000 Min. :-158.50 Min. :-51.500
Class :character 1st Qu.: -66.50 1st Qu.:-12.500 1st Qu.:37.77 1st Qu.: 1.5931 1st Qu.:24.873 1st Qu.:0.6074 1st Qu.:11.398 1st Qu.: 1.5931 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.000000 1st Qu.: -66.50 1st Qu.:-12.500
Mode :character Median : -51.50 Median : -4.500 Median :39.33 Median : 2.8114 Median :26.559 Median :0.7435 Median :12.757 Median : 2.8114 Median :0.000e+00 Median :0.000e+00 Median :0.000000 Median :0.0000000 Median :0.000000 Median :0.0000000 Median :0.000000 Median : -51.50 Median : -4.500
NA Mean : -17.94 Mean : -2.646 Mean :38.82 Mean : 3.2586 Mean :25.815 Mean :0.8264 Mean :12.875 Mean : 3.2586 Mean :1.072e-05 Mean :4.440e-04 Mean :0.009754 Mean :0.0133929 Mean :0.002704 Mean :0.0001245 Mean :0.005088 Mean : -17.91 Mean : -2.633
NA 3rd Qu.: 22.50 3rd Qu.: 4.500 3rd Qu.:40.16 3rd Qu.: 4.3693 3rd Qu.:27.467 3rd Qu.:0.9189 3rd Qu.:14.168 3rd Qu.: 4.3693 3rd Qu.:0.000e+00 3rd Qu.:1.700e-07 3rd Qu.:0.000000 3rd Qu.:0.0000051 3rd Qu.:0.000000 3rd Qu.:0.0000000 3rd Qu.:0.000000 3rd Qu.: 22.50 3rd Qu.: 4.500
NA Max. : 177.05 Max. : 57.500 Max. :46.37 Max. :27.4362 Max. :29.827 Max. :9.2086 Max. :33.467 Max. :27.4362 Max. :6.208e-03 Max. :7.854e-02 Max. :5.649007 Max. :2.3693754 Max. :1.000000 Max. :1.0000000 Max. :1.000000 Max. : 177.50 Max. : 57.500
kable(summary(pop_arb_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:56210 Min. :-158.20 Min. :-51.950 Min. :29.19 Min. : 0.1792 Min. : 1.844 Min. :0.2266 Min. : 3.111 Min. : 0.1792 Min. :0.000e+00 Min. :0.000e+00 Min. :0.00000 Min. :0.0000000 Min. :0.000000 Min. :0.0000000 Min. :0.000000 Min. :-158.50 Min. :-51.500
Class :character 1st Qu.: -66.50 1st Qu.:-12.500 1st Qu.:37.87 1st Qu.: 1.2478 1st Qu.:25.659 1st Qu.:0.6086 1st Qu.:10.727 1st Qu.: 1.2478 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.:0.00000 1st Qu.:0.0000000 1st Qu.:0.000000 1st Qu.:0.0000000 1st Qu.:0.000000 1st Qu.: -66.50 1st Qu.:-12.500
Mode :character Median : -51.50 Median : -4.500 Median :39.44 Median : 2.1585 Median :27.250 Median :0.7280 Median :12.067 Median : 2.1585 Median :0.000e+00 Median :0.000e+00 Median :0.00000 Median :0.0000000 Median :0.000000 Median :0.0000000 Median :0.000000 Median : -51.50 Median : -4.500
NA Mean : -17.94 Mean : -2.646 Mean :38.93 Mean : 2.6312 Mean :26.632 Mean :0.8029 Mean :12.170 Mean : 2.6312 Mean :1.861e-05 Mean :6.503e-04 Mean :0.01693 Mean :0.0196187 Mean :0.005035 Mean :0.0003736 Mean :0.008095 Mean : -17.91 Mean : -2.633
NA 3rd Qu.: 22.50 3rd Qu.: 4.500 3rd Qu.:40.26 3rd Qu.: 3.4901 3rd Qu.:28.262 3rd Qu.:0.8852 3rd Qu.:13.459 3rd Qu.: 3.4901 3rd Qu.:0.000e+00 3rd Qu.:7.100e-07 3rd Qu.:0.00000 3rd Qu.:0.0000215 3rd Qu.:0.000000 3rd Qu.:0.0000000 3rd Qu.:0.000000 3rd Qu.: 22.50 3rd Qu.: 4.500
NA Max. : 177.05 Max. : 57.500 Max. :46.49 Max. :24.9583 Max. :30.435 Max. :9.7651 Max. :33.790 Max. :24.9583 Max. :9.752e-03 Max. :9.827e-02 Max. :8.87437 Max. :2.9644271 Max. :1.000000 Max. :1.0000000 Max. :1.000000 Max. : 177.50 Max. : 57.500
kable(summary(pop_arb_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
tip.label lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se TSM TSM_se overheating_probability overheating_probability_se overheating_days overheating_days_se overheating_risk overheating_risk_strict consecutive_overheating_days lon lat
Length:56210 Min. :-158.20 Min. :-51.950 Min. :29.38 Min. : 0.1832 Min. : 2.172 Min. : 0.2195 Min. : 1.747 Min. : 0.1832 Min. :0.000e+00 Min. :0.000e+00 Min. : 0.00000 Min. :0.00000 Min. :0.00000 Min. :0.000000 Min. :0.00000 Min. :-158.50 Min. :-51.500
Class :character 1st Qu.: -66.50 1st Qu.:-12.500 1st Qu.:38.01 1st Qu.: 0.8147 1st Qu.:27.265 1st Qu.: 0.6233 1st Qu.: 9.278 1st Qu.: 0.8147 1st Qu.:0.000e+00 1st Qu.:0.000e+00 1st Qu.: 0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.000000 1st Qu.:0.00000 1st Qu.: -66.50 1st Qu.:-12.500
Mode :character Median : -51.50 Median : -4.500 Median :39.62 Median : 1.4328 Median :28.675 Median : 0.7425 Median :10.580 Median : 1.4328 Median :0.000e+00 Median :2.000e-08 Median : 0.00000 Median :0.00000 Median :0.00000 Median :0.000000 Median :0.00000 Median : -51.50 Median : -4.500
NA Mean : -17.94 Mean : -2.646 Mean :39.10 Mean : 1.8006 Mean :28.325 Mean : 0.8210 Mean :10.696 Mean : 1.8006 Mean :8.602e-05 Mean :1.551e-03 Mean : 0.07828 Mean :0.04678 Mean :0.01331 Mean :0.004661 Mean :0.01784 Mean : -17.91 Mean : -2.633
NA 3rd Qu.: 22.50 3rd Qu.: 4.500 3rd Qu.:40.44 3rd Qu.: 2.1686 3rd Qu.:30.069 3rd Qu.: 0.9295 3rd Qu.:12.030 3rd Qu.: 2.1686 3rd Qu.:0.000e+00 3rd Qu.:1.492e-05 3rd Qu.: 0.00000 3rd Qu.:0.00045 3rd Qu.:0.00000 3rd Qu.:0.000000 3rd Qu.:0.00000 3rd Qu.: 22.50 3rd Qu.: 4.500
NA Max. : 177.05 Max. : 57.500 Max. :46.72 Max. :21.8019 Max. :33.787 Max. :11.7245 Max. :36.002 Max. :21.8019 Max. :8.370e-02 Max. :2.769e-01 Max. :76.16597 Max. :8.35410 Max. :1.00000 Max. :1.000000 Max. :3.00000 Max. : 177.50 Max. : 57.500

Community-level data

Overview of the datasets

Vegetated substrate

Current climate
# Load data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")

kable(head(community_sub_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 33.17221 0.3408237 8.015516 2.081530 24.45919 0.3408237 1 0 0 0 0 0 0
-165.5 60.5 33.32319 0.3052863 9.236246 1.497526 23.64718 0.3052863 1 0 0 0 0 0 0
-165.5 67.5 33.30512 0.3141322 8.820103 2.338195 23.54795 0.3141322 1 0 0 0 0 0 0
-165.5 68.5 33.23857 0.3288506 8.430455 2.399227 23.86126 0.3288506 1 0 0 0 0 0 0
-164.5 59.5 33.40008 0.2889095 9.843303 1.536170 23.09577 0.2889095 1 0 0 0 0 0 0
-164.5 60.5 33.39810 0.2893413 9.825714 1.537561 23.11138 0.2893413 1 0 0 0 0 0 0
Future climate (+2C)
# Load data
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")

kable(head(community_sub_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 33.34969 0.3024569 9.128464 2.027997 23.48372 0.3024569 1 0 0 0 0 0 0
-165.5 60.5 33.47315 0.2733130 10.178880 1.475962 22.82974 0.2733130 1 0 0 0 0 0 0
-165.5 67.5 33.48473 0.2762448 9.927426 2.287983 22.56154 0.2762448 1 0 0 0 0 0 0
-165.5 68.5 33.41275 0.2916277 9.511248 2.339423 22.90391 0.2916277 1 0 0 0 0 0 0
-164.5 59.5 33.55198 0.2569316 10.796484 1.522394 22.26990 0.2569316 1 0 0 0 0 0 0
-164.5 60.5 33.55141 0.2570616 10.782023 1.521070 22.28421 0.2570616 1 0 0 0 0 0 0
Future climate (+4C)
# Load data
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

kable(head(community_sub_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 33.68787 0.2352213 11.41588 1.810334 21.46671 0.2352213 1 0 0 0 0 0 0
-165.5 60.5 33.75261 0.2165792 11.95603 1.445371 21.28579 0.2165792 1 0 0 0 0 0 0
-165.5 67.5 33.81986 0.2118906 12.14303 2.118961 20.59627 0.2118906 1 0 0 0 0 0 0
-165.5 68.5 33.74000 0.2276859 11.68170 2.139558 20.97120 0.2276859 1 0 0 0 0 0 0
-164.5 59.5 33.83358 0.2013136 12.57430 1.498550 20.72771 0.2013136 1 0 0 0 0 0 0
-164.5 60.5 33.83216 0.2016450 12.55591 1.499213 20.74163 0.2016450 1 0 0 0 0 0 0

Pond or wetland

Current climate
# Load data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")

kable(head(community_pond_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 32.56957 0.4723818 3.327308 1.394739 28.94239 0.4723818 1 0 0 0 0 0 0
-165.5 60.5 33.01829 0.3713634 6.260043 1.519877 26.36852 0.3713634 1 0 0 0 0 0 0
-165.5 67.5 32.63804 0.4589844 3.562022 1.756225 28.54950 0.4589844 1 0 0 0 0 0 0
-165.5 68.5 32.52784 0.4836071 2.872569 1.713213 29.18338 0.4836071 1 0 0 0 0 0 0
-164.5 59.5 33.14150 0.3441268 7.080617 1.482238 25.65416 0.3441268 1 0 0 0 0 0 0
-164.5 60.5 33.13719 0.3450720 7.052383 1.483242 25.67913 0.3450720 1 0 0 0 0 0 0
Future climate (+2C)
# Load data
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")

kable(head(community_pond_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 32.90685 0.3957764 5.583626 1.323727 27.01520 0.3957764 1 0 0 0 0 0 0
-165.5 60.5 33.27285 0.3153421 7.939282 1.461537 24.90612 0.3153421 1 0 0 0 0 0 0
-165.5 67.5 32.98002 0.3812016 5.895649 1.564385 26.59331 0.3812016 1 0 0 0 0 0 0
-165.5 68.5 32.85766 0.4086489 5.074816 1.608037 27.29979 0.4086489 1 0 0 0 0 0 0
-164.5 59.5 33.39119 0.2900648 8.705233 1.453285 24.22281 0.2900648 1 0 0 0 0 0 0
-164.5 60.5 33.39359 0.2896131 8.714851 1.459325 24.20951 0.2896131 1 0 0 0 0 0 0
Future climate (+4C)
# Load data
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

kable(head(community_pond_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-166.5 68.5 33.42968 0.2800353 9.143732 1.076592 24.00849 0.2800353 1 0 0 0 0 0 0
-165.5 60.5 33.68452 0.2292832 10.631329 1.387111 22.54070 0.2292832 1 0 0 0 0 0 0
-165.5 67.5 33.49314 0.2685735 9.384212 1.315300 23.64491 0.2685735 1 0 0 0 0 0 0
-165.5 68.5 33.36912 0.2948686 8.573314 1.331719 24.35341 0.2948686 1 0 0 0 0 0 0
-164.5 59.5 33.80019 0.2070758 11.374784 1.395492 21.87930 0.2070758 1 0 0 0 0 0 0
-164.5 60.5 33.80809 0.2057318 11.419378 1.399156 21.83365 0.2057318 1 0 0 0 0 0 0

Above-ground vegetation

Current climate
# Load data
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")

kable(head(community_arb_current), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-158.5 21.5 35.64807 2.9200780 24.24569 0.6513578 11.15609 2.9200780 1 0 0 0 0 0 0
-157.5 21.5 37.88426 2.1274737 24.44356 0.6767201 13.17293 2.1274737 2 0 0 0 0 0 0
-133.5 53.5 34.99025 0.4919342 12.38168 1.0949775 22.27664 0.4919342 1 0 0 0 0 0 0
-133.5 54.5 35.03701 0.4603092 12.77450 1.0758568 21.93629 0.4603092 1 0 0 0 0 0 0
-132.5 53.5 34.91539 0.5439662 11.96129 1.1790289 22.61334 0.5439662 1 0 0 0 0 0 0
-132.5 54.5 35.01083 0.4779669 12.58975 1.0834335 22.09295 0.4779669 1 0 0 0 0 0 0
Future climate (+2C)
# Load data
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")

kable(head(community_arb_future2C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-158.5 21.5 35.72397 2.5078995 24.72602 0.6405922 10.71095 2.5078995 1 0 0 0 0 0 0
-157.5 21.5 37.91964 1.7500296 25.01383 0.6657816 12.58989 1.7500296 2 0 0 0 0 0 0
-133.5 53.5 35.07396 0.4368020 13.06147 1.0877487 21.66623 0.4368020 1 0 0 0 0 0 0
-133.5 54.5 35.12885 0.4022496 13.52744 1.0759089 21.25936 0.4022496 1 0 0 0 0 0 0
-132.5 53.5 35.01423 0.4761303 12.74279 1.1478999 21.92006 0.4761303 1 0 0 0 0 0 0
-132.5 54.5 35.09755 0.4217223 13.29303 1.0793997 21.46185 0.4217223 1 0 0 0 0 0 0
Future climate (+4C)
# Load data
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

kable(head(community_arb_future4C), "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
lon lat community_CTmax community_CTmax_se community_max_temp community_max_temp_se community_TSM community_TSM_se n_species n_species_overheating proportion_species_overheating proportion_species_overheating_se n_species_overheating_strict proportion_species_overheating_strict proportion_species_overheating_se_strict
-158.5 21.5 35.87435 1.7306178 25.66557 0.6282421 9.814141 1.7306178 1 0 0 0 0 0 0
-157.5 21.5 38.01973 1.1118923 26.09707 0.6480026 11.501296 1.1118923 2 0 0 0 0 0 0
-133.5 53.5 35.22545 0.3476055 14.32490 1.0884031 20.550408 0.3476055 1 0 0 0 0 0 0
-133.5 54.5 35.29009 0.3158709 14.91988 1.0852557 20.049704 0.3158709 1 0 0 0 0 0 0
-132.5 53.5 35.16235 0.3832731 13.95471 1.1517807 20.828830 0.3832731 1 0 0 0 0 0 0
-132.5 54.5 35.25330 0.3332472 14.60744 1.0845907 20.309158 0.3332472 1 0 0 0 0 0 0

Number of communities with overheating species

Vegetated substrate

# Load data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_commu_current <- n_distinct(community_sub_current[community_sub_current$n_species_overheating >
    0, ])
n_commu_future2C <- n_distinct(community_sub_future2C[community_sub_future2C$n_species_overheating >
    0, ])
n_commu_future4C <- n_distinct(community_sub_future4C[community_sub_future4C$n_species_overheating >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_commu_current, n_commu_future2C,
    n_commu_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 253
Future Climate (+2C) 426
Future Climate (+4C) 1328

Pond or wetland

# Load data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_commu_current <- n_distinct(community_pond_current[community_pond_current$n_species_overheating >
    0, ])
n_commu_future2C <- n_distinct(community_pond_future2C[community_pond_future2C$n_species_overheating >
    0, ])
n_commu_future4C <- n_distinct(community_pond_future4C[community_pond_future4C$n_species_overheating >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_commu_current, n_commu_future2C,
    n_commu_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 0
Future Climate (+2C) 0
Future Climate (+4C) 48

Above-ground vegetation

# Load data
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

# Counts for each climatic scenario
n_commu_current <- n_distinct(community_arb_current[community_arb_current$n_species_overheating >
    0, ])
n_commu_future2C <- n_distinct(community_arb_future2C[community_arb_future2C$n_species_overheating >
    0, ])
n_commu_future4C <- n_distinct(community_arb_future4C[community_arb_future4C$n_species_overheating >
    0, ])

results_summary <- data.frame(Climate_Scenario = c("Current Climate", "Future Climate (+2C)",
    "Future Climate (+4C)"), Number_sp_overheating = c(n_commu_current, n_commu_future2C,
    n_commu_future4C))

kable(results_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "250px")
Climate_Scenario Number_sp_overheating
Current Climate 74
Future Climate (+2C) 111
Future Climate (+4C) 285

Data summaries

Vegetated substrate

summary(community_sub_current)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.26   Min.   : 0.1213   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:34.98   1st Qu.: 0.5730   
##  Median :  30.50   Median : 33.50   Median :36.74   Median : 1.1903   
##  Mean   :  23.33   Mean   : 26.42   Mean   :36.65   Mean   : 1.5986   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:38.68   3rd Qu.: 2.0408   
##  Max.   : 178.50   Max.   : 71.50   Max.   :45.43   Max.   :18.0169   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 1.106     Min.   : 0.2772       Min.   : 7.326   Min.   : 0.1213  
##  1st Qu.:16.677     1st Qu.: 0.9795       1st Qu.:12.324   1st Qu.: 0.5730  
##  Median :21.426     Median : 1.5833       Median :14.791   Median : 1.1903  
##  Mean   :20.921     Mean   : 1.8187       Mean   :15.191   Mean   : 1.5986  
##  3rd Qu.:26.198     3rd Qu.: 2.4244       3rd Qu.:17.302   3rd Qu.: 2.0408  
##  Max.   :31.130     Max.   :11.4393       Max.   :33.523   Max.   :18.0169  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   : 0.00000      Min.   :0.000000              
##  1st Qu.:  2.00   1st Qu.: 0.00000      1st Qu.:0.000000              
##  Median :  7.00   Median : 0.00000      Median :0.000000              
##  Mean   : 14.47   Mean   : 0.05933      Mean   :0.002082              
##  3rd Qu.: 19.00   3rd Qu.: 0.00000      3rd Qu.:0.000000              
##  Max.   :158.00   Max.   :18.00000      Max.   :1.000000              
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.000000                  Min.   :0.000000            
##  1st Qu.:0.000000                  1st Qu.:0.000000            
##  Median :0.000000                  Median :0.000000            
##  Mean   :0.004606                  Mean   :0.005819            
##  3rd Qu.:0.000000                  3rd Qu.:0.000000            
##  Max.   :0.707107                  Max.   :4.000000            
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.000e+00                     Min.   :0.0000000                       
##  1st Qu.:0.000e+00                     1st Qu.:0.0000000                       
##  Median :0.000e+00                     Median :0.0000000                       
##  Mean   :8.284e-05                     Mean   :0.0005369                       
##  3rd Qu.:0.000e+00                     3rd Qu.:0.0000000                       
##  Max.   :3.846e-02                     Max.   :0.1932390
summary(community_sub_future2C)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.32   Min.   : 0.1167   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:35.13   1st Qu.: 0.5223   
##  Median :  30.50   Median : 33.50   Median :36.93   Median : 0.9993   
##  Mean   :  23.33   Mean   : 26.43   Mean   :36.80   Mean   : 1.3283   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:38.86   3rd Qu.: 1.7352   
##  Max.   : 178.50   Max.   : 71.50   Max.   :45.35   Max.   :16.8344   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 1.601     Min.   : 0.2740       Min.   : 6.862   Min.   : 0.1167  
##  1st Qu.:17.813     1st Qu.: 0.9301       1st Qu.:11.512   1st Qu.: 0.5223  
##  Median :23.010     Median : 1.5320       Median :13.584   Median : 0.9993  
##  Mean   :22.035     Mean   : 1.7857       Mean   :14.298   Mean   : 1.3283  
##  3rd Qu.:27.173     3rd Qu.: 2.3963       3rd Qu.:16.419   3rd Qu.: 1.7352  
##  Max.   :32.315     Max.   :12.5131       Max.   :32.257   Max.   :16.8344  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   : 0.0000       Min.   :0.000000              
##  1st Qu.:  2.00   1st Qu.: 0.0000       1st Qu.:0.000000              
##  Median :  7.00   Median : 0.0000       Median :0.000000              
##  Mean   : 14.47   Mean   : 0.1011       Mean   :0.003736              
##  3rd Qu.: 19.00   3rd Qu.: 0.0000       3rd Qu.:0.000000              
##  Max.   :158.00   Max.   :20.0000       Max.   :1.000000              
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.00000                   Min.   :0.00000             
##  1st Qu.:0.00000                   1st Qu.:0.00000             
##  Median :0.00000                   Median :0.00000             
##  Mean   :0.00789                   Mean   :0.01462             
##  3rd Qu.:0.00000                   3rd Qu.:0.00000             
##  Max.   :0.57735                   Max.   :8.00000             
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.0000000                     Min.   :0.000000                        
##  1st Qu.:0.0000000                     1st Qu.:0.000000                        
##  Median :0.0000000                     Median :0.000000                        
##  Mean   :0.0002319                     Mean   :0.001232                        
##  3rd Qu.:0.0000000                     3rd Qu.:0.000000                        
##  Max.   :0.1666667                     Max.   :0.408248
summary(community_sub_future4C)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.40   Min.   : 0.1191   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:35.39   1st Qu.: 0.4885   
##  Median :  30.50   Median : 33.50   Median :37.31   Median : 0.8511   
##  Mean   :  23.33   Mean   : 26.43   Mean   :37.07   Mean   : 1.0712   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:39.17   3rd Qu.: 1.4807   
##  Max.   : 178.50   Max.   : 71.50   Max.   :45.32   Max.   :15.3900   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 1.434     Min.   : 0.2730       Min.   : 4.053   Min.   : 0.1191  
##  1st Qu.:19.971     1st Qu.: 0.9353       1st Qu.: 9.834   1st Qu.: 0.4885  
##  Median :25.568     Median : 1.5527       Median :11.754   Median : 0.8511  
##  Mean   :24.226     Mean   : 1.8062       Mean   :12.587   Mean   : 1.0712  
##  3rd Qu.:29.080     3rd Qu.: 2.4510       3rd Qu.:14.868   3rd Qu.: 1.4807  
##  Max.   :35.135     Max.   :12.0536       Max.   :35.323   Max.   :15.3900  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   : 0.0000       Min.   :0.00000               
##  1st Qu.:  2.00   1st Qu.: 0.0000       1st Qu.:0.00000               
##  Median :  7.00   Median : 0.0000       Median :0.00000               
##  Mean   : 14.47   Mean   : 0.3015       Mean   :0.01797               
##  3rd Qu.: 19.00   3rd Qu.: 0.0000       3rd Qu.:0.00000               
##  Max.   :158.00   Max.   :37.0000       Max.   :1.00000               
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.00000                   Min.   : 0.0000             
##  1st Qu.:0.00000                   1st Qu.: 0.0000             
##  Median :0.00000                   Median : 0.0000             
##  Mean   :0.02985                   Mean   : 0.1033             
##  3rd Qu.:0.00000                   3rd Qu.: 0.0000             
##  Max.   :0.70711                   Max.   :15.0000             
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.000000                      Min.   :0.0000                          
##  1st Qu.:0.000000                      1st Qu.:0.0000                          
##  Median :0.000000                      Median :0.0000                          
##  Mean   :0.004919                      Mean   :0.0105                          
##  3rd Qu.:0.000000                      3rd Qu.:0.0000                          
##  Max.   :1.000000                      Max.   :0.7071

Pond or wetland

summary(community_pond_current)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.07   Min.   : 0.1182   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:35.08   1st Qu.: 0.5134   
##  Median :  30.50   Median : 33.50   Median :36.95   Median : 0.9164   
##  Mean   :  23.32   Mean   : 26.42   Mean   :36.82   Mean   : 1.3063   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:38.99   3rd Qu.: 1.7381   
##  Max.   : 178.50   Max.   : 71.50   Max.   :45.27   Max.   :19.1743   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   :-9.592     Min.   :0.1390        Min.   : 8.137   Min.   : 0.1182  
##  1st Qu.:13.874     1st Qu.:0.5659        1st Qu.:13.941   1st Qu.: 0.5134  
##  Median :18.979     Median :1.3682        Median :17.292   Median : 0.9164  
##  Mean   :18.785     Mean   :1.4041        Mean   :17.590   Mean   : 1.3063  
##  3rd Qu.:24.943     3rd Qu.:2.0225        3rd Qu.:20.157   3rd Qu.: 1.7381  
##  Max.   :30.137     Max.   :5.8776        Max.   :43.526   Max.   :19.1743  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   :0             Min.   :0                     
##  1st Qu.:  2.00   1st Qu.:0             1st Qu.:0                     
##  Median :  7.00   Median :0             Median :0                     
##  Mean   : 14.53   Mean   :0             Mean   :0                     
##  3rd Qu.: 19.00   3rd Qu.:0             3rd Qu.:0                     
##  Max.   :158.00   Max.   :0             Max.   :0                     
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0                         Min.   :0                   
##  1st Qu.:0                         1st Qu.:0                   
##  Median :0                         Median :0                   
##  Mean   :0                         Mean   :0                   
##  3rd Qu.:0                         3rd Qu.:0                   
##  Max.   :0                         Max.   :0                   
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0                             Min.   :0                               
##  1st Qu.:0                             1st Qu.:0                               
##  Median :0                             Median :0                               
##  Mean   :0                             Mean   :0                               
##  3rd Qu.:0                             3rd Qu.:0                               
##  Max.   :0                             Max.   :0
summary(community_pond_future2C)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.22   Min.   : 0.1155   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:35.28   1st Qu.: 0.4899   
##  Median :  30.50   Median : 33.50   Median :37.18   Median : 0.8535   
##  Mean   :  23.32   Mean   : 26.43   Mean   :37.02   Mean   : 1.1815   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:39.21   3rd Qu.: 1.5879   
##  Max.   : 178.50   Max.   : 71.50   Max.   :45.56   Max.   :17.9086   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   :-8.232     Min.   :0.1393        Min.   : 7.405   Min.   : 0.1155  
##  1st Qu.:15.219     1st Qu.:0.5907        1st Qu.:13.088   1st Qu.: 0.4899  
##  Median :20.217     Median :1.3659        Median :16.328   Median : 0.8535  
##  Mean   :20.098     Mean   :1.4214        Mean   :16.624   Mean   : 1.1815  
##  3rd Qu.:26.223     3rd Qu.:2.0425        3rd Qu.:19.167   3rd Qu.: 1.5879  
##  Max.   :31.782     Max.   :6.0906        Max.   :42.484   Max.   :17.9086  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   :0             Min.   :0                     
##  1st Qu.:  2.00   1st Qu.:0             1st Qu.:0                     
##  Median :  7.00   Median :0             Median :0                     
##  Mean   : 14.53   Mean   :0             Mean   :0                     
##  3rd Qu.: 19.00   3rd Qu.:0             3rd Qu.:0                     
##  Max.   :158.00   Max.   :0             Max.   :0                     
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0                         Min.   :0                   
##  1st Qu.:0                         1st Qu.:0                   
##  Median :0                         Median :0                   
##  Mean   :0                         Mean   :0                   
##  3rd Qu.:0                         3rd Qu.:0                   
##  Max.   :0                         Max.   :0                   
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0                             Min.   :0                               
##  1st Qu.:0                             1st Qu.:0                               
##  Median :0                             Median :0                               
##  Mean   :0                             Mean   :0                               
##  3rd Qu.:0                             3rd Qu.:0                               
##  Max.   :0                             Max.   :0
summary(community_pond_future4C)
##       lon               lat         community_CTmax community_CTmax_se
##  Min.   :-166.50   Min.   :-54.50   Min.   :29.36   Min.   : 0.1214   
##  1st Qu.: -61.50   1st Qu.:  0.50   1st Qu.:35.61   1st Qu.: 0.5146   
##  Median :  30.50   Median : 33.50   Median :37.56   Median : 0.9767   
##  Mean   :  23.32   Mean   : 26.43   Mean   :37.32   Mean   : 1.2968   
##  3rd Qu.: 102.50   3rd Qu.: 53.50   3rd Qu.:39.45   3rd Qu.: 1.6013   
##  Max.   : 178.50   Max.   : 71.50   Max.   :46.05   Max.   :16.0988   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   :-5.07      Min.   :0.1369        Min.   : 4.432   Min.   : 0.1214  
##  1st Qu.:17.48      1st Qu.:0.6343        1st Qu.:11.620   1st Qu.: 0.5146  
##  Median :22.34      Median :1.3655        Median :14.912   Median : 0.9767  
##  Mean   :22.21      Mean   :1.4339        Mean   :15.091   Mean   : 1.2968  
##  3rd Qu.:28.09      3rd Qu.:2.0254        3rd Qu.:17.706   3rd Qu.: 1.6013  
##  Max.   :34.55      Max.   :6.6509        Max.   :39.749   Max.   :16.0988  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   :  1.00   Min.   :0.000000      Min.   :0.0000000             
##  1st Qu.:  2.00   1st Qu.:0.000000      1st Qu.:0.0000000             
##  Median :  7.00   Median :0.000000      Median :0.0000000             
##  Mean   : 14.53   Mean   :0.003974      Mean   :0.0002084             
##  3rd Qu.: 19.00   3rd Qu.:0.000000      3rd Qu.:0.0000000             
##  Max.   :158.00   Max.   :2.000000      Max.   :0.2857143             
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.0000000                 Min.   :0.0000000           
##  1st Qu.:0.0000000                 1st Qu.:0.0000000           
##  Median :0.0000000                 Median :0.0000000           
##  Mean   :0.0007117                 Mean   :0.0008516           
##  3rd Qu.:0.0000000                 3rd Qu.:0.0000000           
##  Max.   :0.4879500                 Max.   :2.0000000           
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.000e+00                     Min.   :0.0000000                       
##  1st Qu.:0.000e+00                     1st Qu.:0.0000000                       
##  Median :0.000e+00                     Median :0.0000000                       
##  Mean   :7.511e-05                     Mean   :0.0002021                       
##  3rd Qu.:0.000e+00                     3rd Qu.:0.0000000                       
##  Max.   :2.857e-01                     Max.   :0.4879500

Above-ground vegetation

summary(community_arb_current)
##       lon               lat          community_CTmax community_CTmax_se
##  Min.   :-158.50   Min.   :-51.500   Min.   :31.27   Min.   : 0.2136   
##  1st Qu.: -61.50   1st Qu.:-12.500   1st Qu.:37.94   1st Qu.: 0.8569   
##  Median :  17.50   Median :  4.500   Median :39.05   Median : 1.6694   
##  Mean   :  16.65   Mean   :  7.019   Mean   :38.76   Mean   : 2.2242   
##  3rd Qu.:  99.50   3rd Qu.: 27.500   3rd Qu.:39.59   3rd Qu.: 3.1685   
##  Max.   : 177.50   Max.   : 57.500   Max.   :45.59   Max.   :19.2463   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 2.168     Min.   :0.2319        Min.   : 7.765   Min.   : 0.2136  
##  1st Qu.:22.172     1st Qu.:0.6832        1st Qu.:12.074   1st Qu.: 0.8569  
##  Median :25.430     Median :0.9272        Median :13.608   Median : 1.6694  
##  Mean   :24.242     Mean   :1.1104        Mean   :14.252   Mean   : 2.2242  
##  3rd Qu.:27.046     3rd Qu.:1.3950        3rd Qu.:16.044   3rd Qu.: 3.1685  
##  Max.   :29.827     Max.   :9.2086        Max.   :33.467   Max.   :19.2463  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   : 1.000   Min.   :0.00000       Min.   :0.0000000             
##  1st Qu.: 1.000   1st Qu.:0.00000       1st Qu.:0.0000000             
##  Median : 4.000   Median :0.00000       Median :0.0000000             
##  Mean   : 8.499   Mean   :0.02298       Mean   :0.0005957             
##  3rd Qu.:10.000   3rd Qu.:0.00000       3rd Qu.:0.0000000             
##  Max.   :88.000   Max.   :6.00000       Max.   :0.2000000             
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.000000                  Min.   :0.000000            
##  1st Qu.:0.000000                  1st Qu.:0.000000            
##  Median :0.000000                  Median :0.000000            
##  Mean   :0.002402                  Mean   :0.001058            
##  3rd Qu.:0.000000                  3rd Qu.:0.000000            
##  Max.   :0.447214                  Max.   :1.000000            
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.000e+00                     Min.   :0.0000000                       
##  1st Qu.:0.000e+00                     1st Qu.:0.0000000                       
##  Median :0.000e+00                     Median :0.0000000                       
##  Mean   :2.006e-05                     Mean   :0.0001456                       
##  3rd Qu.:0.000e+00                     3rd Qu.:0.0000000                       
##  Max.   :2.174e-02                     Max.   :0.1474420
summary(community_arb_future2C)
##       lon               lat          community_CTmax community_CTmax_se
##  Min.   :-158.50   Min.   :-51.500   Min.   :31.35   Min.   : 0.2143   
##  1st Qu.: -61.50   1st Qu.:-12.500   1st Qu.:38.04   1st Qu.: 0.7129   
##  Median :  17.50   Median :  4.500   Median :39.16   Median : 1.3155   
##  Mean   :  16.65   Mean   :  7.019   Mean   :38.87   Mean   : 1.8070   
##  3rd Qu.:  99.50   3rd Qu.: 27.500   3rd Qu.:39.69   3rd Qu.: 2.5081   
##  Max.   : 177.50   Max.   : 57.500   Max.   :45.50   Max.   :17.2673   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 1.844     Min.   :0.2266        Min.   : 7.474   Min.   : 0.2143  
##  1st Qu.:23.443     1st Qu.:0.6620        1st Qu.:11.415   1st Qu.: 0.7129  
##  Median :26.366     Median :0.8841        Median :12.797   Median : 1.3155  
##  Mean   :25.224     Mean   :1.0645        Mean   :13.424   Mean   : 1.8070  
##  3rd Qu.:27.752     3rd Qu.:1.3196        3rd Qu.:14.990   3rd Qu.: 2.5081  
##  Max.   :30.435     Max.   :9.7651        Max.   :33.790   Max.   :17.2673  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   : 1.000   Min.   :0.00000       Min.   :0.000000              
##  1st Qu.: 1.000   1st Qu.:0.00000       1st Qu.:0.000000              
##  Median : 4.000   Median :0.00000       Median :0.000000              
##  Mean   : 8.499   Mean   :0.04279       Mean   :0.001336              
##  3rd Qu.:10.000   3rd Qu.:0.00000       3rd Qu.:0.000000              
##  Max.   :88.000   Max.   :8.00000       Max.   :0.500000              
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.000000                  Min.   :0.000000            
##  1st Qu.:0.000000                  1st Qu.:0.000000            
##  Median :0.000000                  Median :0.000000            
##  Mean   :0.004311                  Mean   :0.003175            
##  3rd Qu.:0.000000                  3rd Qu.:0.000000            
##  Max.   :0.707107                  Max.   :2.000000            
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.000e+00                     Min.   :0.0000000                       
##  1st Qu.:0.000e+00                     1st Qu.:0.0000000                       
##  Median :0.000e+00                     Median :0.0000000                       
##  Mean   :6.163e-05                     Mean   :0.0004048                       
##  3rd Qu.:0.000e+00                     3rd Qu.:0.0000000                       
##  Max.   :3.846e-02                     Max.   :0.1941839
summary(community_arb_future4C)
##       lon               lat          community_CTmax community_CTmax_se
##  Min.   :-158.50   Min.   :-51.500   Min.   :31.51   Min.   : 0.2132   
##  1st Qu.: -61.50   1st Qu.:-12.500   1st Qu.:38.24   1st Qu.: 0.6157   
##  Median :  17.50   Median :  4.500   Median :39.39   Median : 1.0321   
##  Mean   :  16.65   Mean   :  7.019   Mean   :39.07   Mean   : 1.3027   
##  3rd Qu.:  99.50   3rd Qu.: 27.500   3rd Qu.:39.91   3rd Qu.: 1.6991   
##  Max.   : 177.50   Max.   : 57.500   Max.   :45.66   Max.   :15.2617   
##  community_max_temp community_max_temp_se community_TSM    community_TSM_se 
##  Min.   : 2.172     Min.   : 0.2195       Min.   : 6.080   Min.   : 0.2132  
##  1st Qu.:25.844     1st Qu.: 0.6673       1st Qu.: 9.968   1st Qu.: 0.6157  
##  Median :28.143     Median : 0.9061       Median :11.171   Median : 1.0321  
##  Mean   :27.133     Mean   : 1.0827       Mean   :11.819   Mean   : 1.3027  
##  3rd Qu.:29.381     3rd Qu.: 1.3465       3rd Qu.:13.104   3rd Qu.: 1.6991  
##  Max.   :33.787     Max.   :11.7245       Max.   :34.630   Max.   :15.2617  
##    n_species      n_species_overheating proportion_species_overheating
##  Min.   : 1.000   Min.   : 0.0000       Min.   :0.000000              
##  1st Qu.: 1.000   1st Qu.: 0.0000       1st Qu.:0.000000              
##  Median : 4.000   Median : 0.0000       Median :0.000000              
##  Mean   : 8.499   Mean   : 0.1131       Mean   :0.003957              
##  3rd Qu.:10.000   3rd Qu.: 0.0000       3rd Qu.:0.000000              
##  Max.   :88.000   Max.   :11.0000       Max.   :1.000000              
##  proportion_species_overheating_se n_species_overheating_strict
##  Min.   :0.00000                   Min.   :0.00000             
##  1st Qu.:0.00000                   1st Qu.:0.00000             
##  Median :0.00000                   Median :0.00000             
##  Mean   :0.01137                   Mean   :0.03961             
##  3rd Qu.:0.00000                   3rd Qu.:0.00000             
##  Max.   :0.70711                   Max.   :7.00000             
##  proportion_species_overheating_strict proportion_species_overheating_se_strict
##  Min.   :0.0000000                     Min.   :0.000000                        
##  1st Qu.:0.0000000                     1st Qu.:0.000000                        
##  Median :0.0000000                     Median :0.000000                        
##  Mean   :0.0008389                     Mean   :0.003495                        
##  3rd Qu.:0.0000000                     3rd Qu.:0.000000                        
##  Max.   :0.1206897                     Max.   :0.328611

Predicted CTmax of each species

# Load imputed data
imputed_data <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

# Filter to imputed data and select relevant columns
imputed_data <- filter(imputed_data, imputed == "yes")

imputed_data <- dplyr::select(imputed_data, species = tip.label, order, IUCN_status,
    ecotype, acclimation_temperature = acclimation_temp, predicted_CTmax = filled_mean_UTL5,
    lower_95CI = lower_mean_UTL, upper_95CI = upper_mean_UTL)

# Display data
kable(imputed_data, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
species order IUCN_status ecotype acclimation_temperature predicted_CTmax lower_95CI upper_95CI
Pleurodema thaul Anura LC Ground-dwelling 15.463748 38.10344 37.22839 38.89933
Pleurodema thaul Anura LC Ground-dwelling 13.430227 37.81469 36.88420 38.60340
Pleurodema thaul Anura LC Ground-dwelling 19.618585 38.69341 37.73227 39.50440
Anaxyrus americanus Anura LC Ground-dwelling 19.122093 38.92091 38.41185 39.40160
Anaxyrus americanus Anura LC Ground-dwelling 15.674680 38.60556 38.05185 39.11823
Anaxyrus americanus Anura LC Ground-dwelling 23.517150 39.32294 38.78115 39.87656
Dryophytes versicolor Anura LC Arboreal 22.065446 40.14071 38.96226 41.39508
Dryophytes versicolor Anura LC Arboreal 19.011121 39.75760 38.67100 41.04572
Dryophytes versicolor Anura LC Arboreal 26.206637 40.66015 39.31047 42.09517
Pseudacris crucifer Anura LC Arboreal 21.817045 37.62693 36.34249 39.18047
Pseudacris crucifer Anura LC Arboreal 18.767761 37.24850 35.82576 38.60354
Pseudacris crucifer Anura LC Arboreal 25.779018 38.11862 36.58169 39.57903
Rana cascadae Anura LC Semi-aquatic 17.631615 34.31408 33.11589 35.45648
Rana cascadae Anura LC Semi-aquatic 15.554605 34.05063 32.79932 35.24507
Rana cascadae Anura LC Semi-aquatic 20.879876 34.72610 33.53585 35.86237
Rana luteiventris Anura LC Aquatic 15.327719 35.01461 33.24360 36.84351
Rana luteiventris Anura LC Aquatic 12.500964 34.61194 32.77004 36.44644
Rana luteiventris Anura LC Aquatic 19.712970 35.63928 33.57624 37.30083
Lithobates sphenocephalus Anura LC Semi-aquatic 25.917240 39.12878 37.48914 41.06474
Lithobates sphenocephalus Anura LC Semi-aquatic 23.191184 38.77741 37.10617 40.37965
Lithobates sphenocephalus Anura LC Semi-aquatic 29.075561 39.53587 37.49439 41.51158
Hylomantis aspera Anura LC Arboreal 25.150077 38.61316 36.52150 40.96978
Hylomantis aspera Anura LC Arboreal 24.324014 38.50234 36.45610 40.87586
Hylomantis aspera Anura LC Arboreal 26.642705 38.81340 36.63182 41.15960
Alytes cisternasii Anura LC Ground-dwelling 20.960597 36.42807 35.48323 37.49598
Alytes cisternasii Anura LC Ground-dwelling 19.033210 36.10631 35.20329 37.08004
Alytes cisternasii Anura LC Ground-dwelling 24.098229 36.95187 35.74170 38.01497
Alytes dickhilleni Anura EN Ground-dwelling 22.370947 37.33613 36.06117 38.56023
Alytes dickhilleni Anura EN Ground-dwelling 20.528157 37.11195 35.89012 38.23478
Alytes dickhilleni Anura EN Ground-dwelling 24.883578 37.64180 36.22978 38.99728
Alytes obstetricans Anura LC Ground-dwelling 19.264184 36.07213 34.93983 37.21620
Alytes obstetricans Anura LC Ground-dwelling 17.153941 35.75180 34.60714 36.80148
Alytes obstetricans Anura LC Ground-dwelling 22.792516 36.60773 35.43546 37.96771
Bufotes boulengeri Anura LC Ground-dwelling 23.173925 39.50641 37.42884 41.43809
Bufotes boulengeri Anura LC Ground-dwelling 21.852330 39.32406 37.32270 41.33521
Bufotes boulengeri Anura LC Ground-dwelling 25.686514 39.85307 37.68330 41.79840
Barbarophryne brongersmai Anura LC Ground-dwelling 22.112689 38.47828 37.63872 39.32604
Barbarophryne brongersmai Anura LC Ground-dwelling 20.839716 38.33425 37.59936 39.23796
Barbarophryne brongersmai Anura LC Ground-dwelling 24.342688 38.73061 37.81238 39.62742
Bufo bufo Anura LC Ground-dwelling 17.855448 36.53730 35.69461 37.23484
Bufo bufo Anura LC Ground-dwelling 14.755367 36.20395 35.40753 37.05268
Bufo bufo Anura LC Ground-dwelling 22.586930 37.04609 36.24178 37.88581
Epidalea calamita Anura LC Ground-dwelling 18.294835 37.74490 36.84573 38.61511
Epidalea calamita Anura LC Ground-dwelling 15.822059 37.37088 36.50317 38.23606
Epidalea calamita Anura LC Ground-dwelling 22.723061 38.41468 37.42149 39.45575
Ceratophrys aurita Anura LC Ground-dwelling 25.264245 40.14391 38.09167 42.43652
Ceratophrys aurita Anura LC Ground-dwelling 24.193216 40.00391 37.95313 42.30894
Ceratophrys aurita Anura LC Ground-dwelling 27.244999 40.40282 38.31375 42.67976
Dendropsophus branneri Anura LC Arboreal 25.906170 39.18379 37.94444 40.37139
Dendropsophus branneri Anura LC Arboreal 24.998267 39.08403 37.75504 40.13238
Dendropsophus branneri Anura LC Arboreal 27.610415 39.37106 38.01644 40.56276
Dendropsophus elegans Anura LC Arboreal 25.339773 38.91596 37.56247 40.42926
Dendropsophus elegans Anura LC Arboreal 24.239965 38.78553 37.32726 40.14636
Dendropsophus elegans Anura LC Arboreal 27.348396 39.15416 37.68104 40.61965
Dendropsophus haddadi Anura LC Arboreal 25.231623 37.47571 35.81743 39.25908
Dendropsophus haddadi Anura LC Arboreal 24.348311 37.38168 35.76310 39.15526
Dendropsophus haddadi Anura LC Arboreal 26.776738 37.64019 36.00658 39.57072
Dendropsophus novaisi Anura DD Arboreal 24.840434 40.67349 39.25456 42.03659
Dendropsophus novaisi Anura DD Arboreal 23.727946 40.53549 39.17512 41.98645
Dendropsophus novaisi Anura DD Arboreal 27.226817 40.96950 39.59491 42.43510
Discoglossus galganoi Anura LC Ground-dwelling 20.650608 36.30486 34.75851 37.74577
Discoglossus galganoi Anura LC Ground-dwelling 18.744411 35.97323 34.53306 37.45971
Discoglossus galganoi Anura LC Ground-dwelling 23.539960 36.80754 35.27078 38.42091
Discoglossus pictus Anura LC Ground-dwelling 23.308752 37.63117 35.45122 39.77978
Discoglossus pictus Anura LC Ground-dwelling 21.568351 37.36858 35.25450 39.51171
Discoglossus pictus Anura LC Ground-dwelling 25.955073 38.03045 35.72859 40.24215
Discoglossus scovazzi Anura LC Ground-dwelling 21.901447 37.09122 35.27646 38.72669
Discoglossus scovazzi Anura LC Ground-dwelling 20.525669 36.88553 35.33998 38.73553
Discoglossus scovazzi Anura LC Ground-dwelling 24.299294 37.44973 35.80004 39.32725
Hyla arborea Anura LC Arboreal 18.592148 38.12536 36.94339 39.20401
Hyla arborea Anura LC Arboreal 16.133384 37.77391 36.76276 38.98075
Hyla arborea Anura LC Arboreal 23.102272 38.77003 37.44992 40.03325
Hyla meridionalis Anura LC Arboreal 21.653851 37.65431 36.98516 38.31533
Hyla meridionalis Anura LC Arboreal 19.904028 37.43987 36.76676 38.05589
Hyla meridionalis Anura LC Arboreal 24.409188 37.99197 37.30913 38.80327
Boana albomarginata Anura LC Arboreal 25.395633 40.40561 39.00315 42.08395
Boana albomarginata Anura LC Arboreal 24.262187 40.25600 38.87933 41.89761
Boana albomarginata Anura LC Arboreal 27.373206 40.66665 39.09499 42.35359
Boana faber Anura LC Arboreal 25.639795 40.87918 40.20370 41.68374
Boana faber Anura LC Arboreal 24.369854 40.72418 40.05100 41.49335
Boana faber Anura LC Arboreal 27.871194 41.15154 40.26844 41.91410
Leptodactylus fuscus Anura LC Ground-dwelling 26.941878 42.29611 40.12915 44.58408
Leptodactylus fuscus Anura LC Ground-dwelling 25.996500 42.16817 40.00971 44.38614
Leptodactylus fuscus Anura LC Ground-dwelling 28.784026 42.54543 40.18552 44.80138
Leptodactylus latrans Anura LC Semi-aquatic 26.408131 40.69743 39.83160 41.73152
Leptodactylus latrans Anura LC Semi-aquatic 25.300401 40.56324 39.67065 41.50387
Leptodactylus latrans Anura LC Semi-aquatic 28.514613 40.95261 39.89800 42.01274
Pelobates cultripes Anura VU Ground-dwelling 20.740381 38.05742 37.12363 38.95998
Pelobates cultripes Anura VU Ground-dwelling 18.795726 37.77608 36.92698 38.70589
Pelobates cultripes Anura VU Ground-dwelling 23.631916 38.47575 37.44438 39.52062
Pelodytes ibericus Anura LC Semi-aquatic 21.811513 35.59888 35.02264 36.20577
Pelodytes ibericus Anura LC Semi-aquatic 20.006828 35.43409 34.89251 36.04032
Pelodytes ibericus Anura LC Semi-aquatic 24.634864 35.85669 35.17822 36.57223
Pelodytes punctatus Anura LC Semi-aquatic 19.862542 35.87230 34.98078 36.95143
Pelodytes punctatus Anura LC Semi-aquatic 17.774726 35.63134 34.69994 36.63907
Pelodytes punctatus Anura LC Semi-aquatic 23.241043 36.26223 35.12303 37.32593
Phasmahyla spectabilis Anura DD Arboreal 25.349791 38.09159 36.37864 39.44414
Phasmahyla spectabilis Anura DD Arboreal 24.481954 37.98081 36.58047 39.59649
Phasmahyla spectabilis Anura DD Arboreal 27.135204 38.31949 36.59568 39.80467
Phyllodytes luteolus Anura LC Arboreal 25.276462 39.70829 38.26382 41.34600
Phyllodytes luteolus Anura LC Arboreal 24.438787 39.60109 38.10701 41.14002
Phyllodytes luteolus Anura LC Arboreal 26.732893 39.89468 38.37913 41.55709
Phyllodytes melanomystax Anura LC Arboreal 25.136527 40.58735 38.35016 42.66668
Phyllodytes melanomystax Anura LC Arboreal 24.291129 40.47488 38.37329 42.64952
Phyllodytes melanomystax Anura LC Arboreal 26.625417 40.78542 38.54172 42.93678
Pithecopus rohdei Anura LC Arboreal 25.645855 40.31657 38.16824 42.24255
Pithecopus rohdei Anura LC Arboreal 24.445115 40.15325 38.16378 42.15954
Pithecopus rohdei Anura LC Arboreal 27.794176 40.60878 38.44853 42.68228
Physalaemus camacan Anura DD Ground-dwelling 25.361645 39.71825 37.66106 42.06952
Physalaemus camacan Anura DD Ground-dwelling 24.597670 39.61595 37.60582 41.96530
Physalaemus camacan Anura DD Ground-dwelling 26.767371 39.90648 37.94382 42.42052
Physalaemus erikae Anura LC Ground-dwelling 25.355265 40.04766 37.82478 42.27657
Physalaemus erikae Anura LC Ground-dwelling 24.634345 39.95069 37.68547 42.09720
Physalaemus erikae Anura LC Ground-dwelling 26.707000 40.22948 38.08593 42.58549
Pipa carvalhoi Anura LC Aquatic 25.475894 39.57024 36.96498 42.02644
Pipa carvalhoi Anura LC Aquatic 24.539384 39.43955 36.84172 41.87225
Pipa carvalhoi Anura LC Aquatic 27.080545 39.79416 37.06314 42.29071
Pleurodeles waltl Caudata NT Semi-aquatic 21.379514 36.48250 35.10804 37.78484
Pleurodeles waltl Caudata NT Semi-aquatic 19.616555 36.24190 34.92006 37.54096
Pleurodeles waltl Caudata NT Semi-aquatic 24.150504 36.86066 35.48838 38.26530
Pelophylax perezi Anura LC Semi-aquatic 20.804521 38.36993 36.88445 39.79244
Pelophylax perezi Anura LC Semi-aquatic 18.915268 38.10553 36.71818 39.53697
Pelophylax perezi Anura LC Semi-aquatic 23.629346 38.76525 37.16691 40.25594
Rana temporaria Anura LC Semi-aquatic 16.651132 35.44709 34.97421 35.89911
Rana temporaria Anura LC Semi-aquatic 13.482010 35.03058 34.49873 35.53432
Rana temporaria Anura LC Semi-aquatic 21.738392 36.11570 35.61429 36.58598
Rhinella crucifer Anura LC Ground-dwelling 25.397915 40.28157 38.28283 42.20792
Rhinella crucifer Anura LC Ground-dwelling 24.464195 40.15777 38.18593 42.03138
Rhinella crucifer Anura LC Ground-dwelling 27.033544 40.49845 38.36255 42.43366
Rhinella hoogmoedi Anura LC Ground-dwelling 25.576216 39.14927 37.05240 41.38204
Rhinella hoogmoedi Anura LC Ground-dwelling 24.603794 39.03001 36.83452 41.12515
Rhinella hoogmoedi Anura LC Ground-dwelling 27.205460 39.34909 37.23015 41.67476
Rhinella diptycha Anura DD Ground-dwelling 27.481509 41.12811 39.85738 42.23158
Rhinella diptycha Anura DD Ground-dwelling 26.257249 40.97444 39.79755 42.06137
Rhinella diptycha Anura DD Ground-dwelling 29.666878 41.40243 40.12279 42.73833
Salamandra salamandra Caudata LC Ground-dwelling 19.534064 34.47876 33.20128 35.72961
Salamandra salamandra Caudata LC Ground-dwelling 17.119418 34.16249 32.98373 35.60072
Salamandra salamandra Caudata LC Ground-dwelling 23.598472 35.01111 33.70054 36.33778
Ololygon agilis Anura LC Arboreal 25.306808 41.32400 38.98708 43.80786
Ololygon agilis Anura LC Arboreal 24.547895 41.22652 38.93593 43.68638
Ololygon agilis Anura LC Arboreal 26.750661 41.50945 38.90526 43.79785
Scinax eurydice Anura LC Arboreal 25.821944 41.03284 39.58070 42.74988
Scinax eurydice Anura LC Arboreal 24.936357 40.91882 39.33257 42.41443
Scinax eurydice Anura LC Arboreal 27.503517 41.24935 39.72698 43.01170
Sphaenorhynchus prasinus Anura LC Arboreal 25.222129 40.43759 38.16638 42.54932
Sphaenorhynchus prasinus Anura LC Arboreal 24.303760 40.32064 38.06261 42.46639
Sphaenorhynchus prasinus Anura LC Arboreal 27.055607 40.67108 38.34645 42.81101
Trachycephalus mesophaeus Anura LC Arboreal 25.176322 40.22450 38.21113 42.46123
Trachycephalus mesophaeus Anura LC Arboreal 23.982734 40.07507 37.95266 42.18266
Trachycephalus mesophaeus Anura LC Arboreal 27.346637 40.49621 38.59998 42.91660
Triturus pygmaeus Caudata NT Semi-aquatic 21.291128 36.69927 35.04810 38.50982
Triturus pygmaeus Caudata NT Semi-aquatic 19.507261 36.46495 34.53290 37.96059
Triturus pygmaeus Caudata NT Semi-aquatic 24.064004 37.06351 35.34832 38.88223
Desmognathus carolinensis Caudata LC Semi-aquatic 25.918325 35.09802 32.88357 37.05101
Desmognathus carolinensis Caudata LC Semi-aquatic 23.765010 34.83246 32.87921 36.84785
Desmognathus carolinensis Caudata LC Semi-aquatic 28.939567 35.47062 33.13734 37.61486
Desmognathus fuscus Caudata LC Semi-aquatic 23.859174 35.59828 34.93641 36.31865
Desmognathus fuscus Caudata LC Semi-aquatic 20.860006 35.17295 34.49186 35.69665
Desmognathus fuscus Caudata LC Semi-aquatic 27.352062 36.09362 35.30626 36.96120
Desmognathus monticola Caudata LC Semi-aquatic 25.096452 35.24495 33.86494 36.74298
Desmognathus monticola Caudata LC Semi-aquatic 22.821356 34.95757 33.74975 36.41350
Desmognathus monticola Caudata LC Semi-aquatic 28.516688 35.67699 34.12108 37.39872
Desmognathus ochrophaeus Caudata LC Ground-dwelling 22.256460 34.09650 33.16078 35.09240
Desmognathus ochrophaeus Caudata LC Ground-dwelling 19.386642 33.73322 32.81031 34.60151
Desmognathus ochrophaeus Caudata LC Ground-dwelling 25.978825 34.56771 33.28213 35.66781
Desmognathus ocoee Caudata LC Aquatic 26.771094 35.27167 33.08376 37.54190
Desmognathus ocoee Caudata LC Aquatic 24.763603 35.02020 32.89100 37.13601
Desmognathus ocoee Caudata LC Aquatic 29.770476 35.64740 33.37176 38.19462
Desmognathus orestes Caudata LC Ground-dwelling 25.659643 35.20866 33.12460 37.74128
Desmognathus orestes Caudata LC Ground-dwelling 23.325119 34.91615 32.86278 37.23080
Desmognathus orestes Caudata LC Ground-dwelling 28.735461 35.59406 33.35455 38.26243
Plethodon cinereus Caudata LC Ground-dwelling 20.562720 35.22343 34.22453 36.11166
Plethodon cinereus Caudata LC Ground-dwelling 17.159364 34.83922 33.99444 35.65751
Plethodon cinereus Caudata LC Ground-dwelling 24.628324 35.68240 34.45277 36.75955
Plethodon hubrichti Caudata VU Ground-dwelling 25.055749 34.63426 32.97317 36.33933
Plethodon hubrichti Caudata VU Ground-dwelling 22.277467 34.30537 32.80618 35.86399
Plethodon hubrichti Caudata VU Ground-dwelling 28.347050 35.02389 33.18011 36.89623
Plethodon richmondi Caudata LC Ground-dwelling 25.349730 35.09728 33.44782 36.85404
Plethodon richmondi Caudata LC Ground-dwelling 22.930877 34.79794 33.25171 36.37157
Plethodon richmondi Caudata LC Ground-dwelling 28.542972 35.49245 33.50797 37.40958
Plethodon virginia Caudata NT Ground-dwelling 24.787448 34.90653 32.77881 36.98873
Plethodon virginia Caudata NT Ground-dwelling 21.794457 34.53918 32.64672 36.71767
Plethodon virginia Caudata NT Ground-dwelling 27.992287 35.29989 33.00333 37.52142
Plethodon cylindraceus Caudata LC Ground-dwelling 25.085179 34.35712 33.21722 35.42912
Plethodon cylindraceus Caudata LC Ground-dwelling 20.903442 33.89003 32.95546 34.79426
Plethodon cylindraceus Caudata LC Ground-dwelling 28.042615 34.68746 33.44198 36.01642
Plethodon glutinosus Caudata LC Ground-dwelling 24.961828 35.00158 34.17515 35.88874
Plethodon glutinosus Caudata LC Ground-dwelling 22.023323 34.66136 33.97446 35.44936
Plethodon glutinosus Caudata LC Ground-dwelling 28.358123 35.39481 34.35838 36.45918
Plethodon montanus Caudata LC Ground-dwelling 25.723035 34.78167 32.55220 36.77586
Plethodon montanus Caudata LC Ground-dwelling 23.447192 34.50356 32.32213 36.36015
Plethodon montanus Caudata LC Ground-dwelling 28.786830 35.15608 32.84245 37.42535
Plethodon teyahalee Caudata LC Ground-dwelling 26.404787 35.19772 32.96693 37.04741
Plethodon teyahalee Caudata LC Ground-dwelling 24.395115 34.94969 32.91064 36.82198
Plethodon teyahalee Caudata LC Ground-dwelling 29.333299 35.55915 33.15172 37.63256
Plethodon punctatus Caudata NT Ground-dwelling 24.967104 34.78966 32.56832 36.65866
Plethodon punctatus Caudata NT Ground-dwelling 22.073758 34.43146 32.36694 36.19591
Plethodon punctatus Caudata NT Ground-dwelling 28.173759 35.18664 33.02111 37.52784
Plethodon wehrlei Caudata LC Ground-dwelling 23.650724 34.98295 33.38041 36.81618
Plethodon wehrlei Caudata LC Ground-dwelling 21.032996 34.64994 33.20612 36.45662
Plethodon wehrlei Caudata LC Ground-dwelling 27.599772 35.48533 33.62852 37.41579
Rhinella spinulosa Anura LC Ground-dwelling 15.900965 38.10968 37.36464 38.81157
Rhinella spinulosa Anura LC Ground-dwelling 14.029476 37.95260 37.18280 38.64698
Rhinella spinulosa Anura LC Ground-dwelling 19.213246 38.38768 37.65681 39.17804
Bryophryne cophites Anura EN Ground-dwelling 15.323045 28.99673 27.41640 30.59071
Bryophryne cophites Anura EN Ground-dwelling 11.264668 28.38912 26.74693 30.12279
Bryophryne cophites Anura EN Ground-dwelling 17.134228 29.26790 27.66766 30.85201
Bryophryne hanssaueri Anura LC Ground-dwelling 15.323045 26.95227 25.31065 28.63319
Bryophryne hanssaueri Anura LC Ground-dwelling 11.264668 26.36565 24.64935 28.27946
Bryophryne hanssaueri Anura LC Ground-dwelling 17.134228 27.21407 25.54742 28.79919
Bryophryne nubilosus Anura LC Ground-dwelling 15.323045 27.90592 26.19072 29.50554
Bryophryne nubilosus Anura LC Ground-dwelling 11.264668 27.30989 25.43524 28.97795
Bryophryne nubilosus Anura LC Ground-dwelling 17.134228 28.17192 26.41178 29.69871
Noblella myrmecoides Anura LC Ground-dwelling 25.871846 32.91570 30.98792 34.52600
Noblella myrmecoides Anura LC Ground-dwelling 25.108644 32.80537 30.93055 34.40767
Noblella myrmecoides Anura LC Ground-dwelling 27.229970 33.11204 31.06746 34.67182
Noblella pygmaea Anura LC Ground-dwelling 15.323045 28.38520 26.52289 30.00236
Noblella pygmaea Anura LC Ground-dwelling 11.264668 27.81540 25.85881 29.58317
Noblella pygmaea Anura LC Ground-dwelling 17.134228 28.63950 26.72249 30.15455
Oreobates cruralis Anura LC Ground-dwelling 21.099044 35.76660 34.25724 37.40610
Oreobates cruralis Anura LC Ground-dwelling 20.238659 35.63876 34.15486 37.26828
Oreobates cruralis Anura LC Ground-dwelling 22.363954 35.95455 34.38242 37.53954
Pristimantis buccinator Anura LC Arboreal 22.946424 34.28710 32.74854 35.79861
Pristimantis buccinator Anura LC Arboreal 22.150745 34.18119 32.63490 35.66669
Pristimantis buccinator Anura LC Arboreal 24.110096 34.44200 32.84789 35.91424
Pristimantis carvalhoi Anura LC Arboreal 26.979084 33.59735 31.90872 35.43183
Pristimantis carvalhoi Anura LC Arboreal 26.234799 33.49564 31.80972 35.30576
Pristimantis carvalhoi Anura LC Arboreal 28.438705 33.79681 32.06137 35.68524
Pristimantis danae Anura LC Arboreal 19.128299 31.30577 29.46254 32.87773
Pristimantis danae Anura LC Arboreal 17.971302 31.14438 29.35925 32.79243
Pristimantis danae Anura LC Arboreal 20.474625 31.49358 29.71787 33.16720
Pristimantis lindae Anura LC Arboreal 15.323045 29.77919 27.86563 32.21131
Pristimantis lindae Anura LC Arboreal 11.264668 29.22131 27.21601 31.61719
Pristimantis lindae Anura LC Arboreal 17.134228 30.02816 28.03045 32.38344
Pristimantis ockendeni Anura LC Arboreal 25.708748 32.50928 30.71903 34.14947
Pristimantis ockendeni Anura LC Arboreal 24.946567 32.40749 30.61836 34.00368
Pristimantis ockendeni Anura LC Arboreal 27.127086 32.69869 30.87569 34.40248
Pristimantis platydactylus Anura LC Arboreal 18.798633 31.47670 29.34281 33.72907
Pristimantis platydactylus Anura LC Arboreal 17.737139 31.33035 29.08890 33.49718
Pristimantis platydactylus Anura LC Arboreal 20.167842 31.66547 29.38783 33.79309
Pristimantis salaputium Anura LC Arboreal 15.323045 30.90547 29.17107 32.51374
Pristimantis salaputium Anura LC Arboreal 11.264668 30.32897 28.64763 32.21175
Pristimantis salaputium Anura LC Arboreal 17.134228 31.16275 29.48873 32.73514
Pristimantis toftae Anura LC Ground-dwelling 22.378310 32.66790 31.18569 34.08705
Pristimantis toftae Anura LC Ground-dwelling 21.632966 32.56140 31.21547 34.09276
Pristimantis toftae Anura LC Ground-dwelling 23.553001 32.83574 31.35649 34.29524
Psychrophrynella usurpator Anura NT Ground-dwelling 15.323045 29.68722 27.92876 31.34597
Psychrophrynella usurpator Anura NT Ground-dwelling 11.264668 29.10076 27.29003 30.91298
Psychrophrynella usurpator Anura NT Ground-dwelling 17.134228 29.94895 28.30580 31.67574
Eurycea nana Caudata VU Semi-aquatic 26.551885 37.89340 36.15332 39.57338
Eurycea nana Caudata VU Semi-aquatic 25.679670 37.78595 36.06156 39.37440
Eurycea nana Caudata VU Semi-aquatic 28.719675 38.16047 36.37338 40.01122
Aneides ferreus Caudata LC Ground-dwelling 17.932325 33.43356 31.19598 35.57736
Aneides ferreus Caudata LC Ground-dwelling 16.083264 33.19910 30.92027 35.22959
Aneides ferreus Caudata LC Ground-dwelling 20.790306 33.79595 31.39687 35.87425
Ensatina eschscholtzii Caudata LC Ground-dwelling 18.485448 32.87109 30.62078 35.30112
Ensatina eschscholtzii Caudata LC Ground-dwelling 16.732646 32.65025 30.36469 34.95601
Ensatina eschscholtzii Caudata LC Ground-dwelling 21.290759 33.22453 30.72621 35.53679
Plethodon dunni Caudata LC Ground-dwelling 17.964681 33.44251 31.26625 35.40368
Plethodon dunni Caudata LC Ground-dwelling 16.071043 33.20417 31.09726 35.14681
Plethodon dunni Caudata LC Ground-dwelling 20.898117 33.81174 31.76591 36.10044
Plethodon vehiculum Caudata LC Ground-dwelling 16.492929 32.94804 30.81797 35.01257
Plethodon vehiculum Caudata LC Ground-dwelling 14.366518 32.68087 30.65529 34.83384
Plethodon vehiculum Caudata LC Ground-dwelling 19.826253 33.36684 31.19713 35.46187
Rhyacotriton olympicus Caudata NT Semi-aquatic 16.285091 29.87304 27.84552 31.73791
Rhyacotriton olympicus Caudata NT Semi-aquatic 14.261817 29.59550 27.63018 31.41258
Rhyacotriton olympicus Caudata NT Semi-aquatic 19.543964 30.32006 28.24247 32.40857
Agalychnis dacnicolor Anura LC Arboreal 25.301923 36.43243 33.51322 38.70549
Agalychnis dacnicolor Anura LC Arboreal 24.097990 36.23151 33.40176 38.42678
Agalychnis dacnicolor Anura LC Arboreal 27.283721 36.76315 33.80660 39.22701
Anaxyrus boreas Anura LC Ground-dwelling 15.634025 37.03757 36.28796 37.77973
Anaxyrus boreas Anura LC Ground-dwelling 13.040954 36.76250 36.05148 37.53979
Anaxyrus boreas Anura LC Ground-dwelling 19.718182 37.47083 36.68843 38.25884
Anaxyrus canorus Anura VU Ground-dwelling 18.068758 37.53249 36.26891 38.76364
Anaxyrus canorus Anura VU Ground-dwelling 16.539996 37.32884 36.03195 38.52402
Anaxyrus canorus Anura VU Ground-dwelling 20.818636 37.89880 36.77849 39.39783
Anaxyrus cognatus Anura LC Fossorial 21.539984 40.65966 39.68514 41.68129
Anaxyrus cognatus Anura LC Fossorial 19.165765 40.33875 39.33272 41.18797
Anaxyrus cognatus Anura LC Fossorial 24.969158 41.12316 40.04297 42.28860
Anaxyrus compactilis Anura LC Fossorial 22.990764 38.27199 36.58180 39.86959
Anaxyrus compactilis Anura LC Fossorial 21.715446 38.11836 36.54335 39.75630
Anaxyrus compactilis Anura LC Fossorial 25.282783 38.54810 36.88738 40.36958
Anaxyrus retiformis Anura LC Fossorial 23.727196 40.64958 39.33791 42.17184
Anaxyrus retiformis Anura LC Fossorial 21.966445 40.41723 39.10740 41.87215
Anaxyrus retiformis Anura LC Fossorial 26.705337 41.04260 39.63033 42.64046
Anaxyrus exsul Anura VU Ground-dwelling 19.667759 37.52900 36.28842 38.70807
Anaxyrus exsul Anura VU Ground-dwelling 18.107435 37.35522 36.16674 38.55614
Anaxyrus exsul Anura VU Ground-dwelling 22.251625 37.81678 36.48955 39.02228
Anaxyrus fowleri Anura LC Ground-dwelling 24.461617 38.65713 37.49527 39.89198
Anaxyrus fowleri Anura LC Ground-dwelling 21.513699 38.24633 37.17125 39.34655
Anaxyrus fowleri Anura LC Ground-dwelling 28.078379 39.16112 37.81839 40.54427
Anaxyrus nelsoni Anura CR Ground-dwelling 19.254180 37.39407 35.89436 38.58805
Anaxyrus nelsoni Anura CR Ground-dwelling 17.573728 37.22649 35.87401 38.55146
Anaxyrus nelsoni Anura CR Ground-dwelling 22.184528 37.68631 36.19676 39.05828
Dendrobates auratus Anura LC Arboreal 26.651805 36.09641 33.78917 38.32619
Dendrobates auratus Anura LC Arboreal 25.986834 36.00350 33.79717 38.28042
Dendrobates auratus Anura LC Arboreal 27.978536 36.28177 33.97164 38.55024
Incilius alvarius Anura LC Ground-dwelling 23.148447 39.72002 38.38816 41.16070
Incilius alvarius Anura LC Ground-dwelling 21.307951 39.46371 37.98069 40.70749
Incilius alvarius Anura LC Ground-dwelling 26.093013 40.13009 38.70122 41.53088
Incilius canaliferus Anura LC Ground-dwelling 26.786633 39.37735 37.33414 41.37046
Incilius canaliferus Anura LC Ground-dwelling 25.877706 39.27036 37.24750 41.23975
Incilius canaliferus Anura LC Ground-dwelling 28.705361 39.60320 37.45354 41.60635
Incilius marmoreus Anura LC Ground-dwelling 26.224771 40.46109 38.80452 41.80316
Incilius marmoreus Anura LC Ground-dwelling 25.202167 40.31549 38.82170 41.81324
Incilius marmoreus Anura LC Ground-dwelling 28.024332 40.71731 39.13839 42.19661
Incilius mazatlanensis Anura LC Ground-dwelling 25.268513 40.05036 38.72863 41.48234
Incilius mazatlanensis Anura LC Ground-dwelling 23.882154 39.86771 38.57811 41.29844
Incilius mazatlanensis Anura LC Ground-dwelling 27.377753 40.32825 38.95286 41.76265
Leptodactylus melanonotus Anura LC Ground-dwelling 26.331108 39.35792 37.67321 41.05199
Leptodactylus melanonotus Anura LC Ground-dwelling 25.438435 39.23699 37.56013 40.90906
Leptodactylus melanonotus Anura LC Ground-dwelling 28.041559 39.58963 37.89490 41.30111
Lithobates catesbeianus Anura LC Semi-aquatic 22.583502 36.74855 36.06968 37.44138
Lithobates catesbeianus Anura LC Semi-aquatic 20.318099 36.57193 35.95868 37.27405
Lithobates catesbeianus Anura LC Semi-aquatic 25.691955 36.99090 36.17809 37.83749
Lithobates palmipes Anura LC Semi-aquatic 27.222478 37.43041 35.78357 39.03364
Lithobates palmipes Anura LC Semi-aquatic 26.482362 37.33422 35.67646 38.88909
Lithobates palmipes Anura LC Semi-aquatic 28.783168 37.63322 35.96501 39.29535
Lithobates palustris Anura LC Semi-aquatic 22.979583 33.80988 32.69849 34.86100
Lithobates palustris Anura LC Semi-aquatic 19.893034 33.41870 32.45548 34.47434
Lithobates palustris Anura LC Semi-aquatic 26.744006 34.28696 32.99164 35.47241
Lithobates pipiens Anura LC Semi-aquatic 19.066299 35.96812 35.59588 36.38094
Lithobates pipiens Anura LC Semi-aquatic 16.001909 35.42470 34.98095 35.78971
Lithobates pipiens Anura LC Semi-aquatic 23.225238 36.70564 36.28292 37.10885
Lithobates sylvaticus Anura LC Semi-aquatic 16.008088 34.41302 34.00377 34.77393
Lithobates sylvaticus Anura LC Semi-aquatic 12.482629 33.88987 33.41088 34.31062
Lithobates sylvaticus Anura LC Semi-aquatic 20.701914 35.10954 34.69809 35.49337
Lithobates warszewitschii Anura LC Stream-dwelling 26.780117 34.69182 32.57910 36.85975
Lithobates warszewitschii Anura LC Stream-dwelling 26.060326 34.60094 32.48952 36.75321
Lithobates warszewitschii Anura LC Stream-dwelling 28.195157 34.87050 32.65687 36.97106
Pseudacris cadaverina Anura LC Arboreal 21.173869 35.55850 33.70636 37.07354
Pseudacris cadaverina Anura LC Arboreal 19.618993 35.29180 33.53528 36.86124
Pseudacris cadaverina Anura LC Arboreal 23.746408 35.99976 34.17437 37.65387
Pseudacris regilla Anura LC Arboreal 15.919683 35.45361 34.73739 36.28022
Pseudacris regilla Anura LC Arboreal 13.430067 35.16586 34.42381 35.99552
Pseudacris regilla Anura LC Arboreal 19.864850 35.90959 35.12310 36.73507
Rana boylii Anura NT Stream-dwelling 18.554606 34.07130 32.65406 35.43706
Rana boylii Anura NT Stream-dwelling 16.935380 33.85906 32.40126 35.19827
Rana boylii Anura NT Stream-dwelling 21.175220 34.41480 32.94700 35.77744
Lithobates clamitans Anura LC Semi-aquatic 22.073747 36.74562 36.07130 37.42891
Lithobates clamitans Anura LC Semi-aquatic 19.140405 36.30289 35.66883 37.03449
Lithobates clamitans Anura LC Semi-aquatic 25.893931 37.32220 36.62156 38.12711
Rana pretiosa Anura VU Aquatic 17.421308 34.76691 33.47954 36.13846
Rana pretiosa Anura VU Aquatic 15.256563 34.48983 33.21807 35.93186
Rana pretiosa Anura VU Aquatic 20.864486 35.20761 33.87446 36.53828
Rhaebo haematiticus Anura LC Ground-dwelling 25.914127 38.13928 36.48004 39.80493
Rhaebo haematiticus Anura LC Ground-dwelling 25.158877 38.04092 36.37620 39.71530
Rhaebo haematiticus Anura LC Ground-dwelling 27.399292 38.33270 36.68263 40.02357
Rhinella marina Anura LC Ground-dwelling 26.855625 40.84599 40.51086 41.23724
Rhinella marina Anura LC Ground-dwelling 26.035628 40.72368 40.35591 41.09339
Rhinella marina Anura LC Ground-dwelling 28.483440 41.08878 40.73487 41.45780
Scaphiopus holbrookii Anura LC Fossorial 25.264129 35.16663 33.74488 36.51622
Scaphiopus holbrookii Anura LC Fossorial 22.335032 34.59784 33.35155 35.88402
Scaphiopus holbrookii Anura LC Fossorial 28.497729 35.79455 34.28641 37.34439
Smilisca fodiens Anura LC Fossorial 24.457317 39.53719 38.32221 40.91792
Smilisca fodiens Anura LC Fossorial 22.955486 39.27371 38.08932 40.59798
Smilisca fodiens Anura LC Fossorial 26.875429 39.96143 38.64762 41.36440
Smilisca baudinii Anura LC Ground-dwelling 25.884853 40.00233 38.35697 41.64204
Smilisca baudinii Anura LC Ground-dwelling 24.932456 39.86069 38.35232 41.57165
Smilisca baudinii Anura LC Ground-dwelling 27.711827 40.27403 38.65892 42.07410
Spea hammondii Anura NT Fossorial 19.579209 37.44114 36.54368 38.21527
Spea hammondii Anura NT Fossorial 18.042932 37.22160 36.45132 38.14104
Spea hammondii Anura NT Fossorial 22.044705 37.79347 36.92819 38.63156
Tlalocohyla smithii Anura LC Stream-dwelling 25.146850 41.01741 39.24496 42.91893
Tlalocohyla smithii Anura LC Stream-dwelling 24.013478 40.82026 39.02206 42.67922
Tlalocohyla smithii Anura LC Stream-dwelling 27.074006 41.35265 39.47206 43.27442
Adelotus brevis Anura NT Ground-dwelling 23.121801 35.30275 33.13041 37.56260
Adelotus brevis Anura NT Ground-dwelling 21.709001 35.09577 32.92200 37.19249
Adelotus brevis Anura NT Ground-dwelling 25.617642 35.66839 33.37297 38.21085
Assa darlingtoni Anura LC Ground-dwelling 23.059869 34.70748 32.26602 37.30700
Assa darlingtoni Anura LC Ground-dwelling 21.698433 34.49474 32.06202 37.03385
Assa darlingtoni Anura LC Ground-dwelling 25.319227 35.06052 32.62703 37.77397
Cophixalus ornatus Anura LC Arboreal 25.620922 34.49083 33.21649 35.91963
Cophixalus ornatus Anura LC Arboreal 24.543763 34.34197 33.05855 35.69002
Cophixalus ornatus Anura LC Arboreal 27.578402 34.76134 33.38805 36.22747
Crinia parinsignifera Anura LC Ground-dwelling 21.587566 36.32383 34.72302 38.17026
Crinia parinsignifera Anura LC Ground-dwelling 19.856410 36.05577 34.55813 37.78171
Crinia parinsignifera Anura LC Ground-dwelling 24.573663 36.78622 34.93581 38.77520
Crinia signifera Anura LC Ground-dwelling 20.402425 35.70355 35.02878 36.27797
Crinia signifera Anura LC Ground-dwelling 18.682574 35.47445 34.92060 36.05793
Crinia signifera Anura LC Ground-dwelling 23.389506 36.10146 35.38862 36.83938
Geocrinia laevis Anura LC Ground-dwelling 16.882006 33.94228 32.35638 35.26855
Geocrinia laevis Anura LC Ground-dwelling 15.207520 33.65438 32.21127 35.08083
Geocrinia laevis Anura LC Ground-dwelling 19.744337 34.43442 32.98794 36.04799
Geocrinia victoriana Anura LC Ground-dwelling 18.565653 34.89911 33.81261 35.94504
Geocrinia victoriana Anura LC Ground-dwelling 16.631306 34.55448 33.47353 35.52101
Geocrinia victoriana Anura LC Ground-dwelling 21.710703 35.45945 34.27001 36.64902
Limnodynastes dorsalis Anura LC Semi-aquatic 20.076121 35.86030 34.92717 36.73196
Limnodynastes dorsalis Anura LC Semi-aquatic 18.548878 35.63248 34.78942 36.57589
Limnodynastes dorsalis Anura LC Semi-aquatic 23.220392 36.32932 35.35933 37.25866
Limnodynastes fletcheri Anura LC Semi-aquatic 22.416478 33.55348 31.32191 35.64877
Limnodynastes fletcheri Anura LC Semi-aquatic 20.727885 33.25866 31.15292 35.24612
Limnodynastes fletcheri Anura LC Semi-aquatic 25.329487 34.06208 31.55121 36.31357
Limnodynastes peronii Anura LC Ground-dwelling 21.802238 36.23459 35.50974 36.86630
Limnodynastes peronii Anura LC Ground-dwelling 20.237239 35.94571 35.27520 36.57084
Limnodynastes peronii Anura LC Ground-dwelling 24.528046 36.73773 36.00686 37.48383
Limnodynastes salmini Anura LC Ground-dwelling 23.158980 36.16857 34.33447 37.96882
Limnodynastes salmini Anura LC Ground-dwelling 21.611844 35.94128 34.16630 37.67067
Limnodynastes salmini Anura LC Ground-dwelling 25.873337 36.56733 34.54194 38.46256
Limnodynastes tasmaniensis Anura LC Semi-aquatic 22.332344 36.26686 35.39837 37.19363
Limnodynastes tasmaniensis Anura LC Semi-aquatic 20.650717 35.98965 35.21671 36.94254
Limnodynastes tasmaniensis Anura LC Semi-aquatic 25.250422 36.74790 35.83261 37.78189
Litoria aurea Anura VU Semi-aquatic 20.359934 36.16338 35.28159 37.07160
Litoria aurea Anura VU Semi-aquatic 18.847228 35.96263 35.14382 36.82177
Litoria aurea Anura VU Semi-aquatic 22.717810 36.47630 35.47655 37.42239
Litoria bicolor Anura LC Arboreal 27.358038 40.82070 39.45557 42.38680
Litoria bicolor Anura LC Arboreal 26.360907 40.64454 39.16978 42.08859
Litoria bicolor Anura LC Arboreal 29.336737 41.17027 39.79214 42.86554
Cyclorana brevipes Anura LC Fossorial 24.663221 40.06756 38.62798 41.77888
Cyclorana brevipes Anura LC Fossorial 23.248376 39.86791 38.20456 41.37971
Cyclorana brevipes Anura LC Fossorial 27.162614 40.42023 39.03229 42.12405
Litoria caerulea Anura LC Arboreal 25.142010 39.26847 38.59311 39.85861
Litoria caerulea Anura LC Arboreal 23.787692 39.04373 38.41488 39.62330
Litoria caerulea Anura LC Arboreal 27.517760 39.66270 38.98452 40.36468
Litoria chloris Anura LC Arboreal 22.935912 39.13628 38.14462 40.13794
Litoria chloris Anura LC Arboreal 21.540586 38.96787 38.01424 39.97284
Litoria chloris Anura LC Arboreal 25.281121 39.41935 38.35617 40.43343
Litoria citropa Anura LC Stream-dwelling 19.916530 33.88001 32.46905 35.15193
Litoria citropa Anura LC Stream-dwelling 18.205166 33.66651 32.34808 34.96685
Litoria citropa Anura LC Stream-dwelling 22.563213 34.21020 32.74261 35.48447
Litoria ewingii Anura LC Arboreal 17.815123 34.72873 33.95519 35.35431
Litoria ewingii Anura LC Arboreal 16.075922 34.56029 33.87138 35.19217
Litoria ewingii Anura LC Arboreal 20.652706 35.00355 34.29702 35.81470
Litoria fallax Anura LC Arboreal 23.404223 39.47879 38.71739 40.18196
Litoria fallax Anura LC Arboreal 22.024117 39.30391 38.60324 40.00628
Litoria fallax Anura LC Arboreal 25.799583 39.78232 39.01235 40.62205
Litoria freycineti Anura VU Ground-dwelling 22.374903 36.69041 35.00503 38.55021
Litoria freycineti Anura VU Ground-dwelling 20.971218 36.46165 34.89559 38.39614
Litoria freycineti Anura VU Ground-dwelling 24.626360 37.05734 35.46189 39.06380
Litoria gracilenta Anura LC Arboreal 24.230047 38.54294 38.00746 39.07674
Litoria gracilenta Anura LC Arboreal 22.976557 38.40929 37.92071 38.92713
Litoria gracilenta Anura LC Arboreal 26.390521 38.77330 38.17682 39.39226
Litoria lesueurii Anura LC Stream-dwelling 20.058409 34.77835 34.08976 35.59612
Litoria lesueurii Anura LC Stream-dwelling 18.277997 34.53127 33.79321 35.28389
Litoria lesueurii Anura LC Stream-dwelling 22.909214 35.17397 34.44853 36.04500
Litoria peronii Anura LC Arboreal 21.896649 37.23336 36.37286 38.11272
Litoria peronii Anura LC Arboreal 20.169988 36.99028 36.20351 37.82529
Litoria peronii Anura LC Arboreal 24.851134 37.64930 36.73429 38.71479
Litoria phyllochroa Anura LC Stream-dwelling 22.149054 34.30089 32.94233 35.56732
Litoria phyllochroa Anura LC Stream-dwelling 20.700981 34.09775 32.75743 35.27423
Litoria phyllochroa Anura LC Stream-dwelling 24.489505 34.62921 33.27897 36.12122
Litoria rothii Anura LC Arboreal 26.847620 39.14040 38.12990 40.17287
Litoria rothii Anura LC Arboreal 25.775858 38.94764 37.95279 39.94941
Litoria rothii Anura LC Arboreal 28.907034 39.51081 38.41185 40.58431
Litoria rubella Anura LC Arboreal 24.834580 39.75827 38.97642 40.50461
Litoria rubella Anura LC Arboreal 23.360075 39.52235 38.80065 40.27226
Litoria rubella Anura LC Arboreal 27.379450 40.16544 39.30184 40.95669
Litoria verreauxii Anura LC Ground-dwelling 20.616474 34.03360 33.13866 34.80513
Litoria verreauxii Anura LC Ground-dwelling 18.963504 33.79065 33.00099 34.54342
Litoria verreauxii Anura LC Ground-dwelling 23.230953 34.41788 33.47365 35.36214
Mixophyes fasciolatus Anura LC Ground-dwelling 22.789447 32.37850 30.90085 33.75188
Mixophyes fasciolatus Anura LC Ground-dwelling 21.393825 32.19592 30.64244 33.53627
Mixophyes fasciolatus Anura LC Ground-dwelling 25.109385 32.68200 31.26434 34.05719
Neobatrachus pictus Anura LC Fossorial 20.117135 33.63771 32.00720 35.32460
Neobatrachus pictus Anura LC Fossorial 18.200918 33.34923 31.77967 35.04565
Neobatrachus pictus Anura LC Fossorial 23.753637 34.18518 32.58465 36.05529
Philoria frosti Anura CR Ground-dwelling 19.334236 29.94425 28.94926 31.11516
Philoria frosti Anura CR Ground-dwelling 17.360367 29.68996 28.50046 30.61546
Philoria frosti Anura CR Ground-dwelling 22.939626 30.40873 29.23330 31.56846
Philoria loveridgei Anura EN Ground-dwelling 23.203397 33.39454 31.52391 35.29864
Philoria loveridgei Anura EN Ground-dwelling 21.843774 33.18571 31.29636 34.98011
Philoria loveridgei Anura EN Ground-dwelling 25.439491 33.73800 31.75270 35.84311
Philoria sphagnicolus Anura EN Ground-dwelling 22.670003 32.08177 29.71986 34.30800
Philoria sphagnicolus Anura EN Ground-dwelling 21.241990 31.83836 29.60065 34.02568
Philoria sphagnicolus Anura EN Ground-dwelling 25.046961 32.48694 30.10885 34.97827
Pseudophryne bibronii Anura LC Ground-dwelling 20.497748 36.48884 35.51805 37.34919
Pseudophryne bibronii Anura LC Ground-dwelling 18.710130 36.21905 35.35095 37.02127
Pseudophryne bibronii Anura LC Ground-dwelling 23.609073 36.95841 35.89082 38.00100
Pseudophryne corroboree Anura CR Stream-dwelling 18.818785 34.01796 32.63186 35.22525
Pseudophryne corroboree Anura CR Stream-dwelling 16.779380 33.57809 32.22004 34.72203
Pseudophryne corroboree Anura CR Stream-dwelling 22.052036 34.71533 33.27451 36.02107
Pseudophryne dendyi Anura LC Ground-dwelling 19.295535 37.15013 35.31549 39.16441
Pseudophryne dendyi Anura LC Ground-dwelling 17.439597 36.89374 35.16284 38.80425
Pseudophryne dendyi Anura LC Ground-dwelling 22.202445 37.55172 35.53996 39.75247
Dicamptodon tenebrosus Caudata LC Semi-aquatic 17.799710 30.59743 28.35517 33.16328
Dicamptodon tenebrosus Caudata LC Semi-aquatic 15.851193 30.33238 28.06028 32.87282
Dicamptodon tenebrosus Caudata LC Semi-aquatic 20.820401 31.00832 28.69238 33.53923
Rhyacotriton variegatus Caudata LC Ground-dwelling 18.017144 28.97406 27.05889 30.77802
Rhyacotriton variegatus Caudata LC Ground-dwelling 16.303437 28.72772 26.91866 30.49634
Rhyacotriton variegatus Caudata LC Ground-dwelling 20.686921 29.35782 27.57509 31.49202
Buergeria japonica Anura LC Stream-dwelling 27.303723 42.41802 41.53946 43.35776
Buergeria japonica Anura LC Stream-dwelling 26.441995 42.28516 41.40504 43.22367
Buergeria japonica Anura LC Stream-dwelling 28.347980 42.57903 41.63382 43.45256
Eleutherodactylus coqui Anura LC Ground-dwelling 25.951730 40.88549 39.67451 42.01774
Eleutherodactylus coqui Anura LC Ground-dwelling 25.262435 40.76397 39.53744 41.84188
Eleutherodactylus coqui Anura LC Ground-dwelling 27.037675 41.07693 39.84572 42.24918
Eleutherodactylus portoricensis Anura EN Arboreal 26.882112 38.00733 36.46240 39.43076
Eleutherodactylus portoricensis Anura EN Arboreal 26.344935 37.94190 36.40385 39.33199
Eleutherodactylus portoricensis Anura EN Arboreal 27.616751 38.09680 36.50946 39.52389
Ascaphus truei Anura LC Stream-dwelling 16.143789 30.98727 29.51497 32.45739
Ascaphus truei Anura LC Stream-dwelling 13.855197 30.64999 29.19276 31.96893
Ascaphus truei Anura LC Stream-dwelling 19.817749 31.52872 29.84344 33.22833
Ambystoma jeffersonianum Caudata LC Aquatic 22.474986 36.58252 36.02232 37.09372
Ambystoma jeffersonianum Caudata LC Aquatic 19.000089 36.17106 35.73055 36.65746
Ambystoma jeffersonianum Caudata LC Aquatic 26.425878 37.05033 36.33639 37.64952
Ambystoma tigrinum Caudata LC Ground-dwelling 21.792873 37.19427 36.61949 37.71191
Ambystoma tigrinum Caudata LC Ground-dwelling 19.053502 36.84207 36.37715 37.35668
Ambystoma tigrinum Caudata LC Ground-dwelling 25.449105 37.66434 37.08940 38.36120
Pseudacris triseriata Anura LC Ground-dwelling 22.094439 37.83465 37.42899 38.26452
Pseudacris triseriata Anura LC Ground-dwelling 18.698907 37.55675 37.19505 37.94200
Pseudacris triseriata Anura LC Ground-dwelling 26.436564 38.19002 37.67210 38.66672
Anaxyrus woodhousii Anura LC Fossorial 21.616098 39.72796 39.18368 40.25859
Anaxyrus woodhousii Anura LC Fossorial 19.349773 39.51200 39.01788 40.07118
Anaxyrus woodhousii Anura LC Fossorial 24.937689 40.04447 39.45864 40.62442
Gastrophryne carolinensis Anura LC Fossorial 26.328826 40.60782 39.98970 41.22615
Gastrophryne carolinensis Anura LC Fossorial 24.002571 40.29942 39.67844 40.84586
Gastrophryne carolinensis Anura LC Fossorial 29.362151 41.00997 40.26532 41.74308
Fejervarya cancrivora Anura LC Ground-dwelling 27.633893 40.95235 39.07737 42.82323
Fejervarya cancrivora Anura LC Ground-dwelling 27.049701 40.87562 39.00983 42.72891
Fejervarya cancrivora Anura LC Ground-dwelling 28.881010 41.11617 39.27027 43.05049
Ceratophrys cranwelli Anura LC Fossorial 26.139434 41.24121 39.07134 43.45005
Ceratophrys cranwelli Anura LC Fossorial 24.608667 41.04028 38.87127 43.20896
Ceratophrys cranwelli Anura LC Fossorial 28.883272 41.60138 39.33396 43.94553
Dermatonotus muelleri Anura LC Fossorial 26.682622 42.26149 40.08977 44.58536
Dermatonotus muelleri Anura LC Fossorial 25.530536 42.10085 40.08957 44.54491
Dermatonotus muelleri Anura LC Fossorial 28.849724 42.56366 40.33272 44.99581
Elachistocleis bicolor Anura LC Ground-dwelling 25.053433 40.23869 38.62549 41.73553
Elachistocleis bicolor Anura LC Ground-dwelling 23.342909 40.00725 38.49421 41.50313
Elachistocleis bicolor Anura LC Ground-dwelling 27.937566 40.62894 38.85797 42.23570
Boana raniceps Anura LC Arboreal 27.293036 41.84018 40.53766 43.38194
Boana raniceps Anura LC Arboreal 26.336488 41.70775 40.45377 43.21655
Boana raniceps Anura LC Arboreal 29.184445 42.10204 40.58395 43.64056
Lepidobatrachus llanensis Anura LC Fossorial 25.062020 42.80347 40.51748 45.00449
Lepidobatrachus llanensis Anura LC Fossorial 23.485805 42.58598 40.33602 44.72550
Lepidobatrachus llanensis Anura LC Fossorial 27.774683 43.17777 40.73964 45.51580
Leptodactylus bufonius Anura LC Ground-dwelling 26.085835 42.27292 40.53503 44.05164
Leptodactylus bufonius Anura LC Ground-dwelling 24.554278 42.06752 40.52429 43.96695
Leptodactylus bufonius Anura LC Ground-dwelling 28.794633 42.63620 40.84119 44.49948
Leptodactylus latinasus Anura LC Ground-dwelling 25.016157 41.57418 39.87019 42.91044
Leptodactylus latinasus Anura LC Ground-dwelling 23.370293 41.35680 39.73121 42.70655
Leptodactylus latinasus Anura LC Ground-dwelling 27.942698 41.96071 40.23093 43.53043
Leptodactylus podicipinus Anura LC Ground-dwelling 27.408965 41.71987 39.61707 44.01724
Leptodactylus podicipinus Anura LC Ground-dwelling 26.334710 41.56920 39.53044 43.85965
Leptodactylus podicipinus Anura LC Ground-dwelling 29.510812 42.01467 39.80332 44.38347
Phyllomedusa sauvagii Anura LC Arboreal 26.326901 41.21305 39.32363 43.21971
Phyllomedusa sauvagii Anura LC Arboreal 24.848740 41.01442 39.13096 42.98774
Phyllomedusa sauvagii Anura LC Arboreal 28.956146 41.56634 39.59506 43.71934
Physalaemus albonotatus Anura LC Ground-dwelling 27.024819 40.35583 38.62045 42.16240
Physalaemus albonotatus Anura LC Ground-dwelling 25.831237 40.18981 38.43292 41.85949
Physalaemus albonotatus Anura LC Ground-dwelling 29.340196 40.67787 38.81999 42.55830
Lysapsus limellum Anura LC Aquatic 26.847379 41.08418 39.29476 43.00320
Lysapsus limellum Anura LC Aquatic 25.391029 40.89765 39.11292 42.63759
Lysapsus limellum Anura LC Aquatic 29.491742 41.42289 39.47625 43.51878
Pseudis platensis Anura DD Aquatic 27.241463 41.29940 39.04510 43.30468
Pseudis platensis Anura DD Aquatic 25.920975 41.12766 38.93734 43.09413
Pseudis platensis Anura DD Aquatic 29.616754 41.60832 39.40064 43.83840
Scinax acuminatus Anura LC Semi-aquatic 27.371678 42.29705 40.49931 44.17369
Scinax acuminatus Anura LC Semi-aquatic 25.984779 42.11769 40.33859 43.95267
Scinax acuminatus Anura LC Semi-aquatic 29.925970 42.62739 40.89712 44.87016
Scinax nasicus Anura LC Arboreal 26.327282 41.32566 39.91164 42.99881
Scinax nasicus Anura LC Arboreal 24.953311 41.14999 39.59826 42.59123
Scinax nasicus Anura LC Arboreal 28.855690 41.64893 40.15901 43.49403
Crossodactylus schmidti Anura NT Stream-dwelling 26.657096 36.35326 33.98710 38.60239
Crossodactylus schmidti Anura NT Stream-dwelling 25.042496 36.13660 33.74540 38.31649
Crossodactylus schmidti Anura NT Stream-dwelling 29.112911 36.68281 34.13754 38.93848
Dendropsophus minutus Anura LC Arboreal 26.853605 36.66319 35.70893 37.60712
Dendropsophus minutus Anura LC Arboreal 25.928973 36.59636 35.73933 37.55256
Dendropsophus minutus Anura LC Arboreal 28.657017 36.79354 35.81235 37.93756
Boana curupi Anura LC Arboreal 26.941994 38.03007 35.70967 40.14786
Boana curupi Anura LC Arboreal 25.419025 37.84378 35.65548 40.04755
Boana curupi Anura LC Arboreal 29.251066 38.31250 35.94703 40.50875
Limnomedusa macroglossa Anura LC Semi-aquatic 24.418614 39.27202 37.45365 40.93335
Limnomedusa macroglossa Anura LC Semi-aquatic 22.627233 39.02375 37.28216 40.70926
Limnomedusa macroglossa Anura LC Semi-aquatic 27.378622 39.68225 37.93082 41.59000
Melanophryniscus devincenzii Anura EN Stream-dwelling 24.218736 38.12993 35.79230 40.49958
Melanophryniscus devincenzii Anura EN Stream-dwelling 22.382412 37.88261 35.50622 40.20520
Melanophryniscus devincenzii Anura EN Stream-dwelling 27.515083 38.57389 36.14353 41.03915
Melanophryniscus krauczuki Anura LC Stream-dwelling 26.776295 38.93301 36.70653 41.22662
Melanophryniscus krauczuki Anura LC Stream-dwelling 25.066618 38.70463 36.52818 40.93181
Melanophryniscus krauczuki Anura LC Stream-dwelling 29.628117 39.31398 37.14917 41.91142
Phyllomedusa tetraploidea Anura LC Arboreal 26.365607 41.09025 39.00319 42.98092
Phyllomedusa tetraploidea Anura LC Arboreal 24.922985 40.89711 38.93648 42.78663
Phyllomedusa tetraploidea Anura LC Arboreal 28.815273 41.41822 39.16209 43.34946
Rhinella ornata Anura LC Ground-dwelling 25.856101 39.93853 38.75415 41.11999
Rhinella ornata Anura LC Ground-dwelling 24.595028 39.77068 38.52409 40.83705
Rhinella ornata Anura LC Ground-dwelling 28.117604 40.23955 39.02420 41.51886
Scinax fuscovarius Anura LC Semi-aquatic 26.533982 40.99495 39.16423 42.81214
Scinax fuscovarius Anura LC Semi-aquatic 25.304915 40.83819 39.11316 42.63125
Scinax fuscovarius Anura LC Semi-aquatic 28.808772 41.28509 39.39415 43.22602
Alytes muletensis Anura EN Stream-dwelling 23.372290 37.42678 35.77818 39.32252
Alytes muletensis Anura EN Stream-dwelling 21.703700 37.19762 35.39955 38.80518
Alytes muletensis Anura EN Stream-dwelling 25.446445 37.71164 35.93572 39.62058
Lissotriton boscai Caudata LC Semi-aquatic 20.193821 36.84203 34.89422 38.99162
Lissotriton boscai Caudata LC Semi-aquatic 18.353363 36.59268 34.65359 38.71923
Lissotriton boscai Caudata LC Semi-aquatic 23.146633 37.24209 35.11334 39.23565
Pelophylax lessonae Anura LC Semi-aquatic 18.362694 37.03467 34.71550 39.17094
Pelophylax lessonae Anura LC Semi-aquatic 15.476456 36.65204 34.27384 38.67964
Pelophylax lessonae Anura LC Semi-aquatic 23.234550 37.68054 35.17489 39.71301
Rana arvalis Anura LC Ground-dwelling 16.701593 33.99302 33.10721 34.89867
Rana arvalis Anura LC Ground-dwelling 13.036141 33.52999 32.49901 34.49454
Rana arvalis Anura LC Ground-dwelling 22.129802 34.67872 33.77914 35.64811
Rana iberica Anura VU Aquatic 19.584087 34.62237 33.52410 35.66230
Rana iberica Anura VU Aquatic 17.679558 34.41202 33.34461 35.42741
Rana iberica Anura VU Aquatic 22.643383 34.96027 33.88136 36.18299
Triturus cristatus Caudata LC Ground-dwelling 17.715264 36.23627 34.46612 38.23803
Triturus cristatus Caudata LC Ground-dwelling 14.842348 35.84343 34.00880 37.82416
Triturus cristatus Caudata LC Ground-dwelling 22.523106 36.89370 35.05995 38.95109
Acris crepitans Anura LC Semi-aquatic 25.648822 41.34131 40.64022 41.92435
Acris crepitans Anura LC Semi-aquatic 22.762735 41.20106 40.56105 41.73579
Acris crepitans Anura LC Semi-aquatic 28.908264 41.49970 40.75877 42.19048
Necturus maculosus Caudata LC Aquatic 22.295546 34.55989 33.97253 35.11647
Necturus maculosus Caudata LC Aquatic 19.216572 34.17222 33.69978 34.67389
Necturus maculosus Caudata LC Aquatic 26.427077 35.08008 34.34444 35.77961
Ambystoma maculatum Caudata LC Ground-dwelling 22.171809 37.33251 36.29732 38.66912
Ambystoma maculatum Caudata LC Ground-dwelling 19.093002 36.99702 36.06138 38.08529
Ambystoma maculatum Caudata LC Ground-dwelling 26.065181 37.75677 36.34953 39.21061
Hyperolius tuberilinguis Anura LC Arboreal 24.836058 39.08405 36.69738 41.50443
Hyperolius tuberilinguis Anura LC Arboreal 23.900023 38.97059 36.59289 41.44984
Hyperolius tuberilinguis Anura LC Arboreal 26.704672 39.31053 36.76699 41.54332
Hyperolius viridiflavus Anura LC Arboreal 24.493520 40.90433 39.47749 42.28402
Hyperolius viridiflavus Anura LC Arboreal 23.628289 40.83953 39.45981 42.29048
Hyperolius viridiflavus Anura LC Arboreal 26.233414 41.03465 39.67405 42.35256
Triturus dobrogicus Caudata LC Ground-dwelling 19.639288 36.71630 35.02435 38.28339
Triturus dobrogicus Caudata LC Ground-dwelling 16.529703 36.28664 34.60390 37.86456
Triturus dobrogicus Caudata LC Ground-dwelling 23.685098 37.27532 35.59840 38.96273
Eleutherodactylus richmondi Anura EN Ground-dwelling 26.909318 36.05345 33.75636 38.48236
Eleutherodactylus richmondi Anura EN Ground-dwelling 26.392690 35.98672 33.74528 38.43965
Eleutherodactylus richmondi Anura EN Ground-dwelling 27.600337 36.14271 33.83921 38.59430
Lithobates virgatipes Anura LC Semi-aquatic 25.661305 38.11214 36.52828 39.69509
Lithobates virgatipes Anura LC Semi-aquatic 21.467772 37.57007 36.16190 39.00637
Lithobates virgatipes Anura LC Semi-aquatic 28.902357 38.53110 36.83345 40.30091
Ambystoma macrodactylum Caudata LC Ground-dwelling 15.419792 34.41362 33.20825 35.40387
Ambystoma macrodactylum Caudata LC Ground-dwelling 12.619308 34.08453 33.03572 35.20930
Ambystoma macrodactylum Caudata LC Ground-dwelling 19.869537 34.93651 33.72616 36.12962
Aneides aeneus Caudata NT Ground-dwelling 25.058465 34.09149 31.75343 36.33597
Aneides aeneus Caudata NT Ground-dwelling 22.700531 33.79643 31.68913 36.23850
Aneides aeneus Caudata NT Ground-dwelling 28.163333 34.48001 32.13123 36.94296
Eurycea longicauda Caudata LC Semi-aquatic 24.101021 36.53855 35.01155 38.02535
Eurycea longicauda Caudata LC Semi-aquatic 21.118512 36.35173 35.01945 37.69923
Eurycea longicauda Caudata LC Semi-aquatic 28.083846 36.78803 34.97078 38.46488
Eurycea lucifuga Caudata LC Ground-dwelling 25.197978 36.37556 35.17335 37.72273
Eurycea lucifuga Caudata LC Ground-dwelling 22.406310 36.18309 35.01192 37.31321
Eurycea lucifuga Caudata LC Ground-dwelling 29.035627 36.64014 35.14460 38.18802
Notophthalmus viridescens Caudata LC Aquatic 22.765661 39.02550 38.71121 39.30558
Notophthalmus viridescens Caudata LC Aquatic 19.838502 38.49436 38.22225 38.75551
Notophthalmus viridescens Caudata LC Aquatic 26.508634 39.70467 39.36041 40.05775
Ambystoma opacum Caudata LC Ground-dwelling 25.028017 37.72637 36.68336 38.75474
Ambystoma opacum Caudata LC Ground-dwelling 22.283560 37.41198 36.44936 38.38606
Ambystoma opacum Caudata LC Ground-dwelling 28.570506 38.13218 36.85471 39.21830
Ambystoma mabeei Caudata LC Ground-dwelling 25.348679 37.71139 35.56631 39.77329
Ambystoma mabeei Caudata LC Ground-dwelling 20.997835 37.14959 35.27143 39.25093
Ambystoma mabeei Caudata LC Ground-dwelling 28.834888 38.16153 35.92753 40.34173
Ambystoma talpoideum Caudata LC Semi-aquatic 26.905141 37.95384 35.65131 40.09933
Ambystoma talpoideum Caudata LC Semi-aquatic 24.557507 37.65019 35.42524 39.79633
Ambystoma talpoideum Caudata LC Semi-aquatic 29.794082 38.32749 36.03592 40.70822
Ambystoma laterale Caudata LC Ground-dwelling 18.550365 36.14636 34.52056 37.52068
Ambystoma laterale Caudata LC Ground-dwelling 15.237623 35.73943 34.10870 37.18453
Ambystoma laterale Caudata LC Ground-dwelling 22.932137 36.68461 35.12802 38.34305
Taricha granulosa Caudata LC Ground-dwelling 14.985472 35.53738 33.15900 37.57351
Taricha granulosa Caudata LC Ground-dwelling 12.733136 35.22985 32.74451 37.24072
Taricha granulosa Caudata LC Ground-dwelling 18.574453 36.02742 33.70583 38.10790
Amphiuma tridactylum Caudata LC Semi-aquatic 27.188976 37.33393 34.65484 39.93223
Amphiuma tridactylum Caudata LC Semi-aquatic 25.143717 37.07589 34.42648 39.66546
Amphiuma tridactylum Caudata LC Semi-aquatic 29.978876 37.68592 34.94646 40.46871
Desmognathus quadramaculatus Caudata LC Semi-aquatic 25.816243 33.66231 32.24162 35.09992
Desmognathus quadramaculatus Caudata LC Semi-aquatic 23.539969 33.35561 31.92828 34.60823
Desmognathus quadramaculatus Caudata LC Semi-aquatic 28.856340 34.07192 32.44377 35.67304
Plethodon jordani Caudata NT Ground-dwelling 26.273694 35.62633 34.46529 36.63870
Plethodon jordani Caudata NT Ground-dwelling 24.260429 35.36814 34.31807 36.31421
Plethodon jordani Caudata NT Ground-dwelling 29.241377 36.00690 34.75868 37.25781
Hemidactylium scutatum Caudata LC Semi-aquatic 22.749870 36.19041 33.99184 38.52265
Hemidactylium scutatum Caudata LC Semi-aquatic 19.517229 35.79160 33.58695 38.14492
Hemidactylium scutatum Caudata LC Semi-aquatic 26.674701 36.67461 34.51543 39.17019
Gyrinophilus porphyriticus Caudata LC Semi-aquatic 23.073228 34.59252 32.43743 36.66460
Gyrinophilus porphyriticus Caudata LC Semi-aquatic 20.387323 34.29477 32.23463 36.34392
Gyrinophilus porphyriticus Caudata LC Semi-aquatic 26.715406 34.99628 32.57236 37.03566
Pseudotriton montanus Caudata LC Fossorial 25.839937 36.47834 34.26863 38.60756
Pseudotriton montanus Caudata LC Fossorial 22.954185 36.14517 34.14161 38.23646
Pseudotriton montanus Caudata LC Fossorial 29.058142 36.84989 34.63378 39.29453
Eurycea quadridigitata Caudata LC Semi-aquatic 27.009992 37.80491 35.54113 39.78074
Eurycea quadridigitata Caudata LC Semi-aquatic 24.901850 37.56200 35.46856 39.57004
Eurycea quadridigitata Caudata LC Semi-aquatic 29.672127 38.11166 35.83717 40.38042
Cryptobranchus alleganiensis Caudata VU Stream-dwelling 24.125260 35.60884 34.70130 36.53204
Cryptobranchus alleganiensis Caudata VU Stream-dwelling 21.225349 35.25921 34.49230 36.13553
Cryptobranchus alleganiensis Caudata VU Stream-dwelling 28.252049 36.10639 34.99509 37.16014
Dryophytes andersonii Anura NT Arboreal 26.236817 41.27919 39.17753 43.82594
Dryophytes andersonii Anura NT Arboreal 20.417847 40.46266 38.28048 42.66990
Dryophytes andersonii Anura NT Arboreal 29.082302 41.67847 39.12070 43.95097
Osteopilus septentrionalis Anura LC Arboreal 27.367498 39.17552 38.00860 40.23815
Osteopilus septentrionalis Anura LC Arboreal 26.654358 39.08435 37.98845 40.19652
Osteopilus septentrionalis Anura LC Arboreal 28.548836 39.32655 38.18449 40.42144
Acris gryllus Anura LC Semi-aquatic 26.972820 40.41640 38.19495 42.52269
Acris gryllus Anura LC Semi-aquatic 24.637201 40.14755 37.96729 42.14421
Acris gryllus Anura LC Semi-aquatic 29.765493 40.73786 38.38007 42.96085
Dryophytes cinereus Anura LC Arboreal 26.382399 40.47347 38.75124 42.28672
Dryophytes cinereus Anura LC Arboreal 24.026268 40.14706 38.40313 41.84073
Dryophytes cinereus Anura LC Arboreal 29.224803 40.86725 39.05269 42.71695
Dryophytes squirellus Anura LC Arboreal 26.886326 39.13382 37.03360 41.25422
Dryophytes squirellus Anura LC Arboreal 24.694925 38.86004 36.96004 41.03252
Dryophytes squirellus Anura LC Arboreal 29.449395 39.45404 37.40291 41.79201
Cyclorana alboguttata Anura LC Fossorial 24.891090 40.18912 38.27461 42.29745
Cyclorana alboguttata Anura LC Fossorial 23.494947 39.99111 38.12163 42.14129
Cyclorana alboguttata Anura LC Fossorial 27.349330 40.53776 38.53700 42.70900
Cyclorana australis Anura LC Fossorial 26.843676 40.49954 38.65233 42.65937
Cyclorana australis Anura LC Fossorial 25.595915 40.32413 38.38459 42.35087
Cyclorana australis Anura LC Fossorial 28.907605 40.78969 38.59084 42.74099
Litoria eucnemis Anura LC Stream-dwelling 26.855651 36.10942 33.76269 38.30210
Litoria eucnemis Anura LC Stream-dwelling 26.096565 36.00981 33.68723 38.21819
Litoria eucnemis Anura LC Stream-dwelling 28.240431 36.29112 33.95534 38.48386
Litoria nasuta Anura LC Ground-dwelling 26.430829 36.66233 34.74853 38.89395
Litoria nasuta Anura LC Ground-dwelling 25.404252 36.52716 34.61634 38.70606
Litoria nasuta Anura LC Ground-dwelling 28.388695 36.92011 34.50198 38.79798
Litoria nigrofrenata Anura LC Ground-dwelling 27.374170 38.64742 36.53816 40.93696
Litoria nigrofrenata Anura LC Ground-dwelling 26.511803 38.52722 36.45518 40.81710
Litoria nigrofrenata Anura LC Ground-dwelling 29.197431 38.90157 36.65775 41.17506
Litoria pearsoniana Anura LC Stream-dwelling 22.554499 34.50141 32.45624 36.43598
Litoria pearsoniana Anura LC Stream-dwelling 21.155140 34.30661 32.26199 36.14287
Litoria pearsoniana Anura LC Stream-dwelling 24.827130 34.81778 32.70929 36.77092
Neobatrachus sudelli Anura LC Ground-dwelling 22.180839 33.90907 32.03118 35.82575
Neobatrachus sudelli Anura LC Ground-dwelling 20.384759 33.61973 31.76467 35.62404
Neobatrachus sudelli Anura LC Ground-dwelling 25.316883 34.41427 32.34512 36.27082
Pseudophryne major Anura LC Ground-dwelling 24.186365 35.18430 32.92737 37.43575
Pseudophryne major Anura LC Ground-dwelling 22.886315 34.98617 32.76510 37.20508
Pseudophryne major Anura LC Ground-dwelling 26.576937 35.54865 33.20809 37.89183
Pseudophryne semimarmorata Anura LC Ground-dwelling 17.768395 34.50633 32.26162 36.73195
Pseudophryne semimarmorata Anura LC Ground-dwelling 15.979066 34.23438 31.89268 36.35506
Pseudophryne semimarmorata Anura LC Ground-dwelling 20.852617 34.97508 32.60022 37.27074
Uperoleia laevigata Anura LC Ground-dwelling 22.243437 34.42062 31.85283 36.55165
Uperoleia laevigata Anura LC Ground-dwelling 20.690914 34.19739 31.82817 36.52039
Uperoleia laevigata Anura LC Ground-dwelling 24.901669 34.80283 32.15439 36.83986
Uperoleia rugosa Anura LC Ground-dwelling 22.953803 35.48281 33.19231 37.77581
Uperoleia rugosa Anura LC Ground-dwelling 21.357149 35.23872 32.95217 37.55616
Uperoleia rugosa Anura LC Ground-dwelling 25.692848 35.90155 33.63550 38.24164
Platyplectrum ornatum Anura LC Ground-dwelling 25.505469 40.54497 39.33728 41.71225
Platyplectrum ornatum Anura LC Ground-dwelling 24.192496 40.31048 39.14164 41.47727
Platyplectrum ornatum Anura LC Ground-dwelling 27.797360 40.95430 39.70243 42.22603
Eurycea bislineata Caudata LC Semi-aquatic 19.996823 35.93220 35.40792 36.54272
Eurycea bislineata Caudata LC Semi-aquatic 16.654287 35.58887 34.92700 36.21928
Eurycea bislineata Caudata LC Semi-aquatic 23.912572 36.33441 35.81270 36.95617
Plethodon ouachitae Caudata NT Ground-dwelling 26.407276 35.36583 33.92765 36.89512
Plethodon ouachitae Caudata NT Ground-dwelling 24.464077 35.12571 33.76053 36.52472
Plethodon ouachitae Caudata NT Ground-dwelling 29.501864 35.74822 34.10996 37.42351
Lithobates berlandieri Anura LC Semi-aquatic 23.861038 39.82088 38.38887 41.40312
Lithobates berlandieri Anura LC Semi-aquatic 22.567755 39.65694 38.17533 41.05867
Lithobates berlandieri Anura LC Semi-aquatic 26.170086 40.11359 38.54187 41.81633
Dryophytes chrysoscelis Anura LC Arboreal 23.257625 40.68931 39.16807 42.29264
Dryophytes chrysoscelis Anura LC Arboreal 20.413931 40.36146 38.85731 41.72224
Dryophytes chrysoscelis Anura LC Arboreal 27.084038 41.13046 39.40595 42.95570
Rhinella granulosa Anura LC Ground-dwelling 26.943393 41.88185 40.82221 42.83887
Rhinella granulosa Anura LC Ground-dwelling 25.971169 41.73537 40.75417 42.72115
Rhinella granulosa Anura LC Ground-dwelling 28.829064 42.16596 41.15521 43.29408
Pleurodema bufoninum Anura LC Ground-dwelling 13.438626 37.40161 36.05461 38.90836
Pleurodema bufoninum Anura LC Ground-dwelling 11.366708 37.15441 35.74998 38.66958
Pleurodema bufoninum Anura LC Ground-dwelling 17.867059 37.92996 36.47117 39.28935
Alsodes gargola Anura LC Semi-aquatic 14.798402 33.26557 31.47817 34.96162
Alsodes gargola Anura LC Semi-aquatic 12.593310 32.99706 31.21523 34.77848
Alsodes gargola Anura LC Semi-aquatic 19.593371 33.84944 32.14578 35.65419
Anaxyrus terrestris Anura LC Fossorial 26.962373 39.22885 38.49518 39.98389
Anaxyrus terrestris Anura LC Fossorial 24.586909 38.95829 38.24241 39.73505
Anaxyrus terrestris Anura LC Fossorial 29.719161 39.54284 38.74774 40.29442
Xenopus laevis Anura LC Aquatic 22.300803 36.03092 35.43285 36.63302
Xenopus laevis Anura LC Aquatic 20.922581 35.84024 35.27386 36.43299
Xenopus laevis Anura LC Aquatic 24.771323 36.37272 35.69668 37.04056
Eleutherodactylus cundalli Anura VU Ground-dwelling 27.495925 36.68873 34.87707 38.42630
Eleutherodactylus cundalli Anura VU Ground-dwelling 27.126705 36.63962 34.83119 38.36001
Eleutherodactylus cundalli Anura VU Ground-dwelling 28.083133 36.76682 34.93047 38.53255
Eleutherodactylus gossei Anura VU Ground-dwelling 27.473430 35.98547 34.26757 37.70097
Eleutherodactylus gossei Anura VU Ground-dwelling 27.097639 35.94149 34.22359 37.63122
Eleutherodactylus gossei Anura VU Ground-dwelling 28.066481 36.05487 34.30583 37.77295
Eleutherodactylus johnstonei Anura LC Ground-dwelling 26.194749 38.80301 36.90667 40.31758
Eleutherodactylus johnstonei Anura LC Ground-dwelling 25.556125 38.71868 36.86993 40.26827
Eleutherodactylus johnstonei Anura LC Ground-dwelling 27.404075 38.96269 37.23880 40.69245
Eleutherodactylus planirostris Anura LC Ground-dwelling 27.317668 39.54669 37.89439 41.29417
Eleutherodactylus planirostris Anura LC Ground-dwelling 26.479765 39.42269 37.80989 41.15781
Eleutherodactylus planirostris Anura LC Ground-dwelling 28.732212 39.75602 38.12330 41.59982
Odontophrynus occidentalis Anura LC Ground-dwelling 20.200706 35.06940 33.87581 36.20053
Odontophrynus occidentalis Anura LC Ground-dwelling 18.118641 34.75506 33.50229 35.83007
Odontophrynus occidentalis Anura LC Ground-dwelling 23.911802 35.62968 34.42791 36.95580
Rhinella arenarum Anura LC Ground-dwelling 21.794451 39.12899 38.20059 40.13337
Rhinella arenarum Anura LC Ground-dwelling 19.928701 38.93235 38.00748 39.93306
Rhinella arenarum Anura LC Ground-dwelling 25.039571 39.47101 38.44615 40.54928
Melanophryniscus rubriventris Anura LC Ground-dwelling 19.192884 35.71527 34.00843 37.42919
Melanophryniscus rubriventris Anura LC Ground-dwelling 18.011103 35.57332 33.79897 37.29022
Melanophryniscus rubriventris Anura LC Ground-dwelling 21.065894 35.94023 34.23812 37.62777
Kaloula kalingensis Anura LC Arboreal 27.722871 36.93203 34.96830 38.71287
Kaloula kalingensis Anura LC Arboreal 27.226222 36.86660 34.90238 38.61154
Kaloula kalingensis Anura LC Arboreal 28.643884 37.05337 35.07452 38.85011
Occidozyga laevis Anura LC Aquatic 27.545372 36.85682 34.41792 39.20510
Occidozyga laevis Anura LC Aquatic 27.032258 36.79116 34.33608 39.10216
Occidozyga laevis Anura LC Aquatic 28.628062 36.99535 34.40778 39.25898
Philautus surdus Anura LC Arboreal 27.554874 35.51638 33.23474 37.82591
Philautus surdus Anura LC Arboreal 27.048847 35.45243 33.25101 37.79364
Philautus surdus Anura LC Arboreal 28.588364 35.64701 33.29495 37.92639
Platymantis banahao Anura NT Arboreal 27.300462 35.71101 34.22818 37.32071
Platymantis banahao Anura NT Arboreal 26.857937 35.64969 34.15904 37.20513
Platymantis banahao Anura NT Arboreal 28.156659 35.82965 34.33063 37.45594
Platymantis corrugatus Anura LC Ground-dwelling 27.552003 35.00489 32.71626 37.44110
Platymantis corrugatus Anura LC Ground-dwelling 27.052883 34.93769 32.51008 37.20274
Platymantis corrugatus Anura LC Ground-dwelling 28.575732 35.14271 32.67764 37.44993
Platymantis dorsalis Anura LC Ground-dwelling 27.493280 34.43959 32.12254 36.90346
Platymantis dorsalis Anura LC Ground-dwelling 27.029134 34.37839 32.09923 36.85994
Platymantis dorsalis Anura LC Ground-dwelling 28.456896 34.56665 32.24745 37.07887
Platymantis luzonensis Anura NT Arboreal 27.656366 35.50112 33.39694 37.76962
Platymantis luzonensis Anura NT Arboreal 27.186974 35.43607 33.35423 37.68853
Platymantis luzonensis Anura NT Arboreal 28.498275 35.61779 33.52781 37.93858
Sanguirana luzonensis Anura LC Stream-dwelling 27.711440 36.19917 34.30853 37.91820
Sanguirana luzonensis Anura LC Stream-dwelling 27.217234 36.13348 34.45666 38.03468
Sanguirana luzonensis Anura LC Stream-dwelling 28.659223 36.32514 34.44501 38.12880
Hylarana erythraea Anura LC Ground-dwelling 27.789423 36.15075 33.67126 38.26012
Hylarana erythraea Anura LC Ground-dwelling 27.063349 36.05521 33.57512 38.16324
Hylarana erythraea Anura LC Ground-dwelling 29.267280 36.34523 33.86695 38.50603
Limnonectes woodworthi Anura LC Semi-aquatic 27.721398 37.54929 35.38175 39.76279
Limnonectes woodworthi Anura LC Semi-aquatic 27.236624 37.48917 35.32081 39.67283
Limnonectes woodworthi Anura LC Semi-aquatic 28.645959 37.66394 35.48988 39.93353
Platymantis montanus Anura VU Arboreal 27.627292 35.14299 33.20703 36.80358
Platymantis montanus Anura VU Arboreal 27.121792 35.07449 33.18995 36.74332
Platymantis montanus Anura VU Arboreal 28.602361 35.27512 33.30476 36.96706
Kaloula walteri Anura VU Stream-dwelling 27.620045 37.72149 35.45396 39.71931
Kaloula walteri Anura VU Stream-dwelling 27.139889 37.65289 35.30136 39.55270
Kaloula walteri Anura VU Stream-dwelling 28.513708 37.84916 35.53616 39.83023
Physalaemus cuvieri Anura LC Semi-aquatic 26.916559 38.47990 37.59084 39.37027
Physalaemus cuvieri Anura LC Semi-aquatic 25.905765 38.34593 37.52132 39.28418
Physalaemus cuvieri Anura LC Semi-aquatic 28.866836 38.73841 37.74095 39.67385
Pleurodema diplolister Anura LC Fossorial 26.025050 42.21063 41.30363 43.04299
Pleurodema diplolister Anura LC Fossorial 25.019541 42.07239 41.10068 42.84491
Pleurodema diplolister Anura LC Fossorial 27.822968 42.45782 41.56374 43.33130
Rhinella icterica Anura LC Ground-dwelling 25.800249 40.59029 39.88705 41.31808
Rhinella icterica Anura LC Ground-dwelling 24.459283 40.41196 39.71770 41.11154
Rhinella icterica Anura LC Ground-dwelling 28.150519 40.90285 40.05844 41.64040
Rana chensinensis Anura LC Semi-aquatic 20.863311 34.17244 33.37576 34.96019
Rana chensinensis Anura LC Semi-aquatic 17.789265 33.72127 32.97604 34.45851
Rana chensinensis Anura LC Semi-aquatic 24.635550 34.72608 33.81212 35.67812
Batrachuperus tibetanus Caudata VU Semi-aquatic 17.591549 34.15486 32.13512 36.36602
Batrachuperus tibetanus Caudata VU Semi-aquatic 15.087701 33.82508 31.74952 35.87938
Batrachuperus tibetanus Caudata VU Semi-aquatic 20.727726 34.56792 32.35269 36.85984
Batrachuperus yenyuanensis Caudata EN Semi-aquatic 20.065157 33.90249 31.70556 36.13076
Batrachuperus yenyuanensis Caudata EN Semi-aquatic 18.734125 33.72688 31.59686 35.94963
Batrachuperus yenyuanensis Caudata EN Semi-aquatic 22.048790 34.16419 31.85422 36.45374
Paramesotriton chinensis Caudata LC Semi-aquatic 26.805770 37.47014 34.95739 39.70569
Paramesotriton chinensis Caudata LC Semi-aquatic 24.618871 37.17332 34.76883 39.30108
Paramesotriton chinensis Caudata LC Semi-aquatic 29.367742 37.81787 35.07578 40.17302
Tylototriton kweichowensis Caudata VU Semi-aquatic 23.280404 36.87632 34.58320 39.32508
Tylototriton kweichowensis Caudata VU Semi-aquatic 21.795537 36.67719 34.41471 39.09228
Tylototriton kweichowensis Caudata VU Semi-aquatic 25.409225 37.16180 34.88017 39.77316
Quasipaa spinosa Anura VU Stream-dwelling 26.388714 44.68546 43.22626 46.07364
Quasipaa spinosa Anura VU Stream-dwelling 24.974069 44.48296 43.13024 45.80151
Quasipaa spinosa Anura VU Stream-dwelling 28.680552 45.01353 43.24363 46.41184
Pseudotriton ruber Caudata LC Semi-aquatic 24.742337 35.59786 33.84082 37.73392
Pseudotriton ruber Caudata LC Semi-aquatic 21.697471 35.25012 33.21278 37.04071
Pseudotriton ruber Caudata LC Semi-aquatic 28.244500 35.99782 34.06900 38.19531
Scaphiopus couchii Anura LC Fossorial 23.488390 38.98445 37.98857 40.00356
Scaphiopus couchii Anura LC Fossorial 21.885411 38.73838 37.73866 39.73804
Scaphiopus couchii Anura LC Fossorial 26.068780 39.38055 38.33162 40.39746
Leptodactylus mystacinus Anura LC Ground-dwelling 25.340923 41.66481 39.65245 43.72663
Leptodactylus mystacinus Anura LC Ground-dwelling 23.929010 41.47968 39.44163 43.41021
Leptodactylus mystacinus Anura LC Ground-dwelling 27.868427 41.99623 39.91282 44.21085
Pelophylax saharicus Anura LC Aquatic 22.854607 38.34321 36.25133 40.46459
Pelophylax saharicus Anura LC Aquatic 21.421358 38.14822 36.12557 40.32309
Pelophylax saharicus Anura LC Aquatic 25.535072 38.70788 36.64807 41.08215
Bufotes viridis Anura LC Ground-dwelling 19.396877 38.47693 36.54036 40.43139
Bufotes viridis Anura LC Ground-dwelling 16.594990 38.10681 36.05711 40.01267
Bufotes viridis Anura LC Ground-dwelling 23.792848 39.05763 37.11995 41.07696
Leptodactylus albilabris Anura LC Semi-aquatic 27.064394 38.10411 37.08492 39.34291
Leptodactylus albilabris Anura LC Semi-aquatic 26.582806 38.04648 37.05093 39.27990
Leptodactylus albilabris Anura LC Semi-aquatic 27.788220 38.19073 37.18620 39.49168
Aplastodiscus ibirapitanga Anura LC Arboreal 25.194158 39.55491 37.44233 41.77816
Aplastodiscus ibirapitanga Anura LC Arboreal 24.394840 39.44979 37.32513 41.60246
Aplastodiscus ibirapitanga Anura LC Arboreal 26.614824 39.74175 37.53575 41.95458
Aplastodiscus sibilatus Anura DD Arboreal 24.895750 37.77114 35.44356 40.03515
Aplastodiscus sibilatus Anura DD Arboreal 23.944508 37.64960 35.26757 39.77662
Aplastodiscus sibilatus Anura DD Arboreal 26.585867 37.98708 35.67174 40.36512
Aplastodiscus weygoldti Anura NT Arboreal 25.434686 38.17311 36.67111 39.70382
Aplastodiscus weygoldti Anura NT Arboreal 24.665388 38.07745 36.58630 39.54825
Aplastodiscus weygoldti Anura NT Arboreal 26.933814 38.35951 36.82403 39.98771
Ceratophrys joazeirensis Anura LC Fossorial 25.358394 40.91103 38.82308 43.22320
Ceratophrys joazeirensis Anura LC Fossorial 24.210859 40.76398 38.68758 43.01833
Ceratophrys joazeirensis Anura LC Fossorial 27.406412 41.17345 39.01969 43.56380
Phyllomedusa burmeisteri Anura LC Arboreal 25.371847 41.63586 39.79575 43.71032
Phyllomedusa burmeisteri Anura LC Arboreal 24.232086 41.47366 39.70075 43.52740
Phyllomedusa burmeisteri Anura LC Arboreal 27.556444 41.94675 39.92527 44.06202
Physalaemus cicada Anura LC Ground-dwelling 25.024456 39.04699 37.06674 41.16918
Physalaemus cicada Anura LC Ground-dwelling 23.878503 38.88962 36.98209 41.01677
Physalaemus cicada Anura LC Ground-dwelling 27.133795 39.33667 37.19973 41.47147
Proceratophrys schirchi Anura LC Ground-dwelling 25.396475 38.57688 36.29282 40.86314
Proceratophrys schirchi Anura LC Ground-dwelling 24.521493 38.45627 36.19335 40.68945
Proceratophrys schirchi Anura LC Ground-dwelling 26.971310 38.79396 36.46156 41.14163
Physalaemus signifer Anura LC Ground-dwelling 25.393255 40.88154 38.86855 42.98080
Physalaemus signifer Anura LC Ground-dwelling 24.490610 40.76187 38.75498 42.81978
Physalaemus signifer Anura LC Ground-dwelling 27.028321 41.09831 39.04673 43.28196
Scinax alter Anura LC Arboreal 25.118411 40.87859 38.40003 43.11363
Scinax alter Anura LC Arboreal 23.923007 40.72896 38.26764 42.92237
Scinax alter Anura LC Arboreal 27.121667 41.12935 38.70235 43.56092
Stereocyclops incrassatus Anura LC Ground-dwelling 25.259423 40.01554 37.84696 42.53820
Stereocyclops incrassatus Anura LC Ground-dwelling 24.339215 39.88863 37.70448 42.35099
Stereocyclops incrassatus Anura LC Ground-dwelling 27.056773 40.26342 38.07135 42.86095
Scinax pachycrus Anura LC Arboreal 25.117548 41.20409 39.04653 43.69304
Scinax pachycrus Anura LC Arboreal 23.974055 41.05799 38.95625 43.52291
Scinax pachycrus Anura LC Arboreal 27.223284 41.47312 39.27848 44.07163
Gabohyla pauloalvini Anura DD Arboreal 25.306209 40.39377 38.20340 42.76353
Gabohyla pauloalvini Anura DD Arboreal 24.515917 40.29483 38.14318 42.63136
Gabohyla pauloalvini Anura DD Arboreal 26.810078 40.58203 38.30747 42.95433
Dendropsophus sanborni Anura LC Arboreal 25.013744 38.61547 36.29110 40.79338
Dendropsophus sanborni Anura LC Arboreal 23.309969 38.40563 36.37866 40.74934
Dendropsophus sanborni Anura LC Arboreal 27.871470 38.96743 36.64680 41.32428
Boana albopunctata Anura LC Arboreal 26.790175 38.80452 36.73051 41.05597
Boana albopunctata Anura LC Arboreal 25.627170 38.66799 36.63755 40.88928
Boana albopunctata Anura LC Arboreal 28.992730 39.06309 36.88459 41.36521
Boana pulchella Anura LC Arboreal 23.871903 37.38474 36.23935 38.62698
Boana pulchella Anura LC Arboreal 22.048726 37.16536 36.07342 38.42030
Boana pulchella Anura LC Arboreal 26.984163 37.75923 36.43486 39.05811
Scinax uruguayus Anura LC Ground-dwelling 24.481040 39.50106 38.28723 40.85169
Scinax uruguayus Anura LC Ground-dwelling 22.703098 39.29806 38.11509 40.60999
Scinax uruguayus Anura LC Ground-dwelling 27.362221 39.83002 38.36990 41.09415
Leptodactylus gracilis Anura LC Ground-dwelling 24.370603 40.48560 38.50967 42.78884
Leptodactylus gracilis Anura LC Ground-dwelling 22.613529 40.25211 38.18770 42.40279
Leptodactylus gracilis Anura LC Ground-dwelling 27.364904 40.88350 38.75653 43.11590
Odontophrynus americanus Anura LC Fossorial 24.554150 38.92325 37.49399 40.38385
Odontophrynus americanus Anura LC Fossorial 23.000150 38.69567 37.32372 40.06978
Odontophrynus americanus Anura LC Fossorial 27.313483 39.32734 37.68642 40.78001
Ololygon aromothyella Anura DD Arboreal 26.619474 41.13656 38.82725 43.55490
Ololygon aromothyella Anura DD Arboreal 25.081036 40.93795 38.80039 43.42456
Ololygon aromothyella Anura DD Arboreal 28.930983 41.43497 38.93450 43.82050
Phyllomedusa iheringii Anura LC Arboreal 23.392788 40.26925 39.15008 41.35676
Phyllomedusa iheringii Anura LC Arboreal 21.589605 40.04555 38.83519 40.96882
Phyllomedusa iheringii Anura LC Arboreal 26.388377 40.64089 39.44495 41.86301
Physalaemus gracilis Anura LC Ground-dwelling 24.506654 38.63587 37.33861 39.79253
Physalaemus gracilis Anura LC Ground-dwelling 22.748692 38.42067 37.24600 39.61116
Physalaemus gracilis Anura LC Ground-dwelling 27.308670 38.97888 37.57500 40.21607
Physalaemus henselii Anura LC Ground-dwelling 24.178375 37.11105 36.08661 38.27401
Physalaemus henselii Anura LC Ground-dwelling 22.364873 36.91462 35.80079 37.91919
Physalaemus henselii Anura LC Ground-dwelling 27.230595 37.44166 36.25769 38.67925
Physalaemus riograndensis Anura LC Ground-dwelling 25.028235 41.30004 39.12829 43.76610
Physalaemus riograndensis Anura LC Ground-dwelling 23.268373 41.06148 38.50342 43.08878
Physalaemus riograndensis Anura LC Ground-dwelling 27.984471 41.70077 39.55718 44.35238
Pseudis minuta Anura LC Aquatic 24.250873 38.98984 37.88060 40.15681
Pseudis minuta Anura LC Aquatic 22.410697 38.78700 37.80926 39.99667
Pseudis minuta Anura LC Aquatic 27.383664 39.33517 38.07263 40.63262
Pseudopaludicola falcipes Anura LC Ground-dwelling 25.247562 40.51103 38.17387 43.09867
Pseudopaludicola falcipes Anura LC Ground-dwelling 23.688647 40.30016 37.91320 42.71021
Pseudopaludicola falcipes Anura LC Ground-dwelling 27.974812 40.87996 38.54088 43.60343
Rhinella dorbignyi Anura LC Ground-dwelling 22.771908 39.60586 37.59136 41.86826
Rhinella dorbignyi Anura LC Ground-dwelling 20.944119 39.37246 37.25915 41.38297
Rhinella dorbignyi Anura LC Ground-dwelling 25.953382 40.01210 37.59955 42.07556
Scinax granulatus Anura LC Ground-dwelling 24.304297 40.09174 37.75541 42.26262
Scinax granulatus Anura LC Ground-dwelling 22.554410 39.87288 37.70142 42.11502
Scinax granulatus Anura LC Ground-dwelling 27.193959 40.45316 38.01221 42.69891
Scinax squalirostris Anura LC Arboreal 25.264325 41.24497 38.77794 43.44554
Scinax squalirostris Anura LC Arboreal 23.801961 41.05702 38.92160 43.51252
Scinax squalirostris Anura LC Arboreal 27.832007 41.57499 39.07688 43.86355
Gastrotheca pseustes Anura NT Arboreal 23.264063 37.14374 36.51560 37.92329
Gastrotheca pseustes Anura NT Arboreal 21.671049 36.98320 36.34560 37.74862
Gastrotheca pseustes Anura NT Arboreal 25.494172 37.36848 36.66731 38.11237
Gastrotheca riobambae Anura EN Arboreal 20.883009 37.89816 37.08452 38.67727
Gastrotheca riobambae Anura EN Arboreal 18.807879 37.65427 36.82610 38.46690
Gastrotheca riobambae Anura EN Arboreal 23.416515 38.19593 37.40815 38.99839
Agalychnis spurrelli Anura LC Arboreal 25.931973 40.90113 40.20098 41.69618
Agalychnis spurrelli Anura LC Arboreal 25.210596 40.79096 40.05063 41.53072
Agalychnis spurrelli Anura LC Arboreal 27.300220 41.11010 40.31999 41.88086
Boana geographica Anura LC Arboreal 26.980590 40.77866 39.86173 41.55425
Boana geographica Anura LC Arboreal 26.123019 40.65596 39.74236 41.39535
Boana geographica Anura LC Arboreal 28.707527 41.02575 40.15419 41.93857
Smilisca phaeota Anura LC Stream-dwelling 26.084751 40.60639 39.81140 41.38914
Smilisca phaeota Anura LC Stream-dwelling 25.321692 40.49390 39.70766 41.27284
Smilisca phaeota Anura LC Stream-dwelling 27.550657 40.82248 39.92144 41.57105
Boana crepitans Anura LC Arboreal 26.119967 39.72392 38.36882 41.07622
Boana crepitans Anura LC Arboreal 25.152466 39.61845 38.27653 40.91944
Boana crepitans Anura LC Arboreal 27.954286 39.92389 38.34716 41.21278
Boana semilineata Anura LC Arboreal 25.342960 39.78947 38.03603 41.73545
Boana semilineata Anura LC Arboreal 24.219541 39.65305 37.76650 41.33201
Boana semilineata Anura LC Arboreal 27.366559 40.03521 37.80968 41.72016
Leptodactylus troglodytes Anura LC Ground-dwelling 26.197973 41.23732 39.44128 43.07169
Leptodactylus troglodytes Anura LC Ground-dwelling 25.202294 41.10291 39.42421 42.92832
Leptodactylus troglodytes Anura LC Ground-dwelling 28.029004 41.48450 39.60216 43.33863
Physalaemus crombiei Anura LC Ground-dwelling 25.298055 41.17563 39.67871 43.23460
Physalaemus crombiei Anura LC Ground-dwelling 24.503063 41.06771 39.51655 43.05065
Physalaemus crombiei Anura LC Ground-dwelling 26.826563 41.38313 39.77205 43.44529
Pithecopus nordestinus Anura DD Arboreal 25.581520 40.40331 38.72976 42.01021
Pithecopus nordestinus Anura DD Arboreal 24.541365 40.26230 38.59961 41.83482
Pithecopus nordestinus Anura DD Arboreal 27.435870 40.65470 38.91341 42.35488
Scinax x-signatus Anura LC Arboreal 27.164479 41.54175 39.96942 43.23569
Scinax x-signatus Anura LC Arboreal 26.289657 41.42846 39.92442 43.13446
Scinax x-signatus Anura LC Arboreal 28.929848 41.77035 40.01377 43.45235
Trachycephalus atlas Anura LC Arboreal 24.864425 40.95270 39.14940 42.51054
Trachycephalus atlas Anura LC Arboreal 23.740526 40.80265 39.06772 42.35999
Trachycephalus atlas Anura LC Arboreal 27.024445 41.24107 39.39822 42.91812
Agalychnis hulli Anura LC Arboreal 25.642851 39.48907 37.55575 41.80280
Agalychnis hulli Anura LC Arboreal 24.847883 39.37608 37.45020 41.64044
Agalychnis hulli Anura LC Arboreal 27.212916 39.71223 37.61381 41.96557
Allobates insperatus Anura LC Ground-dwelling 25.638782 37.54551 35.36955 39.83553
Allobates insperatus Anura LC Ground-dwelling 24.760919 37.42221 35.23195 39.62726
Allobates insperatus Anura LC Ground-dwelling 27.246083 37.77125 35.41089 39.99428
Allobates zaparo Anura LC Ground-dwelling 25.494666 38.00964 35.87523 40.07018
Allobates zaparo Anura LC Ground-dwelling 24.698166 37.90277 35.83960 39.98503
Allobates zaparo Anura LC Ground-dwelling 27.079750 38.22234 35.94462 40.30581
Atelopus elegans Anura EN Stream-dwelling 23.495298 36.10367 34.31002 37.84220
Atelopus elegans Anura EN Stream-dwelling 22.462300 35.97060 34.14228 37.61078
Atelopus elegans Anura EN Stream-dwelling 25.230306 36.32716 34.34734 37.94137
Atelopus spumarius Anura VU Stream-dwelling 27.478170 36.93426 34.87639 39.43005
Atelopus spumarius Anura VU Stream-dwelling 26.784003 36.84406 34.84653 39.34364
Atelopus spumarius Anura VU Stream-dwelling 29.000142 37.13200 34.93194 39.63145
Boana boans Anura LC Arboreal 27.215709 40.42277 38.35701 42.35147
Boana boans Anura LC Arboreal 26.483715 40.32703 38.30619 42.22252
Boana boans Anura LC Arboreal 28.777208 40.62699 38.50812 42.65654
Boana cinerascens Anura LC Arboreal 27.502494 39.98874 38.41799 41.78669
Boana cinerascens Anura LC Arboreal 26.786636 39.89472 38.26680 41.58964
Boana cinerascens Anura LC Arboreal 29.036045 40.19013 38.51669 42.03312
Boana fasciata Anura LC Arboreal 27.396672 39.90043 37.56416 42.16012
Boana fasciata Anura LC Arboreal 26.678670 39.80987 37.54453 42.08506
Boana fasciata Anura LC Arboreal 28.948844 40.09621 37.91706 42.63034
Boana lanciformis Anura LC Arboreal 27.275380 41.36055 39.82648 42.92365
Boana lanciformis Anura LC Arboreal 26.530717 41.25001 39.70708 42.74888
Boana lanciformis Anura LC Arboreal 28.838690 41.59261 40.01637 43.29056
Boana pellucens Anura LC Arboreal 24.299713 40.27975 38.49210 41.96450
Boana pellucens Anura LC Arboreal 23.283378 40.14756 38.37071 41.78640
Boana pellucens Anura LC Arboreal 26.001824 40.50114 38.84547 42.42443
Chiasmocleis ventrimaculata Anura LC Ground-dwelling 25.082655 39.02850 36.87264 41.37149
Chiasmocleis ventrimaculata Anura LC Ground-dwelling 24.313668 38.92169 36.72542 41.22974
Chiasmocleis ventrimaculata Anura LC Ground-dwelling 26.464856 39.22049 37.03286 41.60758
Chimerella mariaelenae Anura LC Arboreal 23.727007 37.29639 35.82396 38.83405
Chimerella mariaelenae Anura LC Arboreal 22.592906 37.14647 35.63595 38.61191
Chimerella mariaelenae Anura LC Arboreal 25.584364 37.54193 36.01429 39.12454
Cruziohyla calcarifer Anura LC Arboreal 24.867687 39.71325 37.54078 42.03987
Cruziohyla calcarifer Anura LC Arboreal 24.077584 39.60067 37.35517 41.78651
Cruziohyla calcarifer Anura LC Arboreal 26.263610 39.91217 37.80064 42.36179
Dendropsophus bifurcus Anura LC Arboreal 26.350021 40.58680 38.32821 42.73319
Dendropsophus bifurcus Anura LC Arboreal 25.571765 40.48877 38.25773 42.59835
Dendropsophus bifurcus Anura LC Arboreal 27.916304 40.78409 38.43116 42.90762
Dendropsophus bokermanni Anura LC Arboreal 26.824381 39.23805 36.98995 41.69454
Dendropsophus bokermanni Anura LC Arboreal 26.058449 39.14493 37.06486 41.69828
Dendropsophus bokermanni Anura LC Arboreal 28.323521 39.42033 37.26324 42.07914
Dendropsophus brevifrons Anura LC Arboreal 27.034935 39.01236 37.20740 40.79556
Dendropsophus brevifrons Anura LC Arboreal 26.323579 38.92627 37.16359 40.71330
Dendropsophus brevifrons Anura LC Arboreal 28.519804 39.19208 37.34622 41.03620
Dendropsophus carnifex Anura LC Arboreal 20.180939 39.04306 37.56703 40.80361
Dendropsophus carnifex Anura LC Arboreal 18.072574 38.77132 37.11695 40.34223
Dendropsophus carnifex Anura LC Arboreal 22.820081 39.38320 37.75700 41.09055
Dendropsophus ebraccatus Anura LC Arboreal 26.064724 41.12778 39.40161 42.82813
Dendropsophus ebraccatus Anura LC Arboreal 25.266923 41.02363 39.18814 42.56982
Dendropsophus ebraccatus Anura LC Arboreal 27.615023 41.33017 39.53006 43.04866
Dendropsophus marmoratus Anura LC Arboreal 27.410152 41.16743 39.05718 43.58566
Dendropsophus marmoratus Anura LC Arboreal 26.697600 41.07572 38.99947 43.48208
Dendropsophus marmoratus Anura LC Arboreal 28.950102 41.36562 38.99352 43.64954
Dendropsophus parviceps Anura LC Arboreal 27.369229 39.20377 37.28598 41.55083
Dendropsophus parviceps Anura LC Arboreal 26.629398 39.11342 37.16746 41.38463
Dendropsophus parviceps Anura LC Arboreal 28.927590 39.39409 37.46218 41.84813
Dendropsophus sarayacuensis Anura LC Arboreal 27.225988 40.08166 38.52532 41.69102
Dendropsophus sarayacuensis Anura LC Arboreal 26.468940 39.98968 38.43237 41.53729
Dendropsophus sarayacuensis Anura LC Arboreal 28.744375 40.26614 38.57005 41.87673
Dendropsophus triangulum Anura LC Arboreal 27.385494 40.37777 38.79119 42.17608
Dendropsophus triangulum Anura LC Arboreal 26.643232 40.28987 38.71324 42.03055
Dendropsophus triangulum Anura LC Arboreal 28.912234 40.55855 38.90221 42.42502
Engystomops coloradorum Anura DD Ground-dwelling 23.033729 39.56458 37.62847 41.52548
Engystomops coloradorum Anura DD Ground-dwelling 21.190651 39.32602 37.28661 41.13432
Engystomops coloradorum Anura DD Ground-dwelling 25.447074 39.87696 37.96368 42.03956
Engystomops guayaco Anura VU Ground-dwelling 25.157273 39.76712 38.13814 41.51404
Engystomops guayaco Anura VU Ground-dwelling 23.907105 39.60422 38.00223 41.29584
Engystomops guayaco Anura VU Ground-dwelling 27.136643 40.02502 38.22690 41.78746
Engystomops petersi Anura LC Ground-dwelling 26.061992 39.11846 37.25183 40.84301
Engystomops petersi Anura LC Ground-dwelling 25.166215 38.99997 37.16475 40.71965
Engystomops petersi Anura LC Ground-dwelling 27.695005 39.33449 37.37174 41.12403
Engystomops randi Anura LC Ground-dwelling 23.740388 40.30951 38.47610 42.48777
Engystomops randi Anura LC Ground-dwelling 22.459834 40.13500 38.31710 42.27678
Engystomops randi Anura LC Ground-dwelling 25.835929 40.59509 38.55178 42.72527
Epipedobates anthonyi Anura NT Stream-dwelling 24.021096 38.04794 37.36660 38.70634
Epipedobates anthonyi Anura NT Stream-dwelling 22.976511 37.89629 37.20192 38.53054
Epipedobates anthonyi Anura NT Stream-dwelling 25.865535 38.31571 37.67313 39.07244
Epipedobates boulengeri Anura LC Ground-dwelling 24.382863 38.42545 36.76897 40.11415
Epipedobates boulengeri Anura LC Ground-dwelling 23.388305 38.28794 36.55687 39.88447
Epipedobates boulengeri Anura LC Ground-dwelling 26.018706 38.65163 36.91693 40.37177
Epipedobates espinosai Anura DD Ground-dwelling 26.262132 38.27065 36.46766 40.42705
Epipedobates espinosai Anura DD Ground-dwelling 25.183072 38.12743 36.39908 40.27699
Epipedobates espinosai Anura DD Ground-dwelling 28.032647 38.50565 36.27919 40.41924
Epipedobates machalilla Anura LC Ground-dwelling 23.961946 38.38735 36.86609 39.90325
Epipedobates machalilla Anura LC Ground-dwelling 22.784849 38.22338 36.83362 39.81314
Epipedobates machalilla Anura LC Ground-dwelling 25.868755 38.65298 37.12016 40.29393
Epipedobates tricolor Anura VU Ground-dwelling 24.178205 38.14330 36.57416 39.68529
Epipedobates tricolor Anura VU Ground-dwelling 22.579566 37.92859 36.50367 39.47735
Epipedobates tricolor Anura VU Ground-dwelling 26.372882 38.43806 36.80040 40.06195
Espadarana callistomma Anura LC Stream-dwelling 24.808678 36.65424 34.95473 38.32072
Espadarana callistomma Anura LC Stream-dwelling 24.004542 36.54259 34.85247 38.15630
Espadarana callistomma Anura LC Stream-dwelling 26.254812 36.85503 35.14284 38.62879
Espadarana prosoblepon Anura LC Stream-dwelling 25.722112 34.62956 33.42214 35.87295
Espadarana prosoblepon Anura LC Stream-dwelling 24.880986 34.56004 33.40545 35.78281
Espadarana prosoblepon Anura LC Stream-dwelling 27.236771 34.75475 33.47988 36.06229
Gastrotheca lateonota Anura VU Arboreal 22.736035 37.52490 35.97760 39.15076
Gastrotheca lateonota Anura VU Arboreal 21.681466 37.38785 35.73152 38.85169
Gastrotheca lateonota Anura VU Arboreal 24.443522 37.74679 36.18978 39.45736
Gastrotheca litonedis Anura CR Arboreal 21.252659 37.54452 35.53392 39.77306
Gastrotheca litonedis Anura CR Arboreal 19.420658 37.30545 35.23221 39.44060
Gastrotheca litonedis Anura CR Arboreal 23.758706 37.87156 35.60904 40.02659
Hyloscirtus alytolylax Anura LC Stream-dwelling 24.213945 36.85621 35.09817 38.55343
Hyloscirtus alytolylax Anura LC Stream-dwelling 23.072077 36.70957 35.05645 38.47517
Hyloscirtus alytolylax Anura LC Stream-dwelling 25.988427 37.08411 35.18315 38.76138
Hyloscirtus lindae Anura LC Stream-dwelling 23.840175 36.33520 34.93277 37.94294
Hyloscirtus lindae Anura LC Stream-dwelling 22.658008 36.18601 34.76808 37.76103
Hyloscirtus lindae Anura LC Stream-dwelling 25.653878 36.56409 35.07773 38.14261
Hyloscirtus phyllognathus Anura LC Stream-dwelling 22.277657 37.18112 35.70867 38.60317
Hyloscirtus phyllognathus Anura LC Stream-dwelling 21.220654 37.04227 35.61238 38.50709
Hyloscirtus phyllognathus Anura LC Stream-dwelling 23.795333 37.38048 35.95201 38.92547
Hyloxalus bocagei Anura LC Stream-dwelling 24.246141 37.51895 35.64421 39.23126
Hyloxalus bocagei Anura LC Stream-dwelling 23.313995 37.38724 35.55149 39.11920
Hyloxalus bocagei Anura LC Stream-dwelling 25.863330 37.74745 35.81342 39.45697
Hyloxalus elachyhistus Anura LC Stream-dwelling 23.328916 36.15882 33.76257 38.61757
Hyloxalus elachyhistus Anura LC Stream-dwelling 22.356582 36.02645 33.73179 38.50535
Hyloxalus elachyhistus Anura LC Stream-dwelling 25.038241 36.39153 34.01762 38.90662
Colostethus jacobuspetersi Anura CR Stream-dwelling 19.805326 33.02547 30.67896 35.05069
Colostethus jacobuspetersi Anura CR Stream-dwelling 17.198230 32.69793 30.50872 34.88825
Colostethus jacobuspetersi Anura CR Stream-dwelling 22.861501 33.40943 31.14885 35.57286
Hyloxalus maculosus Anura DD Stream-dwelling 23.870176 36.72844 34.54208 38.73330
Hyloxalus maculosus Anura DD Stream-dwelling 22.471871 36.53872 34.38551 38.49246
Hyloxalus maculosus Anura DD Stream-dwelling 25.771383 36.98640 34.82901 39.15337
Hyloxalus nexipus Anura LC Stream-dwelling 23.656136 36.87561 34.60853 38.83339
Hyloxalus nexipus Anura LC Stream-dwelling 22.733830 36.74545 34.45527 38.66447
Hyloxalus nexipus Anura LC Stream-dwelling 25.341093 37.11341 34.83304 39.13300
Hyloxalus pulchellus Anura NT Ground-dwelling 23.104466 34.57885 32.51749 37.14699
Hyloxalus pulchellus Anura NT Ground-dwelling 21.766491 34.40265 32.39762 36.91830
Hyloxalus pulchellus Anura NT Ground-dwelling 24.960875 34.82332 32.54207 37.22413
Hyloxalus toachi Anura EN Ground-dwelling 22.986312 36.85959 34.80524 39.35495
Hyloxalus toachi Anura EN Ground-dwelling 21.456474 36.64990 34.55143 39.04732
Hyloxalus toachi Anura EN Ground-dwelling 25.131200 37.15358 34.76266 39.34800
Hyloxalus vertebralis Anura CR Stream-dwelling 23.499563 35.21639 32.93452 37.39710
Hyloxalus vertebralis Anura CR Stream-dwelling 22.018834 35.01609 32.82048 37.24095
Hyloxalus vertebralis Anura CR Stream-dwelling 25.735214 35.51880 33.09177 37.65823
Leptodactylus labrosus Anura LC Ground-dwelling 24.093412 39.38919 37.10262 41.39392
Leptodactylus labrosus Anura LC Ground-dwelling 23.141828 39.26559 37.07465 41.35309
Leptodactylus labrosus Anura LC Ground-dwelling 25.797436 39.61053 37.35297 41.62668
Leptodactylus rhodomystax Anura LC Ground-dwelling 27.579410 39.29749 37.09949 41.52347
Leptodactylus rhodomystax Anura LC Ground-dwelling 26.864078 39.20689 37.09489 41.46767
Leptodactylus rhodomystax Anura LC Ground-dwelling 29.120992 39.49274 37.20018 41.73593
Leptodactylus ventrimaculatus Anura LC Ground-dwelling 24.937993 39.19895 37.71395 40.68558
Leptodactylus ventrimaculatus Anura LC Ground-dwelling 24.047604 39.08374 37.64888 40.56891
Leptodactylus ventrimaculatus Anura LC Ground-dwelling 26.507941 39.40208 37.72440 40.85018
Leptodactylus wagneri Anura LC Ground-dwelling 25.962888 39.37594 37.26807 41.64060
Leptodactylus wagneri Anura LC Ground-dwelling 25.047608 39.26210 37.16916 41.52576
Leptodactylus wagneri Anura LC Ground-dwelling 27.574081 39.57633 37.33902 41.87184
Osteocephalus mutabor Anura LC Arboreal 24.600941 38.84923 37.18710 40.64769
Osteocephalus mutabor Anura LC Arboreal 23.554897 38.72149 37.07977 40.45605
Osteocephalus mutabor Anura LC Arboreal 26.336208 39.06114 37.26455 40.84597
Phyllomedusa coelestis Anura LC Ground-dwelling 25.065187 40.60201 38.42037 42.81847
Phyllomedusa coelestis Anura LC Ground-dwelling 24.285196 40.49439 38.32154 42.67300
Phyllomedusa coelestis Anura LC Ground-dwelling 26.623968 40.81708 38.54965 43.04877
Phyllomedusa vaillantii Anura LC Arboreal 27.576903 40.54062 38.96517 42.30953
Phyllomedusa vaillantii Anura LC Arboreal 26.857733 40.44070 38.89590 42.18077
Phyllomedusa vaillantii Anura LC Arboreal 29.134017 40.75696 39.17772 42.58246
Lithobates bwana Anura LC Semi-aquatic 24.606241 37.79464 35.80461 39.76588
Lithobates bwana Anura LC Semi-aquatic 23.503526 37.64140 35.68731 39.57196
Lithobates bwana Anura LC Semi-aquatic 26.501025 38.05796 36.00618 40.06793
Lithobates vaillanti Anura LC Semi-aquatic 26.097529 38.54479 36.48930 40.73575
Lithobates vaillanti Anura LC Semi-aquatic 25.273434 38.42926 36.21234 40.41243
Lithobates vaillanti Anura LC Semi-aquatic 27.713013 38.77125 36.90969 41.23516
Rhinella margaritifera Anura LC Ground-dwelling 27.084304 38.88154 37.36352 40.48257
Rhinella margaritifera Anura LC Ground-dwelling 26.288679 38.78867 37.28326 40.37031
Rhinella margaritifera Anura LC Ground-dwelling 28.728070 39.07341 37.45926 40.67490
Scinax elaeochroa Anura LC Arboreal 26.480345 40.26435 38.03072 42.74217
Scinax elaeochroa Anura LC Arboreal 25.748273 40.17155 37.93782 42.58010
Scinax elaeochroa Anura LC Arboreal 27.862185 40.43952 38.09711 42.85347
Scinax garbei Anura LC Arboreal 27.326182 39.97615 37.84324 42.25361
Scinax garbei Anura LC Arboreal 26.588927 39.88447 37.75704 42.12968
Scinax garbei Anura LC Arboreal 28.874148 40.16864 37.93107 42.43706
Scinax quinquefasciatus Anura LC Arboreal 24.616354 41.20541 39.35125 43.03390
Scinax quinquefasciatus Anura LC Arboreal 23.618313 41.07952 39.28903 42.92799
Scinax quinquefasciatus Anura LC Arboreal 26.265288 41.41341 39.55013 43.35755
Scinax ruber Anura LC Arboreal 27.428745 40.78879 39.37958 42.21463
Scinax ruber Anura LC Arboreal 26.666557 40.69422 39.34213 42.11603
Scinax ruber Anura LC Arboreal 29.044834 40.98929 39.48389 42.46765
Eleutherodactylus antillensis Anura LC Ground-dwelling 27.100319 45.46772 43.20019 47.57578
Eleutherodactylus antillensis Anura LC Ground-dwelling 26.555958 45.35477 43.11779 47.44807
Eleutherodactylus antillensis Anura LC Ground-dwelling 27.882953 45.63011 43.31069 47.77107
Eleutherodactylus brittoni Anura LC Ground-dwelling 26.951986 36.50472 34.06038 38.71138
Eleutherodactylus brittoni Anura LC Ground-dwelling 26.448459 36.45756 34.00172 38.62885
Eleutherodactylus brittoni Anura LC Ground-dwelling 27.635538 36.56876 34.11905 38.84425
Eleutherodactylus wightmanae Anura EN Ground-dwelling 26.909318 38.44017 36.12252 40.34261
Eleutherodactylus wightmanae Anura EN Ground-dwelling 26.392690 38.37580 36.06595 40.25098
Eleutherodactylus wightmanae Anura EN Ground-dwelling 27.600337 38.52627 36.17150 40.46221
Plethodon yonahlossee Caudata LC Ground-dwelling 25.800021 35.10147 33.73703 36.81362
Plethodon yonahlossee Caudata LC Ground-dwelling 23.529304 34.82812 33.31989 36.18844
Plethodon yonahlossee Caudata LC Ground-dwelling 28.868351 35.47083 33.85008 37.28125
Plethodon caddoensis Caudata NT Ground-dwelling 26.535050 35.73646 34.16342 37.30475
Plethodon caddoensis Caudata NT Ground-dwelling 24.472091 35.48679 34.07009 37.06091
Plethodon caddoensis Caudata NT Ground-dwelling 29.808076 36.13257 34.26584 37.87318
Plethodon dorsalis Caudata LC Ground-dwelling 26.105896 34.35695 32.11152 36.86382
Plethodon dorsalis Caudata LC Ground-dwelling 23.076841 33.98381 31.66330 36.08513
Plethodon dorsalis Caudata LC Ground-dwelling 29.453704 34.76936 32.34069 37.52912
Eurycea multiplicata Caudata LC Semi-aquatic 25.444802 37.64142 35.65078 39.22586
Eurycea multiplicata Caudata LC Semi-aquatic 23.308749 37.44406 35.68857 38.98869
Eurycea multiplicata Caudata LC Semi-aquatic 29.335530 38.00091 35.88308 40.06487
Plethodon serratus Caudata LC Ground-dwelling 25.571874 35.21598 33.07564 37.64315
Plethodon serratus Caudata LC Ground-dwelling 23.091812 34.91262 32.71508 37.08124
Plethodon serratus Caudata LC Ground-dwelling 29.496507 35.69603 33.28442 38.30489
Adenomera andreae Anura LC Ground-dwelling 27.336711 37.95190 35.61629 40.33543
Adenomera andreae Anura LC Ground-dwelling 26.604865 37.86351 35.52650 40.23865
Adenomera andreae Anura LC Ground-dwelling 28.892930 38.13986 35.68262 40.42983
Allobates conspicuus Anura DD Ground-dwelling 26.525372 36.49538 34.47094 38.81875
Allobates conspicuus Anura DD Ground-dwelling 25.786418 36.39946 34.39453 38.71595
Allobates conspicuus Anura DD Ground-dwelling 27.915035 36.67578 34.51919 38.89653
Allobates femoralis Anura LC Ground-dwelling 27.449361 39.97274 37.95662 42.16430
Allobates femoralis Anura LC Ground-dwelling 26.720267 39.86101 37.86276 42.04034
Allobates femoralis Anura LC Ground-dwelling 28.997731 40.21003 38.19087 42.44995
Allobates trilineatus Anura LC Ground-dwelling 25.104709 35.50559 33.17104 37.78552
Allobates trilineatus Anura LC Ground-dwelling 24.356533 35.41271 33.04784 37.68327
Allobates trilineatus Anura LC Ground-dwelling 26.500218 35.67883 33.38267 38.03455
Ameerega hahneli Anura LC Ground-dwelling 27.524329 38.70755 36.83259 41.02193
Ameerega hahneli Anura LC Ground-dwelling 26.817301 38.60908 36.74321 40.90621
Ameerega hahneli Anura LC Ground-dwelling 29.035421 38.91800 36.72416 41.00646
Ameerega trivittata Anura LC Ground-dwelling 27.656596 39.13981 36.93920 41.35434
Ameerega trivittata Anura LC Ground-dwelling 26.950152 39.03615 36.76340 41.12174
Ameerega trivittata Anura LC Ground-dwelling 29.184302 39.36396 37.30689 41.80134
Chiasmocleis bassleri Anura LC Fossorial 27.717312 39.45158 37.36806 41.81921
Chiasmocleis bassleri Anura LC Fossorial 26.959875 39.35015 37.23449 41.69239
Chiasmocleis bassleri Anura LC Fossorial 29.254362 39.65741 37.45419 41.94687
Ctenophryne geayi Anura LC Fossorial 27.232893 40.12566 37.83373 42.45442
Ctenophryne geayi Anura LC Fossorial 26.514806 40.02441 37.58848 42.19820
Ctenophryne geayi Anura LC Fossorial 28.762768 40.34138 37.96989 42.65915
Dendropsophus koechlini Anura LC Arboreal 26.287558 39.85417 37.96657 41.95939
Dendropsophus koechlini Anura LC Arboreal 25.519095 39.75203 37.85205 41.82854
Dendropsophus koechlini Anura LC Arboreal 27.728750 40.04571 38.06496 42.12846
Dendropsophus leucophyllatus Anura LC Arboreal 27.407738 40.87114 38.61052 42.88325
Dendropsophus leucophyllatus Anura LC Arboreal 26.692422 40.77724 38.79563 43.05465
Dendropsophus leucophyllatus Anura LC Arboreal 28.947355 41.07325 38.82000 43.12334
Dendropsophus schubarti Anura LC Arboreal 26.908705 38.36789 36.31696 40.68170
Dendropsophus schubarti Anura LC Arboreal 26.141679 38.27658 36.25423 40.58282
Dendropsophus schubarti Anura LC Arboreal 28.532174 38.56115 36.52107 40.95536
Edalorhina perezi Anura LC Ground-dwelling 27.233396 39.84654 37.63241 42.16872
Edalorhina perezi Anura LC Ground-dwelling 26.469376 39.74660 37.28288 41.75285
Edalorhina perezi Anura LC Ground-dwelling 28.714241 40.04024 37.58254 42.20293
Engystomops freibergi Anura LC Ground-dwelling 26.939369 38.81926 36.75916 40.85689
Engystomops freibergi Anura LC Ground-dwelling 26.179302 38.72657 36.80379 40.84144
Engystomops freibergi Anura LC Ground-dwelling 28.493060 39.00873 36.91036 41.07364
Hamptophryne boliviana Anura LC Ground-dwelling 27.417312 40.00964 38.01187 42.45739
Hamptophryne boliviana Anura LC Ground-dwelling 26.692523 39.91171 37.85878 42.24480
Hamptophryne boliviana Anura LC Ground-dwelling 28.973002 40.21983 38.15173 42.69309
Boana punctata Anura LC Arboreal 26.999464 40.65675 38.45514 42.79239
Boana punctata Anura LC Arboreal 26.115953 40.53508 38.33099 42.64123
Boana punctata Anura LC Arboreal 28.768927 40.90044 38.59700 42.97250
Leptodactylus bolivianus Anura LC Semi-aquatic 27.188422 39.07941 37.03742 41.54976
Leptodactylus bolivianus Anura LC Semi-aquatic 26.455967 38.98877 36.96184 41.45900
Leptodactylus bolivianus Anura LC Semi-aquatic 28.741056 39.27156 37.07179 41.64386
Leptodactylus didymus Anura LC Ground-dwelling 22.146497 38.09861 35.93070 40.17592
Leptodactylus didymus Anura LC Ground-dwelling 21.361075 38.00328 35.80291 40.05784
Leptodactylus didymus Anura LC Ground-dwelling 23.375214 38.24774 36.16455 40.33716
Leptodactylus leptodactyloides Anura LC Ground-dwelling 27.433733 39.65611 37.53425 41.81256
Leptodactylus leptodactyloides Anura LC Ground-dwelling 26.727593 39.56562 37.47532 41.69959
Leptodactylus leptodactyloides Anura LC Ground-dwelling 28.970029 39.85299 37.55391 41.94063
Leptodactylus petersii Anura LC Ground-dwelling 27.690084 39.84792 37.73765 41.81854
Leptodactylus petersii Anura LC Ground-dwelling 26.940594 39.75324 37.78172 41.80967
Leptodactylus petersii Anura LC Ground-dwelling 29.292669 40.05035 37.95340 42.16217
Lithodytes lineatus Anura LC Ground-dwelling 27.179455 39.80360 37.51023 41.99373
Lithodytes lineatus Anura LC Ground-dwelling 26.458499 39.70801 37.43881 41.88824
Lithodytes lineatus Anura LC Ground-dwelling 28.723511 40.00831 37.76038 42.26807
Oreobates quixensis Anura LC Ground-dwelling 27.084996 37.61602 35.48423 39.70221
Oreobates quixensis Anura LC Ground-dwelling 26.318842 37.48853 35.37731 39.56918
Oreobates quixensis Anura LC Ground-dwelling 28.576446 37.86421 35.61249 39.89084
Osteocephalus buckleyi Anura LC Stream-dwelling 27.290320 39.76244 37.67904 41.86366
Osteocephalus buckleyi Anura LC Stream-dwelling 26.574573 39.66589 37.65274 41.79118
Osteocephalus buckleyi Anura LC Stream-dwelling 28.813329 39.96790 38.10777 42.44125
Phyllomedusa camba Anura LC Arboreal 26.460486 41.41157 39.58496 43.46404
Phyllomedusa camba Anura LC Arboreal 25.657317 41.29680 39.49218 43.30753
Phyllomedusa camba Anura LC Arboreal 28.063087 41.64058 39.50776 43.49191
Pristimantis fenestratus Anura LC Ground-dwelling 27.695321 35.32204 33.05821 37.38503
Pristimantis fenestratus Anura LC Ground-dwelling 26.964108 35.21731 32.98513 37.29972
Pristimantis fenestratus Anura LC Ground-dwelling 29.275475 35.54835 33.21614 37.64030
Ranitomeya sirensis Anura LC Arboreal 21.968866 38.03888 35.69075 40.20037
Ranitomeya sirensis Anura LC Arboreal 21.175998 37.91943 35.56542 40.06461
Ranitomeya sirensis Anura LC Arboreal 23.306122 38.24034 35.98825 40.49329
Scarthyla goinorum Anura LC Semi-aquatic 27.775071 38.64205 36.30091 40.87232
Scarthyla goinorum Anura LC Semi-aquatic 27.025097 38.55613 36.19848 40.70847
Scarthyla goinorum Anura LC Semi-aquatic 29.290099 38.81559 36.13984 40.81681
Scinax ictericus Anura LC Arboreal 22.997749 40.12200 37.97207 42.48160
Scinax ictericus Anura LC Arboreal 22.321185 40.03660 37.90702 42.44451
Scinax ictericus Anura LC Arboreal 24.173715 40.27043 38.11949 42.68079
Sphaenorhynchus lacteus Anura LC Semi-aquatic 27.410364 41.44774 39.21361 43.73559
Sphaenorhynchus lacteus Anura LC Semi-aquatic 26.693859 41.35375 39.10975 43.59440
Sphaenorhynchus lacteus Anura LC Semi-aquatic 28.952800 41.65008 39.43435 44.00787
Leptodactylus lithonaetes Anura LC Stream-dwelling 27.661690 41.17483 39.20090 42.91342
Leptodactylus lithonaetes Anura LC Stream-dwelling 26.957256 41.06813 39.08099 42.82745
Leptodactylus lithonaetes Anura LC Stream-dwelling 29.179950 41.40482 39.47690 43.13288
Chiropterotriton multidentatus Caudata EN Arboreal 23.066179 34.08395 33.14232 35.14012
Chiropterotriton multidentatus Caudata EN Arboreal 22.040805 33.95862 33.05307 34.94712
Chiropterotriton multidentatus Caudata EN Arboreal 25.197040 34.34438 33.32957 35.60690
Bufo bankorensis Anura LC Ground-dwelling 27.514509 39.87984 39.35691 40.42004
Bufo bankorensis Anura LC Ground-dwelling 26.761020 39.76180 39.28342 40.30385
Bufo bankorensis Anura LC Ground-dwelling 28.703695 40.06614 39.52150 40.65370
Odorrana swinhoana Anura LC Stream-dwelling 27.395311 36.18974 34.37177 38.06597
Odorrana swinhoana Anura LC Stream-dwelling 26.621837 36.08423 34.28397 37.92779
Odorrana swinhoana Anura LC Stream-dwelling 28.594579 36.35334 34.57225 38.32429
Kurixalus eiffingeri Anura LC Arboreal 27.441253 35.52215 34.21905 36.71238
Kurixalus eiffingeri Anura LC Arboreal 26.656250 35.44142 34.30550 36.72348
Kurixalus eiffingeri Anura LC Arboreal 28.646511 35.64611 34.19747 36.84904
Fejervarya limnocharis Anura LC Ground-dwelling 26.363591 40.11326 39.18921 41.04696
Fejervarya limnocharis Anura LC Ground-dwelling 25.074396 39.95158 39.11484 40.97277
Fejervarya limnocharis Anura LC Ground-dwelling 28.441970 40.37392 39.46301 41.38938
Hylarana latouchii Anura LC Ground-dwelling 27.155017 38.38551 36.72633 40.25995
Hylarana latouchii Anura LC Ground-dwelling 25.575214 38.17299 36.55398 40.01909
Hylarana latouchii Anura LC Ground-dwelling 29.476888 38.69786 36.81428 40.56052
Rana longicrus Anura VU Semi-aquatic 27.321876 36.85203 34.92848 38.67137
Rana longicrus Anura VU Semi-aquatic 26.484367 36.74120 34.79870 38.42483
Rana longicrus Anura VU Semi-aquatic 28.616127 37.02330 35.03496 38.90639
Rana sauteri Anura VU Stream-dwelling 27.421578 35.45392 33.76634 37.29228
Rana sauteri Anura VU Stream-dwelling 26.675417 35.35558 33.67311 37.15945
Rana sauteri Anura VU Stream-dwelling 28.608292 35.61032 33.96269 37.54903
Kaloula pulchra Anura LC Ground-dwelling 27.566496 41.06636 40.11473 41.80228
Kaloula pulchra Anura LC Ground-dwelling 26.701150 40.91651 40.01191 41.65817
Kaloula pulchra Anura LC Ground-dwelling 29.277603 41.36267 40.47373 42.31284
Batrachyla taeniata Anura LC Ground-dwelling 14.255902 35.56092 34.62784 36.43576
Batrachyla taeniata Anura LC Ground-dwelling 12.211969 35.33778 34.37641 36.23897
Batrachyla taeniata Anura LC Ground-dwelling 18.532463 36.02781 35.13724 37.10527
Atelopus limosus Anura CR Stream-dwelling 27.088398 37.73753 34.94583 39.83935
Atelopus limosus Anura CR Stream-dwelling 26.527920 37.66149 34.94439 39.78260
Atelopus limosus Anura CR Stream-dwelling 28.279757 37.89915 35.13696 40.09074
Physalaemus nattereri Anura LC Fossorial 27.012709 41.35516 40.38971 42.47080
Physalaemus nattereri Anura LC Fossorial 25.887194 41.20338 40.27432 42.26051
Physalaemus nattereri Anura LC Fossorial 29.253390 41.65732 40.57721 42.86774
Boana pardalis Anura LC Arboreal 25.548561 41.56469 40.33960 42.99918
Boana pardalis Anura LC Arboreal 24.374994 41.40459 40.12736 42.73935
Boana pardalis Anura LC Arboreal 27.669221 41.85399 40.56134 43.39013
Hylorina sylvatica Anura LC Semi-aquatic 13.124678 34.70268 32.66475 36.81451
Hylorina sylvatica Anura LC Semi-aquatic 11.166061 34.44249 32.40984 36.59327
Hylorina sylvatica Anura LC Semi-aquatic 17.515376 35.28594 33.25634 37.41320
Craugastor crassidigitus Anura LC Ground-dwelling 26.722658 37.51663 35.27250 39.78024
Craugastor crassidigitus Anura LC Ground-dwelling 26.102354 37.43237 35.17938 39.70364
Craugastor crassidigitus Anura LC Ground-dwelling 27.984135 37.68799 35.33347 39.98279
Craugastor fitzingeri Anura LC Ground-dwelling 26.572651 38.42677 36.31160 40.56259
Craugastor fitzingeri Anura LC Ground-dwelling 25.861127 38.32414 36.22756 40.45616
Craugastor fitzingeri Anura LC Ground-dwelling 28.002549 38.63300 36.45827 40.81785
Dendropsophus anceps Anura LC Arboreal 25.499168 38.44676 36.89114 40.13210
Dendropsophus anceps Anura LC Arboreal 24.438720 38.31892 36.76096 39.93982
Dendropsophus anceps Anura LC Arboreal 27.413115 38.67748 37.07399 40.40772
Dendropsophus decipiens Anura LC Arboreal 25.749589 37.54659 35.97592 39.32216
Dendropsophus decipiens Anura LC Arboreal 24.758249 37.43612 35.94349 39.26766
Dendropsophus decipiens Anura LC Arboreal 27.493444 37.74093 36.08641 39.50352
Alytes maurus Anura EN Ground-dwelling 21.769723 37.31064 35.05970 39.46124
Alytes maurus Anura EN Ground-dwelling 20.218430 37.09044 35.11333 39.38399
Alytes maurus Anura EN Ground-dwelling 24.376298 37.68062 35.19550 39.88632
Bufo gargarizans Anura LC Ground-dwelling 21.332920 37.41990 36.61630 38.15938
Bufo gargarizans Anura LC Ground-dwelling 18.633791 37.03884 36.25896 37.69502
Bufo gargarizans Anura LC Ground-dwelling 24.676640 37.89196 36.97139 38.75018
Pseudacris feriarum Anura LC Ground-dwelling 25.648446 38.62626 36.74992 40.64231
Pseudacris feriarum Anura LC Ground-dwelling 22.461698 38.22764 36.45512 40.17606
Pseudacris feriarum Anura LC Ground-dwelling 29.066762 39.05384 36.99131 41.18801
Cophixalus aenigma Anura VU Ground-dwelling 26.415710 31.88702 29.14228 34.26350
Cophixalus aenigma Anura VU Ground-dwelling 25.165581 31.70900 29.14110 34.15633
Cophixalus aenigma Anura VU Ground-dwelling 28.731015 32.21672 29.52657 34.82166
Cophixalus bombiens Anura LC Ground-dwelling 26.801236 35.00594 32.34153 37.50722
Cophixalus bombiens Anura LC Ground-dwelling 25.588831 34.83136 32.21014 37.25615
Cophixalus bombiens Anura LC Ground-dwelling 29.037380 35.32793 32.99590 38.42120
Cophixalus concinnus Anura CR Ground-dwelling 26.415710 32.49630 29.83407 34.86526
Cophixalus concinnus Anura CR Ground-dwelling 25.165581 32.32009 29.68892 34.66313
Cophixalus concinnus Anura CR Ground-dwelling 28.731015 32.82266 30.09654 35.27581
Cophixalus exiguus Anura LC Ground-dwelling 27.228068 36.96072 34.67720 39.39367
Cophixalus exiguus Anura LC Ground-dwelling 26.069923 36.78846 34.48317 39.18659
Cophixalus exiguus Anura LC Ground-dwelling 29.362021 37.27813 34.91511 39.79913
Cophixalus hosmeri Anura EN Arboreal 26.415710 34.49678 32.14587 37.13292
Cophixalus hosmeri Anura EN Arboreal 25.165581 34.31288 32.05000 36.91810
Cophixalus hosmeri Anura EN Arboreal 28.731015 34.83737 32.24110 37.51479
Cophixalus infacetus Anura LC Ground-dwelling 25.726234 36.19802 33.73605 38.71970
Cophixalus infacetus Anura LC Ground-dwelling 24.774413 36.05874 33.71843 38.65420
Cophixalus infacetus Anura LC Ground-dwelling 27.439325 36.44871 33.92008 38.98497
Cophixalus mcdonaldi Anura CR Arboreal 24.988161 34.71835 32.20723 36.93856
Cophixalus mcdonaldi Anura CR Arboreal 23.609885 34.52131 32.05184 36.79799
Cophixalus mcdonaldi Anura CR Arboreal 27.450133 35.07032 32.69721 37.56324
Cophixalus monticola Anura CR Arboreal 26.415710 33.89951 31.33631 36.53761
Cophixalus monticola Anura CR Arboreal 25.165581 33.72222 31.25047 36.33569
Cophixalus monticola Anura CR Arboreal 28.731015 34.22786 31.49787 36.98089
Cophixalus neglectus Anura CR Ground-dwelling 24.826134 33.75348 31.30153 36.31941
Cophixalus neglectus Anura CR Ground-dwelling 23.921945 33.62251 31.14052 36.11096
Cophixalus neglectus Anura CR Ground-dwelling 26.425790 33.98520 31.54296 36.70879
Cophixalus saxatilis Anura LC Ground-dwelling 27.228068 36.24367 33.81975 38.60986
Cophixalus saxatilis Anura LC Ground-dwelling 26.069923 36.07143 33.59125 38.36591
Cophixalus saxatilis Anura LC Ground-dwelling 29.362021 36.56103 34.08558 38.94995
Craugastor rhodopis Anura LC Ground-dwelling 24.330446 34.87649 32.50133 37.07616
Craugastor rhodopis Anura LC Ground-dwelling 23.337194 34.74371 32.30919 36.87693
Craugastor rhodopis Anura LC Ground-dwelling 26.529719 35.17050 32.74844 37.44433
Rheohyla miotympanum Anura LC Arboreal 24.201966 39.47822 36.90828 41.62900
Rheohyla miotympanum Anura LC Arboreal 23.155981 39.34154 36.81824 41.47205
Rheohyla miotympanum Anura LC Arboreal 26.310517 39.75376 37.41464 42.28292
Engystomops pustulosus Anura LC Ground-dwelling 26.449767 40.18439 39.44853 40.92581
Engystomops pustulosus Anura LC Ground-dwelling 25.646919 40.06652 39.35373 40.83651
Engystomops pustulosus Anura LC Ground-dwelling 28.051185 40.41951 39.75069 41.21936
Craugastor loki Anura LC Ground-dwelling 26.321194 35.90275 34.74143 37.23174
Craugastor loki Anura LC Ground-dwelling 25.405887 35.78184 34.68257 37.13998
Craugastor loki Anura LC Ground-dwelling 28.229800 36.15487 34.77215 37.46627
Pleurodema brachyops Anura LC Ground-dwelling 26.709086 42.79322 41.45814 44.25798
Pleurodema brachyops Anura LC Ground-dwelling 25.947995 42.67349 41.31907 44.11977
Pleurodema brachyops Anura LC Ground-dwelling 28.268318 43.03850 41.68178 44.51023
Pristimantis frater Anura LC Arboreal 23.647121 33.77803 31.86861 35.63549
Pristimantis frater Anura LC Arboreal 22.787811 33.66754 31.78146 35.50745
Pristimantis frater Anura LC Arboreal 25.315927 33.99262 32.10050 35.95922
Pristimantis medemi Anura LC Arboreal 24.189374 35.02791 32.51771 37.29650
Pristimantis medemi Anura LC Arboreal 23.389942 34.91156 32.53443 37.36119
Pristimantis medemi Anura LC Arboreal 25.822636 35.26561 33.00802 37.81402
Pristimantis taeniatus Anura LC Ground-dwelling 26.071208 36.74640 34.92597 38.49950
Pristimantis taeniatus Anura LC Ground-dwelling 25.371504 36.64224 34.83700 38.38416
Pristimantis taeniatus Anura LC Ground-dwelling 27.513249 36.96106 35.09751 38.71128
Pristimantis fallax Anura VU Stream-dwelling 23.628676 35.92268 33.90030 38.39404
Pristimantis fallax Anura VU Stream-dwelling 22.714297 35.78488 33.64303 38.14418
Pristimantis fallax Anura VU Stream-dwelling 25.234324 36.16464 34.20683 38.77348
Pristimantis w-nigrum Anura LC Arboreal 24.242574 36.15408 33.95105 38.16569
Pristimantis w-nigrum Anura LC Arboreal 23.266761 35.99754 33.75400 37.93978
Pristimantis w-nigrum Anura LC Arboreal 25.929147 36.42465 34.26021 38.51497
Pristimantis bicolor Anura VU Arboreal 23.634135 35.68944 33.37983 38.31732
Pristimantis bicolor Anura VU Arboreal 22.896095 35.58231 33.09089 38.01380
Pristimantis bicolor Anura VU Arboreal 25.228297 35.92085 33.50265 38.51442
Pristimantis bogotensis Anura LC Arboreal 22.977523 35.30491 33.81807 36.84169
Pristimantis bogotensis Anura LC Arboreal 22.085246 35.17992 33.76074 36.71463
Pristimantis bogotensis Anura LC Arboreal 24.609919 35.53358 33.98022 37.18087
Pristimantis savagei Anura NT Arboreal 24.089231 33.60704 31.43248 36.08607
Pristimantis savagei Anura NT Arboreal 23.292529 33.49593 31.32229 35.95521
Pristimantis savagei Anura NT Arboreal 25.685061 33.82960 31.69949 36.46112
Pristimantis renjiforum Anura EN Ground-dwelling 23.231393 36.34027 34.03165 38.98733
Pristimantis renjiforum Anura EN Ground-dwelling 22.364476 36.22032 34.02636 38.91142
Pristimantis renjiforum Anura EN Ground-dwelling 24.748943 36.55025 34.13843 39.21635
Pristimantis conspicillatus Anura LC Ground-dwelling 26.492196 35.65518 33.21752 37.86333
Pristimantis conspicillatus Anura LC Ground-dwelling 25.741338 35.54963 33.10844 37.71035
Pristimantis conspicillatus Anura LC Ground-dwelling 27.961036 35.86166 33.35904 38.19911
Pristimantis elegans Anura VU Arboreal 23.149266 35.36109 33.84675 36.88380
Pristimantis elegans Anura VU Arboreal 22.297397 35.24252 33.72998 36.69106
Pristimantis elegans Anura VU Arboreal 24.812711 35.59263 34.00064 37.22921
Pristimantis nervicus Anura LC Ground-dwelling 22.992371 35.69363 33.26369 38.14189
Pristimantis nervicus Anura LC Ground-dwelling 22.118649 35.57218 33.14287 37.92474
Pristimantis nervicus Anura LC Ground-dwelling 24.751450 35.93816 33.45121 38.48086
Eurycea sosorum Caudata VU Aquatic 26.500352 36.39330 34.21026 38.38225
Eurycea sosorum Caudata VU Aquatic 25.286696 36.27567 34.04014 38.13273
Eurycea sosorum Caudata VU Aquatic 29.192627 36.65424 34.25097 38.71203
Duttaphrynus melanostictus Anura LC Ground-dwelling 26.998722 39.00029 37.76821 40.34305
Duttaphrynus melanostictus Anura LC Ground-dwelling 25.998304 38.86582 37.63125 40.21948
Duttaphrynus melanostictus Anura LC Ground-dwelling 28.894420 39.25510 37.97166 40.67227
Limnonectes blythii Anura LC Stream-dwelling 28.089075 37.11896 34.73348 39.31465
Limnonectes blythii Anura LC Stream-dwelling 27.384388 37.02879 34.66001 39.22868
Limnonectes blythii Anura LC Stream-dwelling 29.594612 37.31160 34.91206 39.56646
Limnonectes malesianus Anura LC Stream-dwelling 28.202336 37.48714 34.86601 39.69908
Limnonectes malesianus Anura LC Stream-dwelling 27.520200 37.39983 34.79570 39.57145
Limnonectes malesianus Anura LC Stream-dwelling 29.629396 37.66980 34.97000 39.96610
Nyctixalus pictus Anura LC Arboreal 27.780370 37.29310 34.99940 39.49998
Nyctixalus pictus Anura LC Arboreal 27.173132 37.21281 34.94251 39.42944
Nyctixalus pictus Anura LC Arboreal 29.039628 37.45959 35.13223 39.76801
Polypedates leucomystax Anura LC Arboreal 27.042901 39.06387 36.93361 41.36224
Polypedates leucomystax Anura LC Arboreal 26.302092 38.96369 36.85176 41.22688
Polypedates leucomystax Anura LC Arboreal 28.523530 39.26410 36.97460 41.47657
Microhyla butleri Anura LC Ground-dwelling 26.839623 38.47737 36.19760 40.75222
Microhyla butleri Anura LC Ground-dwelling 25.755793 38.32533 36.07800 40.66206
Microhyla butleri Anura LC Ground-dwelling 28.740012 38.74395 36.36680 41.07612
Microhyla heymonsi Anura LC Ground-dwelling 27.189960 40.52937 38.23810 42.92662
Microhyla heymonsi Anura LC Ground-dwelling 26.124000 40.37510 38.06542 42.67848
Microhyla heymonsi Anura LC Ground-dwelling 29.071166 40.80163 38.37744 43.15794
Microhyla mantheyi Anura LC Ground-dwelling 28.267068 37.40238 34.99020 39.75347
Microhyla mantheyi Anura LC Ground-dwelling 27.576765 37.30844 34.91960 39.62203
Microhyla mantheyi Anura LC Ground-dwelling 29.788156 37.60937 35.16179 40.02378
Pseudis paradoxa Anura LC Aquatic 27.408842 41.18748 38.76892 43.13219
Pseudis paradoxa Anura LC Aquatic 26.508077 41.07525 38.70177 42.96033
Pseudis paradoxa Anura LC Aquatic 29.250377 41.41692 39.05609 43.56529
Anaxyrus punctatus Anura LC Fossorial 22.586297 40.20711 38.84831 41.49307
Anaxyrus punctatus Anura LC Fossorial 20.834767 39.98048 38.59273 41.24410
Anaxyrus punctatus Anura LC Fossorial 25.352864 40.56508 39.29617 42.00119
Craugastor longirostris Anura LC Ground-dwelling 25.628476 40.00618 37.39799 42.26877
Craugastor longirostris Anura LC Ground-dwelling 24.836657 39.89203 37.31162 42.12365
Craugastor longirostris Anura LC Ground-dwelling 27.106370 40.21922 37.51990 42.46707
Pristimantis achatinus Anura LC Ground-dwelling 24.953709 38.35438 36.43640 40.08545
Pristimantis achatinus Anura LC Ground-dwelling 24.077514 38.22309 36.36277 39.94058
Pristimantis achatinus Anura LC Ground-dwelling 26.510669 38.58767 36.67418 40.42804
Pristimantis latidiscus Anura LC Arboreal 25.249689 36.94002 34.64183 39.30542
Pristimantis latidiscus Anura LC Arboreal 24.468097 36.82664 34.62051 39.22421
Pristimantis latidiscus Anura LC Arboreal 26.689412 37.14887 34.80060 39.54741
Pristimantis laticlavius Anura VU Arboreal 22.593496 34.91432 33.25642 37.01514
Pristimantis laticlavius Anura VU Arboreal 21.178511 34.71167 33.15479 36.83745
Pristimantis laticlavius Anura VU Arboreal 24.575191 35.19815 33.33797 37.13385
Pristimantis incomptus Anura LC Arboreal 22.906981 34.75592 32.43057 36.95966
Pristimantis incomptus Anura LC Arboreal 21.483456 34.55335 32.14307 36.65337
Pristimantis incomptus Anura LC Arboreal 24.951026 35.04678 32.66093 37.21136
Pristimantis quaquaversus Anura LC Arboreal 24.740908 35.15724 32.79671 37.25976
Pristimantis quaquaversus Anura LC Arboreal 23.823776 35.02403 32.65117 37.10213
Pristimantis quaquaversus Anura LC Arboreal 26.391577 35.39701 33.02915 37.56673
Pristimantis crenunguis Anura EN Stream-dwelling 22.986312 34.19682 31.85686 36.32118
Pristimantis crenunguis Anura EN Stream-dwelling 21.456474 33.97547 31.65264 36.00621
Pristimantis crenunguis Anura EN Stream-dwelling 25.131200 34.50716 32.34491 36.86293
Pristimantis trachyblepharis Anura LC Arboreal 23.649499 33.46583 31.17765 35.77394
Pristimantis trachyblepharis Anura LC Arboreal 22.473968 33.30439 31.09222 35.63067
Pristimantis trachyblepharis Anura LC Arboreal 25.512832 33.72173 31.18524 35.84827
Pristimantis actites Anura VU Ground-dwelling 22.903646 34.66822 32.53907 36.69407
Pristimantis actites Anura VU Ground-dwelling 21.297960 34.44491 32.38978 36.51057
Pristimantis actites Anura VU Ground-dwelling 25.045552 34.96612 32.75799 36.98932
Pristimantis unistrigatus Anura LC Ground-dwelling 22.208859 35.61051 33.84233 37.25414
Pristimantis unistrigatus Anura LC Ground-dwelling 20.675313 35.39072 33.58629 36.96695
Pristimantis unistrigatus Anura LC Ground-dwelling 24.228444 35.89996 34.04486 37.52274
Pristimantis vertebralis Anura VU Stream-dwelling 22.208003 31.69978 29.49138 33.78692
Pristimantis vertebralis Anura VU Stream-dwelling 20.442740 31.45442 29.34371 33.66176
Pristimantis vertebralis Anura VU Stream-dwelling 24.557603 32.02636 29.82696 34.17333
Pristimantis riveti Anura CR Ground-dwelling 22.043563 34.88749 32.63304 37.17114
Pristimantis riveti Anura CR Ground-dwelling 20.823650 34.71170 32.45424 36.95752
Pristimantis riveti Anura CR Ground-dwelling 23.766620 35.13577 32.86291 37.52183
Pristimantis phoxocephalus Anura CR Arboreal 23.033729 32.33111 29.96352 34.59074
Pristimantis phoxocephalus Anura CR Arboreal 21.190651 32.07398 29.71420 34.24631
Pristimantis phoxocephalus Anura CR Arboreal 25.447074 32.66781 30.25656 34.98497
Pristimantis pycnodermis Anura EN Arboreal 23.049225 34.50209 32.37553 36.71222
Pristimantis pycnodermis Anura EN Arboreal 21.493692 34.28047 32.03301 36.37780
Pristimantis pycnodermis Anura EN Arboreal 25.325715 34.82642 32.64489 37.08543
Pristimantis curtipes Anura LC Ground-dwelling 22.330378 34.61732 32.70468 36.97811
Pristimantis curtipes Anura LC Ground-dwelling 20.719567 34.39141 32.38352 36.58683
Pristimantis curtipes Anura LC Ground-dwelling 24.454681 34.91525 32.92974 37.29671
Pleurodema marmoratum Anura VU Ground-dwelling 16.284323 36.22708 34.18540 38.15420
Pleurodema marmoratum Anura VU Ground-dwelling 14.758955 36.02946 34.01557 37.95991
Pleurodema marmoratum Anura VU Ground-dwelling 18.560447 36.52196 34.55136 38.56742
Microhyla fissipes Anura LC Ground-dwelling 26.295214 39.33562 37.92800 40.77718
Microhyla fissipes Anura LC Ground-dwelling 24.846265 39.13780 37.77276 40.58533
Microhyla fissipes Anura LC Ground-dwelling 28.511561 39.63822 38.10100 41.14942
Hoplobatrachus rugulosus Anura LC Semi-aquatic 27.010259 42.53600 40.08815 44.94544
Hoplobatrachus rugulosus Anura LC Semi-aquatic 25.740998 42.35578 39.92947 44.73488
Hoplobatrachus rugulosus Anura LC Semi-aquatic 29.073415 42.82895 40.37442 45.35028
Microhyla ornata Anura LC Ground-dwelling 26.507481 40.05139 38.72277 41.57460
Microhyla ornata Anura LC Ground-dwelling 25.293963 39.87284 38.65640 41.45396
Microhyla ornata Anura LC Ground-dwelling 28.676190 40.37049 39.00677 41.94516
Rana dybowskii Anura LC Semi-aquatic 18.244216 29.36283 28.49545 30.24583
Rana dybowskii Anura LC Semi-aquatic 14.179610 28.94416 27.93541 30.01903
Rana dybowskii Anura LC Semi-aquatic 22.620571 29.81362 28.93511 30.78229
Hyperolius marmoratus Anura LC Arboreal 24.117403 46.03317 45.23247 46.81729
Hyperolius marmoratus Anura LC Arboreal 22.993360 45.79944 45.11020 46.55617
Hyperolius marmoratus Anura LC Arboreal 26.227887 46.47202 45.47465 47.30801
Oophaga pumilio Anura LC Ground-dwelling 26.534847 32.86695 31.27791 34.90825
Oophaga pumilio Anura LC Ground-dwelling 25.755738 32.77726 31.00543 34.61610
Oophaga pumilio Anura LC Ground-dwelling 27.998334 33.03542 31.29595 34.96929
Odontophrynus barrioi Anura LC Ground-dwelling 19.888283 37.56406 36.10551 38.81295
Odontophrynus barrioi Anura LC Ground-dwelling 18.097781 37.29907 35.95140 38.67085
Odontophrynus barrioi Anura LC Ground-dwelling 23.047078 38.03154 36.65974 39.45840
Pleurodema nebulosum Anura LC Ground-dwelling 19.719194 39.69379 37.74808 41.94607
Pleurodema nebulosum Anura LC Ground-dwelling 17.713046 39.41789 37.44182 41.65774
Pleurodema nebulosum Anura LC Ground-dwelling 23.479780 40.21098 38.23774 42.57729
Pleurodema tucumanum Anura LC Ground-dwelling 22.758730 40.22621 38.30877 42.26292
Pleurodema tucumanum Anura LC Ground-dwelling 20.890279 39.97885 37.90875 41.75403
Pleurodema tucumanum Anura LC Ground-dwelling 25.875681 40.63886 38.52256 42.57921
Desmognathus brimleyorum Caudata LC Semi-aquatic 26.558190 35.77729 33.94598 37.70727
Desmognathus brimleyorum Caudata LC Semi-aquatic 24.631292 35.53243 33.90120 37.49900
Desmognathus brimleyorum Caudata LC Semi-aquatic 29.652741 36.17052 34.20720 38.36627
Ambystoma californiense Caudata VU Ground-dwelling 19.685859 36.49679 34.36201 38.47989
Ambystoma californiense Caudata VU Ground-dwelling 18.312888 36.32879 34.24000 38.22853
Ambystoma californiense Caudata VU Ground-dwelling 21.999293 36.77986 34.62935 38.89036
Ambystoma mavortium Caudata LC Ground-dwelling 20.226437 36.39017 34.28126 38.63011
Ambystoma mavortium Caudata LC Ground-dwelling 17.587617 36.06482 33.97124 38.19942
Ambystoma mavortium Caudata LC Ground-dwelling 23.875884 36.84013 34.70321 39.31363
Batrachuperus karlschmidti Caudata VU Stream-dwelling 16.399896 32.84581 29.84628 35.75212
Batrachuperus karlschmidti Caudata VU Stream-dwelling 14.140677 32.54285 29.69296 35.63141
Batrachuperus karlschmidti Caudata VU Stream-dwelling 18.989650 33.19310 30.23353 36.13760
Batrachuperus londongensis Caudata EN Stream-dwelling 20.716649 33.28365 30.21586 36.37340
Batrachuperus londongensis Caudata EN Stream-dwelling 18.796383 33.02604 29.99250 36.08028
Batrachuperus londongensis Caudata EN Stream-dwelling 23.031664 33.59422 30.53780 36.85679
Batrachuperus pinchonii Caudata VU Semi-aquatic 18.334808 33.83821 30.72412 36.76406
Batrachuperus pinchonii Caudata VU Semi-aquatic 16.288402 33.57066 30.56101 36.53491
Batrachuperus pinchonii Caudata VU Semi-aquatic 20.786179 34.15871 30.98483 37.13258
Liua shihi Caudata LC Semi-aquatic 24.839697 34.43503 30.67124 38.69260
Liua shihi Caudata LC Semi-aquatic 22.105195 34.06828 30.32350 38.16309
Liua shihi Caudata LC Semi-aquatic 28.017331 34.86122 30.67301 38.95050
Liua tsinpaensis Caudata VU Semi-aquatic 22.153719 34.07123 30.64504 38.05921
Liua tsinpaensis Caudata VU Semi-aquatic 19.461413 33.70627 30.35903 37.75954
Liua tsinpaensis Caudata VU Semi-aquatic 25.656249 34.54601 30.93054 38.41741
Pseudohynobius flavomaculatus Caudata VU Ground-dwelling 25.967304 34.30959 30.50064 38.43489
Pseudohynobius flavomaculatus Caudata VU Ground-dwelling 23.557808 33.97980 30.19973 38.05763
Pseudohynobius flavomaculatus Caudata VU Ground-dwelling 28.502143 34.65653 30.59584 38.70310
Pseudohynobius kuankuoshuiensis Caudata CR Semi-aquatic 25.072476 34.44986 30.89747 38.98954
Pseudohynobius kuankuoshuiensis Caudata CR Semi-aquatic 23.322387 34.21223 30.79470 38.78717
Pseudohynobius kuankuoshuiensis Caudata CR Semi-aquatic 27.473569 34.77587 31.14589 39.46115
Pseudohynobius shuichengensis Caudata CR Ground-dwelling 23.039610 33.88555 30.27961 37.92496
Pseudohynobius shuichengensis Caudata CR Ground-dwelling 21.766568 33.71492 30.15200 37.66867
Pseudohynobius shuichengensis Caudata CR Ground-dwelling 25.469759 34.21126 30.49285 38.27795
Pseudohynobius puxiongensis Caudata CR Ground-dwelling 20.706935 33.67561 29.60713 37.65257
Pseudohynobius puxiongensis Caudata CR Ground-dwelling 19.102920 33.45492 29.42166 37.39849
Pseudohynobius puxiongensis Caudata CR Ground-dwelling 22.692973 33.94885 29.83657 37.83916
Hynobius abei Caudata EN Ground-dwelling 24.665948 33.84299 30.19908 37.86152
Hynobius abei Caudata EN Ground-dwelling 21.759341 33.44878 29.85664 37.40188
Hynobius abei Caudata EN Ground-dwelling 27.579047 34.23808 30.54388 38.30744
Hynobius lichenatus Caudata LC Semi-aquatic 23.695550 33.98193 30.19247 37.53666
Hynobius lichenatus Caudata LC Semi-aquatic 20.639753 33.56336 29.84130 37.01878
Hynobius lichenatus Caudata LC Semi-aquatic 26.836039 34.41211 30.92956 38.38441
Hynobius tokyoensis Caudata VU Semi-aquatic 25.026301 34.09683 30.28714 37.69600
Hynobius tokyoensis Caudata VU Semi-aquatic 22.345886 33.73032 29.81448 37.06123
Hynobius tokyoensis Caudata VU Semi-aquatic 27.738905 34.46773 30.57374 38.17382
Hynobius nigrescens Caudata LC Ground-dwelling 23.767976 33.74118 30.18025 37.24878
Hynobius nigrescens Caudata LC Ground-dwelling 20.732203 33.33150 29.94438 36.97165
Hynobius nigrescens Caudata LC Ground-dwelling 26.916798 34.16611 30.56035 37.73131
Hynobius takedai Caudata EN Semi-aquatic 23.363994 33.89992 30.31707 37.64701
Hynobius takedai Caudata EN Semi-aquatic 20.295963 33.48095 29.66471 36.78406
Hynobius takedai Caudata EN Semi-aquatic 26.463697 34.32323 30.63455 38.27466
Hynobius stejnegeri Caudata NT Semi-aquatic 26.324972 34.34867 30.35496 37.56571
Hynobius stejnegeri Caudata NT Semi-aquatic 23.871159 34.01318 30.18080 37.27911
Hynobius stejnegeri Caudata NT Semi-aquatic 28.279359 34.61588 30.95623 38.39502
Hynobius amjiensis Caudata EN Semi-aquatic 27.023498 34.37122 30.36776 38.13475
Hynobius amjiensis Caudata EN Semi-aquatic 23.814076 33.93695 30.18690 37.77242
Hynobius amjiensis Caudata EN Semi-aquatic 30.088377 34.78593 30.64450 38.65326
Hynobius chinensis Caudata DD Semi-aquatic 24.055123 33.99228 30.45544 37.97074
Hynobius chinensis Caudata DD Semi-aquatic 21.299542 33.61739 30.15416 37.62719
Hynobius chinensis Caudata DD Semi-aquatic 27.652570 34.48169 30.62743 38.43367
Hynobius guabangshanensis Caudata CR Semi-aquatic 27.388480 34.36449 30.70815 38.69678
Hynobius guabangshanensis Caudata CR Semi-aquatic 26.110503 34.19196 30.48927 38.38205
Hynobius guabangshanensis Caudata CR Semi-aquatic 29.759298 34.68457 30.90593 39.15447
Hynobius maoershanensis Caudata CR Aquatic 26.288031 34.21192 30.07031 38.15505
Hynobius maoershanensis Caudata CR Aquatic 24.994406 34.03632 29.95732 37.92325
Hynobius maoershanensis Caudata CR Aquatic 28.845152 34.55903 30.23693 38.44207
Hynobius yiwuensis Caudata LC Semi-aquatic 26.634167 34.32987 30.47863 37.91833
Hynobius yiwuensis Caudata LC Semi-aquatic 24.336361 34.02189 30.31938 37.61611
Hynobius yiwuensis Caudata LC Semi-aquatic 29.052173 34.65395 30.63496 38.21116
Hynobius hidamontanus Caudata EN Semi-aquatic 22.821809 33.69041 30.33258 37.33742
Hynobius hidamontanus Caudata EN Semi-aquatic 19.710231 33.26936 29.89719 36.72472
Hynobius hidamontanus Caudata EN Semi-aquatic 26.049053 34.12712 30.58487 37.82956
Hynobius katoi Caudata EN Semi-aquatic 25.270600 34.15730 30.62764 38.28586
Hynobius katoi Caudata EN Semi-aquatic 22.691466 33.81234 30.34840 37.85176
Hynobius katoi Caudata EN Semi-aquatic 27.934563 34.51362 30.65560 38.43103
Hynobius naevius Caudata EN Ground-dwelling 25.737015 33.91322 30.09130 38.01480
Hynobius naevius Caudata EN Ground-dwelling 23.195199 33.57116 29.58546 37.37156
Hynobius naevius Caudata EN Ground-dwelling 28.046263 34.22399 30.31367 38.39209
Hynobius dunni Caudata VU Semi-aquatic 26.365524 34.25344 30.81119 38.30467
Hynobius dunni Caudata VU Semi-aquatic 23.865471 33.91185 30.45851 37.66517
Hynobius dunni Caudata VU Semi-aquatic 28.352327 34.52490 30.88120 38.60554
Hynobius nebulosus Caudata LC Semi-aquatic 25.628023 34.22301 30.28934 37.76123
Hynobius nebulosus Caudata LC Semi-aquatic 23.093755 33.87175 29.93538 37.29888
Hynobius nebulosus Caudata LC Semi-aquatic 28.053129 34.55914 30.83283 38.44098
Hynobius tsuensis Caudata NT Semi-aquatic 25.390618 34.11548 30.39272 37.84400
Hynobius tsuensis Caudata NT Semi-aquatic 22.797802 33.76212 30.14338 37.43170
Hynobius tsuensis Caudata NT Semi-aquatic 27.992222 34.47004 30.51437 38.19159
Hynobius okiensis Caudata EN Ground-dwelling 25.307304 33.84693 30.04022 37.50418
Hynobius okiensis Caudata EN Ground-dwelling 22.164381 33.42723 29.52936 36.89518
Hynobius okiensis Caudata EN Ground-dwelling 27.588234 34.15152 30.21886 37.80963
Hynobius leechii Caudata LC Ground-dwelling 21.674546 33.36454 29.98666 36.82902
Hynobius leechii Caudata LC Ground-dwelling 18.197042 32.88672 29.64095 36.38731
Hynobius leechii Caudata LC Ground-dwelling 25.186836 33.84714 30.24844 37.16506
Hynobius yangi Caudata EN Semi-aquatic 23.935584 33.94789 30.72986 37.71220
Hynobius yangi Caudata EN Semi-aquatic 21.353051 33.60245 30.13765 36.98361
Hynobius yangi Caudata EN Semi-aquatic 26.972592 34.35413 31.00811 38.25260
Hynobius quelpaertensis Caudata VU Semi-aquatic 24.105347 34.02325 30.17415 37.33271
Hynobius quelpaertensis Caudata VU Semi-aquatic 21.319622 33.64176 29.88348 36.98138
Hynobius quelpaertensis Caudata VU Semi-aquatic 27.170250 34.44298 30.66905 37.95869
Hynobius turkestanicus Caudata DD Semi-aquatic 14.669952 32.66335 28.97926 36.61273
Hynobius turkestanicus Caudata DD Semi-aquatic 12.532507 32.37405 28.39615 36.06416
Hynobius turkestanicus Caudata DD Semi-aquatic 17.462010 33.04125 28.57122 36.14932
Hynobius arisanensis Caudata EN Semi-aquatic 27.492343 34.13531 30.95181 37.74821
Hynobius arisanensis Caudata EN Semi-aquatic 26.776238 34.03740 30.84525 37.58965
Hynobius arisanensis Caudata EN Semi-aquatic 28.627154 34.29046 30.93682 37.84401
Hynobius sonani Caudata EN Semi-aquatic 27.421271 34.21319 31.06965 37.74398
Hynobius sonani Caudata EN Semi-aquatic 26.671168 34.11001 30.88164 37.47437
Hynobius sonani Caudata EN Semi-aquatic 28.582367 34.37291 30.96299 37.72119
Hynobius formosanus Caudata EN Semi-aquatic 26.977134 34.11182 30.67595 37.27599
Hynobius formosanus Caudata EN Semi-aquatic 26.083575 33.99047 30.60056 37.15294
Hynobius formosanus Caudata EN Semi-aquatic 28.273584 34.28787 31.16095 37.84579
Hynobius boulengeri Caudata EN Semi-aquatic 25.823880 34.25372 30.58939 37.96484
Hynobius boulengeri Caudata EN Semi-aquatic 23.406145 33.92387 30.30217 37.51869
Hynobius boulengeri Caudata EN Semi-aquatic 28.181935 34.57543 30.81904 38.46421
Hynobius kimurae Caudata LC Fossorial 24.620921 34.83621 31.27132 38.52198
Hynobius kimurae Caudata LC Fossorial 21.691446 34.43834 30.82341 37.99320
Hynobius kimurae Caudata LC Fossorial 27.492894 35.22627 31.70819 39.02553
Hynobius retardatus Caudata LC Semi-aquatic 19.580668 33.36882 30.00962 37.43726
Hynobius retardatus Caudata LC Semi-aquatic 16.430170 32.94142 29.35540 36.71295
Hynobius retardatus Caudata LC Semi-aquatic 23.121665 33.84920 30.53155 38.09545
Pachyhynobius shangchengensis Caudata VU Semi-aquatic 27.802632 34.76706 30.38412 38.79234
Pachyhynobius shangchengensis Caudata VU Semi-aquatic 25.023885 34.38806 30.31626 38.59776
Pachyhynobius shangchengensis Caudata VU Semi-aquatic 30.906723 35.19043 31.04827 39.67363
Salamandrella keyserlingii Caudata LC Ground-dwelling 14.968386 32.89928 29.26134 37.43656
Salamandrella keyserlingii Caudata LC Ground-dwelling 10.423342 32.28634 28.50592 36.71562
Salamandrella keyserlingii Caudata LC Ground-dwelling 20.751913 33.67923 30.03586 38.40180
Ranodon sibiricus Caudata EN Stream-dwelling 14.590021 32.21971 27.92382 36.72161
Ranodon sibiricus Caudata EN Stream-dwelling 12.333758 31.91624 27.46270 36.24563
Ranodon sibiricus Caudata EN Stream-dwelling 18.256669 32.71289 28.56597 37.45130
Onychodactylus fischeri Caudata LC Semi-aquatic 21.301436 34.53897 29.17657 39.94769
Onychodactylus fischeri Caudata LC Semi-aquatic 17.729588 34.06454 28.54037 39.27104
Onychodactylus fischeri Caudata LC Semi-aquatic 24.818000 35.00605 29.55164 40.28968
Onychodactylus japonicus Caudata LC Semi-aquatic 24.915063 35.03917 29.32636 40.08976
Onychodactylus japonicus Caudata LC Semi-aquatic 22.131205 34.66938 29.26611 39.92726
Onychodactylus japonicus Caudata LC Semi-aquatic 27.686719 35.40733 30.15665 40.92591
Andrias japonicus Caudata VU Stream-dwelling 25.334521 35.32426 30.71143 39.58948
Andrias japonicus Caudata VU Stream-dwelling 22.646036 34.97885 30.29540 39.16240
Andrias japonicus Caudata VU Stream-dwelling 27.853375 35.64787 31.07609 40.05871
Andrias davidianus Caudata CR Aquatic 25.322713 36.14523 31.43210 40.49294
Andrias davidianus Caudata CR Aquatic 23.184325 35.87155 31.26949 40.22206
Andrias davidianus Caudata CR Aquatic 28.159878 36.50834 31.68684 40.94049
Siren intermedia Caudata LC Aquatic 26.337962 35.48521 29.09146 42.15996
Siren intermedia Caudata LC Aquatic 23.861535 35.16095 29.01395 42.06290
Siren intermedia Caudata LC Aquatic 29.335729 35.87773 29.60854 42.58024
Siren lacertina Caudata LC Semi-aquatic 26.656419 35.71246 29.30136 42.01761
Siren lacertina Caudata LC Semi-aquatic 24.073295 35.36963 29.02425 41.66731
Siren lacertina Caudata LC Semi-aquatic 29.408680 36.07773 29.73770 42.49653
Pseudobranchus striatus Caudata LC Aquatic 27.312418 35.59588 29.46481 42.05609
Pseudobranchus striatus Caudata LC Aquatic 25.922049 35.41381 29.11033 41.63879
Pseudobranchus striatus Caudata LC Aquatic 29.571249 35.89167 29.72698 42.33517
Pseudobranchus axanthus Caudata LC Semi-aquatic 27.778431 35.78503 28.62874 41.88091
Pseudobranchus axanthus Caudata LC Semi-aquatic 26.688177 35.64237 28.46874 41.72868
Pseudobranchus axanthus Caudata LC Semi-aquatic 29.572423 36.01977 28.81141 42.12543
Chioglossa lusitanica Caudata NT Semi-aquatic 19.044365 35.85757 31.29532 40.46455
Chioglossa lusitanica Caudata NT Semi-aquatic 17.409104 35.63783 31.11381 40.32187
Chioglossa lusitanica Caudata NT Semi-aquatic 21.738599 36.21961 31.85541 41.03084
Mertensiella caucasica Caudata VU Semi-aquatic 19.300742 35.83005 31.28308 40.10379
Mertensiella caucasica Caudata VU Semi-aquatic 16.761439 35.48602 30.83536 39.73164
Mertensiella caucasica Caudata VU Semi-aquatic 22.342683 36.24218 31.55002 40.45644
Lyciasalamandra antalyana Caudata EN Ground-dwelling 23.579020 35.62344 31.85041 39.24588
Lyciasalamandra antalyana Caudata EN Ground-dwelling 21.603998 35.35364 31.84289 39.21241
Lyciasalamandra antalyana Caudata EN Ground-dwelling 26.233059 35.98599 32.21109 39.64939
Lyciasalamandra helverseni Caudata VU Ground-dwelling 24.136644 35.64391 32.22285 39.50726
Lyciasalamandra helverseni Caudata VU Ground-dwelling 22.699055 35.44836 31.97532 39.20778
Lyciasalamandra helverseni Caudata VU Ground-dwelling 25.894297 35.88299 32.44824 39.75259
Lyciasalamandra fazilae Caudata EN Ground-dwelling 22.542634 35.42734 31.98116 39.19099
Lyciasalamandra fazilae Caudata EN Ground-dwelling 20.687162 35.17888 31.58944 38.71403
Lyciasalamandra fazilae Caudata EN Ground-dwelling 25.316532 35.79878 32.34638 39.69256
Lyciasalamandra flavimembris Caudata EN Ground-dwelling 23.491706 35.54410 32.07950 38.98586
Lyciasalamandra flavimembris Caudata EN Ground-dwelling 21.836145 35.31403 32.07015 38.91563
Lyciasalamandra flavimembris Caudata EN Ground-dwelling 26.062384 35.90135 32.43695 39.36988
Lyciasalamandra atifi Caudata EN Ground-dwelling 22.584693 35.36549 31.38971 38.74180
Lyciasalamandra atifi Caudata EN Ground-dwelling 20.479864 35.07448 31.66548 39.01389
Lyciasalamandra atifi Caudata EN Ground-dwelling 25.536700 35.77362 31.96529 39.40311
Lyciasalamandra luschani Caudata VU Ground-dwelling 22.305012 35.34563 31.57761 38.95435
Lyciasalamandra luschani Caudata VU Ground-dwelling 20.312141 35.07217 31.30812 38.66997
Lyciasalamandra luschani Caudata VU Ground-dwelling 25.093101 35.72821 31.77314 39.17156
Salamandra algira Caudata VU Semi-aquatic 22.549496 35.51955 32.54451 38.69306
Salamandra algira Caudata VU Semi-aquatic 20.868324 35.28571 32.29662 38.42705
Salamandra algira Caudata VU Semi-aquatic 25.163653 35.88317 32.56582 38.81588
Salamandra infraimmaculata Caudata NT Ground-dwelling 21.660153 35.18202 32.45738 37.89520
Salamandra infraimmaculata Caudata NT Ground-dwelling 19.918206 34.93963 32.51918 37.90435
Salamandra infraimmaculata Caudata NT Ground-dwelling 24.361012 35.55784 32.74666 38.31573
Salamandra corsica Caudata LC Ground-dwelling 23.532117 35.43880 32.57001 38.55974
Salamandra corsica Caudata LC Ground-dwelling 21.506855 35.16159 32.25644 38.17679
Salamandra corsica Caudata LC Ground-dwelling 26.682481 35.87000 32.95838 39.14542
Salamandra lanzai Caudata CR Ground-dwelling 19.772886 34.94224 31.98775 38.34614
Salamandra lanzai Caudata CR Ground-dwelling 17.098564 34.58043 31.37893 37.71482
Salamandra lanzai Caudata CR Ground-dwelling 23.886563 35.49878 32.51422 38.95229
Salamandra atra Caudata LC Ground-dwelling 19.400307 34.82977 31.66663 37.85087
Salamandra atra Caudata LC Ground-dwelling 16.235625 34.40506 31.16276 37.28804
Salamandra atra Caudata LC Ground-dwelling 23.614163 35.39529 32.27342 38.55347
Calotriton arnoldi Caudata CR Stream-dwelling 22.509444 36.17188 32.68984 39.71137
Calotriton arnoldi Caudata CR Stream-dwelling 20.449937 35.89283 32.58266 39.51987
Calotriton arnoldi Caudata CR Stream-dwelling 24.896636 36.49533 32.87023 40.00280
Calotriton asper Caudata LC Aquatic 20.227614 36.68063 33.21702 39.94072
Calotriton asper Caudata LC Aquatic 17.819185 36.35191 33.02826 39.64352
Calotriton asper Caudata LC Aquatic 23.521418 37.13020 33.77648 40.55303
Triturus carnifex Caudata LC Semi-aquatic 20.346780 36.89485 34.01043 39.86252
Triturus carnifex Caudata LC Semi-aquatic 17.696673 36.53983 33.47017 39.22632
Triturus carnifex Caudata LC Semi-aquatic 24.242453 37.41673 34.47280 40.52998
Triturus karelinii Caudata LC Semi-aquatic 19.706316 36.83355 34.16924 39.56873
Triturus karelinii Caudata LC Semi-aquatic 17.626584 36.54896 33.45208 38.82424
Triturus karelinii Caudata LC Semi-aquatic 22.953008 37.27782 34.53668 40.00476
Triturus marmoratus Caudata LC Semi-aquatic 19.396648 36.65845 34.11465 39.56520
Triturus marmoratus Caudata LC Semi-aquatic 17.384616 36.39158 33.75050 39.12641
Triturus marmoratus Caudata LC Semi-aquatic 22.645465 37.08936 34.22907 39.90685
Neurergus crocatus Caudata VU Aquatic 21.036661 36.80615 33.51007 40.35801
Neurergus crocatus Caudata VU Aquatic 19.240213 36.55816 33.30481 40.03129
Neurergus crocatus Caudata VU Aquatic 23.565503 37.15523 33.72773 40.81580
Neurergus kaiseri Caudata VU Semi-aquatic 23.122558 37.08648 33.96123 40.42171
Neurergus kaiseri Caudata VU Semi-aquatic 21.444492 36.85472 33.74530 40.15772
Neurergus kaiseri Caudata VU Semi-aquatic 25.491245 37.41364 34.29361 40.89622
Neurergus strauchii Caudata VU Semi-aquatic 20.031021 36.71354 33.12697 40.07215
Neurergus strauchii Caudata VU Semi-aquatic 17.975200 36.43203 32.97609 39.84011
Neurergus strauchii Caudata VU Semi-aquatic 22.403682 37.03844 33.26530 40.33246
Ommatotriton ophryticus Caudata NT Ground-dwelling 19.403227 36.38888 32.87657 39.89817
Ommatotriton ophryticus Caudata NT Ground-dwelling 17.090301 36.07268 32.59042 39.55767
Ommatotriton ophryticus Caudata NT Ground-dwelling 22.787408 36.85152 33.34084 40.45198
Ommatotriton vittatus Caudata LC Semi-aquatic 23.502736 37.11174 33.68739 40.74191
Ommatotriton vittatus Caudata LC Semi-aquatic 21.886694 36.88954 33.54535 40.60768
Ommatotriton vittatus Caudata LC Semi-aquatic 25.622938 37.40326 33.81874 40.99561
Lissotriton helveticus Caudata LC Semi-aquatic 17.755528 36.42678 33.22570 39.90137
Lissotriton helveticus Caudata LC Semi-aquatic 15.768889 36.15848 32.69264 39.38987
Lissotriton helveticus Caudata LC Semi-aquatic 21.257335 36.89969 33.38278 40.11847
Lissotriton italicus Caudata LC Semi-aquatic 23.629026 37.18996 33.54881 40.67529
Lissotriton italicus Caudata LC Semi-aquatic 20.772038 36.80225 33.21281 40.19482
Lissotriton italicus Caudata LC Semi-aquatic 26.626485 37.59674 33.83142 41.04257
Lissotriton montandoni Caudata LC Ground-dwelling 18.173405 36.16746 32.61969 39.39259
Lissotriton montandoni Caudata LC Ground-dwelling 15.017013 35.75068 32.10696 38.89376
Lissotriton montandoni Caudata LC Ground-dwelling 24.369317 36.98559 33.20130 40.33719
Lissotriton vulgaris Caudata LC Semi-aquatic 14.375703 35.92355 32.63109 39.41392
Lissotriton vulgaris Caudata LC Semi-aquatic 11.763266 35.56836 32.40946 39.25582
Lissotriton vulgaris Caudata LC Semi-aquatic 18.249830 36.45029 33.24418 40.12681
Ichthyosaura alpestris Caudata LC Ground-dwelling 18.641722 36.27928 32.69716 40.09198
Ichthyosaura alpestris Caudata LC Ground-dwelling 16.153349 35.93925 32.60297 39.79186
Ichthyosaura alpestris Caudata LC Ground-dwelling 23.227641 36.90594 32.97422 40.70350
Cynops ensicauda Caudata VU Semi-aquatic 27.381519 37.75752 34.38306 40.94157
Cynops ensicauda Caudata VU Semi-aquatic 26.604964 37.65162 34.27831 40.78899
Cynops ensicauda Caudata VU Semi-aquatic 28.390640 37.89512 34.50385 41.10922
Cynops pyrrhogaster Caudata NT Aquatic 24.852248 37.37101 33.94361 40.59014
Cynops pyrrhogaster Caudata NT Aquatic 22.101081 36.99981 33.74446 40.26850
Cynops pyrrhogaster Caudata NT Aquatic 27.541053 37.73379 34.44885 41.26027
Laotriton laoensis Caudata EN Aquatic 26.845246 37.52325 34.16986 40.76439
Laotriton laoensis Caudata EN Aquatic 25.911110 37.39801 34.12971 40.58572
Laotriton laoensis Caudata EN Aquatic 28.787353 37.78363 34.51551 41.27567
Pachytriton brevipes Caudata LC Aquatic 26.553818 37.49423 34.37210 40.92708
Pachytriton brevipes Caudata LC Aquatic 24.883425 37.27194 34.19266 40.58945
Pachytriton brevipes Caudata LC Aquatic 28.782368 37.79081 34.57761 41.34642
Paramesotriton caudopunctatus Caudata NT Aquatic 26.513015 37.38053 34.22987 40.57992
Paramesotriton caudopunctatus Caudata NT Aquatic 25.220921 37.20582 34.10730 40.39257
Paramesotriton caudopunctatus Caudata NT Aquatic 28.914044 37.70517 34.45214 40.94977
Paramesotriton deloustali Caudata LC Aquatic 25.938842 37.27991 34.06264 40.22574
Paramesotriton deloustali Caudata LC Aquatic 24.837136 37.13151 33.90894 40.02066
Paramesotriton deloustali Caudata LC Aquatic 27.884247 37.54194 34.28832 40.62807
Paramesotriton fuzhongensis Caudata VU Semi-aquatic 27.216061 37.58476 34.29345 40.70097
Paramesotriton fuzhongensis Caudata VU Semi-aquatic 25.938318 37.41103 34.17003 40.54199
Paramesotriton fuzhongensis Caudata VU Semi-aquatic 29.691611 37.92136 34.42127 41.04155
Paramesotriton hongkongensis Caudata NT Ground-dwelling 27.630748 37.36913 34.20504 40.58012
Paramesotriton hongkongensis Caudata NT Ground-dwelling 26.708353 37.24415 34.08556 40.38843
Paramesotriton hongkongensis Caudata NT Ground-dwelling 29.414606 37.61084 34.22929 40.78385
Euproctus montanus Caudata LC Ground-dwelling 23.532117 36.85611 32.82965 40.58566
Euproctus montanus Caudata LC Ground-dwelling 21.506855 36.57928 32.55208 40.29267
Euproctus montanus Caudata LC Ground-dwelling 26.682481 37.28673 33.19516 41.10953
Euproctus platycephalus Caudata VU Semi-aquatic 23.865179 37.00479 32.89255 41.07446
Euproctus platycephalus Caudata VU Semi-aquatic 21.949143 36.74580 32.44399 40.55708
Euproctus platycephalus Caudata VU Semi-aquatic 26.857045 37.40921 32.99921 41.30253
Notophthalmus meridionalis Caudata VU Semi-aquatic 25.152904 38.29614 34.95021 41.57212
Notophthalmus meridionalis Caudata VU Semi-aquatic 24.335231 38.18543 34.89511 41.48485
Notophthalmus meridionalis Caudata VU Semi-aquatic 26.922969 38.53582 35.20711 41.94920
Notophthalmus perstriatus Caudata NT Semi-aquatic 27.406003 38.70784 35.38185 42.04157
Notophthalmus perstriatus Caudata NT Semi-aquatic 25.994006 38.51348 35.22060 41.75886
Notophthalmus perstriatus Caudata NT Semi-aquatic 29.669364 39.01940 35.77879 42.66368
Taricha torosa Caudata NT Ground-dwelling 19.394957 36.27202 32.82613 39.49979
Taricha torosa Caudata NT Ground-dwelling 17.919351 36.06988 32.70646 39.31509
Taricha torosa Caudata NT Ground-dwelling 21.820055 36.60424 32.97653 39.75591
Taricha rivularis Caudata VU Ground-dwelling 17.796742 36.10349 32.81703 39.66092
Taricha rivularis Caudata VU Ground-dwelling 16.346624 35.90499 32.49490 39.38474
Taricha rivularis Caudata VU Ground-dwelling 20.078952 36.41588 33.11332 39.97114
Echinotriton andersoni Caudata VU Ground-dwelling 27.367725 37.22229 33.36819 40.55842
Echinotriton andersoni Caudata VU Ground-dwelling 26.559688 37.11277 33.27980 40.42533
Echinotriton andersoni Caudata VU Ground-dwelling 28.353332 37.35589 33.45652 40.72075
Echinotriton chinhaiensis Caudata CR Semi-aquatic 26.351463 37.28423 33.95366 41.04664
Echinotriton chinhaiensis Caudata CR Semi-aquatic 24.088634 36.97810 33.69637 40.69185
Echinotriton chinhaiensis Caudata CR Semi-aquatic 28.619276 37.59104 34.12794 41.37891
Tylototriton asperrimus Caudata NT Ground-dwelling 26.474420 37.02463 33.69916 40.90623
Tylototriton asperrimus Caudata NT Ground-dwelling 25.250611 36.85968 33.63888 40.72575
Tylototriton asperrimus Caudata NT Ground-dwelling 28.596531 37.31065 33.74521 41.16043
Tylototriton notialis Caudata VU Ground-dwelling 27.686933 37.18225 33.83094 40.84407
Tylototriton notialis Caudata VU Ground-dwelling 26.775401 37.05991 33.77367 40.73175
Tylototriton notialis Caudata VU Ground-dwelling 29.514904 37.42758 33.94987 41.07824
Tylototriton hainanensis Caudata EN Ground-dwelling 27.794919 37.19376 33.38936 40.40427
Tylototriton hainanensis Caudata EN Ground-dwelling 27.188240 37.11293 33.44355 40.40221
Tylototriton hainanensis Caudata EN Ground-dwelling 28.913777 37.34283 33.73336 40.80714
Tylototriton wenxianensis Caudata VU Ground-dwelling 23.446987 36.63425 33.00006 39.96457
Tylototriton wenxianensis Caudata VU Ground-dwelling 21.294301 36.35105 32.76468 39.67740
Tylototriton wenxianensis Caudata VU Ground-dwelling 26.053318 36.97713 33.30989 40.35587
Tylototriton vietnamensis Caudata VU Semi-aquatic 27.388502 37.42443 33.97289 40.75585
Tylototriton vietnamensis Caudata VU Semi-aquatic 26.204023 37.26654 33.78798 40.50288
Tylototriton vietnamensis Caudata VU Semi-aquatic 29.366287 37.68808 34.28164 41.19839
Tylototriton shanjing Caudata VU Ground-dwelling 21.860850 36.42967 32.95176 39.70437
Tylototriton shanjing Caudata VU Ground-dwelling 20.797073 36.28721 32.85871 39.55628
Tylototriton shanjing Caudata VU Ground-dwelling 23.928350 36.70654 33.09728 39.94609
Tylototriton verrucosus Caudata NT Semi-aquatic 22.809680 36.80155 33.43001 40.09445
Tylototriton verrucosus Caudata NT Semi-aquatic 21.860530 36.67621 33.26904 39.87363
Tylototriton verrucosus Caudata NT Semi-aquatic 24.712695 37.05286 33.72004 40.48564
Pleurodeles poireti Caudata EN Ground-dwelling 24.337916 36.75952 33.56639 40.00669
Pleurodeles poireti Caudata EN Ground-dwelling 22.426724 36.50020 33.38799 39.69743
Pleurodeles poireti Caudata EN Ground-dwelling 27.215990 37.15004 33.67907 40.37439
Salamandrina perspicillata Caudata EN Ground-dwelling 21.394760 36.24628 32.18640 40.63590
Salamandrina perspicillata Caudata EN Ground-dwelling 18.270485 35.82049 31.61757 40.04972
Salamandrina perspicillata Caudata EN Ground-dwelling 25.768973 36.84241 32.59954 41.23425
Salamandrina terdigitata Caudata LC Ground-dwelling 24.218244 36.63323 32.36375 40.76606
Salamandrina terdigitata Caudata LC Ground-dwelling 22.091411 36.34067 32.04531 40.36532
Salamandrina terdigitata Caudata LC Ground-dwelling 27.153363 37.03697 32.61263 41.14871
Ambystoma altamirani Caudata EN Stream-dwelling 19.615331 35.70638 32.71802 38.53675
Ambystoma altamirani Caudata EN Stream-dwelling 18.329823 35.54858 32.65581 38.44889
Ambystoma altamirani Caudata EN Stream-dwelling 22.683425 36.08299 33.05686 38.94164
Ambystoma amblycephalum Caudata CR Semi-aquatic 22.111518 37.00322 33.97678 40.19229
Ambystoma amblycephalum Caudata CR Semi-aquatic 20.992462 36.86364 33.69850 39.86157
Ambystoma amblycephalum Caudata CR Semi-aquatic 24.196224 37.26326 34.25114 40.55678
Ambystoma lermaense Caudata EN Aquatic 21.732772 36.80342 33.83051 40.11800
Ambystoma lermaense Caudata EN Aquatic 20.545475 36.65665 33.73393 40.02499
Ambystoma lermaense Caudata EN Aquatic 24.329851 37.12447 33.95360 40.36454
Ambystoma andersoni Caudata CR Stream-dwelling 22.111518 36.35185 33.80355 38.89535
Ambystoma andersoni Caudata CR Stream-dwelling 20.992462 36.20847 33.78409 38.79605
Ambystoma andersoni Caudata CR Stream-dwelling 24.196224 36.61895 33.98564 39.19775
Ambystoma mexicanum Caudata CR Aquatic 20.553017 36.92141 34.59936 39.62312
Ambystoma mexicanum Caudata CR Aquatic 19.305069 36.76330 34.47785 39.43597
Ambystoma mexicanum Caudata CR Aquatic 23.352564 37.27611 34.68915 39.85300
Ambystoma rosaceum Caudata LC Semi-aquatic 23.655020 37.39026 34.82691 40.12289
Ambystoma rosaceum Caudata LC Semi-aquatic 21.865186 37.16292 34.77323 39.87703
Ambystoma rosaceum Caudata LC Semi-aquatic 26.404602 37.73950 35.11770 40.69268
Ambystoma dumerilii Caudata CR Aquatic 22.111518 37.08874 34.63416 39.95318
Ambystoma dumerilii Caudata CR Aquatic 20.992462 36.94963 34.44026 39.67226
Ambystoma dumerilii Caudata CR Aquatic 24.196224 37.34789 34.84531 40.30797
Ambystoma ordinarium Caudata EN Ground-dwelling 22.798887 36.99374 34.79560 39.74632
Ambystoma ordinarium Caudata EN Ground-dwelling 21.773397 36.86660 34.69569 39.58134
Ambystoma ordinarium Caudata EN Ground-dwelling 24.878725 37.25157 34.94115 40.06490
Ambystoma annulatum Caudata LC Fossorial 24.495982 38.06575 35.13570 41.14200
Ambystoma annulatum Caudata LC Fossorial 21.579467 37.70384 34.62315 40.45269
Ambystoma annulatum Caudata LC Fossorial 29.163238 38.64490 35.48256 41.75050
Ambystoma bishopi Caudata EN Ground-dwelling 27.833478 37.51522 34.85718 40.81046
Ambystoma bishopi Caudata EN Ground-dwelling 26.222832 37.31456 34.30379 40.21542
Ambystoma bishopi Caudata EN Ground-dwelling 30.498691 37.84727 34.95896 41.11080
Ambystoma cingulatum Caudata EN Fossorial 26.970515 38.34715 35.29685 41.30582
Ambystoma cingulatum Caudata EN Fossorial 25.453413 38.16004 35.24469 41.11337
Ambystoma cingulatum Caudata EN Fossorial 29.368997 38.64297 35.48680 41.62317
Ambystoma barbouri Caudata NT Ground-dwelling 25.326857 37.35908 34.55853 40.67119
Ambystoma barbouri Caudata NT Ground-dwelling 22.815747 37.04971 34.22885 40.15223
Ambystoma barbouri Caudata NT Ground-dwelling 28.670606 37.77103 34.54274 40.96772
Ambystoma texanum Caudata LC Semi-aquatic 25.273197 37.54073 34.57367 40.69466
Ambystoma texanum Caudata LC Semi-aquatic 22.847202 37.23925 34.44452 40.44392
Ambystoma texanum Caudata LC Semi-aquatic 28.710980 37.96794 34.95930 41.37272
Ambystoma flavipiperatum Caudata EN Ground-dwelling 24.233007 37.06770 34.09895 40.03989
Ambystoma flavipiperatum Caudata EN Ground-dwelling 23.145344 36.93362 33.95158 39.82434
Ambystoma flavipiperatum Caudata EN Ground-dwelling 26.034679 37.28980 34.34195 40.40184
Ambystoma gracile Caudata LC Ground-dwelling 15.778065 35.85125 33.01781 38.36821
Ambystoma gracile Caudata LC Ground-dwelling 13.476280 35.56338 32.79019 38.12087
Ambystoma gracile Caudata LC Ground-dwelling 19.419445 36.30667 33.63531 38.99990
Ambystoma granulosum Caudata EN Aquatic 22.115868 36.94102 33.90949 40.35925
Ambystoma granulosum Caudata EN Aquatic 21.048851 36.80645 33.75052 40.19450
Ambystoma granulosum Caudata EN Aquatic 24.466554 37.23747 34.06230 40.65179
Ambystoma leorae Caudata CR Aquatic 21.490704 36.79825 33.76027 39.97848
Ambystoma leorae Caudata CR Aquatic 20.280314 36.64728 33.62740 39.75988
Ambystoma leorae Caudata CR Aquatic 24.021704 37.11393 33.74686 40.04470
Ambystoma taylori Caudata CR Aquatic 21.030433 36.75448 33.47279 40.01775
Ambystoma taylori Caudata CR Aquatic 19.480693 36.56257 33.01093 39.54611
Ambystoma taylori Caudata CR Aquatic 24.144250 37.14007 33.75600 40.37525
Ambystoma silvense Caudata DD Aquatic 22.917116 36.19651 33.31645 38.91547
Ambystoma silvense Caudata DD Aquatic 21.025568 35.95896 33.14116 38.64336
Ambystoma silvense Caudata DD Aquatic 25.749016 36.55215 33.63457 39.51773
Ambystoma rivulare Caudata EN Aquatic 21.550794 37.13917 34.19219 39.91271
Ambystoma rivulare Caudata EN Aquatic 20.442078 37.00451 34.03707 39.73663
Ambystoma rivulare Caudata EN Aquatic 24.122326 37.45147 34.71730 40.44879
Ambystoma velasci Caudata LC Ground-dwelling 23.279619 36.84990 34.04418 40.00667
Ambystoma velasci Caudata LC Ground-dwelling 21.876246 36.67337 33.89451 39.86545
Ambystoma velasci Caudata LC Ground-dwelling 25.646373 37.14761 34.32536 40.51855
Dicamptodon ensatus Caudata NT Semi-aquatic 18.477839 31.60809 27.91896 34.95626
Dicamptodon ensatus Caudata NT Semi-aquatic 17.131768 31.42309 27.69169 34.72407
Dicamptodon ensatus Caudata NT Semi-aquatic 20.670130 31.90938 28.49975 35.53874
Dicamptodon aterrimus Caudata LC Semi-aquatic 16.684228 31.31712 27.72846 34.97271
Dicamptodon aterrimus Caudata LC Semi-aquatic 13.920399 30.93613 27.40828 34.65456
Dicamptodon aterrimus Caudata LC Semi-aquatic 20.698372 31.87046 28.13859 35.32643
Dicamptodon copei Caudata LC Semi-aquatic 16.969340 31.37820 27.43981 34.56485
Dicamptodon copei Caudata LC Semi-aquatic 14.889016 31.09284 27.25683 34.33394
Dicamptodon copei Caudata LC Semi-aquatic 20.185185 31.81932 28.32539 35.43469
Necturus punctatus Caudata LC Aquatic 25.833479 35.13186 31.23067 39.04733
Necturus punctatus Caudata LC Aquatic 22.067821 34.64711 30.85021 38.43999
Necturus punctatus Caudata LC Aquatic 29.136903 35.55711 31.54132 39.67679
Necturus lewisi Caudata NT Aquatic 26.066702 35.20635 31.22629 38.93210
Necturus lewisi Caudata NT Aquatic 19.428102 34.33638 30.81967 38.08710
Necturus lewisi Caudata NT Aquatic 28.828452 35.56827 31.46421 39.39591
Necturus beyeri Caudata LC Aquatic 27.464115 35.33182 32.11446 38.45888
Necturus beyeri Caudata LC Aquatic 25.782646 35.11017 31.97794 38.17837
Necturus beyeri Caudata LC Aquatic 30.190295 35.69120 32.38068 39.02412
Necturus alabamensis Caudata EN Aquatic 27.392819 35.30300 32.25178 38.49274
Necturus alabamensis Caudata EN Aquatic 25.349557 35.03711 31.92357 38.00629
Necturus alabamensis Caudata EN Aquatic 30.418364 35.69671 32.31682 38.90878
Rhyacotriton kezeri Caudata NT Semi-aquatic 17.630772 30.56197 26.70429 33.89411
Rhyacotriton kezeri Caudata NT Semi-aquatic 15.632682 30.28796 26.64473 33.85831
Rhyacotriton kezeri Caudata NT Semi-aquatic 20.681293 30.98031 27.14454 34.32943
Rhyacotriton cascadae Caudata NT Semi-aquatic 17.676792 30.56943 27.00639 34.22711
Rhyacotriton cascadae Caudata NT Semi-aquatic 15.531486 30.27715 26.68208 33.86950
Rhyacotriton cascadae Caudata NT Semi-aquatic 20.926359 31.01214 27.52008 34.79620
Amphiuma pholeter Caudata NT Aquatic 27.731965 36.93221 32.46042 40.79259
Amphiuma pholeter Caudata NT Aquatic 26.287091 36.75211 32.37106 40.66336
Amphiuma pholeter Caudata NT Aquatic 30.116185 37.22940 32.66585 41.17074
Amphiuma means Caudata LC Aquatic 26.941668 36.70985 32.99874 41.16383
Amphiuma means Caudata LC Aquatic 24.524353 36.41650 32.52171 40.62172
Amphiuma means Caudata LC Aquatic 29.689155 37.04326 33.14679 41.37827
Aneides vagrans Caudata LC Ground-dwelling 15.749502 33.26239 30.37897 36.70212
Aneides vagrans Caudata LC Ground-dwelling 14.008509 33.04075 30.31470 36.70546
Aneides vagrans Caudata LC Ground-dwelling 18.403752 33.60030 30.67754 37.05613
Aneides flavipunctatus Caudata LC Ground-dwelling 17.531037 33.45574 30.17515 37.02457
Aneides flavipunctatus Caudata LC Ground-dwelling 16.046648 33.27088 29.95448 36.75151
Aneides flavipunctatus Caudata LC Ground-dwelling 19.819500 33.74074 30.48381 37.35172
Aneides lugubris Caudata LC Arboreal 19.493360 33.59514 30.03936 37.38176
Aneides lugubris Caudata LC Arboreal 18.006691 33.41304 29.94118 37.21560
Aneides lugubris Caudata LC Arboreal 21.866622 33.88583 30.49767 37.95381
Aneides hardii Caudata NT Ground-dwelling 21.188520 33.91308 29.97041 37.37851
Aneides hardii Caudata NT Ground-dwelling 19.087205 33.65187 29.71935 37.08903
Aneides hardii Caudata NT Ground-dwelling 24.293512 34.29905 30.20940 37.96314
Desmognathus abditus Caudata NT Semi-aquatic 26.065836 35.24706 32.44391 38.34873
Desmognathus abditus Caudata NT Semi-aquatic 23.920627 34.97729 32.13343 37.89341
Desmognathus abditus Caudata NT Semi-aquatic 29.084441 35.62667 32.76909 38.89581
Desmognathus welteri Caudata LC Semi-aquatic 25.689480 35.26184 32.29822 38.09925
Desmognathus welteri Caudata LC Semi-aquatic 23.391171 34.96683 32.08264 37.71558
Desmognathus welteri Caudata LC Semi-aquatic 28.760338 35.65601 32.62720 38.70151
Desmognathus apalachicolae Caudata LC Semi-aquatic 27.734318 35.47065 32.39366 38.24124
Desmognathus apalachicolae Caudata LC Semi-aquatic 26.019837 35.25411 32.22025 37.94598
Desmognathus apalachicolae Caudata LC Semi-aquatic 30.431986 35.81136 32.77035 38.84716
Desmognathus auriculatus Caudata LC Semi-aquatic 25.528113 35.14619 32.37151 38.12458
Desmognathus auriculatus Caudata LC Semi-aquatic 21.471380 34.62711 31.88597 37.46602
Desmognathus auriculatus Caudata LC Semi-aquatic 28.894858 35.57698 32.72771 38.73546
Desmognathus santeetlah Caudata NT Semi-aquatic 26.273694 35.20776 32.59456 38.15662
Desmognathus santeetlah Caudata NT Semi-aquatic 24.260429 34.95428 32.47917 37.91297
Desmognathus santeetlah Caudata NT Semi-aquatic 29.241377 35.58141 32.70491 38.45627
Desmognathus imitator Caudata NT Semi-aquatic 26.192376 35.24706 32.28898 38.28803
Desmognathus imitator Caudata NT Semi-aquatic 24.161092 34.98963 32.13298 37.94026
Desmognathus imitator Caudata NT Semi-aquatic 29.189508 35.62689 32.44991 38.74012
Desmognathus aeneus Caudata NT Semi-aquatic 27.207502 35.13467 32.17292 38.72030
Desmognathus aeneus Caudata NT Semi-aquatic 25.204992 34.88232 31.85342 38.29531
Desmognathus aeneus Caudata NT Semi-aquatic 30.200526 35.51184 32.25793 39.02976
Desmognathus folkertsi Caudata DD Semi-aquatic 26.649141 34.64094 31.71488 37.85969
Desmognathus folkertsi Caudata DD Semi-aquatic 24.608151 34.38316 31.44359 37.41514
Desmognathus folkertsi Caudata DD Semi-aquatic 29.595138 35.01302 31.96770 38.32212
Desmognathus marmoratus Caudata LC Semi-aquatic 26.114378 34.63356 31.78553 38.02580
Desmognathus marmoratus Caudata LC Semi-aquatic 23.999980 34.36352 31.67792 37.73469
Desmognathus marmoratus Caudata LC Semi-aquatic 29.105408 35.01557 31.91318 38.43541
Desmognathus wrighti Caudata LC Ground-dwelling 25.971147 34.73215 30.88387 38.15570
Desmognathus wrighti Caudata LC Ground-dwelling 23.791040 34.45394 30.79199 38.00949
Desmognathus wrighti Caudata LC Ground-dwelling 28.984412 35.11669 31.25545 38.79480
Phaeognathus hubrichti Caudata EN Ground-dwelling 27.921885 34.95503 30.75156 39.19067
Phaeognathus hubrichti Caudata EN Ground-dwelling 26.303381 34.75316 30.70447 39.00677
Phaeognathus hubrichti Caudata EN Ground-dwelling 30.663819 35.29702 31.13177 39.79836
Plethodon albagula Caudata LC Ground-dwelling 25.328605 35.09039 32.56517 38.02811
Plethodon albagula Caudata LC Ground-dwelling 23.157961 34.81833 32.28261 37.52979
Plethodon albagula Caudata LC Ground-dwelling 28.903138 35.53840 32.88817 38.67833
Plethodon sequoyah Caudata DD Ground-dwelling 26.579884 35.25396 32.16976 37.79117
Plethodon sequoyah Caudata DD Ground-dwelling 24.499953 34.99993 32.52320 37.91978
Plethodon sequoyah Caudata DD Ground-dwelling 29.901534 35.65965 32.67765 38.54300
Plethodon kisatchie Caudata LC Ground-dwelling 27.242773 35.33890 32.10593 37.79613
Plethodon kisatchie Caudata LC Ground-dwelling 25.496794 35.12471 31.95364 37.51233
Plethodon kisatchie Caudata LC Ground-dwelling 30.046590 35.68288 32.47274 38.41145
Plethodon kiamichi Caudata VU Ground-dwelling 26.407276 35.20751 32.50085 38.10081
Plethodon kiamichi Caudata VU Ground-dwelling 24.464077 34.96592 32.25464 37.65443
Plethodon kiamichi Caudata VU Ground-dwelling 29.501864 35.59226 32.58934 38.41834
Plethodon amplus Caudata EN Ground-dwelling 26.327453 35.12304 32.23592 37.51883
Plethodon amplus Caudata EN Ground-dwelling 24.232726 34.86031 32.26940 37.39448
Plethodon amplus Caudata EN Ground-dwelling 29.276985 35.49299 32.76097 38.26234
Plethodon meridianus Caudata EN Ground-dwelling 26.338843 35.11299 32.31703 37.71584
Plethodon meridianus Caudata EN Ground-dwelling 24.181198 34.84303 32.14519 37.43028
Plethodon meridianus Caudata EN Ground-dwelling 29.327622 35.48694 32.43914 38.13676
Plethodon metcalfi Caudata LC Ground-dwelling 26.385290 35.04252 32.61082 37.56280
Plethodon metcalfi Caudata LC Ground-dwelling 24.339535 34.79242 32.54939 37.31315
Plethodon metcalfi Caudata LC Ground-dwelling 29.329800 35.40250 33.14387 38.37623
Plethodon aureolus Caudata DD Ground-dwelling 26.246814 35.16961 32.74509 37.71444
Plethodon aureolus Caudata DD Ground-dwelling 24.274280 34.92436 32.45250 37.21213
Plethodon aureolus Caudata DD Ground-dwelling 29.223574 35.53973 32.77518 38.06714
Plethodon cheoah Caudata VU Ground-dwelling 26.057299 35.15469 32.73946 37.84198
Plethodon cheoah Caudata VU Ground-dwelling 24.089459 34.90777 32.52144 37.47709
Plethodon cheoah Caudata VU Ground-dwelling 29.102032 35.53674 32.99793 38.43800
Plethodon shermani Caudata NT Ground-dwelling 26.380923 35.11251 32.22193 37.47138
Plethodon shermani Caudata NT Ground-dwelling 24.385570 34.87100 31.95287 37.07934
Plethodon shermani Caudata NT Ground-dwelling 29.347428 35.47155 32.72605 38.26621
Plethodon fourchensis Caudata NT Ground-dwelling 26.535050 35.29330 32.91664 38.28632
Plethodon fourchensis Caudata NT Ground-dwelling 24.472091 35.03791 32.50115 37.69869
Plethodon fourchensis Caudata NT Ground-dwelling 29.808076 35.69848 33.22665 38.88572
Plethodon kentucki Caudata LC Ground-dwelling 25.189633 35.16262 32.40380 37.89011
Plethodon kentucki Caudata LC Ground-dwelling 22.744583 34.85588 32.14561 37.39689
Plethodon kentucki Caudata LC Ground-dwelling 28.363678 35.56080 32.89505 38.59913
Plethodon petraeus Caudata VU Ground-dwelling 26.604361 35.19179 32.37012 38.15554
Plethodon petraeus Caudata VU Ground-dwelling 24.430927 34.92464 32.27676 37.80004
Plethodon petraeus Caudata VU Ground-dwelling 29.722571 35.57507 32.77471 38.91425
Plethodon angusticlavius Caudata LC Semi-aquatic 24.517993 34.75256 31.57106 37.64238
Plethodon angusticlavius Caudata LC Semi-aquatic 22.324019 34.48070 31.34811 37.34586
Plethodon angusticlavius Caudata LC Semi-aquatic 29.192601 35.33180 31.89780 38.32790
Plethodon ventralis Caudata LC Ground-dwelling 26.776138 34.75342 31.92034 37.78720
Plethodon ventralis Caudata LC Ground-dwelling 24.706252 34.49833 31.42861 37.16653
Plethodon ventralis Caudata LC Ground-dwelling 29.833267 35.13017 32.37002 38.49175
Plethodon welleri Caudata EN Ground-dwelling 25.686366 34.90363 31.59787 37.95601
Plethodon welleri Caudata EN Ground-dwelling 23.392948 34.61496 31.56546 37.71421
Plethodon welleri Caudata EN Ground-dwelling 28.774108 35.29229 31.95764 38.44899
Plethodon websteri Caudata LC Ground-dwelling 27.330521 35.22962 32.14318 38.70136
Plethodon websteri Caudata LC Ground-dwelling 25.452605 34.99953 32.12657 38.56664
Plethodon websteri Caudata LC Ground-dwelling 30.203742 35.58167 32.19601 38.99022
Plethodon shenandoah Caudata VU Ground-dwelling 24.926073 35.26221 32.51681 37.73952
Plethodon shenandoah Caudata VU Ground-dwelling 21.955077 34.89722 32.54120 37.58267
Plethodon shenandoah Caudata VU Ground-dwelling 28.059673 35.64719 32.89292 38.47548
Plethodon electromorphus Caudata LC Ground-dwelling 23.259677 34.87618 32.54014 37.54377
Plethodon electromorphus Caudata LC Ground-dwelling 20.510275 34.53081 32.16500 37.01680
Plethodon electromorphus Caudata LC Ground-dwelling 27.610082 35.42268 32.60694 37.96243
Plethodon nettingi Caudata NT Ground-dwelling 24.355642 34.98474 32.10385 37.68882
Plethodon nettingi Caudata NT Ground-dwelling 21.319478 34.60981 32.01161 37.34777
Plethodon nettingi Caudata NT Ground-dwelling 27.662741 35.39313 32.51906 38.46653
Plethodon hoffmani Caudata LC Ground-dwelling 21.457193 34.60631 32.20176 37.47807
Plethodon hoffmani Caudata LC Ground-dwelling 18.919309 34.29382 31.90563 37.04354
Plethodon hoffmani Caudata LC Ground-dwelling 25.878865 35.15075 32.29790 38.01548
Plethodon sherando Caudata VU Ground-dwelling 25.055749 35.07341 31.89280 37.98518
Plethodon sherando Caudata VU Ground-dwelling 22.277467 34.73007 31.95410 37.91767
Plethodon sherando Caudata VU Ground-dwelling 28.347050 35.48015 32.21748 38.50484
Plethodon asupak Caudata EN Ground-dwelling 18.332335 33.61642 30.46932 37.52952
Plethodon asupak Caudata EN Ground-dwelling 16.704266 33.41149 30.32026 37.32368
Plethodon asupak Caudata EN Ground-dwelling 20.884111 33.93763 30.67041 37.77184
Plethodon elongatus Caudata LC Ground-dwelling 18.238875 33.71715 29.85446 37.43316
Plethodon elongatus Caudata LC Ground-dwelling 16.544105 33.50638 29.72937 37.28030
Plethodon elongatus Caudata LC Ground-dwelling 20.853234 34.04229 30.08186 37.69792
Plethodon stormi Caudata EN Ground-dwelling 18.328294 33.71895 30.07594 37.23551
Plethodon stormi Caudata EN Ground-dwelling 16.605451 33.50156 30.03342 37.22925
Plethodon stormi Caudata EN Ground-dwelling 21.054044 34.06289 30.42779 37.53241
Plethodon idahoensis Caudata LC Semi-aquatic 16.871688 33.76430 29.89733 37.47454
Plethodon idahoensis Caudata LC Semi-aquatic 13.994735 33.40941 29.72156 37.19118
Plethodon idahoensis Caudata LC Semi-aquatic 21.079327 34.28336 30.56620 38.15081
Plethodon vandykei Caudata LC Ground-dwelling 16.901606 33.53817 29.79143 37.30450
Plethodon vandykei Caudata LC Ground-dwelling 14.771489 33.27871 29.49784 36.99759
Plethodon vandykei Caudata LC Ground-dwelling 20.178134 33.93727 30.23786 37.75714
Plethodon larselli Caudata LC Ground-dwelling 17.658988 33.60807 29.42530 37.09974
Plethodon larselli Caudata LC Ground-dwelling 15.407035 33.32691 29.29776 36.93907
Plethodon larselli Caudata LC Ground-dwelling 21.077058 34.03481 29.92352 37.66213
Plethodon neomexicanus Caudata EN Ground-dwelling 18.928693 33.73415 30.19418 37.35249
Plethodon neomexicanus Caudata EN Ground-dwelling 16.509370 33.42954 29.81088 37.04957
Plethodon neomexicanus Caudata EN Ground-dwelling 22.646397 34.20224 30.75034 38.01425
Hydromantes brunus Caudata NT Ground-dwelling 17.989651 33.83009 29.54118 38.24557
Hydromantes brunus Caudata NT Ground-dwelling 16.517098 33.64513 29.26556 37.98606
Hydromantes brunus Caudata NT Ground-dwelling 20.519513 34.14785 29.86093 38.67022
Hydromantes platycephalus Caudata LC Ground-dwelling 18.780108 33.93232 29.30822 37.99802
Hydromantes platycephalus Caudata LC Ground-dwelling 17.229382 33.73878 28.89155 37.50432
Hydromantes platycephalus Caudata LC Ground-dwelling 21.449133 34.26544 29.58561 38.28204
Hydromantes shastae Caudata NT Ground-dwelling 18.451567 33.87520 30.14274 38.42688
Hydromantes shastae Caudata NT Ground-dwelling 16.591564 33.64457 29.90801 38.10294
Hydromantes shastae Caudata NT Ground-dwelling 21.282352 34.22621 30.52432 38.94829
Karsenia koreana Caudata LC Ground-dwelling 23.834674 34.61853 30.69109 39.53315
Karsenia koreana Caudata LC Ground-dwelling 21.109871 34.27487 30.32452 39.15076
Karsenia koreana Caudata LC Ground-dwelling 26.916593 35.00723 30.81151 39.73643
Eurycea junaluska Caudata VU Semi-aquatic 26.246814 36.99819 34.18973 39.77658
Eurycea junaluska Caudata VU Semi-aquatic 24.274280 36.77651 34.05923 39.48544
Eurycea junaluska Caudata VU Semi-aquatic 29.223574 37.33273 34.39320 40.27905
Eurycea cirrigera Caudata LC Semi-aquatic 25.767720 36.87424 33.99712 39.39573
Eurycea cirrigera Caudata LC Semi-aquatic 23.005356 36.57670 33.68556 38.98803
Eurycea cirrigera Caudata LC Semi-aquatic 29.215723 37.24563 34.21785 39.91499
Eurycea wilderae Caudata LC Semi-aquatic 26.013007 36.93620 34.47359 40.25382
Eurycea wilderae Caudata LC Semi-aquatic 23.793695 36.69493 34.26819 39.80126
Eurycea wilderae Caudata LC Semi-aquatic 29.058022 37.26725 34.12010 40.18577
Eurycea guttolineata Caudata LC Semi-aquatic 26.360718 37.17117 34.76746 40.21583
Eurycea guttolineata Caudata LC Semi-aquatic 23.813474 36.89695 34.12218 39.32971
Eurycea guttolineata Caudata LC Semi-aquatic 29.378417 37.49604 34.78734 40.54058
Eurycea chisholmensis Caudata VU Aquatic 26.458913 37.04911 34.10412 40.08552
Eurycea chisholmensis Caudata VU Aquatic 25.240115 36.91297 34.04985 39.97936
Eurycea chisholmensis Caudata VU Aquatic 29.148276 37.34951 34.55414 40.76615
Eurycea tonkawae Caudata EN Aquatic 26.500352 37.07940 33.95452 39.86182
Eurycea tonkawae Caudata EN Aquatic 25.286696 36.94646 33.82381 39.60075
Eurycea tonkawae Caudata EN Aquatic 29.192627 37.37430 34.22280 40.40373
Eurycea naufragia Caudata CR Semi-aquatic 26.500352 37.14239 34.48920 39.94266
Eurycea naufragia Caudata CR Semi-aquatic 25.286696 37.00713 34.38782 39.70663
Eurycea naufragia Caudata CR Semi-aquatic 29.192627 37.44244 34.51216 40.23206
Eurycea tridentifera Caudata VU Aquatic 26.065686 37.01229 34.42293 39.57737
Eurycea tridentifera Caudata VU Aquatic 25.250112 36.92236 34.35093 39.44814
Eurycea tridentifera Caudata VU Aquatic 27.927802 37.21760 34.43542 39.77577
Eurycea pterophila Caudata DD Aquatic 26.304041 37.09103 34.48678 39.55199
Eurycea pterophila Caudata DD Aquatic 25.379846 36.98852 34.41661 39.41049
Eurycea pterophila Caudata DD Aquatic 28.275515 37.30972 34.55199 39.81604
Eurycea troglodytes Caudata DD Aquatic 26.048467 37.04554 34.20986 39.72961
Eurycea troglodytes Caudata DD Aquatic 25.213379 36.95409 33.97148 39.42395
Eurycea troglodytes Caudata DD Aquatic 27.911227 37.24952 34.32100 40.04138
Eurycea waterlooensis Caudata VU Aquatic 26.500352 37.07039 34.56300 40.22644
Eurycea waterlooensis Caudata VU Aquatic 25.286696 36.93420 34.03485 39.62929
Eurycea waterlooensis Caudata VU Aquatic 29.192627 37.37252 34.21077 40.06958
Eurycea tynerensis Caudata NT Aquatic 23.454899 36.73914 33.66295 39.89543
Eurycea tynerensis Caudata NT Aquatic 21.324026 36.50932 33.47715 39.54851
Eurycea tynerensis Caudata NT Aquatic 28.911408 37.32764 33.93092 40.58769
Urspelerpes brucei Caudata LC Fossorial 26.649141 37.35631 33.13347 40.38157
Urspelerpes brucei Caudata LC Fossorial 24.608151 37.12320 32.96432 40.05089
Urspelerpes brucei Caudata LC Fossorial 29.595138 37.69279 33.41767 40.84521
Stereochilus marginatus Caudata LC Semi-aquatic 25.739655 35.74573 32.59929 38.78617
Stereochilus marginatus Caudata LC Semi-aquatic 21.972107 35.30290 32.26401 38.17513
Stereochilus marginatus Caudata LC Semi-aquatic 28.972676 36.12574 32.90517 39.37655
Batrachoseps gregarius Caudata LC Ground-dwelling 18.901773 34.47136 30.26645 38.85713
Batrachoseps gregarius Caudata LC Ground-dwelling 17.394208 34.29135 29.94595 38.54362
Batrachoseps gregarius Caudata LC Ground-dwelling 21.550710 34.78767 30.45087 39.09158
Batrachoseps nigriventris Caudata LC Ground-dwelling 20.445312 34.70324 30.72980 39.18591
Batrachoseps nigriventris Caudata LC Ground-dwelling 18.944563 34.52232 30.14615 38.60750
Batrachoseps nigriventris Caudata LC Ground-dwelling 22.803200 34.98748 30.77971 39.18893
Batrachoseps stebbinsi Caudata VU Ground-dwelling 19.043339 34.52367 30.40667 38.99515
Batrachoseps stebbinsi Caudata VU Ground-dwelling 17.367509 34.32285 30.12212 38.74905
Batrachoseps stebbinsi Caudata VU Ground-dwelling 21.870191 34.86243 30.62351 39.19850
Batrachoseps simatus Caudata VU Ground-dwelling 17.583327 34.30196 29.97420 39.07323
Batrachoseps simatus Caudata VU Ground-dwelling 15.897419 34.10125 29.16915 38.33123
Batrachoseps simatus Caudata VU Ground-dwelling 20.596336 34.66066 30.23721 39.38591
Batrachoseps kawia Caudata NT Ground-dwelling 15.572224 34.08225 29.98588 38.81533
Batrachoseps kawia Caudata NT Ground-dwelling 13.908856 33.88116 29.00234 37.86750
Batrachoseps kawia Caudata NT Ground-dwelling 18.776325 34.46962 30.30527 39.14059
Batrachoseps relictus Caudata DD Ground-dwelling 17.583327 34.25657 29.84350 39.06773
Batrachoseps relictus Caudata DD Ground-dwelling 15.897419 34.05838 29.69146 38.95554
Batrachoseps relictus Caudata DD Ground-dwelling 20.596336 34.61079 30.19877 39.59909
Batrachoseps diabolicus Caudata DD Ground-dwelling 20.142281 34.67178 30.51594 39.17819
Batrachoseps diabolicus Caudata DD Ground-dwelling 18.752207 34.50602 30.25689 38.91561
Batrachoseps diabolicus Caudata DD Ground-dwelling 22.528577 34.95633 30.87695 39.63058
Batrachoseps regius Caudata VU Ground-dwelling 21.274720 34.77636 30.52353 39.09367
Batrachoseps regius Caudata VU Ground-dwelling 19.919791 34.61447 30.45690 39.01011
Batrachoseps regius Caudata VU Ground-dwelling 23.549664 35.04816 30.83411 39.43220
Batrachoseps gabrieli Caudata DD Ground-dwelling 19.904945 34.62617 30.23484 38.88701
Batrachoseps gabrieli Caudata DD Ground-dwelling 18.173037 34.42538 29.99823 38.66193
Batrachoseps gabrieli Caudata DD Ground-dwelling 22.890779 34.97233 30.73679 39.38933
Batrachoseps gavilanensis Caudata LC Ground-dwelling 19.537068 34.56860 30.18936 38.69116
Batrachoseps gavilanensis Caudata LC Ground-dwelling 18.242612 34.41435 30.09084 38.56993
Batrachoseps gavilanensis Caudata LC Ground-dwelling 21.723828 34.82918 30.14175 38.70329
Batrachoseps incognitus Caudata DD Ground-dwelling 19.200816 34.58273 30.37054 39.23429
Batrachoseps incognitus Caudata DD Ground-dwelling 17.945820 34.43226 30.23602 39.10855
Batrachoseps incognitus Caudata DD Ground-dwelling 21.397707 34.84612 30.68554 39.50955
Batrachoseps minor Caudata DD Ground-dwelling 19.703588 34.56445 30.23499 39.18088
Batrachoseps minor Caudata DD Ground-dwelling 18.422359 34.41134 30.09455 39.03477
Batrachoseps minor Caudata DD Ground-dwelling 22.108248 34.85181 30.49443 39.42780
Batrachoseps major Caudata LC Ground-dwelling 21.228278 34.80440 30.80253 39.66955
Batrachoseps major Caudata LC Ground-dwelling 19.579335 34.60992 30.06127 38.91682
Batrachoseps major Caudata LC Ground-dwelling 23.806568 35.10849 31.02517 40.01028
Batrachoseps pacificus Caudata LC Ground-dwelling 19.092654 34.52440 30.26329 38.83155
Batrachoseps pacificus Caudata LC Ground-dwelling 17.794184 34.37102 30.13643 38.69922
Batrachoseps pacificus Caudata LC Ground-dwelling 21.558753 34.81569 30.31028 39.04070
Batrachoseps luciae Caudata LC Ground-dwelling 19.179298 34.51251 29.91268 39.08918
Batrachoseps luciae Caudata LC Ground-dwelling 17.892191 34.35900 29.77534 38.89716
Batrachoseps luciae Caudata LC Ground-dwelling 21.285465 34.76370 29.83696 39.05983
Batrachoseps robustus Caudata NT Ground-dwelling 19.075432 34.53782 30.08340 38.90065
Batrachoseps robustus Caudata NT Ground-dwelling 17.480082 34.34392 29.88217 38.70014
Batrachoseps robustus Caudata NT Ground-dwelling 21.813122 34.87056 30.54157 39.40266
Batrachoseps attenuatus Caudata LC Ground-dwelling 18.771211 34.50808 30.34917 38.98927
Batrachoseps attenuatus Caudata LC Ground-dwelling 17.297972 34.33253 30.19768 38.81353
Batrachoseps attenuatus Caudata LC Ground-dwelling 21.117565 34.78768 30.42850 39.11360
Batrachoseps campi Caudata NT Ground-dwelling 17.838213 34.49529 30.39707 39.15334
Batrachoseps campi Caudata NT Ground-dwelling 16.254887 34.30435 30.10570 38.80214
Batrachoseps campi Caudata NT Ground-dwelling 20.648948 34.83424 30.78058 39.56293
Batrachoseps wrighti Caudata NT Ground-dwelling 17.816881 34.48280 30.06391 38.65667
Batrachoseps wrighti Caudata NT Ground-dwelling 15.792631 34.24010 29.90965 38.54438
Batrachoseps wrighti Caudata NT Ground-dwelling 20.959635 34.85962 30.44623 39.06384
Bolitoglossa adspersa Caudata NT Ground-dwelling 23.104446 34.98331 30.97128 39.24956
Bolitoglossa adspersa Caudata NT Ground-dwelling 22.275600 34.88301 30.80424 39.06034
Bolitoglossa adspersa Caudata NT Ground-dwelling 24.747226 35.18213 31.07516 39.36201
Bolitoglossa medemi Caudata LC Arboreal 26.390359 35.21171 30.88817 39.54648
Bolitoglossa medemi Caudata LC Arboreal 25.731534 35.13096 30.84223 39.48250
Bolitoglossa medemi Caudata LC Arboreal 27.738999 35.37701 31.12393 39.83451
Bolitoglossa alberchi Caudata VU Arboreal 27.237701 35.37561 30.91578 39.54371
Bolitoglossa alberchi Caudata VU Arboreal 26.286179 35.26196 30.79710 39.33554
Bolitoglossa alberchi Caudata VU Arboreal 29.192015 35.60905 31.02206 39.70918
Bolitoglossa altamazonica Caudata LC Arboreal 26.682991 35.28726 30.73422 39.57715
Bolitoglossa altamazonica Caudata LC Arboreal 25.915625 35.19344 30.71794 39.56067
Bolitoglossa altamazonica Caudata LC Arboreal 28.186575 35.47109 30.84249 39.79244
Bolitoglossa peruviana Caudata DD Arboreal 24.021783 34.97329 30.67440 39.37384
Bolitoglossa peruviana Caudata DD Arboreal 23.410536 34.90027 30.65348 39.31846
Bolitoglossa peruviana Caudata DD Arboreal 25.363768 35.13359 30.96757 39.71623
Bolitoglossa palmata Caudata LC Arboreal 22.770970 34.79641 30.09686 38.69939
Bolitoglossa palmata Caudata LC Arboreal 21.263331 34.61728 29.99879 38.53190
Bolitoglossa palmata Caudata LC Arboreal 24.898342 35.04916 30.22267 38.92714
Bolitoglossa alvaradoi Caudata VU Arboreal 24.957708 35.11272 30.64151 39.10051
Bolitoglossa alvaradoi Caudata VU Arboreal 24.191000 35.01974 30.49370 38.93452
Bolitoglossa alvaradoi Caudata VU Arboreal 26.352285 35.28184 30.89949 39.39004
Bolitoglossa dofleini Caudata NT Ground-dwelling 26.212985 35.43357 30.83818 39.45083
Bolitoglossa dofleini Caudata NT Ground-dwelling 25.429183 35.33935 30.79578 39.34316
Bolitoglossa dofleini Caudata NT Ground-dwelling 27.890247 35.63518 31.12157 39.88182
Bolitoglossa anthracina Caudata EN Ground-dwelling 27.911209 35.61174 31.18192 39.62679
Bolitoglossa anthracina Caudata EN Ground-dwelling 27.288770 35.53570 31.06570 39.50260
Bolitoglossa anthracina Caudata EN Ground-dwelling 28.936857 35.73703 31.28989 39.82880
Bolitoglossa biseriata Caudata LC Arboreal 25.811450 35.18528 31.08834 39.52029
Bolitoglossa biseriata Caudata LC Arboreal 25.026529 35.09052 30.98263 39.39375
Bolitoglossa biseriata Caudata LC Arboreal 27.202696 35.35324 31.37306 39.93925
Bolitoglossa sima Caudata LC Arboreal 23.921100 34.94343 30.99082 39.42173
Bolitoglossa sima Caudata LC Arboreal 22.707937 34.80021 30.86726 39.29325
Bolitoglossa sima Caudata LC Arboreal 25.766620 35.16131 31.01961 39.48147
Bolitoglossa borburata Caudata VU Ground-dwelling 26.532132 35.47015 30.93559 40.12780
Bolitoglossa borburata Caudata VU Ground-dwelling 25.800733 35.38139 30.45111 39.61432
Bolitoglossa borburata Caudata VU Ground-dwelling 27.991576 35.64726 30.53764 39.76539
Bolitoglossa bramei Caudata LC Ground-dwelling 24.247729 35.21864 30.50539 39.26144
Bolitoglossa bramei Caudata LC Ground-dwelling 23.486497 35.12752 30.40706 39.13436
Bolitoglossa bramei Caudata LC Ground-dwelling 25.406800 35.35739 30.81927 39.57696
Bolitoglossa pesrubra Caudata LC Ground-dwelling 17.078254 34.35081 30.55468 38.72647
Bolitoglossa pesrubra Caudata LC Ground-dwelling 15.980470 34.22181 30.35526 38.51643
Bolitoglossa pesrubra Caudata LC Ground-dwelling 18.397641 34.50584 30.66481 38.85919
Bolitoglossa capitana Caudata CR Ground-dwelling 24.790993 35.19517 31.16065 39.73758
Bolitoglossa capitana Caudata CR Ground-dwelling 24.132263 35.11798 31.05604 39.57457
Bolitoglossa capitana Caudata CR Ground-dwelling 26.160418 35.35564 31.09233 39.69657
Bolitoglossa carri Caudata CR Arboreal 23.908967 34.97309 30.61625 39.17951
Bolitoglossa carri Caudata CR Arboreal 22.710840 34.82815 30.50993 39.00226
Bolitoglossa carri Caudata CR Arboreal 26.336413 35.26674 31.07279 39.76891
Bolitoglossa oresbia Caudata CR Arboreal 23.908967 34.93657 30.74117 39.20932
Bolitoglossa oresbia Caudata CR Arboreal 22.710840 34.79280 30.57624 38.99990
Bolitoglossa oresbia Caudata CR Arboreal 26.336413 35.22785 31.10228 39.75543
Bolitoglossa celaque Caudata CR Ground-dwelling 25.840884 35.35581 31.11349 40.35209
Bolitoglossa celaque Caudata CR Ground-dwelling 24.717977 35.22130 30.68418 39.84983
Bolitoglossa celaque Caudata CR Ground-dwelling 28.038361 35.61903 31.21823 40.44772
Bolitoglossa synoria Caudata CR Arboreal 27.096784 35.34092 30.90926 40.12996
Bolitoglossa synoria Caudata CR Arboreal 26.234483 35.23804 30.86136 40.02520
Bolitoglossa synoria Caudata CR Arboreal 28.925176 35.55905 31.00267 40.38658
Bolitoglossa heiroreias Caudata EN Ground-dwelling 27.096784 35.46863 30.83960 39.57693
Bolitoglossa heiroreias Caudata EN Ground-dwelling 26.234483 35.36452 30.71761 39.43406
Bolitoglossa heiroreias Caudata EN Ground-dwelling 28.925176 35.68938 31.01997 39.87986
Bolitoglossa cerroensis Caudata LC Ground-dwelling 17.078254 34.20237 30.28211 38.66169
Bolitoglossa cerroensis Caudata LC Ground-dwelling 15.980470 34.06838 30.07467 38.48652
Bolitoglossa cerroensis Caudata LC Ground-dwelling 18.397641 34.36340 30.39264 38.78378
Bolitoglossa epimela Caudata DD Arboreal 22.320708 34.72588 30.57092 38.86727
Bolitoglossa epimela Caudata DD Arboreal 21.414495 34.61666 30.49134 38.76069
Bolitoglossa epimela Caudata DD Arboreal 23.754809 34.89873 30.68181 39.13991
Bolitoglossa marmorea Caudata EN Arboreal 27.911209 35.43929 31.09105 39.68310
Bolitoglossa marmorea Caudata EN Arboreal 27.288770 35.36349 31.22643 39.81248
Bolitoglossa marmorea Caudata EN Arboreal 28.936857 35.56418 31.29764 39.96155
Bolitoglossa chica Caudata CR Arboreal 24.406710 35.01566 30.86756 39.63079
Bolitoglossa chica Caudata CR Arboreal 23.404282 34.89326 30.87123 39.57571
Bolitoglossa chica Caudata CR Arboreal 26.113428 35.22405 31.16156 40.03394
Bolitoglossa colonnea Caudata LC Arboreal 26.127683 35.24848 31.49992 40.22002
Bolitoglossa colonnea Caudata LC Arboreal 25.430495 35.16375 31.44197 40.12086
Bolitoglossa colonnea Caudata LC Arboreal 27.423500 35.40596 31.73102 40.51143
Bolitoglossa nigrescens Caudata DD Ground-dwelling 22.371743 34.98784 30.53653 39.07266
Bolitoglossa nigrescens Caudata DD Ground-dwelling 21.457006 34.87713 30.70071 39.22082
Bolitoglossa nigrescens Caudata DD Ground-dwelling 23.844119 35.16604 30.87267 39.50236
Bolitoglossa compacta Caudata EN Arboreal 27.832466 35.43971 30.74173 39.64104
Bolitoglossa compacta Caudata EN Arboreal 27.239510 35.36921 30.66472 39.54541
Bolitoglossa compacta Caudata EN Arboreal 28.911379 35.56798 30.82485 39.82585
Bolitoglossa robusta Caudata VU Ground-dwelling 25.977403 35.47364 31.19764 39.89501
Bolitoglossa robusta Caudata VU Ground-dwelling 25.272793 35.38776 31.06968 39.78689
Bolitoglossa robusta Caudata VU Ground-dwelling 27.360886 35.64227 31.42480 40.19942
Bolitoglossa schizodactyla Caudata LC Arboreal 26.330875 35.27701 30.78766 39.31063
Bolitoglossa schizodactyla Caudata LC Arboreal 25.675851 35.19757 30.75014 39.24672
Bolitoglossa schizodactyla Caudata LC Arboreal 27.510668 35.42009 30.93624 39.53896
Bolitoglossa conanti Caudata VU Arboreal 26.148464 35.22243 31.28753 39.26524
Bolitoglossa conanti Caudata VU Arboreal 25.307816 35.11921 31.25193 39.16097
Bolitoglossa conanti Caudata VU Arboreal 27.964329 35.44539 31.63386 39.73685
Bolitoglossa diaphora Caudata EN Arboreal 25.174190 35.11562 31.18741 39.93222
Bolitoglossa diaphora Caudata EN Arboreal 24.673669 35.05551 31.09669 39.80464
Bolitoglossa diaphora Caudata EN Arboreal 26.575538 35.28389 31.27134 40.10363
Bolitoglossa dunni Caudata EN Arboreal 25.174190 35.11426 30.92986 39.59178
Bolitoglossa dunni Caudata EN Arboreal 24.673669 35.05414 30.89466 39.49260
Bolitoglossa dunni Caudata EN Arboreal 26.575538 35.28258 30.66091 39.40415
Bolitoglossa copia Caudata CR Ground-dwelling 27.670287 35.58532 31.22816 39.79837
Bolitoglossa copia Caudata CR Ground-dwelling 27.090947 35.51542 31.17880 39.71661
Bolitoglossa copia Caudata CR Ground-dwelling 28.836217 35.72598 31.35783 40.04885
Bolitoglossa cuchumatana Caudata EN Ground-dwelling 24.642523 35.22424 30.60117 39.17109
Bolitoglossa cuchumatana Caudata EN Ground-dwelling 23.462785 35.08178 30.63314 39.21691
Bolitoglossa cuchumatana Caudata EN Ground-dwelling 26.942640 35.50200 30.84670 39.53489
Bolitoglossa helmrichi Caudata VU Arboreal 26.005871 35.19982 30.81362 39.61764
Bolitoglossa helmrichi Caudata VU Arboreal 25.026780 35.08378 30.48407 39.21137
Bolitoglossa helmrichi Caudata VU Arboreal 28.021294 35.43868 30.80550 39.71478
Bolitoglossa cuna Caudata EN Arboreal 27.549063 35.45351 31.41074 40.34125
Bolitoglossa cuna Caudata EN Arboreal 26.904992 35.37451 31.38900 40.30576
Bolitoglossa cuna Caudata EN Arboreal 28.900670 35.61929 31.23444 40.23387
Bolitoglossa suchitanensis Caudata CR Arboreal 27.096784 35.28821 31.12412 39.35962
Bolitoglossa suchitanensis Caudata CR Arboreal 26.234483 35.18483 31.15057 39.36831
Bolitoglossa suchitanensis Caudata CR Arboreal 28.925176 35.50743 31.21625 39.51478
Bolitoglossa morio Caudata VU Arboreal 24.846943 35.04774 31.01080 39.57398
Bolitoglossa morio Caudata VU Arboreal 23.863817 34.93006 30.89933 39.39398
Bolitoglossa morio Caudata VU Arboreal 26.981897 35.30329 31.37273 40.05535
Bolitoglossa flavimembris Caudata EN Arboreal 25.222340 35.19911 30.93962 39.33669
Bolitoglossa flavimembris Caudata EN Arboreal 24.309797 35.08879 30.82855 39.21632
Bolitoglossa flavimembris Caudata EN Arboreal 27.326458 35.45347 31.14535 39.63180
Bolitoglossa decora Caudata CR Arboreal 26.312208 35.20180 30.68583 39.37752
Bolitoglossa decora Caudata CR Arboreal 25.824153 35.14355 30.72594 39.41637
Bolitoglossa decora Caudata CR Arboreal 27.366036 35.32758 30.76828 39.55372
Bolitoglossa digitigrada Caudata DD Ground-dwelling 15.448306 34.10244 29.81702 38.42198
Bolitoglossa digitigrada Caudata DD Ground-dwelling 14.520308 33.99129 29.63551 38.29733
Bolitoglossa digitigrada Caudata DD Ground-dwelling 16.818757 34.26657 30.06941 38.69383
Bolitoglossa diminuta Caudata LC Arboreal 17.078254 34.22742 29.96037 38.26091
Bolitoglossa diminuta Caudata LC Arboreal 15.980470 34.09258 29.84105 38.11369
Bolitoglossa diminuta Caudata LC Arboreal 18.397641 34.38948 30.11417 38.43173
Bolitoglossa engelhardti Caudata EN Arboreal 24.633966 34.96880 30.65901 39.43141
Bolitoglossa engelhardti Caudata EN Arboreal 23.618004 34.84840 30.53232 39.25932
Bolitoglossa engelhardti Caudata EN Arboreal 26.880464 35.23501 30.89848 39.60737
Bolitoglossa equatoriana Caudata LC Arboreal 25.365179 35.05685 30.61224 39.82813
Bolitoglossa equatoriana Caudata LC Arboreal 24.571701 34.96142 30.54913 39.69941
Bolitoglossa equatoriana Caudata LC Arboreal 26.871302 35.23797 30.42281 39.79666
Bolitoglossa paraensis Caudata DD Arboreal 27.676071 35.37636 30.93952 39.57167
Bolitoglossa paraensis Caudata DD Arboreal 27.084479 35.30577 30.86549 39.49188
Bolitoglossa paraensis Caudata DD Arboreal 28.983180 35.53233 31.09880 39.79730
Bolitoglossa flaviventris Caudata EN Arboreal 25.222340 35.18237 30.71776 39.81854
Bolitoglossa flaviventris Caudata EN Arboreal 24.309797 35.07349 30.64675 39.68103
Bolitoglossa flaviventris Caudata EN Arboreal 27.326458 35.43341 30.76871 40.02539
Bolitoglossa franklini Caudata VU Arboreal 25.222340 35.17053 30.47776 39.30023
Bolitoglossa franklini Caudata VU Arboreal 24.309797 35.05763 30.35030 39.13141
Bolitoglossa franklini Caudata VU Arboreal 27.326458 35.43085 30.56248 39.54217
Bolitoglossa lincolni Caudata NT Arboreal 25.541296 35.18215 30.56244 39.31233
Bolitoglossa lincolni Caudata NT Arboreal 24.487814 35.05363 30.63908 39.31988
Bolitoglossa lincolni Caudata NT Arboreal 27.633587 35.43741 30.92104 39.67590
Bolitoglossa gomezi Caudata EN Arboreal 22.494731 34.74684 30.33331 38.97324
Bolitoglossa gomezi Caudata EN Arboreal 21.634620 34.64387 30.57653 39.20420
Bolitoglossa gomezi Caudata EN Arboreal 23.667249 34.88721 30.52361 39.11398
Bolitoglossa gracilis Caudata LC Arboreal 22.320708 34.68406 30.90667 39.57449
Bolitoglossa gracilis Caudata LC Arboreal 21.414495 34.57757 30.78196 39.43103
Bolitoglossa gracilis Caudata LC Arboreal 23.754809 34.85258 31.00803 39.63903
Bolitoglossa subpalmata Caudata LC Arboreal 24.025703 34.87655 30.54039 38.90847
Bolitoglossa subpalmata Caudata LC Arboreal 23.191250 34.77727 30.46502 38.77660
Bolitoglossa subpalmata Caudata LC Arboreal 25.507747 35.05288 30.88522 39.28440
Bolitoglossa tica Caudata DD Arboreal 22.371743 34.63398 30.21204 38.86329
Bolitoglossa tica Caudata DD Arboreal 21.457006 34.52685 30.10716 38.73845
Bolitoglossa tica Caudata DD Arboreal 23.844119 34.80640 30.26890 38.93953
Bolitoglossa guaramacalensis Caudata EN Ground-dwelling 26.628438 35.50648 31.24099 39.66156
Bolitoglossa guaramacalensis Caudata EN Ground-dwelling 25.765485 35.40362 31.13605 39.51317
Bolitoglossa guaramacalensis Caudata EN Ground-dwelling 28.169923 35.69023 31.28863 39.74083
Bolitoglossa hartwegi Caudata VU Ground-dwelling 27.278733 35.53184 31.43895 40.08831
Bolitoglossa hartwegi Caudata VU Ground-dwelling 26.237393 35.40692 31.34855 39.91876
Bolitoglossa hartwegi Caudata VU Ground-dwelling 29.095216 35.74974 31.59444 40.37622
Bolitoglossa hermosa Caudata LC Arboreal 24.137970 34.98858 31.00794 39.30924
Bolitoglossa hermosa Caudata LC Arboreal 23.061969 34.86214 30.88406 39.15699
Bolitoglossa hermosa Caudata LC Arboreal 25.815825 35.18573 30.96312 39.28331
Bolitoglossa riletti Caudata EN Arboreal 25.238949 35.16256 30.98324 39.38863
Bolitoglossa riletti Caudata EN Arboreal 24.040375 35.01849 30.84185 39.21493
Bolitoglossa riletti Caudata EN Arboreal 27.197672 35.39800 31.30687 39.81754
Bolitoglossa zapoteca Caudata EN Ground-dwelling 27.361306 35.49903 30.80433 39.43897
Bolitoglossa zapoteca Caudata EN Ground-dwelling 26.340347 35.37887 30.74089 39.35139
Bolitoglossa zapoteca Caudata EN Ground-dwelling 29.216114 35.71732 31.06845 39.72600
Bolitoglossa hiemalis Caudata VU Arboreal 24.017258 35.03420 30.84070 39.17382
Bolitoglossa hiemalis Caudata VU Arboreal 23.300537 34.94698 30.75629 39.07909
Bolitoglossa hiemalis Caudata VU Arboreal 25.278806 35.18773 30.96590 39.35996
Bolitoglossa hypacra Caudata EN Ground-dwelling 25.973775 35.32825 30.74666 39.53677
Bolitoglossa hypacra Caudata EN Ground-dwelling 25.275238 35.24469 30.68593 39.44303
Bolitoglossa hypacra Caudata EN Ground-dwelling 27.319325 35.48920 30.90089 39.71734
Bolitoglossa indio Caudata EN Ground-dwelling 27.713529 35.68234 31.45496 40.16908
Bolitoglossa indio Caudata EN Ground-dwelling 26.973037 35.59130 31.64746 40.28967
Bolitoglossa indio Caudata EN Ground-dwelling 29.311442 35.87879 31.78227 40.64605
Bolitoglossa insularis Caudata CR Arboreal 27.162478 35.30403 30.94163 39.43041
Bolitoglossa insularis Caudata CR Arboreal 26.299723 35.20207 30.92144 39.34298
Bolitoglossa insularis Caudata CR Arboreal 29.073735 35.52992 31.08289 39.64188
Bolitoglossa jacksoni Caudata CR Ground-dwelling 22.235597 34.83321 30.58481 39.00574
Bolitoglossa jacksoni Caudata CR Ground-dwelling 20.945471 34.67689 30.41810 38.79011
Bolitoglossa jacksoni Caudata CR Ground-dwelling 24.805021 35.14455 30.96448 39.49051
Bolitoglossa nicefori Caudata LC Arboreal 23.392915 34.81900 30.46568 38.99029
Bolitoglossa nicefori Caudata LC Arboreal 22.591262 34.72276 30.38629 38.87841
Bolitoglossa nicefori Caudata LC Arboreal 24.955324 35.00656 30.56769 39.13009
Bolitoglossa lignicolor Caudata LC Arboreal 25.438060 35.13590 30.63068 39.21194
Bolitoglossa lignicolor Caudata LC Arboreal 24.779460 35.05599 30.57690 39.12432
Bolitoglossa lignicolor Caudata LC Arboreal 26.660145 35.28418 30.71227 39.31218
Bolitoglossa longissima Caudata CR Arboreal 26.355801 35.28898 31.22455 39.70665
Bolitoglossa longissima Caudata CR Arboreal 25.562400 35.19192 30.93511 39.43654
Bolitoglossa longissima Caudata CR Arboreal 27.958590 35.48504 31.42238 39.89423
Bolitoglossa porrasorum Caudata EN Arboreal 26.157984 35.19758 30.46435 39.35828
Bolitoglossa porrasorum Caudata EN Arboreal 25.537721 35.12410 30.53870 39.39840
Bolitoglossa porrasorum Caudata EN Arboreal 27.383776 35.34280 30.57640 39.51686
Bolitoglossa lozanoi Caudata LC Arboreal 24.038090 34.99894 30.77165 39.08894
Bolitoglossa lozanoi Caudata LC Arboreal 23.230685 34.90206 30.68013 38.97552
Bolitoglossa lozanoi Caudata LC Arboreal 25.626365 35.18951 30.94551 39.31205
Bolitoglossa macrinii Caudata EN Ground-dwelling 26.842515 35.47729 30.75062 39.64033
Bolitoglossa macrinii Caudata EN Ground-dwelling 25.741835 35.34390 30.57534 39.40785
Bolitoglossa macrinii Caudata EN Ground-dwelling 28.551868 35.68446 30.88447 39.80482
Bolitoglossa oaxacensis Caudata EN Ground-dwelling 26.023477 35.32478 30.88212 39.34976
Bolitoglossa oaxacensis Caudata EN Ground-dwelling 24.851257 35.18407 30.78955 39.21537
Bolitoglossa oaxacensis Caudata EN Ground-dwelling 27.875192 35.54705 31.01554 39.61435
Bolitoglossa magnifica Caudata EN Ground-dwelling 27.911209 35.64890 31.17737 40.04380
Bolitoglossa magnifica Caudata EN Ground-dwelling 27.288770 35.57389 31.12025 39.91482
Bolitoglossa magnifica Caudata EN Ground-dwelling 28.936857 35.77251 31.03784 39.93042
Bolitoglossa meliana Caudata EN Ground-dwelling 24.519544 35.23354 30.38593 39.47395
Bolitoglossa meliana Caudata EN Ground-dwelling 23.559542 35.11696 30.48449 39.56384
Bolitoglossa meliana Caudata EN Ground-dwelling 26.706480 35.49911 30.72609 39.87842
Bolitoglossa mexicana Caudata LC Arboreal 26.584167 35.30733 30.53466 39.38677
Bolitoglossa mexicana Caudata LC Arboreal 25.706929 35.20089 30.40229 39.21883
Bolitoglossa mexicana Caudata LC Arboreal 28.333355 35.51958 31.02070 39.91040
Bolitoglossa odonnelli Caudata NT Arboreal 25.832357 35.19421 31.23598 39.95928
Bolitoglossa odonnelli Caudata NT Arboreal 24.998926 35.09487 31.09523 39.78909
Bolitoglossa odonnelli Caudata NT Arboreal 27.644046 35.41015 31.19533 39.91028
Bolitoglossa minutula Caudata EN Arboreal 24.247729 35.01371 30.50970 39.25992
Bolitoglossa minutula Caudata EN Arboreal 23.486497 34.92262 30.78829 39.51149
Bolitoglossa minutula Caudata EN Arboreal 25.406800 35.15240 31.05208 39.85073
Bolitoglossa sooyorum Caudata EN Arboreal 17.078254 34.13260 29.86778 38.50935
Bolitoglossa sooyorum Caudata EN Arboreal 15.980470 33.99916 29.72471 38.37854
Bolitoglossa sooyorum Caudata EN Arboreal 18.397641 34.29299 30.00018 38.66036
Bolitoglossa mombachoensis Caudata VU Arboreal 27.162478 35.37057 30.96166 39.54794
Bolitoglossa mombachoensis Caudata VU Arboreal 26.299723 35.26812 30.91518 39.45349
Bolitoglossa mombachoensis Caudata VU Arboreal 29.073735 35.59751 31.27283 39.99782
Bolitoglossa striatula Caudata LC Arboreal 26.476833 35.28560 30.77859 39.48750
Bolitoglossa striatula Caudata LC Arboreal 25.652683 35.18542 30.76018 39.38711
Bolitoglossa striatula Caudata LC Arboreal 28.119961 35.48533 31.05886 39.91183
Bolitoglossa mulleri Caudata VU Ground-dwelling 25.273823 35.25818 30.68451 39.08185
Bolitoglossa mulleri Caudata VU Ground-dwelling 24.145710 35.12099 30.66099 39.08851
Bolitoglossa mulleri Caudata VU Ground-dwelling 27.517964 35.53108 30.89036 39.28229
Bolitoglossa yucatana Caudata LC Ground-dwelling 27.510293 35.61376 31.36443 39.76292
Bolitoglossa yucatana Caudata LC Ground-dwelling 26.836915 35.53164 31.29243 39.66366
Bolitoglossa yucatana Caudata LC Ground-dwelling 29.031504 35.79927 31.62647 40.05597
Bolitoglossa orestes Caudata EN Ground-dwelling 26.263875 35.41348 31.08314 39.38362
Bolitoglossa orestes Caudata EN Ground-dwelling 25.397043 35.30990 30.91061 39.16553
Bolitoglossa orestes Caudata EN Ground-dwelling 27.823709 35.59987 31.25672 39.60354
Bolitoglossa rufescens Caudata LC Arboreal 26.017936 35.19433 31.05070 39.58492
Bolitoglossa rufescens Caudata LC Arboreal 24.972865 35.06692 30.91499 39.37757
Bolitoglossa rufescens Caudata LC Arboreal 28.108668 35.44922 30.83367 39.42684
Bolitoglossa obscura Caudata DD Ground-dwelling 17.078254 34.27630 29.96090 38.18613
Bolitoglossa obscura Caudata DD Ground-dwelling 15.980470 34.14536 29.90277 38.14652
Bolitoglossa obscura Caudata DD Ground-dwelling 18.397641 34.43368 30.14435 38.36616
Bolitoglossa occidentalis Caudata LC Arboreal 26.573443 35.29689 30.78648 39.49233
Bolitoglossa occidentalis Caudata LC Arboreal 25.605584 35.18155 30.76943 39.37137
Bolitoglossa occidentalis Caudata LC Arboreal 28.541205 35.53139 31.20426 39.96011
Bolitoglossa pandi Caudata EN Ground-dwelling 25.022654 35.25046 31.15821 39.39936
Bolitoglossa pandi Caudata EN Ground-dwelling 24.422681 35.17752 31.04436 39.23660
Bolitoglossa pandi Caudata EN Ground-dwelling 26.346708 35.41144 31.23284 39.59674
Bolitoglossa phalarosoma Caudata NT Ground-dwelling 23.364733 35.03215 30.89031 39.16410
Bolitoglossa phalarosoma Caudata NT Ground-dwelling 22.528890 34.93009 30.79543 39.07119
Bolitoglossa phalarosoma Caudata NT Ground-dwelling 24.874656 35.21650 30.99830 39.35627
Bolitoglossa platydactyla Caudata LC Arboreal 25.090175 35.16029 30.70698 39.42875
Bolitoglossa platydactyla Caudata LC Arboreal 24.125277 35.04466 30.66159 39.32817
Bolitoglossa platydactyla Caudata LC Arboreal 27.133150 35.40511 31.07349 39.81849
Bolitoglossa ramosi Caudata NT Arboreal 23.911067 34.96740 30.88382 39.54989
Bolitoglossa ramosi Caudata NT Arboreal 23.105038 34.87080 30.80625 39.42866
Bolitoglossa ramosi Caudata NT Arboreal 25.393507 35.14507 30.98691 39.78898
Bolitoglossa rostrata Caudata NT Arboreal 25.797952 35.18348 30.59110 39.36042
Bolitoglossa rostrata Caudata NT Arboreal 24.749793 35.05728 30.41864 39.17313
Bolitoglossa rostrata Caudata NT Arboreal 27.845269 35.42998 30.95123 39.87711
Bolitoglossa salvinii Caudata VU Arboreal 26.475215 35.30468 30.83719 39.46520
Bolitoglossa salvinii Caudata VU Arboreal 25.674497 35.20788 30.72474 39.34276
Bolitoglossa salvinii Caudata VU Arboreal 28.370070 35.53375 31.06618 39.85865
Bolitoglossa savagei Caudata NT Arboreal 26.777894 35.26613 30.96957 39.84644
Bolitoglossa savagei Caudata NT Arboreal 25.908244 35.16202 30.99405 39.78914
Bolitoglossa savagei Caudata NT Arboreal 28.696471 35.49582 31.02133 40.04950
Bolitoglossa silverstonei Caudata DD Arboreal 25.728540 35.16457 30.64833 39.64899
Bolitoglossa silverstonei Caudata DD Arboreal 25.006141 35.07682 30.09760 39.10763
Bolitoglossa silverstonei Caudata DD Arboreal 27.084885 35.32934 30.91700 39.95342
Bolitoglossa sombra Caudata NT Arboreal 27.832466 35.49996 31.05187 39.79579
Bolitoglossa sombra Caudata NT Arboreal 27.239510 35.42880 31.61862 40.31692
Bolitoglossa sombra Caudata NT Arboreal 28.911379 35.62943 31.78340 40.59815
Bolitoglossa stuarti Caudata VU Arboreal 25.737105 35.10937 30.74658 39.56235
Bolitoglossa stuarti Caudata VU Arboreal 24.619651 34.97544 30.83956 39.65508
Bolitoglossa stuarti Caudata VU Arboreal 27.816738 35.35863 31.09861 39.91187
Bolitoglossa tatamae Caudata EN Arboreal 24.913367 35.12589 30.83062 39.56315
Bolitoglossa tatamae Caudata EN Arboreal 24.197155 35.03803 30.69720 39.39427
Bolitoglossa tatamae Caudata EN Arboreal 26.314412 35.29777 30.96234 39.91973
Bolitoglossa taylori Caudata EN Arboreal 26.997239 35.31378 31.21176 40.24168
Bolitoglossa taylori Caudata EN Arboreal 26.294779 35.22926 31.12623 40.13309
Bolitoglossa taylori Caudata EN Arboreal 28.463507 35.49019 30.95139 40.07419
Bolitoglossa vallecula Caudata LC Arboreal 22.986816 34.93531 30.26888 39.09249
Bolitoglossa vallecula Caudata LC Arboreal 22.092048 34.82751 30.24301 39.01530
Bolitoglossa vallecula Caudata LC Arboreal 24.542988 35.12279 30.39545 39.31201
Bolitoglossa veracrucis Caudata EN Arboreal 27.352265 35.33793 30.56874 39.12892
Bolitoglossa veracrucis Caudata EN Arboreal 26.475358 35.23170 30.45205 39.00318
Bolitoglossa veracrucis Caudata EN Arboreal 29.147645 35.55542 30.88736 39.66617
Bolitoglossa walkeri Caudata NT Arboreal 23.478062 34.89561 30.85437 39.42294
Bolitoglossa walkeri Caudata NT Arboreal 22.554985 34.78310 30.68427 39.22247
Bolitoglossa walkeri Caudata NT Arboreal 25.033465 35.08518 30.87217 39.48876
Ixalotriton niger Caudata EN Ground-dwelling 27.384785 35.54318 30.86945 40.04090
Ixalotriton niger Caudata EN Ground-dwelling 26.395290 35.42162 31.05059 40.13487
Ixalotriton niger Caudata EN Ground-dwelling 29.371363 35.78724 31.30594 40.57942
Ixalotriton parvus Caudata CR Arboreal 27.781178 35.37719 30.70105 39.90558
Ixalotriton parvus Caudata CR Arboreal 26.782294 35.25976 30.49021 39.68866
Ixalotriton parvus Caudata CR Arboreal 29.726741 35.60590 30.78599 40.07889
Parvimolge townsendi Caudata VU Ground-dwelling 24.717194 35.17182 30.40310 39.28268
Parvimolge townsendi Caudata VU Ground-dwelling 23.702399 35.05121 30.50925 39.35846
Parvimolge townsendi Caudata VU Ground-dwelling 26.977841 35.44050 30.72771 39.69925
Pseudoeurycea ahuitzotl Caudata CR Ground-dwelling 24.137970 35.25775 30.59386 39.46091
Pseudoeurycea ahuitzotl Caudata CR Ground-dwelling 23.061969 35.12727 30.47786 39.28474
Pseudoeurycea ahuitzotl Caudata CR Ground-dwelling 25.815825 35.46122 31.10808 40.10693
Pseudoeurycea altamontana Caudata EN Ground-dwelling 20.553017 34.65244 30.31493 39.18365
Pseudoeurycea altamontana Caudata EN Ground-dwelling 19.305069 34.50530 30.14820 38.96279
Pseudoeurycea altamontana Caudata EN Ground-dwelling 23.352564 34.98253 30.37159 39.41615
Pseudoeurycea robertsi Caudata CR Ground-dwelling 19.615331 34.63337 30.52731 39.19204
Pseudoeurycea robertsi Caudata CR Ground-dwelling 18.329823 34.47796 30.33527 38.99367
Pseudoeurycea robertsi Caudata CR Ground-dwelling 22.683425 35.00428 30.85306 39.47471
Pseudoeurycea longicauda Caudata EN Ground-dwelling 23.486257 35.07007 30.58291 39.39425
Pseudoeurycea longicauda Caudata EN Ground-dwelling 22.554332 34.95845 30.43786 39.21993
Pseudoeurycea longicauda Caudata EN Ground-dwelling 25.561227 35.31860 30.72132 39.53769
Pseudoeurycea tenchalli Caudata CR Ground-dwelling 25.149511 35.25967 30.81880 39.42530
Pseudoeurycea tenchalli Caudata CR Ground-dwelling 24.010788 35.12420 30.77142 39.39358
Pseudoeurycea tenchalli Caudata CR Ground-dwelling 27.212280 35.50507 30.84841 39.63001
Pseudoeurycea cochranae Caudata VU Ground-dwelling 24.991356 35.28454 30.75466 39.35541
Pseudoeurycea cochranae Caudata VU Ground-dwelling 23.789311 35.13926 30.68776 39.20439
Pseudoeurycea cochranae Caudata VU Ground-dwelling 27.204941 35.55206 31.37432 40.16663
Pseudoeurycea gadovii Caudata VU Ground-dwelling 22.413670 34.89100 30.69428 39.55121
Pseudoeurycea gadovii Caudata VU Ground-dwelling 21.104264 34.73587 30.56290 39.38931
Pseudoeurycea gadovii Caudata VU Ground-dwelling 24.985766 35.19573 31.14395 40.04636
Pseudoeurycea melanomolga Caudata EN Ground-dwelling 21.030433 34.74899 30.01318 38.82508
Pseudoeurycea melanomolga Caudata EN Ground-dwelling 19.480693 34.56163 30.28738 39.15724
Pseudoeurycea melanomolga Caudata EN Ground-dwelling 24.144250 35.12544 30.29650 39.22563
Pseudoeurycea amuzga Caudata EN Ground-dwelling 25.300025 35.23242 30.72480 39.55947
Pseudoeurycea amuzga Caudata EN Ground-dwelling 24.408169 35.12381 30.93003 39.78421
Pseudoeurycea amuzga Caudata EN Ground-dwelling 27.074161 35.44848 30.94573 39.86164
Pseudoeurycea aquatica Caudata CR Aquatic 22.187059 35.03636 31.08905 39.59817
Pseudoeurycea aquatica Caudata CR Aquatic 20.787577 34.86895 30.84180 39.27383
Pseudoeurycea aquatica Caudata CR Aquatic 25.070986 35.38136 31.24002 39.83497
Pseudoeurycea aurantia Caudata CR Ground-dwelling 22.187059 34.98883 30.37413 39.01849
Pseudoeurycea aurantia Caudata CR Ground-dwelling 20.787577 34.82269 30.18557 38.75336
Pseudoeurycea aurantia Caudata CR Ground-dwelling 25.070986 35.33120 31.14050 39.86077
Pseudoeurycea juarezi Caudata EN Ground-dwelling 24.589991 35.26643 30.93494 39.85432
Pseudoeurycea juarezi Caudata EN Ground-dwelling 23.425321 35.12773 30.83240 39.68232
Pseudoeurycea juarezi Caudata EN Ground-dwelling 27.093143 35.56452 31.13919 40.15964
Pseudoeurycea saltator Caudata CR Arboreal 22.187059 34.83657 30.20544 38.72297
Pseudoeurycea saltator Caudata CR Arboreal 20.787577 34.66655 30.08073 38.54307
Pseudoeurycea saltator Caudata CR Arboreal 25.070986 35.18694 30.49886 39.24434
Pseudoeurycea ruficauda Caudata EN Arboreal 24.443279 34.98897 30.83099 39.10497
Pseudoeurycea ruficauda Caudata EN Arboreal 23.278941 34.85182 30.60067 38.88921
Pseudoeurycea ruficauda Caudata EN Arboreal 26.911302 35.27968 31.02535 39.44806
Pseudoeurycea goebeli Caudata CR Ground-dwelling 26.803492 35.49715 30.87457 39.77967
Pseudoeurycea goebeli Caudata CR Ground-dwelling 26.173613 35.42112 30.76497 39.67587
Pseudoeurycea goebeli Caudata CR Ground-dwelling 28.607938 35.71498 30.86611 39.83378
Pseudoeurycea rex Caudata VU Ground-dwelling 24.633966 35.19680 30.64885 39.65976
Pseudoeurycea rex Caudata VU Ground-dwelling 23.618004 35.07482 30.54144 39.47437
Pseudoeurycea rex Caudata VU Ground-dwelling 26.880464 35.46652 30.80295 39.95842
Pseudoeurycea conanti Caudata EN Ground-dwelling 24.514372 35.10069 30.67014 39.27929
Pseudoeurycea conanti Caudata EN Ground-dwelling 23.204283 34.94347 30.63494 39.13107
Pseudoeurycea conanti Caudata EN Ground-dwelling 26.765556 35.37085 30.89782 39.57504
Pseudoeurycea mystax Caudata EN Ground-dwelling 24.774182 35.13277 30.61550 39.17705
Pseudoeurycea mystax Caudata EN Ground-dwelling 23.563962 34.98902 30.50548 38.98796
Pseudoeurycea mystax Caudata EN Ground-dwelling 27.143550 35.41421 31.02129 39.68189
Pseudoeurycea obesa Caudata CR Ground-dwelling 26.699499 35.41104 30.82699 39.60662
Pseudoeurycea obesa Caudata CR Ground-dwelling 25.770306 35.29762 31.00757 39.71805
Pseudoeurycea obesa Caudata CR Ground-dwelling 28.751617 35.66153 30.92813 39.77166
Pseudoeurycea werleri Caudata EN Ground-dwelling 25.379722 35.31005 31.46567 39.93294
Pseudoeurycea werleri Caudata EN Ground-dwelling 24.254452 35.17430 31.00865 39.44184
Pseudoeurycea werleri Caudata EN Ground-dwelling 27.728353 35.59339 31.52641 40.03590
Pseudoeurycea firscheini Caudata EN Ground-dwelling 24.719872 35.11201 30.79013 39.54507
Pseudoeurycea firscheini Caudata EN Ground-dwelling 23.551785 34.97260 30.37604 39.12896
Pseudoeurycea firscheini Caudata EN Ground-dwelling 26.791345 35.35923 30.90839 39.69837
Pseudoeurycea leprosa Caudata LC Ground-dwelling 22.966849 34.96653 30.89106 39.83682
Pseudoeurycea leprosa Caudata LC Ground-dwelling 21.786564 34.82630 30.71161 39.60840
Pseudoeurycea leprosa Caudata LC Ground-dwelling 25.391282 35.25456 30.74970 39.78640
Pseudoeurycea nigromaculata Caudata EN Arboreal 25.625820 35.17494 30.23345 39.09463
Pseudoeurycea nigromaculata Caudata EN Arboreal 24.758384 35.07048 30.22338 38.98426
Pseudoeurycea nigromaculata Caudata EN Arboreal 27.499985 35.40062 30.36487 39.33782
Pseudoeurycea lynchi Caudata EN Ground-dwelling 24.055532 35.15398 30.56550 39.41000
Pseudoeurycea lynchi Caudata EN Ground-dwelling 23.063302 35.03238 30.45743 39.29298
Pseudoeurycea lynchi Caudata EN Ground-dwelling 26.448747 35.44728 30.84216 39.79659
Pseudoeurycea lineola Caudata EN Ground-dwelling 24.476973 35.21468 31.22094 39.74932
Pseudoeurycea lineola Caudata EN Ground-dwelling 23.438962 35.09093 31.10031 39.63225
Pseudoeurycea lineola Caudata EN Ground-dwelling 26.661051 35.47506 31.31181 39.94144
Pseudoeurycea mixcoatl Caudata CR Ground-dwelling 25.149511 35.25062 30.57227 39.72639
Pseudoeurycea mixcoatl Caudata CR Ground-dwelling 24.010788 35.11380 30.45492 39.54899
Pseudoeurycea mixcoatl Caudata CR Ground-dwelling 27.212280 35.49846 30.55978 39.86192
Pseudoeurycea mixteca Caudata VU Ground-dwelling 24.224858 35.15984 30.59981 39.63252
Pseudoeurycea mixteca Caudata VU Ground-dwelling 22.972593 35.01163 30.61413 39.56327
Pseudoeurycea mixteca Caudata VU Ground-dwelling 26.439691 35.42196 30.76967 39.90744
Pseudoeurycea orchileucos Caudata EN Ground-dwelling 22.187059 34.97597 30.83480 39.08133
Pseudoeurycea orchileucos Caudata EN Ground-dwelling 20.787577 34.80449 30.68949 38.90969
Pseudoeurycea orchileucos Caudata EN Ground-dwelling 25.070986 35.32935 30.98558 39.46140
Pseudoeurycea orchimelas Caudata EN Ground-dwelling 26.976054 35.46618 31.29224 39.62897
Pseudoeurycea orchimelas Caudata EN Ground-dwelling 25.987890 35.34792 31.21118 39.50528
Pseudoeurycea orchimelas Caudata EN Ground-dwelling 29.057037 35.71522 31.47850 40.05363
Pseudoeurycea papenfussi Caudata EN Ground-dwelling 22.187059 34.87952 30.51918 38.83367
Pseudoeurycea papenfussi Caudata EN Ground-dwelling 20.787577 34.70873 30.60218 38.83949
Pseudoeurycea papenfussi Caudata EN Ground-dwelling 25.070986 35.23149 30.83784 39.19086
Pseudoeurycea smithi Caudata CR Ground-dwelling 22.187059 34.83949 30.59216 39.07690
Pseudoeurycea smithi Caudata CR Ground-dwelling 20.787577 34.67215 30.38878 38.80339
Pseudoeurycea smithi Caudata CR Ground-dwelling 25.070986 35.18433 30.91421 39.49563
Pseudoeurycea tlahcuiloh Caudata CR Ground-dwelling 24.137970 35.14986 30.72557 39.23862
Pseudoeurycea tlahcuiloh Caudata CR Ground-dwelling 23.061969 35.02065 30.66427 39.10573
Pseudoeurycea tlahcuiloh Caudata CR Ground-dwelling 25.815825 35.35133 31.12756 39.74576
Pseudoeurycea tlilicxitl Caudata EN Ground-dwelling 20.553017 34.72330 29.80561 38.65428
Pseudoeurycea tlilicxitl Caudata EN Ground-dwelling 19.305069 34.56990 29.70782 38.51696
Pseudoeurycea tlilicxitl Caudata EN Ground-dwelling 23.352564 35.06742 30.18787 39.09370
Bradytriton silus Caudata EN Ground-dwelling 25.133942 35.21329 30.49709 39.39136
Bradytriton silus Caudata EN Ground-dwelling 23.951557 35.06842 30.50377 39.37957
Bradytriton silus Caudata EN Ground-dwelling 27.288650 35.47729 30.66454 39.68695
Oedipina alfaroi Caudata VU Ground-dwelling 24.131713 35.02411 30.88905 39.22035
Oedipina alfaroi Caudata VU Ground-dwelling 23.339747 34.92699 30.86997 39.14655
Oedipina alfaroi Caudata VU Ground-dwelling 25.465173 35.18763 31.09974 39.46698
Oedipina alleni Caudata LC Ground-dwelling 24.812458 35.11638 30.65251 38.95522
Oedipina alleni Caudata LC Ground-dwelling 24.080462 35.02944 30.78256 39.02653
Oedipina alleni Caudata LC Ground-dwelling 26.063102 35.26493 30.87298 39.24241
Oedipina savagei Caudata VU Ground-dwelling 25.400711 35.18010 30.95917 39.60720
Oedipina savagei Caudata VU Ground-dwelling 24.702420 35.09620 30.87973 39.51543
Oedipina savagei Caudata VU Ground-dwelling 26.627661 35.32752 31.06114 39.76933
Oedipina altura Caudata DD Ground-dwelling 17.078254 34.19768 29.93437 38.31924
Oedipina altura Caudata DD Ground-dwelling 15.980470 34.06743 29.85039 38.28725
Oedipina altura Caudata DD Ground-dwelling 18.397641 34.35422 30.12565 38.49205
Oedipina carablanca Caudata EN Ground-dwelling 27.563161 35.52715 31.39525 39.70687
Oedipina carablanca Caudata EN Ground-dwelling 26.848520 35.44030 31.31670 39.61008
Oedipina carablanca Caudata EN Ground-dwelling 29.111976 35.71536 31.54356 40.00489
Oedipina elongata Caudata LC Ground-dwelling 26.747678 35.32669 31.12628 39.79818
Oedipina elongata Caudata LC Ground-dwelling 25.913884 35.22669 30.91937 39.53451
Oedipina elongata Caudata LC Ground-dwelling 28.351710 35.51907 31.21410 40.01728
Oedipina collaris Caudata DD Ground-dwelling 24.954444 35.08892 30.54317 38.93402
Oedipina collaris Caudata DD Ground-dwelling 24.240736 35.00424 30.44976 38.81741
Oedipina collaris Caudata DD Ground-dwelling 26.102308 35.22510 30.49099 38.92414
Oedipina complex Caudata LC Ground-dwelling 25.648593 35.23746 31.09555 39.85717
Oedipina complex Caudata LC Ground-dwelling 24.908303 35.14743 30.46180 39.18669
Oedipina complex Caudata LC Ground-dwelling 27.038724 35.40653 31.15403 39.99686
Oedipina maritima Caudata CR Ground-dwelling 28.074263 35.56530 30.91791 39.91747
Oedipina maritima Caudata CR Ground-dwelling 27.498756 35.49655 30.79890 39.73878
Oedipina maritima Caudata CR Ground-dwelling 29.176158 35.69693 31.08507 40.13868
Oedipina parvipes Caudata LC Ground-dwelling 26.800096 35.37376 31.08396 40.23188
Oedipina parvipes Caudata LC Ground-dwelling 26.168207 35.29983 31.08185 40.23542
Oedipina parvipes Caudata LC Ground-dwelling 28.045564 35.51948 31.20505 40.37220
Oedipina cyclocauda Caudata NT Ground-dwelling 25.548408 35.25634 31.01673 39.29143
Oedipina cyclocauda Caudata NT Ground-dwelling 24.810554 35.16763 30.86075 39.12149
Oedipina cyclocauda Caudata NT Ground-dwelling 26.869200 35.41513 31.07392 39.40697
Oedipina pseudouniformis Caudata DD Ground-dwelling 22.320708 34.89581 30.75409 39.00275
Oedipina pseudouniformis Caudata DD Ground-dwelling 21.414495 34.78542 30.62830 38.81281
Oedipina pseudouniformis Caudata DD Ground-dwelling 23.754809 35.07050 30.90806 39.18876
Oedipina gephyra Caudata CR Ground-dwelling 26.003759 35.28816 31.04723 39.63134
Oedipina gephyra Caudata CR Ground-dwelling 25.251289 35.19870 30.97657 39.51535
Oedipina gephyra Caudata CR Ground-dwelling 27.401517 35.45432 31.09844 39.77004
Oedipina tomasi Caudata CR Ground-dwelling 25.174190 35.14749 30.75543 39.37824
Oedipina tomasi Caudata CR Ground-dwelling 24.673669 35.08737 30.76029 39.38712
Oedipina tomasi Caudata CR Ground-dwelling 26.575538 35.31581 31.01597 39.65095
Oedipina gracilis Caudata EN Ground-dwelling 24.957708 35.15847 30.69288 38.97085
Oedipina gracilis Caudata EN Ground-dwelling 24.191000 35.06629 30.63786 38.88792
Oedipina gracilis Caudata EN Ground-dwelling 26.352285 35.32613 30.88301 39.36875
Oedipina pacificensis Caudata LC Fossorial 24.812458 36.04030 31.76270 40.42771
Oedipina pacificensis Caudata LC Fossorial 24.080462 35.95059 31.69703 40.35751
Oedipina pacificensis Caudata LC Fossorial 26.063102 36.19357 31.98851 40.68339
Oedipina uniformis Caudata LC Ground-dwelling 26.054620 35.19454 31.11749 39.14785
Oedipina uniformis Caudata LC Ground-dwelling 25.378578 35.11488 31.04175 39.08452
Oedipina uniformis Caudata LC Ground-dwelling 27.394190 35.35238 31.21160 39.27057
Oedipina grandis Caudata EN Fossorial 27.911209 36.53240 32.02413 41.08911
Oedipina grandis Caudata EN Fossorial 27.288770 36.45684 32.00200 41.02573
Oedipina grandis Caudata EN Fossorial 28.936857 36.65690 32.09534 41.18815
Oedipina poelzi Caudata EN Ground-dwelling 24.935585 35.21318 30.82379 39.52368
Oedipina poelzi Caudata EN Ground-dwelling 24.126823 35.11595 30.98165 39.66791
Oedipina poelzi Caudata EN Ground-dwelling 26.453459 35.39565 30.93882 39.66728
Oedipina ignea Caudata EN Ground-dwelling 25.615545 35.27012 30.92005 39.58623
Oedipina ignea Caudata EN Ground-dwelling 24.554433 35.14063 30.90862 39.52601
Oedipina ignea Caudata EN Ground-dwelling 27.766650 35.53261 31.54408 40.30729
Oedipina paucidentata Caudata DD Ground-dwelling 17.078254 34.26286 29.81957 37.89246
Oedipina paucidentata Caudata DD Ground-dwelling 15.980470 34.13126 29.89976 38.03413
Oedipina paucidentata Caudata DD Ground-dwelling 18.397641 34.42103 30.16357 38.27298
Oedipina stenopodia Caudata EN Ground-dwelling 26.803492 35.41333 31.33847 39.77189
Oedipina stenopodia Caudata EN Ground-dwelling 26.173613 35.33534 31.27353 39.68699
Oedipina stenopodia Caudata EN Ground-dwelling 28.607938 35.63676 31.21463 39.67180
Oedipina taylori Caudata EN Ground-dwelling 27.403781 35.40730 31.44584 39.84225
Oedipina taylori Caudata EN Ground-dwelling 26.680869 35.32110 31.35850 39.76967
Oedipina taylori Caudata EN Ground-dwelling 29.231942 35.62529 31.66606 40.07151
Nototriton abscondens Caudata LC Ground-dwelling 24.935585 35.21677 30.91653 39.16317
Nototriton abscondens Caudata LC Ground-dwelling 24.126823 35.11953 30.79951 39.03155
Nototriton abscondens Caudata LC Ground-dwelling 26.453459 35.39928 30.95411 39.37607
Nototriton gamezi Caudata LC Ground-dwelling 27.435694 35.50320 31.14383 39.48458
Nototriton gamezi Caudata LC Ground-dwelling 26.744760 35.42052 31.09451 39.39504
Nototriton gamezi Caudata LC Ground-dwelling 29.013624 35.69201 31.25204 39.67412
Nototriton picadoi Caudata LC Ground-dwelling 24.102216 35.09437 31.16732 39.62626
Nototriton picadoi Caudata LC Ground-dwelling 23.254177 34.99195 30.80858 39.19978
Nototriton picadoi Caudata LC Ground-dwelling 25.600071 35.27528 31.38285 39.86616
Nototriton guanacaste Caudata LC Ground-dwelling 26.434550 35.34958 31.44165 39.81764
Nototriton guanacaste Caudata LC Ground-dwelling 25.923240 35.28934 31.30420 39.63927
Nototriton guanacaste Caudata LC Ground-dwelling 27.889612 35.52100 31.60876 40.01070
Nototriton saslaya Caudata CR Ground-dwelling 26.701304 35.40229 30.89597 39.51179
Nototriton saslaya Caudata CR Ground-dwelling 25.767451 35.29109 30.76647 39.35218
Nototriton saslaya Caudata CR Ground-dwelling 28.472922 35.61326 30.94255 39.65444
Nototriton barbouri Caudata EN Ground-dwelling 26.003759 35.41049 30.57404 39.18262
Nototriton barbouri Caudata EN Ground-dwelling 25.251289 35.31889 30.48947 39.05792
Nototriton barbouri Caudata EN Ground-dwelling 27.401517 35.58064 30.75732 39.50405
Nototriton brodiei Caudata EN Ground-dwelling 25.174190 35.25709 30.80968 39.34890
Nototriton brodiei Caudata EN Ground-dwelling 24.673669 35.19740 30.74649 39.28398
Nototriton brodiei Caudata EN Ground-dwelling 26.575538 35.42419 30.87427 39.43708
Nototriton stuarti Caudata CR Ground-dwelling 25.174190 35.32483 31.59102 39.94256
Nototriton stuarti Caudata CR Ground-dwelling 24.673669 35.26447 31.53616 39.87749
Nototriton stuarti Caudata CR Ground-dwelling 26.575538 35.49384 31.83944 40.34208
Nototriton limnospectator Caudata EN Ground-dwelling 24.874925 35.18750 30.95235 39.64100
Nototriton limnospectator Caudata EN Ground-dwelling 23.714409 35.04904 30.80020 39.47147
Nototriton limnospectator Caudata EN Ground-dwelling 27.187387 35.46339 31.08439 39.85907
Nototriton lignicola Caudata EN Ground-dwelling 25.408311 35.26468 30.99877 39.49669
Nototriton lignicola Caudata EN Ground-dwelling 24.595427 35.16722 30.99740 39.44017
Nototriton lignicola Caudata EN Ground-dwelling 27.034655 35.45967 30.99148 39.62265
Nototriton major Caudata EN Ground-dwelling 17.078254 34.26313 29.90175 38.31570
Nototriton major Caudata EN Ground-dwelling 15.980470 34.13046 29.97559 38.37209
Nototriton major Caudata EN Ground-dwelling 18.397641 34.42259 29.97594 38.46382
Nototriton richardi Caudata LC Ground-dwelling 27.499428 35.48252 31.50925 39.83374
Nototriton richardi Caudata LC Ground-dwelling 26.796640 35.39946 31.45134 39.76652
Nototriton richardi Caudata LC Ground-dwelling 29.062800 35.66727 31.25656 39.65275
Nototriton tapanti Caudata LC Ground-dwelling 22.320708 34.85496 31.19654 39.52787
Nototriton tapanti Caudata LC Ground-dwelling 21.414495 34.74662 31.07065 39.34644
Nototriton tapanti Caudata LC Ground-dwelling 23.754809 35.02641 31.26543 39.65787
Dendrotriton bromeliacius Caudata CR Arboreal 24.519544 34.98821 30.72702 39.45293
Dendrotriton bromeliacius Caudata CR Arboreal 23.559542 34.87252 30.46506 39.15991
Dendrotriton bromeliacius Caudata CR Arboreal 26.706480 35.25177 30.85248 39.71146
Dendrotriton megarhinus Caudata VU Arboreal 26.988391 35.31345 30.86001 39.43195
Dendrotriton megarhinus Caudata VU Arboreal 26.008286 35.19440 30.87397 39.40978
Dendrotriton megarhinus Caudata VU Arboreal 29.015985 35.55972 31.02020 39.78407
Dendrotriton xolocalcae Caudata VU Arboreal 24.862809 35.02580 30.68418 39.10196
Dendrotriton xolocalcae Caudata VU Arboreal 23.734928 34.88692 30.39449 38.79599
Dendrotriton xolocalcae Caudata VU Arboreal 27.228431 35.31708 30.97977 39.48723
Dendrotriton sanctibarbarus Caudata CR Arboreal 25.840884 35.17701 30.90036 39.54325
Dendrotriton sanctibarbarus Caudata CR Arboreal 24.717977 35.04157 30.84604 39.34009
Dendrotriton sanctibarbarus Caudata CR Arboreal 28.038361 35.44204 31.66823 40.36774
Dendrotriton chujorum Caudata CR Arboreal 22.235597 34.74006 30.82170 39.20634
Dendrotriton chujorum Caudata CR Arboreal 20.945471 34.58181 30.68202 38.96773
Dendrotriton chujorum Caudata CR Arboreal 24.805021 35.05522 31.03836 39.62176
Dendrotriton cuchumatanus Caudata CR Arboreal 22.235597 34.68750 30.46039 39.32745
Dendrotriton cuchumatanus Caudata CR Arboreal 20.945471 34.53046 30.21538 39.11171
Dendrotriton cuchumatanus Caudata CR Arboreal 24.805021 35.00026 30.77303 39.62566
Dendrotriton kekchiorum Caudata CR Arboreal 24.942963 35.04176 30.61595 39.23663
Dendrotriton kekchiorum Caudata CR Arboreal 23.795138 34.90349 30.41507 38.97447
Dendrotriton kekchiorum Caudata CR Arboreal 27.309028 35.32677 31.09267 39.77595
Dendrotriton rabbi Caudata CR Arboreal 22.235597 34.72239 30.85500 39.26511
Dendrotriton rabbi Caudata CR Arboreal 20.945471 34.56598 30.74043 39.18460
Dendrotriton rabbi Caudata CR Arboreal 24.805021 35.03390 31.08435 39.67521
Nyctanolis pernix Caudata VU Ground-dwelling 24.642523 35.11718 31.07225 38.98787
Nyctanolis pernix Caudata VU Ground-dwelling 23.462785 34.97327 31.03959 38.93836
Nyctanolis pernix Caudata VU Ground-dwelling 26.942640 35.39776 31.31133 39.39023
Chiropterotriton arboreus Caudata CR Arboreal 22.077838 34.20437 31.01687 37.46926
Chiropterotriton arboreus Caudata CR Arboreal 21.016877 34.07568 30.79862 37.16940
Chiropterotriton arboreus Caudata CR Arboreal 24.274752 34.47083 31.34086 37.81038
Chiropterotriton cracens Caudata VU Arboreal 23.698697 34.31879 31.85928 37.02972
Chiropterotriton cracens Caudata VU Arboreal 22.747751 34.20092 31.76443 36.84915
Chiropterotriton cracens Caudata VU Arboreal 25.180769 34.50249 31.80905 37.06620
Chiropterotriton terrestris Caudata CR Ground-dwelling 22.077838 34.46538 30.99449 37.49638
Chiropterotriton terrestris Caudata CR Ground-dwelling 21.016877 34.33439 30.85948 37.32183
Chiropterotriton terrestris Caudata CR Ground-dwelling 24.274752 34.73661 31.22037 37.83317
Chiropterotriton priscus Caudata NT Ground-dwelling 23.288691 34.72451 31.24491 38.07281
Chiropterotriton priscus Caudata NT Ground-dwelling 22.231798 34.59406 31.15509 37.92531
Chiropterotriton priscus Caudata NT Ground-dwelling 25.328582 34.97631 31.43337 38.35021
Chiropterotriton chiropterus Caudata CR Arboreal 23.244262 34.50282 30.62522 38.14049
Chiropterotriton chiropterus Caudata CR Arboreal 22.216878 34.37541 30.77501 38.29074
Chiropterotriton chiropterus Caudata CR Arboreal 25.550622 34.78884 30.64386 38.33335
Chiropterotriton chondrostega Caudata EN Ground-dwelling 22.550090 34.57342 31.05395 38.08330
Chiropterotriton chondrostega Caudata EN Ground-dwelling 21.502083 34.44641 30.95623 37.94136
Chiropterotriton chondrostega Caudata EN Ground-dwelling 24.904622 34.85879 31.35002 38.53009
Chiropterotriton magnipes Caudata EN Ground-dwelling 24.474273 34.76564 30.97572 38.22472
Chiropterotriton magnipes Caudata EN Ground-dwelling 23.571806 34.65677 30.86763 38.10652
Chiropterotriton magnipes Caudata EN Ground-dwelling 26.257997 34.98082 31.10828 38.44870
Chiropterotriton dimidiatus Caudata VU Ground-dwelling 22.077838 34.65508 30.90632 38.44427
Chiropterotriton dimidiatus Caudata VU Ground-dwelling 21.016877 34.52699 30.91520 38.42708
Chiropterotriton dimidiatus Caudata VU Ground-dwelling 24.274752 34.92030 31.03914 38.68415
Chiropterotriton orculus Caudata VU Ground-dwelling 22.199797 34.57509 31.10511 38.53873
Chiropterotriton orculus Caudata VU Ground-dwelling 20.990831 34.43141 30.97357 38.38861
Chiropterotriton orculus Caudata VU Ground-dwelling 24.695382 34.87168 31.29802 38.85910
Chiropterotriton lavae Caudata CR Arboreal 23.244262 34.59643 30.50407 37.74519
Chiropterotriton lavae Caudata CR Arboreal 22.216878 34.47380 30.43532 37.65727
Chiropterotriton lavae Caudata CR Arboreal 25.550622 34.87172 31.30673 38.60904
Cryptotriton alvarezdeltoroi Caudata EN Ground-dwelling 27.695251 35.39757 31.14504 39.29474
Cryptotriton alvarezdeltoroi Caudata EN Ground-dwelling 26.712363 35.27866 31.08062 39.18802
Cryptotriton alvarezdeltoroi Caudata EN Ground-dwelling 29.467457 35.61196 31.48867 39.71989
Cryptotriton monzoni Caudata CR Arboreal 27.096784 35.13247 31.04201 39.19878
Cryptotriton monzoni Caudata CR Arboreal 26.234483 35.02879 30.94709 39.04795
Cryptotriton monzoni Caudata CR Arboreal 28.925176 35.35230 30.89847 39.16676
Cryptotriton nasalis Caudata EN Arboreal 25.174190 34.85629 30.65542 38.87314
Cryptotriton nasalis Caudata EN Arboreal 24.673669 34.79531 30.59103 38.76717
Cryptotriton nasalis Caudata EN Arboreal 26.575538 35.02704 30.83569 39.17099
Cryptotriton sierraminensis Caudata CR Arboreal 26.481996 35.14281 31.32636 39.33309
Cryptotriton sierraminensis Caudata CR Arboreal 25.605134 35.03727 31.11031 39.11746
Cryptotriton sierraminensis Caudata CR Arboreal 28.318240 35.36383 31.38469 39.59300
Cryptotriton veraepacis Caudata CR Arboreal 24.942963 34.88728 31.02030 38.90510
Cryptotriton veraepacis Caudata CR Arboreal 23.795138 34.74815 30.85757 38.66062
Cryptotriton veraepacis Caudata CR Arboreal 27.309028 35.17406 31.09860 39.14649
Thorius adelos Caudata NT Arboreal 22.187059 34.58717 30.58465 38.98240
Thorius adelos Caudata NT Arboreal 20.787577 34.42169 30.40880 38.78879
Thorius adelos Caudata NT Arboreal 25.070986 34.92818 30.84952 39.28171
Thorius arboreus Caudata CR Arboreal 22.187059 34.60860 30.70423 38.84761
Thorius arboreus Caudata CR Arboreal 20.787577 34.43614 30.24366 38.37761
Thorius arboreus Caudata CR Arboreal 25.070986 34.96400 31.00298 39.13299
Thorius macdougalli Caudata EN Ground-dwelling 22.187059 34.70274 30.41431 38.69112
Thorius macdougalli Caudata EN Ground-dwelling 20.787577 34.53098 30.29199 38.52984
Thorius macdougalli Caudata EN Ground-dwelling 25.070986 35.05668 30.81350 39.27175
Thorius aureus Caudata CR Ground-dwelling 22.187059 34.82912 30.90350 38.88064
Thorius aureus Caudata CR Ground-dwelling 20.787577 34.65880 30.37956 38.32547
Thorius aureus Caudata CR Ground-dwelling 25.070986 35.18009 31.32051 39.40600
Thorius boreas Caudata EN Ground-dwelling 22.187059 34.79861 30.45309 38.67966
Thorius boreas Caudata EN Ground-dwelling 20.787577 34.62768 30.28322 38.52838
Thorius boreas Caudata EN Ground-dwelling 25.070986 35.15086 30.67647 39.11949
Thorius grandis Caudata CR Ground-dwelling 24.137970 35.00942 30.71961 38.86272
Thorius grandis Caudata CR Ground-dwelling 23.061969 34.88124 30.65556 38.74416
Thorius grandis Caudata CR Ground-dwelling 25.815825 35.20928 30.87380 39.11064
Thorius omiltemi Caudata EN Ground-dwelling 25.149511 35.17733 30.74769 39.11412
Thorius omiltemi Caudata EN Ground-dwelling 24.010788 35.04070 30.85527 39.20625
Thorius omiltemi Caudata EN Ground-dwelling 27.212280 35.42484 31.03341 39.44244
Thorius pulmonaris Caudata CR Ground-dwelling 22.187059 34.78136 30.55252 38.70845
Thorius pulmonaris Caudata CR Ground-dwelling 20.787577 34.61263 30.39386 38.52633
Thorius pulmonaris Caudata CR Ground-dwelling 25.070986 35.12907 30.75196 39.04075
Thorius minutissimus Caudata CR Ground-dwelling 27.361306 35.38407 31.04392 39.78330
Thorius minutissimus Caudata CR Ground-dwelling 26.340347 35.26072 30.57681 39.26327
Thorius minutissimus Caudata CR Ground-dwelling 29.216114 35.60816 30.70565 39.54737
Thorius narisovalis Caudata EN Ground-dwelling 23.738601 34.94286 30.67390 38.98176
Thorius narisovalis Caudata EN Ground-dwelling 22.398714 34.78313 30.60922 38.85234
Thorius narisovalis Caudata EN Ground-dwelling 26.200700 35.23637 30.82909 39.33164
Thorius papaloae Caudata CR Ground-dwelling 22.187059 34.86285 31.18167 38.86476
Thorius papaloae Caudata CR Ground-dwelling 20.787577 34.69437 30.99891 38.68802
Thorius papaloae Caudata CR Ground-dwelling 25.070986 35.21004 31.11057 38.89295
Thorius dubitus Caudata CR Ground-dwelling 24.719872 35.11888 30.44746 38.93436
Thorius dubitus Caudata CR Ground-dwelling 23.551785 34.97809 30.57560 38.98913
Thorius dubitus Caudata CR Ground-dwelling 26.791345 35.36855 30.72155 39.29531
Thorius troglodytes Caudata EN Fossorial 22.875152 35.83325 31.47806 39.78481
Thorius troglodytes Caudata EN Fossorial 21.516239 35.67088 31.34168 39.64189
Thorius troglodytes Caudata EN Fossorial 25.467797 36.14305 31.91119 40.36030
Thorius insperatus Caudata CR Ground-dwelling 22.187059 34.87339 30.72564 39.01049
Thorius insperatus Caudata CR Ground-dwelling 20.787577 34.70082 30.43959 38.71561
Thorius insperatus Caudata CR Ground-dwelling 25.070986 35.22903 30.77653 39.12583
Thorius minydemus Caudata EN Ground-dwelling 23.244262 34.93930 30.75076 38.84836
Thorius minydemus Caudata EN Ground-dwelling 22.216878 34.81164 30.64993 38.69949
Thorius minydemus Caudata EN Ground-dwelling 25.550622 35.22587 30.94268 39.14523
Thorius spilogaster Caudata CR Fossorial 24.719872 36.02264 31.49252 40.35067
Thorius spilogaster Caudata CR Fossorial 23.551785 35.88168 31.41644 40.19467
Thorius spilogaster Caudata CR Fossorial 26.791345 36.27261 31.73839 40.71803
Thorius pennatulus Caudata EN Ground-dwelling 24.476973 35.09819 31.00933 39.48960
Thorius pennatulus Caudata EN Ground-dwelling 23.438962 34.97078 30.91662 39.34239
Thorius pennatulus Caudata EN Ground-dwelling 26.661051 35.36628 30.99022 39.51685
Thorius smithi Caudata CR Ground-dwelling 22.187059 34.79895 31.04648 39.28336
Thorius smithi Caudata CR Ground-dwelling 20.787577 34.62894 30.88081 39.02792
Thorius smithi Caudata CR Ground-dwelling 25.070986 35.14930 31.04125 39.51790
Thorius infernalis Caudata CR Semi-aquatic 24.137970 35.25370 31.21227 39.44786
Thorius infernalis Caudata CR Semi-aquatic 23.061969 35.12384 30.76119 38.87722
Thorius infernalis Caudata CR Semi-aquatic 25.815825 35.45620 31.30200 39.57284
Thorius magnipes Caudata CR Arboreal 24.719872 34.93816 30.35709 38.86765
Thorius magnipes Caudata CR Arboreal 23.551785 34.79738 30.84544 39.27575
Thorius magnipes Caudata CR Arboreal 26.791345 35.18783 30.59397 39.14873
Thorius schmidti Caudata CR Ground-dwelling 24.719872 35.05188 31.18046 39.25238
Thorius schmidti Caudata CR Ground-dwelling 23.551785 34.91287 31.05702 39.13089
Thorius schmidti Caudata CR Ground-dwelling 26.791345 35.29842 31.22067 39.38598
Thorius narismagnus Caudata CR Fossorial 26.881155 36.32457 31.35000 40.12783
Thorius narismagnus Caudata CR Fossorial 25.933953 36.20923 31.79196 40.53939
Thorius narismagnus Caudata CR Fossorial 28.925281 36.57347 31.85861 40.68456
Thorius lunaris Caudata CR Ground-dwelling 24.719872 35.12869 30.83256 39.51765
Thorius lunaris Caudata CR Ground-dwelling 23.551785 34.98680 30.78447 39.45586
Thorius lunaris Caudata CR Ground-dwelling 26.791345 35.38031 30.36844 39.13842
Thorius munificus Caudata CR Ground-dwelling 21.030433 34.58208 30.76742 38.97898
Thorius munificus Caudata CR Ground-dwelling 19.480693 34.39888 30.50510 38.67117
Thorius munificus Caudata CR Ground-dwelling 24.144250 34.95017 30.80324 39.10017
Ascaphus montanus Anura LC Stream-dwelling 17.062328 31.46533 28.25988 34.54120
Ascaphus montanus Anura LC Stream-dwelling 14.311735 31.06348 28.08504 34.21491
Ascaphus montanus Anura LC Stream-dwelling 21.051179 32.04807 29.05547 35.60638
Leiopelma hochstetteri Anura LC Semi-aquatic 19.105510 34.80956 27.64607 41.56082
Leiopelma hochstetteri Anura LC Semi-aquatic 17.722214 34.61218 27.17095 41.13331
Leiopelma hochstetteri Anura LC Semi-aquatic 21.235573 35.11349 27.99423 41.78423
Leiopelma archeyi Anura CR Ground-dwelling 19.026968 34.50413 28.17334 41.83428
Leiopelma archeyi Anura CR Ground-dwelling 17.629798 34.30304 27.95315 41.53968
Leiopelma archeyi Anura CR Ground-dwelling 21.192988 34.81588 28.23054 41.87064
Leiopelma pakeka Anura VU Ground-dwelling 16.884389 34.22400 27.82927 41.04566
Leiopelma pakeka Anura VU Ground-dwelling 15.246833 33.99400 27.55254 40.83182
Leiopelma pakeka Anura VU Ground-dwelling 18.923271 34.51037 28.21378 41.39011
Leiopelma hamiltoni Anura VU Ground-dwelling 18.298231 34.41810 27.29126 40.63997
Leiopelma hamiltoni Anura VU Ground-dwelling 16.839979 34.21006 27.65434 41.00002
Leiopelma hamiltoni Anura VU Ground-dwelling 20.376600 34.71459 27.60100 40.88086
Barbourula kalimantanensis Anura EN Aquatic 29.096779 37.52719 31.37350 44.81816
Barbourula kalimantanensis Anura EN Aquatic 28.314058 37.41874 31.22543 44.64701
Barbourula kalimantanensis Anura EN Aquatic 30.599071 37.73533 31.51441 45.05557
Barbourula busuangensis Anura NT Aquatic 27.678080 37.48777 30.31451 43.64625
Barbourula busuangensis Anura NT Aquatic 27.245368 37.42698 30.23887 43.57427
Barbourula busuangensis Anura NT Aquatic 28.615860 37.61952 31.16081 44.43060
Bombina orientalis Anura LC Semi-aquatic 21.266223 36.70480 30.58136 43.89261
Bombina orientalis Anura LC Semi-aquatic 17.928969 36.23026 29.90425 43.33646
Bombina orientalis Anura LC Semi-aquatic 24.868130 37.21698 30.93959 44.06260
Bombina bombina Anura LC Aquatic 19.017954 36.23315 29.94178 43.36069
Bombina bombina Anura LC Aquatic 16.105965 35.82769 29.39129 42.74555
Bombina bombina Anura LC Aquatic 23.678600 36.88209 30.25738 43.77261
Bombina variegata Anura LC Aquatic 19.574345 36.35973 30.10326 43.10654
Bombina variegata Anura LC Aquatic 16.933640 35.98534 29.79792 42.78726
Bombina variegata Anura LC Aquatic 23.895101 36.97231 30.60286 43.59536
Bombina lichuanensis Anura VU Aquatic 23.811531 36.92876 29.98615 43.01811
Bombina lichuanensis Anura VU Aquatic 21.719264 36.63372 29.78367 42.71473
Bombina lichuanensis Anura VU Aquatic 26.049218 37.24431 30.30400 43.40775
Latonia nigriventer Anura CR Semi-aquatic 23.592772 37.24927 33.31598 41.26804
Latonia nigriventer Anura CR Semi-aquatic 22.339542 37.06381 33.11181 41.01841
Latonia nigriventer Anura CR Semi-aquatic 24.986566 37.45554 33.60725 41.65036
Discoglossus montalentii Anura NT Stream-dwelling 23.532117 36.42180 32.85295 40.28161
Discoglossus montalentii Anura NT Stream-dwelling 21.506855 36.12372 32.55367 39.92974
Discoglossus montalentii Anura NT Stream-dwelling 26.682481 36.88548 33.09994 40.65076
Discoglossus sardus Anura LC Semi-aquatic 23.754228 37.65683 34.67545 40.52804
Discoglossus sardus Anura LC Semi-aquatic 21.795436 37.36900 34.33021 40.08189
Discoglossus sardus Anura LC Semi-aquatic 26.787989 38.10262 35.03843 41.04384
Rhinophrynus dorsalis Anura LC Ground-dwelling 26.657065 37.09434 31.29274 44.35227
Rhinophrynus dorsalis Anura LC Ground-dwelling 25.846516 36.98244 30.08683 43.18503
Rhinophrynus dorsalis Anura LC Ground-dwelling 28.397323 37.33461 31.43758 44.57042
Hymenochirus boettgeri Anura LC Aquatic 27.291905 37.30618 30.90470 43.55382
Hymenochirus boettgeri Anura LC Aquatic 26.541996 37.20286 30.77892 43.46257
Hymenochirus boettgeri Anura LC Aquatic 28.937141 37.53285 31.12038 43.74915
Hymenochirus feae Anura DD Aquatic 27.779440 37.40973 31.47090 44.09663
Hymenochirus feae Anura DD Aquatic 26.971792 37.29577 31.33628 43.91904
Hymenochirus feae Anura DD Aquatic 29.489972 37.65111 31.38502 44.09098
Hymenochirus boulengeri Anura DD Aquatic 27.055135 37.39008 31.31778 44.23678
Hymenochirus boulengeri Anura DD Aquatic 26.262997 37.27689 31.18420 44.10051
Hymenochirus boulengeri Anura DD Aquatic 28.652846 37.61836 30.98833 44.08036
Hymenochirus curtipes Anura LC Semi-aquatic 27.885377 37.47325 31.00981 43.92310
Hymenochirus curtipes Anura LC Semi-aquatic 27.089994 37.36315 30.95132 43.85626
Hymenochirus curtipes Anura LC Semi-aquatic 29.607357 37.71162 31.13410 44.17434
Pseudhymenochirus merlini Anura LC Aquatic 27.235913 37.36118 30.92768 43.14958
Pseudhymenochirus merlini Anura LC Aquatic 26.443998 37.25020 30.69086 42.90001
Pseudhymenochirus merlini Anura LC Aquatic 28.973739 37.60471 31.16194 43.36102
Xenopus amieti Anura VU Aquatic 26.187407 36.76796 33.05908 40.80562
Xenopus amieti Anura VU Aquatic 25.516049 36.67420 32.90951 40.65675
Xenopus amieti Anura VU Aquatic 27.610767 36.96674 33.21614 40.96243
Xenopus longipes Anura CR Aquatic 25.529022 36.67830 33.17781 40.73974
Xenopus longipes Anura CR Aquatic 24.726769 36.56579 33.10673 40.62934
Xenopus longipes Anura CR Aquatic 27.197252 36.91227 32.90002 40.56185
Xenopus boumbaensis Anura NT Stream-dwelling 27.027331 36.15440 32.41940 40.42374
Xenopus boumbaensis Anura NT Stream-dwelling 26.316955 36.05270 32.29781 40.28084
Xenopus boumbaensis Anura NT Stream-dwelling 28.468720 36.36077 32.67714 40.71371
Xenopus itombwensis Anura EN Aquatic 24.143899 36.49185 32.67994 40.81105
Xenopus itombwensis Anura EN Aquatic 23.402584 36.38640 32.57233 40.66557
Xenopus itombwensis Anura EN Aquatic 26.105081 36.77084 32.95892 41.14697
Xenopus wittei Anura LC Aquatic 23.248631 36.27375 31.96381 39.83120
Xenopus wittei Anura LC Aquatic 22.596636 36.18265 31.82901 39.69550
Xenopus wittei Anura LC Aquatic 24.723337 36.47981 32.12221 40.07828
Xenopus andrei Anura LC Aquatic 26.969819 36.89462 32.56914 40.34685
Xenopus andrei Anura LC Aquatic 26.297591 36.79897 33.00160 40.74776
Xenopus andrei Anura LC Aquatic 28.463049 37.10710 33.13180 41.02756
Xenopus fraseri Anura DD Aquatic 28.084892 37.01870 33.50445 41.38011
Xenopus fraseri Anura DD Aquatic 27.400160 36.92268 33.46105 41.31800
Xenopus fraseri Anura DD Aquatic 29.688712 37.24360 33.73385 41.69611
Xenopus pygmaeus Anura LC Aquatic 27.354072 36.86515 32.84388 40.74234
Xenopus pygmaeus Anura LC Aquatic 26.595714 36.76172 32.75457 40.53558
Xenopus pygmaeus Anura LC Aquatic 28.981403 37.08707 32.86549 40.92179
Xenopus gilli Anura EN Ground-dwelling 20.397272 35.73431 32.27212 39.21170
Xenopus gilli Anura EN Ground-dwelling 19.105333 35.55239 31.99993 38.89809
Xenopus gilli Anura EN Ground-dwelling 22.950470 36.09384 32.50243 39.51552
Xenopus petersii Anura LC Aquatic 25.101104 36.59058 32.87613 39.70921
Xenopus petersii Anura LC Aquatic 24.059763 36.44433 33.32157 40.09693
Xenopus petersii Anura LC Aquatic 27.282153 36.89691 33.62857 40.59072
Xenopus victorianus Anura LC Aquatic 23.279228 36.34125 33.16511 39.24289
Xenopus victorianus Anura LC Aquatic 22.489742 36.22991 33.09624 39.13711
Xenopus victorianus Anura LC Aquatic 24.964321 36.57889 33.23039 39.47123
Xenopus lenduensis Anura CR Aquatic 25.415737 36.61522 32.94264 40.47341
Xenopus lenduensis Anura CR Aquatic 24.602350 36.50054 32.84658 40.35800
Xenopus lenduensis Anura CR Aquatic 27.056930 36.84660 33.15487 40.70757
Xenopus vestitus Anura LC Aquatic 22.981895 36.27369 32.85106 40.28876
Xenopus vestitus Anura LC Aquatic 22.354939 36.18569 32.68970 40.12436
Xenopus vestitus Anura LC Aquatic 24.383053 36.47035 32.87419 40.36030
Xenopus borealis Anura LC Aquatic 21.388931 36.20860 32.19988 40.37259
Xenopus borealis Anura LC Aquatic 20.546510 36.09171 31.94887 40.06479
Xenopus borealis Anura LC Aquatic 23.221793 36.46292 32.37355 40.55238
Xenopus clivii Anura LC Aquatic 22.298307 36.19571 32.01104 40.21163
Xenopus clivii Anura LC Aquatic 21.376220 36.06625 31.87898 40.03889
Xenopus clivii Anura LC Aquatic 24.071564 36.44468 32.08680 40.36561
Xenopus largeni Anura EN Aquatic 20.653207 36.03140 31.85667 40.41253
Xenopus largeni Anura EN Aquatic 19.714422 35.89881 31.65764 40.18632
Xenopus largeni Anura EN Aquatic 22.578642 36.30334 32.08657 40.74699
Xenopus ruwenzoriensis Anura DD Aquatic 24.029257 36.56623 31.86165 40.76228
Xenopus ruwenzoriensis Anura DD Aquatic 23.297012 36.46285 31.62216 40.54358
Xenopus ruwenzoriensis Anura DD Aquatic 25.800773 36.81636 32.18723 41.15898
Xenopus muelleri Anura LC Aquatic 23.988443 36.43874 31.65002 40.74583
Xenopus muelleri Anura LC Aquatic 22.980163 36.29965 31.49536 40.61962
Xenopus muelleri Anura LC Aquatic 26.026939 36.71995 31.99939 41.15546
Xenopus epitropicalis Anura LC Aquatic 27.250462 37.18557 32.54222 42.53644
Xenopus epitropicalis Anura LC Aquatic 26.483887 37.07785 32.37973 42.36874
Xenopus epitropicalis Anura LC Aquatic 28.961576 37.42600 32.61891 42.75241
Xenopus tropicalis Anura LC Aquatic 27.384725 37.18537 32.15880 42.57950
Xenopus tropicalis Anura LC Aquatic 26.663045 37.08307 31.56764 41.95676
Xenopus tropicalis Anura LC Aquatic 29.072581 37.42462 31.74428 42.24171
Pipa arrabali Anura LC Aquatic 27.574394 38.55685 33.29601 44.05685
Pipa arrabali Anura LC Aquatic 26.876212 38.46111 33.15898 43.90139
Pipa arrabali Anura LC Aquatic 29.107346 38.76704 33.49077 44.37102
Pipa myersi Anura EN Aquatic 27.812573 38.49912 33.01714 44.21386
Pipa myersi Anura EN Aquatic 27.084203 38.40033 32.95085 44.12368
Pipa myersi Anura EN Aquatic 29.356453 38.70854 32.97137 44.27329
Pipa parva Anura LC Aquatic 26.388054 38.35060 32.87627 44.11424
Pipa parva Anura LC Aquatic 25.587971 38.24237 32.71945 43.98089
Pipa parva Anura LC Aquatic 27.838960 38.54686 33.06451 44.35605
Pipa pipa Anura LC Aquatic 27.263623 38.50394 33.36100 44.17746
Pipa pipa Anura LC Aquatic 26.539509 38.40604 33.31227 44.05612
Pipa pipa Anura LC Aquatic 28.814614 38.71362 32.89152 43.94045
Pipa aspera Anura LC Aquatic 27.258508 38.54229 33.05140 44.18717
Pipa aspera Anura LC Aquatic 26.630980 38.45585 32.96881 44.08691
Pipa aspera Anura LC Aquatic 28.841925 38.76041 33.39792 44.51144
Pipa snethlageae Anura LC Aquatic 28.365067 38.64267 33.11478 44.21160
Pipa snethlageae Anura LC Aquatic 27.658188 38.54427 32.89038 43.96525
Pipa snethlageae Anura LC Aquatic 29.930306 38.86054 33.23662 44.31936
Scaphiopus hurterii Anura LC Fossorial 26.454918 36.47580 33.11839 39.53267
Scaphiopus hurterii Anura LC Fossorial 25.002000 36.25365 33.25583 39.58451
Scaphiopus hurterii Anura LC Fossorial 28.956377 36.85828 33.42033 40.08714
Spea multiplicata Anura LC Ground-dwelling 21.918075 36.39043 33.17791 40.73424
Spea multiplicata Anura LC Ground-dwelling 20.140203 36.13853 32.92622 40.37093
Spea multiplicata Anura LC Ground-dwelling 24.725882 36.78827 33.10431 40.77553
Spea bombifrons Anura LC Aquatic 21.264741 36.63334 33.16616 39.65340
Spea bombifrons Anura LC Aquatic 18.757039 36.27223 32.94172 39.32425
Spea bombifrons Anura LC Aquatic 24.742127 37.13408 33.57482 40.22991
Spea intermontana Anura LC Aquatic 17.185550 36.08541 32.38909 39.02539
Spea intermontana Anura LC Aquatic 14.958374 35.76385 32.55889 39.18244
Spea intermontana Anura LC Aquatic 20.662306 36.58737 32.97397 39.77011
Pelodytes caucasicus Anura NT Semi-aquatic 19.896328 36.10820 32.25005 40.11674
Pelodytes caucasicus Anura NT Semi-aquatic 17.136690 35.74621 32.02123 39.80663
Pelodytes caucasicus Anura NT Semi-aquatic 23.110526 36.52983 32.81607 40.78288
Oreolalax chuanbeiensis Anura EN Ground-dwelling 18.632878 36.49646 31.15309 41.90681
Oreolalax chuanbeiensis Anura EN Ground-dwelling 16.038714 36.14173 30.63922 41.40185
Oreolalax chuanbeiensis Anura EN Ground-dwelling 21.550110 36.89537 31.41170 42.20264
Oreolalax nanjiangensis Anura VU Stream-dwelling 20.105036 36.10220 30.40170 41.76015
Oreolalax nanjiangensis Anura VU Stream-dwelling 17.482836 35.74421 30.01218 41.39843
Oreolalax nanjiangensis Anura VU Stream-dwelling 23.243675 36.53069 31.11799 42.48824
Oreolalax omeimontis Anura EN Ground-dwelling 21.331557 36.82200 31.42803 42.18111
Oreolalax omeimontis Anura EN Ground-dwelling 19.542290 36.57587 31.30632 42.06231
Oreolalax omeimontis Anura EN Ground-dwelling 23.446248 37.11288 31.63436 42.36091
Oreolalax popei Anura LC Ground-dwelling 19.525253 36.63101 31.22316 42.35757
Oreolalax popei Anura LC Ground-dwelling 17.082496 36.29134 30.73305 41.83028
Oreolalax popei Anura LC Ground-dwelling 22.351348 37.02399 31.51403 42.63559
Oreolalax multipunctatus Anura EN Ground-dwelling 19.414441 36.58867 30.82165 41.81807
Oreolalax multipunctatus Anura EN Ground-dwelling 17.213646 36.28429 30.36213 41.34964
Oreolalax multipunctatus Anura EN Ground-dwelling 21.898695 36.93225 31.10388 42.18964
Oreolalax granulosus Anura NT Stream-dwelling 22.537233 36.36646 30.71619 41.64265
Oreolalax granulosus Anura NT Stream-dwelling 21.553350 36.23284 30.57354 41.46928
Oreolalax granulosus Anura NT Stream-dwelling 24.556818 36.64074 30.80726 41.74855
Oreolalax jingdongensis Anura VU Stream-dwelling 22.030846 36.39794 30.55269 41.63428
Oreolalax jingdongensis Anura VU Stream-dwelling 20.964411 36.25208 30.42599 41.47069
Oreolalax jingdongensis Anura VU Stream-dwelling 24.225222 36.69809 31.06380 42.20519
Oreolalax liangbeiensis Anura CR Ground-dwelling 20.706935 36.83599 31.27221 41.95369
Oreolalax liangbeiensis Anura CR Ground-dwelling 19.102920 36.61553 31.07375 41.75997
Oreolalax liangbeiensis Anura CR Ground-dwelling 22.692973 37.10894 31.30849 42.07546
Oreolalax major Anura LC Ground-dwelling 19.734979 36.71329 31.16762 42.19151
Oreolalax major Anura LC Ground-dwelling 17.486685 36.40519 30.91069 41.88517
Oreolalax major Anura LC Ground-dwelling 22.311030 37.06631 31.58142 42.63637
Oreolalax rugosus Anura LC Semi-aquatic 20.431982 36.99866 31.69328 42.66189
Oreolalax rugosus Anura LC Semi-aquatic 19.035803 36.80717 31.45299 42.42256
Oreolalax rugosus Anura LC Semi-aquatic 22.561326 37.29070 32.11927 43.05614
Oreolalax xiangchengensis Anura LC Stream-dwelling 16.232959 35.57579 29.96325 41.40720
Oreolalax xiangchengensis Anura LC Stream-dwelling 14.720009 35.37088 29.71869 41.08711
Oreolalax xiangchengensis Anura LC Stream-dwelling 18.494559 35.88210 29.83776 41.37780
Oreolalax puxiongensis Anura EN Semi-aquatic 20.706935 37.02354 30.82840 42.24289
Oreolalax puxiongensis Anura EN Semi-aquatic 19.102920 36.80526 30.59245 42.02339
Oreolalax puxiongensis Anura EN Semi-aquatic 22.692973 37.29381 30.98041 42.36475
Oreolalax lichuanensis Anura LC Ground-dwelling 25.304338 37.41380 32.09416 43.40181
Oreolalax lichuanensis Anura LC Ground-dwelling 23.234226 37.12732 31.46491 42.68094
Oreolalax lichuanensis Anura LC Ground-dwelling 27.846713 37.76564 32.46994 43.78755
Oreolalax pingii Anura EN Ground-dwelling 20.880198 36.82403 30.84241 41.68443
Oreolalax pingii Anura EN Ground-dwelling 19.399173 36.61764 30.56303 41.43041
Oreolalax pingii Anura EN Ground-dwelling 22.850314 37.09858 31.17582 42.06453
Oreolalax schmidti Anura NT Ground-dwelling 19.614375 36.62034 31.24550 41.56767
Oreolalax schmidti Anura NT Ground-dwelling 17.534419 36.34084 30.83127 41.28720
Oreolalax schmidti Anura NT Ground-dwelling 22.030587 36.94503 31.44509 41.82563
Oreolalax rhodostigmatus Anura VU Ground-dwelling 25.002790 37.36745 31.92374 43.18027
Oreolalax rhodostigmatus Anura VU Ground-dwelling 22.975382 37.09163 31.25081 42.46264
Oreolalax rhodostigmatus Anura VU Ground-dwelling 27.494028 37.70636 32.18891 43.55018
Scutiger adungensis Anura DD Stream-dwelling 17.149009 35.64453 30.55012 41.02700
Scutiger adungensis Anura DD Stream-dwelling 15.802182 35.45725 30.23099 40.71103
Scutiger adungensis Anura DD Stream-dwelling 19.156182 35.92363 30.69642 41.18139
Scutiger boulengeri Anura LC Stream-dwelling 12.465362 35.05040 29.43893 40.70760
Scutiger boulengeri Anura LC Stream-dwelling 10.053052 34.72203 29.13460 40.42255
Scutiger boulengeri Anura LC Stream-dwelling 15.297854 35.43597 29.71264 40.87503
Scutiger muliensis Anura EN Stream-dwelling 17.350242 35.68435 30.15967 41.06090
Scutiger muliensis Anura EN Stream-dwelling 15.907821 35.48857 30.43337 41.35031
Scutiger muliensis Anura EN Stream-dwelling 19.584018 35.98755 30.67837 41.55383
Scutiger tuberculatus Anura VU Stream-dwelling 20.611774 36.14873 31.07334 41.58414
Scutiger tuberculatus Anura VU Stream-dwelling 19.054256 35.93567 30.98150 41.51008
Scutiger tuberculatus Anura VU Stream-dwelling 22.660180 36.42893 31.25842 41.82693
Scutiger mammatus Anura LC Stream-dwelling 12.102934 35.00611 29.28525 40.56349
Scutiger mammatus Anura LC Stream-dwelling 9.808691 34.69050 28.95319 40.28667
Scutiger mammatus Anura LC Stream-dwelling 14.932263 35.39533 29.61635 40.78051
Scutiger brevipes Anura DD Stream-dwelling 15.064913 35.35770 30.10662 40.74064
Scutiger brevipes Anura DD Stream-dwelling 13.136959 35.08804 30.02801 40.61055
Scutiger brevipes Anura DD Stream-dwelling 17.351601 35.67754 30.34909 40.97143
Scutiger chintingensis Anura VU Stream-dwelling 21.331557 36.19555 31.32613 41.89026
Scutiger chintingensis Anura VU Stream-dwelling 19.542290 35.94690 30.92664 41.43192
Scutiger chintingensis Anura VU Stream-dwelling 23.446248 36.48943 31.46215 42.00514
Scutiger glandulatus Anura LC Ground-dwelling 15.159680 36.01571 30.88538 41.44368
Scutiger glandulatus Anura LC Ground-dwelling 12.996325 35.71525 30.55132 41.27588
Scutiger glandulatus Anura LC Ground-dwelling 17.790909 36.38114 31.12730 41.83937
Scutiger gongshanensis Anura LC Semi-aquatic 18.421810 36.75194 31.68979 42.17563
Scutiger gongshanensis Anura LC Semi-aquatic 17.233382 36.59021 31.48817 42.03444
Scutiger gongshanensis Anura LC Semi-aquatic 20.333876 37.01214 32.03871 42.46717
Scutiger jiulongensis Anura EN Semi-aquatic 17.781630 36.61167 31.52866 42.07554
Scutiger jiulongensis Anura EN Semi-aquatic 15.771343 36.33925 31.29248 41.82095
Scutiger jiulongensis Anura EN Semi-aquatic 20.218503 36.94189 31.77212 42.45841
Scutiger liupanensis Anura EN Stream-dwelling 20.137011 36.03532 30.57377 41.41825
Scutiger liupanensis Anura EN Stream-dwelling 17.511283 35.67874 30.07901 40.98751
Scutiger liupanensis Anura EN Stream-dwelling 23.508651 36.49321 31.08243 41.98651
Scutiger nepalensis Anura VU Stream-dwelling 16.240811 35.61047 30.36465 40.77794
Scutiger nepalensis Anura VU Stream-dwelling 14.201692 35.32845 30.12757 40.56441
Scutiger nepalensis Anura VU Stream-dwelling 19.106280 36.00677 30.49147 40.85546
Scutiger ningshanensis Anura LC Stream-dwelling 23.296088 36.51943 30.96449 42.04505
Scutiger ningshanensis Anura LC Stream-dwelling 20.532944 36.13479 30.47049 41.60952
Scutiger ningshanensis Anura LC Stream-dwelling 27.036373 37.04009 31.51918 42.67832
Scutiger nyingchiensis Anura LC Stream-dwelling 13.979409 35.28298 29.68853 40.28674
Scutiger nyingchiensis Anura LC Stream-dwelling 11.995824 35.01090 29.79099 40.40518
Scutiger nyingchiensis Anura LC Stream-dwelling 16.774621 35.66637 29.87881 40.37693
Scutiger pingwuensis Anura EN Stream-dwelling 19.647578 35.95208 30.51242 41.25913
Scutiger pingwuensis Anura EN Stream-dwelling 17.134883 35.61161 30.26211 41.02228
Scutiger pingwuensis Anura EN Stream-dwelling 22.524272 36.34187 30.80987 41.66801
Scutiger sikimmensis Anura LC Stream-dwelling 17.224167 35.61621 30.01843 40.36685
Scutiger sikimmensis Anura LC Stream-dwelling 15.863153 35.42554 29.76477 40.25812
Scutiger sikimmensis Anura LC Stream-dwelling 19.611445 35.95065 30.26357 40.55911
Leptobrachella baluensis Anura LC Ground-dwelling 26.935514 37.48202 31.52312 42.29090
Leptobrachella baluensis Anura LC Ground-dwelling 26.316600 37.39825 31.40967 42.15900
Leptobrachella baluensis Anura LC Ground-dwelling 28.162487 37.64809 31.61924 42.40341
Leptobrachella brevicrus Anura LC Stream-dwelling 27.086462 37.01628 31.43972 42.50315
Leptobrachella brevicrus Anura LC Stream-dwelling 26.556259 36.94268 31.47101 42.55987
Leptobrachella brevicrus Anura LC Stream-dwelling 28.322808 37.18789 31.57733 42.63490
Leptobrachella mjobergi Anura DD Ground-dwelling 27.207972 37.55515 32.12523 43.33455
Leptobrachella mjobergi Anura DD Ground-dwelling 26.793682 37.49978 32.07465 43.27043
Leptobrachella mjobergi Anura DD Ground-dwelling 27.965940 37.65645 32.21778 43.45187
Leptobrachella natunae Anura DD Stream-dwelling 27.443786 37.00954 31.37788 42.82441
Leptobrachella natunae Anura DD Stream-dwelling 26.999324 36.94908 31.27502 42.70756
Leptobrachella natunae Anura DD Stream-dwelling 28.214218 37.11434 31.46493 42.93842
Leptobrachella palmata Anura CR Stream-dwelling 28.251650 37.04446 31.58999 42.28575
Leptobrachella palmata Anura CR Stream-dwelling 27.794743 36.98257 31.57578 42.26071
Leptobrachella palmata Anura CR Stream-dwelling 29.494495 37.21280 31.70660 42.42319
Leptobrachella parva Anura LC Ground-dwelling 27.450199 37.66828 32.10878 43.13978
Leptobrachella parva Anura LC Ground-dwelling 26.884928 37.59092 32.07901 43.05200
Leptobrachella parva Anura LC Ground-dwelling 28.705602 37.84008 32.10526 43.24530
Leptobrachella serasanae Anura NT Ground-dwelling 27.727539 37.64507 31.91565 42.72273
Leptobrachella serasanae Anura NT Ground-dwelling 27.132025 37.56547 31.83468 42.67289
Leptobrachella serasanae Anura NT Ground-dwelling 28.951407 37.80865 32.07649 42.86296
Leptobrachium abbotti Anura LC Ground-dwelling 27.698796 37.51499 31.93219 43.18314
Leptobrachium abbotti Anura LC Ground-dwelling 27.061335 37.42906 31.94160 43.17394
Leptobrachium abbotti Anura LC Ground-dwelling 29.004963 37.69106 32.08627 43.36568
Leptobrachium gunungense Anura LC Ground-dwelling 27.024307 37.51725 31.66559 42.71233
Leptobrachium gunungense Anura LC Ground-dwelling 26.595031 37.45927 31.61865 42.69280
Leptobrachium gunungense Anura LC Ground-dwelling 27.949343 37.64218 31.76415 42.84997
Leptobrachium montanum Anura LC Ground-dwelling 27.555015 37.58517 31.92610 42.87734
Leptobrachium montanum Anura LC Ground-dwelling 26.916703 37.49771 31.87904 42.81990
Leptobrachium montanum Anura LC Ground-dwelling 28.913322 37.77127 32.09035 42.99958
Leptobrachium hasseltii Anura LC Ground-dwelling 27.580949 37.60600 32.46158 43.19170
Leptobrachium hasseltii Anura LC Ground-dwelling 26.958626 37.52084 32.27142 42.99956
Leptobrachium hasseltii Anura LC Ground-dwelling 28.840347 37.77834 32.61605 43.30672
Leptobrachium smithi Anura LC Ground-dwelling 27.622594 37.65749 32.12994 42.76387
Leptobrachium smithi Anura LC Ground-dwelling 26.807194 37.54451 32.15386 42.70069
Leptobrachium smithi Anura LC Ground-dwelling 29.359123 37.89808 32.21675 42.97144
Leptobrachium hendricksoni Anura LC Ground-dwelling 28.134864 37.70217 32.48756 43.47036
Leptobrachium hendricksoni Anura LC Ground-dwelling 27.463206 37.61113 32.39294 43.35674
Leptobrachium hendricksoni Anura LC Ground-dwelling 29.536202 37.89212 32.70280 43.83778
Leptobrachium nigrops Anura LC Ground-dwelling 28.394416 37.72381 32.30381 43.51403
Leptobrachium nigrops Anura LC Ground-dwelling 27.738270 37.63529 32.28099 43.49734
Leptobrachium nigrops Anura LC Ground-dwelling 29.713749 37.90182 32.43573 43.71730
Leptobrachium ailaonicum Anura LC Ground-dwelling 23.394604 37.21318 31.37256 42.65228
Leptobrachium ailaonicum Anura LC Ground-dwelling 22.386658 37.07649 31.24720 42.44693
Leptobrachium ailaonicum Anura LC Ground-dwelling 25.465492 37.49403 31.88101 43.24536
Leptobrachium boringii Anura EN Ground-dwelling 22.786221 37.06498 31.71625 42.16705
Leptobrachium boringii Anura EN Ground-dwelling 20.917801 36.80999 31.60653 42.06191
Leptobrachium boringii Anura EN Ground-dwelling 25.151088 37.38772 31.96459 42.58135
Leptobrachium leishanense Anura EN Ground-dwelling 25.769995 37.43407 32.07557 42.83944
Leptobrachium leishanense Anura EN Ground-dwelling 24.497611 37.26076 31.94888 42.70038
Leptobrachium leishanense Anura EN Ground-dwelling 28.047797 37.74432 32.42565 43.30152
Leptobrachium liui Anura LC Ground-dwelling 27.172840 37.66711 32.60323 43.63222
Leptobrachium liui Anura LC Ground-dwelling 25.796811 37.48128 32.28307 43.25327
Leptobrachium liui Anura LC Ground-dwelling 29.583745 37.99270 32.70558 43.77232
Leptobrachium chapaense Anura LC Ground-dwelling 24.353354 37.27652 31.84241 42.80433
Leptobrachium chapaense Anura LC Ground-dwelling 23.374265 37.14326 31.71552 42.64731
Leptobrachium chapaense Anura LC Ground-dwelling 26.398240 37.55484 31.98512 43.03338
Leptobrachium huashen Anura LC Ground-dwelling 22.998975 37.11238 32.02906 42.89203
Leptobrachium huashen Anura LC Ground-dwelling 21.999615 36.97655 31.89530 42.67103
Leptobrachium huashen Anura LC Ground-dwelling 25.045117 37.39048 32.05690 42.96256
Leptobrachium promustache Anura EN Stream-dwelling 25.500432 36.75267 31.69301 42.05273
Leptobrachium promustache Anura EN Stream-dwelling 24.463648 36.61137 31.60713 41.88290
Leptobrachium promustache Anura EN Stream-dwelling 27.451252 37.01855 31.99186 42.38978
Leptobrachium banae Anura LC Ground-dwelling 27.814077 37.68549 32.40052 43.21208
Leptobrachium banae Anura LC Ground-dwelling 26.905008 37.56055 32.36771 43.16640
Leptobrachium banae Anura LC Ground-dwelling 29.541577 37.92290 32.43476 43.28108
Leptobrachium buchardi Anura EN Ground-dwelling 28.429363 37.78493 32.68892 43.73846
Leptobrachium buchardi Anura EN Ground-dwelling 27.427371 37.64807 32.59036 43.56955
Leptobrachium buchardi Anura EN Ground-dwelling 30.308497 38.04161 32.68400 43.84399
Leptobrachium ngoclinhense Anura EN Ground-dwelling 27.647134 37.63744 31.96204 43.00650
Leptobrachium ngoclinhense Anura EN Ground-dwelling 26.659697 37.50292 31.82988 42.86151
Leptobrachium ngoclinhense Anura EN Ground-dwelling 29.428639 37.88013 32.18791 43.25379
Leptobrachium hainanense Anura VU Ground-dwelling 27.973108 37.71887 32.12293 42.84645
Leptobrachium hainanense Anura VU Ground-dwelling 27.367922 37.63707 32.05267 42.74674
Leptobrachium hainanense Anura VU Ground-dwelling 29.095461 37.87056 32.11690 42.91606
Leptobrachium mouhoti Anura LC Ground-dwelling 28.128180 37.79012 32.43505 43.21208
Leptobrachium mouhoti Anura LC Ground-dwelling 27.101017 37.64949 32.24781 42.97992
Leptobrachium mouhoti Anura LC Ground-dwelling 29.954752 38.04020 32.78924 43.62492
Leptobrachium pullum Anura LC Ground-dwelling 28.014092 37.71275 32.03845 43.13706
Leptobrachium pullum Anura LC Ground-dwelling 27.052053 37.58241 31.89480 42.98988
Leptobrachium pullum Anura LC Ground-dwelling 29.773359 37.95111 32.19658 43.35847
Leptobrachium xanthops Anura EN Stream-dwelling 27.398082 37.02652 31.63289 42.41333
Leptobrachium xanthops Anura EN Stream-dwelling 26.443812 36.89608 31.22208 42.04330
Leptobrachium xanthops Anura EN Stream-dwelling 29.147029 37.26558 31.49933 42.35430
Leptobrachium xanthospilum Anura EN Stream-dwelling 27.001410 37.02609 31.20296 42.44350
Leptobrachium xanthospilum Anura EN Stream-dwelling 26.005306 36.89139 31.14829 42.34705
Leptobrachium xanthospilum Anura EN Stream-dwelling 28.753804 37.26305 31.29913 42.66151
Leptobrachium leucops Anura VU Ground-dwelling 28.175925 37.79502 31.99939 42.98295
Leptobrachium leucops Anura VU Ground-dwelling 27.169330 37.65743 32.66430 43.60293
Leptobrachium leucops Anura VU Ground-dwelling 29.908032 38.03176 32.25191 43.31151
Megophrys kobayashii Anura LC Ground-dwelling 27.355101 37.60002 32.52275 43.13999
Megophrys kobayashii Anura LC Ground-dwelling 26.788195 37.52209 32.41089 43.00807
Megophrys kobayashii Anura LC Ground-dwelling 28.477535 37.75433 32.61742 43.30960
Megophrys ligayae Anura NT Ground-dwelling 27.659089 37.65928 32.80860 42.87257
Megophrys ligayae Anura NT Ground-dwelling 27.243458 37.60111 32.73862 42.79545
Megophrys ligayae Anura NT Ground-dwelling 28.633065 37.79560 33.07434 43.12396
Megophrys montana Anura LC Ground-dwelling 27.241860 37.51384 32.65982 43.25006
Megophrys montana Anura LC Ground-dwelling 26.619222 37.42760 32.58124 43.16788
Megophrys montana Anura LC Ground-dwelling 28.489779 37.68667 32.58925 43.15402
Megophrys nasuta Anura LC Ground-dwelling 28.098417 37.61849 32.08103 42.75383
Megophrys nasuta Anura LC Ground-dwelling 27.458862 37.52976 31.88248 42.52948
Megophrys nasuta Anura LC Ground-dwelling 29.422792 37.80223 32.14703 42.88806
Megophrys stejnegeri Anura LC Ground-dwelling 27.412649 37.58261 32.32159 42.91893
Megophrys stejnegeri Anura LC Ground-dwelling 26.897312 37.51150 32.24858 42.83330
Megophrys stejnegeri Anura LC Ground-dwelling 28.489388 37.73119 32.42226 43.13316
Pelobates fuscus Anura LC Ground-dwelling 18.298481 37.21005 33.79365 40.81927
Pelobates fuscus Anura LC Ground-dwelling 15.388016 36.82438 33.35040 40.45472
Pelobates fuscus Anura LC Ground-dwelling 23.253530 37.86665 34.13024 41.33261
Pelobates syriacus Anura LC Fossorial 20.230138 38.51915 34.60137 41.83676
Pelobates syriacus Anura LC Fossorial 18.446065 38.27858 34.43524 41.54138
Pelobates syriacus Anura LC Fossorial 23.303427 38.93356 34.90104 42.36709
Pelobates varaldii Anura EN Fossorial 22.475028 38.97489 35.67156 41.99097
Pelobates varaldii Anura EN Fossorial 21.105990 38.78960 35.62592 41.82929
Pelobates varaldii Anura EN Fossorial 25.051458 39.32361 35.87302 42.32328
Hadromophryne natalensis Anura LC Stream-dwelling 22.172363 35.83821 28.78339 42.03104
Hadromophryne natalensis Anura LC Stream-dwelling 20.883641 35.65716 28.74357 42.03048
Hadromophryne natalensis Anura LC Stream-dwelling 24.344933 36.14344 29.00269 42.25375
Heleophryne hewitti Anura EN Ground-dwelling 21.140698 36.18998 29.98008 42.67159
Heleophryne hewitti Anura EN Ground-dwelling 19.675221 35.98442 29.73312 42.49033
Heleophryne hewitti Anura EN Ground-dwelling 23.635260 36.53987 30.77107 43.61849
Heleophryne orientalis Anura LC Stream-dwelling 21.257283 35.61720 29.12261 41.56000
Heleophryne orientalis Anura LC Stream-dwelling 19.700220 35.40158 28.98194 41.44331
Heleophryne orientalis Anura LC Stream-dwelling 23.845278 35.97559 29.51941 41.94130
Heleophryne purcelli Anura LC Stream-dwelling 20.461482 35.48953 29.16919 41.98181
Heleophryne purcelli Anura LC Stream-dwelling 19.089764 35.29727 28.86076 41.71517
Heleophryne purcelli Anura LC Stream-dwelling 23.196806 35.87292 29.17424 41.99295
Heleophryne regis Anura LC Stream-dwelling 20.979607 35.51532 29.33320 42.24833
Heleophryne regis Anura LC Stream-dwelling 19.408928 35.29674 29.02899 42.03835
Heleophryne regis Anura LC Stream-dwelling 23.589656 35.87855 29.58381 42.50260
Heleophryne rosei Anura CR Stream-dwelling 20.209458 35.38871 28.77093 41.51612
Heleophryne rosei Anura CR Stream-dwelling 18.876407 35.20536 28.62996 41.37194
Heleophryne rosei Anura CR Stream-dwelling 23.098046 35.78602 29.24705 41.95665
Philoria pughi Anura EN Stream-dwelling 22.996696 31.38176 28.61644 34.20535
Philoria pughi Anura EN Stream-dwelling 21.515672 31.14411 28.45762 33.92249
Philoria pughi Anura EN Stream-dwelling 25.497317 31.78301 28.87077 34.70553
Philoria kundagungan Anura EN Ground-dwelling 23.254138 33.20820 29.90864 36.42128
Philoria kundagungan Anura EN Ground-dwelling 21.777520 32.98152 29.74202 36.10394
Philoria kundagungan Anura EN Ground-dwelling 25.747962 33.59103 30.54998 37.32309
Philoria richmondensis Anura EN Ground-dwelling 23.068345 33.24067 30.02506 36.30928
Philoria richmondensis Anura EN Ground-dwelling 21.601952 33.01216 29.94723 36.18755
Philoria richmondensis Anura EN Ground-dwelling 25.603207 33.63566 30.41088 36.83894
Limnodynastes convexiusculus Anura LC Semi-aquatic 27.283305 36.41473 33.16628 39.73341
Limnodynastes convexiusculus Anura LC Semi-aquatic 26.354972 36.27655 33.09517 39.56245
Limnodynastes convexiusculus Anura LC Semi-aquatic 29.141358 36.69131 33.55988 40.17763
Limnodynastes lignarius Anura LC Ground-dwelling 27.926154 36.45647 33.53367 39.96807
Limnodynastes lignarius Anura LC Ground-dwelling 27.020006 36.32045 33.40358 39.80721
Limnodynastes lignarius Anura LC Ground-dwelling 29.777049 36.73431 33.34150 40.00840
Limnodynastes depressus Anura LC Ground-dwelling 27.965034 35.49580 32.17465 38.41668
Limnodynastes depressus Anura LC Ground-dwelling 27.076421 35.35912 32.16631 38.31696
Limnodynastes depressus Anura LC Ground-dwelling 29.822843 35.78154 32.44046 38.82789
Limnodynastes terraereginae Anura LC Semi-aquatic 24.292058 36.19110 33.38741 38.62868
Limnodynastes terraereginae Anura LC Semi-aquatic 22.978021 35.99395 33.23473 38.35744
Limnodynastes terraereginae Anura LC Semi-aquatic 26.691558 36.55112 33.52156 39.00482
Limnodynastes dumerilii Anura LC Ground-dwelling 20.020825 35.20999 32.73213 37.97433
Limnodynastes dumerilii Anura LC Ground-dwelling 18.259028 34.94401 32.48661 37.73902
Limnodynastes dumerilii Anura LC Ground-dwelling 23.046207 35.66673 33.12807 38.40667
Limnodynastes interioris Anura LC Semi-aquatic 21.179487 35.65820 33.18487 38.45802
Limnodynastes interioris Anura LC Semi-aquatic 19.245800 35.36336 32.92347 38.10163
Limnodynastes interioris Anura LC Semi-aquatic 24.429094 36.15367 33.43958 38.91527
Lechriodus aganoposis Anura LC Ground-dwelling 26.515807 38.27235 35.10490 41.86077
Lechriodus aganoposis Anura LC Ground-dwelling 25.665364 38.14684 35.00529 41.72814
Lechriodus aganoposis Anura LC Ground-dwelling 27.974721 38.48765 35.12957 41.97872
Lechriodus melanopyga Anura LC Ground-dwelling 26.996446 38.41272 35.21139 41.75258
Lechriodus melanopyga Anura LC Ground-dwelling 26.243506 38.30220 35.07638 41.54096
Lechriodus melanopyga Anura LC Ground-dwelling 28.362972 38.61329 35.03731 41.70273
Lechriodus fletcheri Anura LC Ground-dwelling 22.398282 37.34333 33.89052 40.64892
Lechriodus fletcheri Anura LC Ground-dwelling 21.015283 37.13953 33.61463 40.35259
Lechriodus fletcheri Anura LC Ground-dwelling 24.589159 37.66620 34.40756 41.31859
Lechriodus platyceps Anura LC Ground-dwelling 26.813659 37.93415 34.60927 41.23115
Lechriodus platyceps Anura LC Ground-dwelling 26.172609 37.83926 34.68178 41.23562
Lechriodus platyceps Anura LC Ground-dwelling 28.089212 38.12297 34.78208 41.54550
Platyplectrum spenceri Anura LC Ground-dwelling 24.021179 37.04715 33.64490 40.64676
Platyplectrum spenceri Anura LC Ground-dwelling 22.283374 36.78384 33.55147 40.50496
Platyplectrum spenceri Anura LC Ground-dwelling 26.807581 37.46934 34.03600 41.11036
Heleioporus albopunctatus Anura LC Fossorial 20.721896 35.46601 31.36531 39.22779
Heleioporus albopunctatus Anura LC Fossorial 19.098688 35.22364 31.08429 38.92713
Heleioporus albopunctatus Anura LC Fossorial 24.030074 35.95995 32.24135 40.06325
Heleioporus barycragus Anura LC Fossorial 20.087936 35.38360 31.26162 39.35667
Heleioporus barycragus Anura LC Fossorial 18.509452 35.14428 30.95125 39.07098
Heleioporus barycragus Anura LC Fossorial 23.382190 35.88304 31.77914 39.90695
Heleioporus australiacus Anura VU Fossorial 19.841335 35.34353 31.26608 39.22552
Heleioporus australiacus Anura VU Fossorial 18.113833 35.08204 31.16094 39.05894
Heleioporus australiacus Anura VU Fossorial 22.506165 35.74691 31.40407 39.54230
Heleioporus eyrei Anura LC Fossorial 20.094598 35.32059 31.17670 39.14883
Heleioporus eyrei Anura LC Fossorial 18.581940 35.08948 30.82038 38.89209
Heleioporus eyrei Anura LC Fossorial 23.148271 35.78713 31.63147 39.72696
Heleioporus inornatus Anura LC Fossorial 19.432567 35.25211 31.45445 39.40960
Heleioporus inornatus Anura LC Fossorial 17.998095 35.03611 31.22237 39.17541
Heleioporus inornatus Anura LC Fossorial 22.246677 35.67585 31.73902 39.82021
Heleioporus psammophilus Anura LC Fossorial 20.232684 35.33351 31.25881 39.21683
Heleioporus psammophilus Anura LC Fossorial 18.697446 35.10066 31.11170 38.95073
Heleioporus psammophilus Anura LC Fossorial 23.327167 35.80285 31.68303 39.74225
Neobatrachus albipes Anura LC Ground-dwelling 20.096290 34.12403 30.51563 37.76046
Neobatrachus albipes Anura LC Ground-dwelling 18.547128 33.89093 30.28613 37.50436
Neobatrachus albipes Anura LC Ground-dwelling 23.301094 34.60625 31.02255 38.30426
Neobatrachus kunapalari Anura LC Ground-dwelling 20.739877 34.22747 30.48666 37.97073
Neobatrachus kunapalari Anura LC Ground-dwelling 19.130663 33.97839 30.24851 37.66288
Neobatrachus kunapalari Anura LC Ground-dwelling 24.122119 34.75098 31.18205 38.78474
Neobatrachus aquilonius Anura LC Ground-dwelling 26.662043 34.71687 31.05655 38.02974
Neobatrachus aquilonius Anura LC Ground-dwelling 25.416230 34.52580 30.83849 37.71749
Neobatrachus aquilonius Anura LC Ground-dwelling 28.749941 35.03709 31.17812 38.26955
Neobatrachus wilsmorei Anura LC Ground-dwelling 22.568354 34.17387 30.45825 37.75759
Neobatrachus wilsmorei Anura LC Ground-dwelling 20.905624 33.91462 30.28500 37.46183
Neobatrachus wilsmorei Anura LC Ground-dwelling 25.739780 34.66837 30.76964 38.31278
Neobatrachus sutor Anura LC Ground-dwelling 22.246476 33.95545 30.57421 37.49560
Neobatrachus sutor Anura LC Ground-dwelling 20.547795 33.69412 30.41306 37.20667
Neobatrachus sutor Anura LC Ground-dwelling 25.411921 34.44243 30.77847 37.91342
Neobatrachus fulvus Anura LC Ground-dwelling 25.092937 34.32716 30.95650 37.37284
Neobatrachus fulvus Anura LC Ground-dwelling 23.536429 34.08634 31.01929 37.32558
Neobatrachus fulvus Anura LC Ground-dwelling 27.628459 34.71946 31.38122 37.96692
Neobatrachus pelobatoides Anura LC Ground-dwelling 20.257054 33.63912 30.11061 36.69553
Neobatrachus pelobatoides Anura LC Ground-dwelling 18.697751 33.39970 30.17182 36.73153
Neobatrachus pelobatoides Anura LC Ground-dwelling 23.500847 34.13718 30.81352 37.53269
Notaden bennettii Anura LC Ground-dwelling 23.210089 35.19796 31.17844 39.87515
Notaden bennettii Anura LC Ground-dwelling 21.586957 34.95582 31.08536 39.69676
Notaden bennettii Anura LC Ground-dwelling 26.035185 35.61940 31.45413 40.27523
Notaden melanoscaphus Anura LC Ground-dwelling 27.596281 35.81670 31.68726 40.58213
Notaden melanoscaphus Anura LC Ground-dwelling 26.614950 35.66724 30.68255 39.51011
Notaden melanoscaphus Anura LC Ground-dwelling 29.562287 36.11612 31.83479 40.79944
Notaden weigeli Anura LC Fossorial 27.806553 36.87589 32.58634 41.73535
Notaden weigeli Anura LC Fossorial 27.081922 36.76466 32.51490 41.59960
Notaden weigeli Anura LC Fossorial 29.441316 37.12683 32.68580 41.96728
Notaden nichollsi Anura LC Fossorial 24.779023 36.36611 32.18657 41.10436
Notaden nichollsi Anura LC Fossorial 23.116779 36.11590 31.40386 40.30722
Notaden nichollsi Anura LC Fossorial 27.352006 36.75340 32.30858 41.29841
Arenophryne rotunda Anura LC Fossorial 24.014023 37.01512 33.59275 40.82080
Arenophryne rotunda Anura LC Fossorial 22.310826 36.75278 33.38244 40.63375
Arenophryne rotunda Anura LC Fossorial 26.701130 37.42902 34.08055 41.37069
Metacrinia nichollsi Anura LC Ground-dwelling 18.741857 35.13821 31.80587 39.23375
Metacrinia nichollsi Anura LC Ground-dwelling 17.430397 34.93923 31.50495 38.94187
Metacrinia nichollsi Anura LC Ground-dwelling 21.167909 35.50629 31.92418 39.46136
Myobatrachus gouldii Anura LC Fossorial 20.295099 36.32799 32.83611 40.09925
Myobatrachus gouldii Anura LC Fossorial 18.720299 36.08498 32.18017 39.42206
Myobatrachus gouldii Anura LC Fossorial 23.551868 36.83053 33.26228 40.62774
Pseudophryne australis Anura VU Ground-dwelling 21.053330 36.74521 34.09868 39.55364
Pseudophryne australis Anura VU Ground-dwelling 19.518898 36.51610 33.93523 39.27341
Pseudophryne australis Anura VU Ground-dwelling 23.460460 37.10463 34.34656 39.98101
Pseudophryne occidentalis Anura LC Ground-dwelling 21.198709 36.25270 33.53242 38.66946
Pseudophryne occidentalis Anura LC Ground-dwelling 19.578549 36.01249 33.39345 38.44278
Pseudophryne occidentalis Anura LC Ground-dwelling 24.534646 36.74730 33.92512 39.27630
Pseudophryne coriacea Anura LC Ground-dwelling 22.548203 35.89661 32.76833 39.27161
Pseudophryne coriacea Anura LC Ground-dwelling 21.145806 35.68016 32.54869 39.00371
Pseudophryne coriacea Anura LC Ground-dwelling 24.814203 36.24634 33.07013 39.67281
Pseudophryne covacevichae Anura EN Ground-dwelling 25.096658 36.28569 32.92698 39.69216
Pseudophryne covacevichae Anura EN Ground-dwelling 24.041192 36.12513 32.80166 39.46570
Pseudophryne covacevichae Anura EN Ground-dwelling 26.972135 36.57099 33.22568 40.20584
Pseudophryne guentheri Anura LC Ground-dwelling 20.555715 34.86434 32.00340 37.48600
Pseudophryne guentheri Anura LC Ground-dwelling 18.991763 34.62350 31.82076 37.27820
Pseudophryne guentheri Anura LC Ground-dwelling 23.745614 35.35559 32.54203 38.10538
Pseudophryne douglasi Anura LC Aquatic 25.161909 35.99473 32.84600 39.15821
Pseudophryne douglasi Anura LC Aquatic 23.592177 35.75487 32.60568 38.84860
Pseudophryne douglasi Anura LC Aquatic 27.737807 36.38835 33.14156 39.61738
Pseudophryne pengilleyi Anura CR Stream-dwelling 19.261589 34.72713 31.57721 38.29536
Pseudophryne pengilleyi Anura CR Stream-dwelling 17.296047 34.43419 30.76491 37.40833
Pseudophryne pengilleyi Anura CR Stream-dwelling 22.460332 35.20385 31.77895 38.60873
Pseudophryne raveni Anura LC Ground-dwelling 23.994463 35.99709 32.38232 39.47506
Pseudophryne raveni Anura LC Ground-dwelling 22.705383 35.80388 32.40682 39.46857
Pseudophryne raveni Anura LC Ground-dwelling 26.243957 36.33426 32.80223 40.06650
Spicospina flammocaerulea Anura VU Semi-aquatic 18.361767 34.91743 30.92015 39.22037
Spicospina flammocaerulea Anura VU Semi-aquatic 17.104306 34.72811 30.56691 38.82700
Spicospina flammocaerulea Anura VU Semi-aquatic 20.714905 35.27170 30.97102 39.33675
Uperoleia altissima Anura LC Ground-dwelling 25.916897 35.72614 32.61487 39.71355
Uperoleia altissima Anura LC Ground-dwelling 24.779931 35.55312 32.41516 39.45684
Uperoleia altissima Anura LC Ground-dwelling 27.986141 36.04105 32.80507 40.06344
Uperoleia littlejohni Anura LC Ground-dwelling 25.465719 35.68502 32.34386 39.06677
Uperoleia littlejohni Anura LC Ground-dwelling 24.207229 35.49299 32.06482 38.73350
Uperoleia littlejohni Anura LC Ground-dwelling 27.846339 36.04826 32.51415 39.39353
Uperoleia orientalis Anura DD Ground-dwelling 27.542531 35.98522 32.52387 39.50670
Uperoleia orientalis Anura DD Ground-dwelling 26.402106 35.81318 32.35863 39.34813
Uperoleia orientalis Anura DD Ground-dwelling 29.777245 36.32234 32.83171 39.89516
Uperoleia arenicola Anura LC Ground-dwelling 28.308302 36.12066 32.25429 39.93318
Uperoleia arenicola Anura LC Ground-dwelling 27.371803 35.97926 32.11219 39.69601
Uperoleia arenicola Anura LC Ground-dwelling 30.057508 36.38478 32.50548 40.32568
Uperoleia borealis Anura LC Ground-dwelling 27.427403 35.90863 32.36400 39.45178
Uperoleia borealis Anura LC Ground-dwelling 26.452055 35.76351 32.39243 39.45722
Uperoleia borealis Anura LC Ground-dwelling 29.399443 36.20205 32.53375 39.71093
Uperoleia crassa Anura LC Semi-aquatic 27.804363 36.28368 32.92692 40.16207
Uperoleia crassa Anura LC Semi-aquatic 27.053206 36.16894 32.65808 39.87205
Uperoleia crassa Anura LC Semi-aquatic 29.457894 36.53626 32.98109 40.33044
Uperoleia inundata Anura LC Ground-dwelling 27.828604 35.99790 32.44396 39.33330
Uperoleia inundata Anura LC Ground-dwelling 26.860967 35.85310 32.38625 39.25688
Uperoleia inundata Anura LC Ground-dwelling 29.708003 36.27914 32.70324 39.72586
Uperoleia russelli Anura LC Ground-dwelling 24.381793 35.52300 31.73319 39.16990
Uperoleia russelli Anura LC Ground-dwelling 22.739283 35.27333 31.44186 38.84919
Uperoleia russelli Anura LC Ground-dwelling 27.209242 35.95278 32.13487 39.70762
Uperoleia talpa Anura LC Ground-dwelling 27.491391 36.03839 32.06257 39.77105
Uperoleia talpa Anura LC Ground-dwelling 26.518495 35.88879 31.90788 39.59259
Uperoleia talpa Anura LC Ground-dwelling 29.303692 36.31707 32.36852 40.13041
Uperoleia aspera Anura LC Ground-dwelling 27.760070 36.04318 32.49008 40.14203
Uperoleia aspera Anura LC Ground-dwelling 26.860537 35.90487 32.43923 40.07456
Uperoleia aspera Anura LC Ground-dwelling 29.568121 36.32117 32.70310 40.43166
Uperoleia lithomoda Anura LC Ground-dwelling 27.310559 35.86772 32.32825 39.98099
Uperoleia lithomoda Anura LC Ground-dwelling 26.294669 35.71179 32.01635 39.59380
Uperoleia lithomoda Anura LC Ground-dwelling 29.318382 36.17592 32.67013 40.35343
Uperoleia trachyderma Anura LC Ground-dwelling 26.778073 35.86241 31.98474 39.35727
Uperoleia trachyderma Anura LC Ground-dwelling 25.404650 35.65128 31.71264 39.12048
Uperoleia trachyderma Anura LC Ground-dwelling 28.956057 36.19722 32.37102 39.96341
Uperoleia minima Anura LC Ground-dwelling 27.780039 36.00905 32.09514 39.94206
Uperoleia minima Anura LC Ground-dwelling 27.036499 35.89638 32.24172 40.02974
Uperoleia minima Anura LC Ground-dwelling 29.451546 36.26234 32.36981 40.23944
Uperoleia glandulosa Anura LC Ground-dwelling 26.199597 35.76190 31.87268 39.77956
Uperoleia glandulosa Anura LC Ground-dwelling 24.891284 35.56574 31.63709 39.50041
Uperoleia glandulosa Anura LC Ground-dwelling 28.380390 36.08887 32.13827 40.11401
Uperoleia martini Anura DD Ground-dwelling 18.933984 34.65284 31.07386 38.04895
Uperoleia martini Anura DD Ground-dwelling 17.116167 34.37618 30.87117 37.84211
Uperoleia martini Anura DD Ground-dwelling 21.667991 35.06895 31.62583 38.64044
Uperoleia daviesae Anura EN Ground-dwelling 28.063551 36.08228 31.87735 39.86421
Uperoleia daviesae Anura EN Ground-dwelling 27.372574 35.97751 31.79333 39.79908
Uperoleia daviesae Anura EN Ground-dwelling 29.348685 36.27714 31.99610 40.11323
Uperoleia micromeles Anura LC Ground-dwelling 25.088051 35.56844 31.90848 39.39294
Uperoleia micromeles Anura LC Ground-dwelling 23.368547 35.30670 31.80860 39.23188
Uperoleia micromeles Anura LC Ground-dwelling 27.532534 35.94054 32.14136 39.86294
Uperoleia mjobergii Anura LC Ground-dwelling 27.736069 35.91810 31.69549 39.39216
Uperoleia mjobergii Anura LC Ground-dwelling 26.814554 35.77826 31.65008 39.22131
Uperoleia mjobergii Anura LC Ground-dwelling 29.550357 36.19341 32.37408 40.13420
Uperoleia mimula Anura LC Ground-dwelling 26.474436 35.72535 31.96447 39.76535
Uperoleia mimula Anura LC Ground-dwelling 25.434563 35.56646 31.83568 39.56456
Uperoleia mimula Anura LC Ground-dwelling 28.560931 36.04416 32.05719 40.01306
Uperoleia fusca Anura LC Ground-dwelling 23.240009 34.87866 31.67816 37.78729
Uperoleia fusca Anura LC Ground-dwelling 21.875057 34.67152 31.52448 37.61802
Uperoleia fusca Anura LC Ground-dwelling 25.562684 35.23116 31.87378 38.16884
Uperoleia tyleri Anura DD Ground-dwelling 20.120083 34.47178 31.05938 37.32697
Uperoleia tyleri Anura DD Ground-dwelling 18.435409 34.21664 30.78533 37.00090
Uperoleia tyleri Anura DD Ground-dwelling 22.736174 34.86799 31.47614 37.77006
Geocrinia alba Anura CR Ground-dwelling 19.744900 34.55428 31.49145 37.61241
Geocrinia alba Anura CR Ground-dwelling 18.327374 34.33627 31.26706 37.35626
Geocrinia alba Anura CR Ground-dwelling 22.394314 34.96174 31.79818 38.06811
Geocrinia vitellina Anura VU Ground-dwelling 19.685310 34.52616 31.20095 37.38990
Geocrinia vitellina Anura VU Ground-dwelling 18.315960 34.31147 31.18194 37.19359
Geocrinia vitellina Anura VU Ground-dwelling 22.270738 34.93153 31.47887 37.87365
Geocrinia lutea Anura LC Ground-dwelling 18.450765 34.36024 31.19594 37.26471
Geocrinia lutea Anura LC Ground-dwelling 17.224069 34.17080 31.08745 37.05899
Geocrinia lutea Anura LC Ground-dwelling 20.847528 34.73038 31.51392 37.71928
Geocrinia rosea Anura LC Ground-dwelling 18.929360 34.44285 31.54064 37.44868
Geocrinia rosea Anura LC Ground-dwelling 17.617432 34.24073 31.30799 37.17507
Geocrinia rosea Anura LC Ground-dwelling 21.402880 34.82393 31.88919 37.90265
Geocrinia leai Anura LC Ground-dwelling 19.334531 34.41152 31.88549 37.08894
Geocrinia leai Anura LC Ground-dwelling 17.909987 34.18793 31.79384 36.96366
Geocrinia leai Anura LC Ground-dwelling 22.103380 34.84610 32.30301 37.68109
Paracrinia haswelli Anura LC Stream-dwelling 20.121316 34.31082 30.29931 37.90741
Paracrinia haswelli Anura LC Stream-dwelling 18.475229 34.06024 30.05626 37.60456
Paracrinia haswelli Anura LC Stream-dwelling 22.643332 34.69475 30.73495 38.42725
Crinia bilingua Anura LC Semi-aquatic 27.736505 36.91094 33.03045 41.23395
Crinia bilingua Anura LC Semi-aquatic 26.766313 36.76643 32.82718 40.98927
Crinia bilingua Anura LC Semi-aquatic 29.677076 37.19999 33.38855 41.61313
Crinia remota Anura LC Ground-dwelling 27.413768 36.54041 32.97027 40.16182
Crinia remota Anura LC Ground-dwelling 26.387838 36.38680 32.84312 39.97248
Crinia remota Anura LC Ground-dwelling 29.381207 36.83499 33.21411 40.57042
Crinia deserticola Anura LC Ground-dwelling 25.542211 36.36920 32.99493 39.85933
Crinia deserticola Anura LC Ground-dwelling 24.135900 36.15983 32.77329 39.62551
Crinia deserticola Anura LC Ground-dwelling 27.935868 36.72555 33.30325 40.24560
Crinia riparia Anura LC Stream-dwelling 21.089805 35.18069 31.95761 38.13699
Crinia riparia Anura LC Stream-dwelling 19.125103 34.88655 31.77381 37.87871
Crinia riparia Anura LC Stream-dwelling 24.692362 35.72003 32.43303 38.73763
Crinia georgiana Anura LC Ground-dwelling 19.527298 35.50576 32.20290 38.72610
Crinia georgiana Anura LC Ground-dwelling 18.059943 35.28597 32.03818 38.47473
Crinia georgiana Anura LC Ground-dwelling 22.502454 35.95139 32.19347 38.82691
Crinia glauerti Anura LC Ground-dwelling 19.334531 35.44542 32.45352 38.46573
Crinia glauerti Anura LC Ground-dwelling 17.909987 35.23107 32.32135 38.32904
Crinia glauerti Anura LC Ground-dwelling 22.103380 35.86207 32.72857 38.91811
Crinia insignifera Anura LC Ground-dwelling 20.334412 35.66043 32.37958 38.79285
Crinia insignifera Anura LC Ground-dwelling 18.740435 35.42362 32.20761 38.55994
Crinia insignifera Anura LC Ground-dwelling 23.510075 36.13223 32.71232 39.31193
Crinia pseudinsignifera Anura LC Ground-dwelling 20.131541 35.63682 32.13891 38.48466
Crinia pseudinsignifera Anura LC Ground-dwelling 18.585292 35.40445 32.38789 38.68548
Crinia pseudinsignifera Anura LC Ground-dwelling 23.324502 36.11666 33.24242 39.67182
Crinia subinsignifera Anura LC Ground-dwelling 18.956876 35.48159 32.86660 39.09948
Crinia subinsignifera Anura LC Ground-dwelling 17.588661 35.27863 32.64159 38.86413
Crinia subinsignifera Anura LC Ground-dwelling 21.746946 35.89547 32.49929 38.85265
Crinia sloanei Anura DD Ground-dwelling 21.188168 35.77451 32.65108 39.01508
Crinia sloanei Anura DD Ground-dwelling 19.230552 35.48173 32.41989 38.62815
Crinia sloanei Anura DD Ground-dwelling 24.511334 36.27152 32.67823 39.20470
Crinia tinnula Anura VU Ground-dwelling 22.886405 36.12815 33.01845 39.28683
Crinia tinnula Anura VU Ground-dwelling 21.573182 35.93206 32.94293 39.12115
Crinia tinnula Anura VU Ground-dwelling 24.982141 36.44107 33.30502 39.72613
Crinia nimbus Anura LC Ground-dwelling 15.858751 34.65397 30.54207 38.79665
Crinia nimbus Anura LC Ground-dwelling 14.373099 34.43018 30.49154 38.75476
Crinia nimbus Anura LC Ground-dwelling 18.198845 35.00647 30.58397 38.87508
Crinia tasmaniensis Anura NT Aquatic 16.268857 34.88690 30.89718 39.10055
Crinia tasmaniensis Anura NT Aquatic 14.709859 34.65018 30.65420 38.85933
Crinia tasmaniensis Anura NT Aquatic 18.738647 35.26191 31.09960 39.32025
Taudactylus eungellensis Anura EN Stream-dwelling 25.276510 35.01775 30.59236 39.56341
Taudactylus eungellensis Anura EN Stream-dwelling 24.054857 34.83322 30.41891 39.37655
Taudactylus eungellensis Anura EN Stream-dwelling 27.592228 35.36753 30.92115 39.92886
Taudactylus liemi Anura LC Semi-aquatic 25.276510 35.79719 31.48448 40.78179
Taudactylus liemi Anura LC Semi-aquatic 24.054857 35.61400 31.30040 40.62862
Taudactylus liemi Anura LC Semi-aquatic 27.592228 36.14443 31.69050 41.11143
Taudactylus pleione Anura CR Ground-dwelling 24.127771 35.55291 31.08048 40.36841
Taudactylus pleione Anura CR Ground-dwelling 23.021721 35.38370 30.87474 40.14769
Taudactylus pleione Anura CR Ground-dwelling 26.050714 35.84709 31.08431 40.38689
Mixophyes balbus Anura VU Stream-dwelling 21.116497 32.56317 29.00874 36.10935
Mixophyes balbus Anura VU Stream-dwelling 19.551960 32.32557 28.89273 35.93636
Mixophyes balbus Anura VU Stream-dwelling 23.570674 32.93588 29.36013 36.56197
Mixophyes carbinensis Anura LC Stream-dwelling 26.587820 33.37832 29.96433 37.20821
Mixophyes carbinensis Anura LC Stream-dwelling 25.348285 33.19124 29.80454 37.07021
Mixophyes carbinensis Anura LC Stream-dwelling 28.875060 33.72354 30.23152 37.57247
Mixophyes coggeri Anura LC Ground-dwelling 25.799549 33.88130 30.37864 37.28848
Mixophyes coggeri Anura LC Ground-dwelling 24.767030 33.72763 30.19482 37.02609
Mixophyes coggeri Anura LC Ground-dwelling 27.658562 34.15797 30.86818 37.91676
Mixophyes schevilli Anura LC Stream-dwelling 25.919597 33.30971 29.81463 37.15229
Mixophyes schevilli Anura LC Stream-dwelling 24.862524 33.15038 29.72090 37.00309
Mixophyes schevilli Anura LC Stream-dwelling 27.828630 33.59745 29.81129 37.21959
Mixophyes fleayi Anura EN Semi-aquatic 23.402606 33.79303 30.21307 37.33420
Mixophyes fleayi Anura EN Semi-aquatic 22.028422 33.58762 30.04351 37.07116
Mixophyes fleayi Anura EN Semi-aquatic 25.740085 34.14244 30.39613 37.63256
Mixophyes iteratus Anura EN Stream-dwelling 22.347547 32.45383 29.00577 35.25302
Mixophyes iteratus Anura EN Stream-dwelling 20.917811 32.23966 28.90047 35.09538
Mixophyes iteratus Anura EN Stream-dwelling 24.665037 32.80099 29.33773 35.69929
Mixophyes hihihorlo Anura DD Ground-dwelling 27.414332 34.26024 30.28493 38.02029
Mixophyes hihihorlo Anura DD Ground-dwelling 26.588272 34.13699 30.14651 37.83486
Mixophyes hihihorlo Anura DD Ground-dwelling 29.236805 34.53215 30.73456 38.53138
Calyptocephalella gayi Anura VU Semi-aquatic 17.988099 35.40059 30.09608 41.09697
Calyptocephalella gayi Anura VU Semi-aquatic 16.085231 35.12224 29.97761 40.90306
Calyptocephalella gayi Anura VU Semi-aquatic 21.562559 35.92345 31.34021 42.31675
Telmatobufo bullocki Anura EN Stream-dwelling 17.747011 34.56221 29.26919 40.22557
Telmatobufo bullocki Anura EN Stream-dwelling 15.993370 34.30746 29.02944 39.98229
Telmatobufo bullocki Anura EN Stream-dwelling 21.273967 35.07457 29.75363 40.82780
Telmatobufo venustus Anura EN Stream-dwelling 15.450278 34.21796 28.42599 40.12130
Telmatobufo venustus Anura EN Stream-dwelling 13.417904 33.92514 28.16678 39.90663
Telmatobufo venustus Anura EN Stream-dwelling 20.886672 35.00121 29.11933 40.54603
Telmatobufo australis Anura LC Stream-dwelling 15.878790 34.26171 28.91393 40.71264
Telmatobufo australis Anura LC Stream-dwelling 13.758505 33.95485 28.61017 40.48049
Telmatobufo australis Anura LC Stream-dwelling 20.016717 34.86058 29.29007 41.11940
Adelphobates castaneoticus Anura LC Ground-dwelling 27.705562 36.41111 32.83848 40.55376
Adelphobates castaneoticus Anura LC Ground-dwelling 26.984020 36.30993 32.80688 40.50580
Adelphobates castaneoticus Anura LC Ground-dwelling 29.265903 36.62991 32.97258 40.79692
Adelphobates galactonotus Anura LC Ground-dwelling 27.829513 36.28643 32.07900 40.18042
Adelphobates galactonotus Anura LC Ground-dwelling 27.112522 36.18829 32.22677 40.30321
Adelphobates galactonotus Anura LC Ground-dwelling 29.441503 36.50708 32.18172 40.37281
Adelphobates quinquevittatus Anura LC Ground-dwelling 28.479833 36.55501 32.49208 39.85712
Adelphobates quinquevittatus Anura LC Ground-dwelling 27.709247 36.44761 32.42809 39.73057
Adelphobates quinquevittatus Anura LC Ground-dwelling 30.089914 36.77944 32.64051 40.14238
Dendrobates truncatus Anura LC Ground-dwelling 25.810177 35.98302 32.65971 39.20618
Dendrobates truncatus Anura LC Ground-dwelling 25.089176 35.88360 32.69212 39.20524
Dendrobates truncatus Anura LC Ground-dwelling 27.370746 36.19820 32.80784 39.45374
Dendrobates leucomelas Anura LC Ground-dwelling 26.798309 36.21944 32.59562 39.54060
Dendrobates leucomelas Anura LC Ground-dwelling 26.084568 36.12005 32.57215 39.48433
Dendrobates leucomelas Anura LC Ground-dwelling 28.325306 36.43206 32.85638 39.90847
Dendrobates tinctorius Anura LC Ground-dwelling 27.353690 36.23479 33.03350 40.21422
Dendrobates tinctorius Anura LC Ground-dwelling 26.739905 36.15030 33.02927 40.13859
Dendrobates tinctorius Anura LC Ground-dwelling 28.809912 36.43526 33.11012 40.40164
Dendrobates nubeculosus Anura DD Ground-dwelling 27.023773 36.22801 32.69094 39.71728
Dendrobates nubeculosus Anura DD Ground-dwelling 26.364103 36.13712 32.65671 39.66923
Dendrobates nubeculosus Anura DD Ground-dwelling 28.432172 36.42207 32.92957 39.95881
Oophaga vicentei Anura EN Arboreal 27.076166 34.01407 31.05287 36.99065
Oophaga vicentei Anura EN Arboreal 26.459668 33.92875 31.00479 36.89136
Oophaga vicentei Anura EN Arboreal 28.344435 34.18958 31.12002 37.20281
Oophaga sylvatica Anura NT Ground-dwelling 24.263679 34.03898 31.02473 36.96162
Oophaga sylvatica Anura NT Ground-dwelling 23.234930 33.89095 30.80174 36.72864
Oophaga sylvatica Anura NT Ground-dwelling 25.914935 34.27657 31.19737 37.24841
Oophaga occultator Anura CR Ground-dwelling 25.597617 34.13953 31.16740 37.34330
Oophaga occultator Anura CR Ground-dwelling 24.953236 34.04878 31.07422 37.20506
Oophaga occultator Anura CR Ground-dwelling 26.739957 34.30040 31.14760 37.37507
Oophaga granulifera Anura VU Ground-dwelling 25.400711 34.62454 31.29691 37.97425
Oophaga granulifera Anura VU Ground-dwelling 24.702420 34.52830 31.19092 37.86410
Oophaga granulifera Anura VU Ground-dwelling 26.627661 34.79366 31.43885 38.17341
Minyobates steyermarki Anura CR Arboreal 27.310817 36.41299 32.37966 40.56245
Minyobates steyermarki Anura CR Arboreal 26.682569 36.32563 32.36762 40.48211
Minyobates steyermarki Anura CR Arboreal 28.771641 36.61611 32.59259 40.89337
Andinobates altobueyensis Anura DD Ground-dwelling 26.557207 37.31174 33.65797 41.15724
Andinobates altobueyensis Anura DD Ground-dwelling 25.921998 37.22590 33.56012 41.05153
Andinobates altobueyensis Anura DD Ground-dwelling 27.873963 37.48968 33.83047 41.37637
Andinobates bombetes Anura VU Ground-dwelling 23.362438 36.90843 33.10151 40.78521
Andinobates bombetes Anura VU Ground-dwelling 22.562962 36.80009 32.99755 40.68591
Andinobates bombetes Anura VU Ground-dwelling 24.839549 37.10860 33.26529 40.96867
Andinobates tolimensis Anura VU Ground-dwelling 23.073459 36.88589 33.02308 40.60582
Andinobates tolimensis Anura VU Ground-dwelling 22.320721 36.78357 32.93950 40.48971
Andinobates tolimensis Anura VU Ground-dwelling 24.583693 37.09119 33.39446 41.01340
Andinobates virolinensis Anura VU Ground-dwelling 23.778204 36.95976 33.05651 40.83030
Andinobates virolinensis Anura VU Ground-dwelling 23.054804 36.86297 32.97376 40.71555
Andinobates virolinensis Anura VU Ground-dwelling 25.399391 37.17670 33.14729 40.99860
Andinobates opisthomelas Anura VU Ground-dwelling 24.617418 37.10621 32.91545 40.77926
Andinobates opisthomelas Anura VU Ground-dwelling 23.815290 36.99731 32.85602 40.69191
Andinobates opisthomelas Anura VU Ground-dwelling 26.081448 37.30497 33.12240 41.04234
Andinobates claudiae Anura DD Ground-dwelling 27.753723 37.43746 33.40244 41.45747
Andinobates claudiae Anura DD Ground-dwelling 27.190251 37.36135 33.34261 41.37828
Andinobates claudiae Anura DD Ground-dwelling 28.885900 37.59040 33.52264 41.65651
Andinobates minutus Anura LC Ground-dwelling 26.435461 37.24507 33.53531 41.09003
Andinobates minutus Anura LC Ground-dwelling 25.777337 37.15661 33.39361 40.90994
Andinobates minutus Anura LC Ground-dwelling 27.740983 37.42055 33.64959 41.29054
Andinobates daleswansoni Anura EN Ground-dwelling 24.023434 36.88066 33.06286 40.62497
Andinobates daleswansoni Anura EN Ground-dwelling 23.377045 36.79317 32.97969 40.52672
Andinobates daleswansoni Anura EN Ground-dwelling 25.418792 37.06953 33.21965 40.84679
Andinobates dorisswansonae Anura VU Ground-dwelling 23.073459 36.84616 33.00487 40.65440
Andinobates dorisswansonae Anura VU Ground-dwelling 22.320721 36.74239 32.89474 40.51274
Andinobates dorisswansonae Anura VU Ground-dwelling 24.583693 37.05435 32.90732 40.59466
Andinobates fulguritus Anura LC Ground-dwelling 26.159691 37.30840 33.42962 41.30409
Andinobates fulguritus Anura LC Ground-dwelling 25.489333 37.21802 32.98808 40.79168
Andinobates fulguritus Anura LC Ground-dwelling 27.493852 37.48826 33.40505 41.31525
Ranitomeya amazonica Anura DD Arboreal 27.813623 37.55259 33.87223 41.88042
Ranitomeya amazonica Anura DD Arboreal 27.086561 37.45407 33.75196 41.67275
Ranitomeya amazonica Anura DD Arboreal 29.154053 37.73422 33.61355 41.77050
Ranitomeya benedicta Anura VU Ground-dwelling 25.383775 37.40872 33.71150 41.17419
Ranitomeya benedicta Anura VU Ground-dwelling 24.727105 37.31790 33.51108 40.92515
Ranitomeya benedicta Anura VU Ground-dwelling 26.712434 37.59248 33.85294 41.40723
Ranitomeya fantastica Anura VU Arboreal 24.460869 37.07482 33.05149 40.76076
Ranitomeya fantastica Anura VU Arboreal 23.770824 36.98058 33.03068 40.75094
Ranitomeya fantastica Anura VU Arboreal 25.887710 37.26968 33.33448 41.03169
Ranitomeya summersi Anura EN Ground-dwelling 24.021783 37.14839 33.27010 40.64781
Ranitomeya summersi Anura EN Ground-dwelling 23.410536 37.06585 33.14486 40.49155
Ranitomeya summersi Anura EN Ground-dwelling 25.363768 37.32961 33.47787 40.94976
Ranitomeya reticulata Anura LC Ground-dwelling 27.157578 37.58199 34.00433 41.56884
Ranitomeya reticulata Anura LC Ground-dwelling 26.371019 37.47368 33.87794 41.42534
Ranitomeya reticulata Anura LC Ground-dwelling 28.646810 37.78707 34.02890 41.58493
Ranitomeya uakarii Anura LC Ground-dwelling 25.237949 37.35182 33.81188 41.28929
Ranitomeya uakarii Anura LC Ground-dwelling 24.505254 37.25099 33.73338 41.14597
Ranitomeya uakarii Anura LC Ground-dwelling 26.528797 37.52945 33.87249 41.44257
Ranitomeya ventrimaculata Anura LC Arboreal 27.848883 37.53703 33.44483 41.32554
Ranitomeya ventrimaculata Anura LC Arboreal 27.139249 37.44129 33.28694 41.14495
Ranitomeya ventrimaculata Anura LC Arboreal 29.360098 37.74093 33.53865 41.51554
Ranitomeya variabilis Anura DD Arboreal 24.344348 36.98080 32.98776 40.54552
Ranitomeya variabilis Anura DD Arboreal 23.718874 36.89689 32.92531 40.47550
Ranitomeya variabilis Anura DD Arboreal 25.665115 37.15800 33.36727 40.96332
Ranitomeya flavovittata Anura LC Arboreal 28.577810 37.85179 34.12725 41.46419
Ranitomeya flavovittata Anura LC Arboreal 27.842852 37.75054 34.01558 41.29271
Ranitomeya flavovittata Anura LC Arboreal 29.874090 38.03036 34.22213 41.59546
Ranitomeya vanzolinii Anura LC Arboreal 24.846715 37.28615 33.95789 41.30685
Ranitomeya vanzolinii Anura LC Arboreal 24.150535 37.19224 33.99611 41.34194
Ranitomeya vanzolinii Anura LC Arboreal 26.088358 37.45365 33.98755 41.35129
Ranitomeya imitator Anura LC Arboreal 25.003805 37.29341 33.59714 40.89953
Ranitomeya imitator Anura LC Arboreal 24.325970 37.20124 33.53343 40.84403
Ranitomeya imitator Anura LC Arboreal 26.389385 37.48180 33.77044 41.14108
Excidobates captivus Anura VU Stream-dwelling 24.641712 36.21136 32.74046 40.04692
Excidobates captivus Anura VU Stream-dwelling 23.801243 36.09689 32.71189 39.92926
Excidobates captivus Anura VU Stream-dwelling 26.321295 36.44010 32.66095 40.05540
Excidobates mysteriosus Anura EN Arboreal 22.164010 36.30799 32.69987 40.28308
Excidobates mysteriosus Anura EN Arboreal 21.259620 36.18429 32.68353 40.28854
Excidobates mysteriosus Anura EN Arboreal 23.969227 36.55492 32.92553 40.62075
Phyllobates aurotaenia Anura LC Ground-dwelling 25.603259 36.77277 32.46459 40.72775
Phyllobates aurotaenia Anura LC Ground-dwelling 24.897882 36.67687 32.35991 40.60835
Phyllobates aurotaenia Anura LC Ground-dwelling 26.964915 36.95789 32.57638 40.97765
Phyllobates terribilis Anura EN Ground-dwelling 25.849112 36.86057 32.87274 41.26156
Phyllobates terribilis Anura EN Ground-dwelling 25.206177 36.77020 32.93602 41.32570
Phyllobates terribilis Anura EN Ground-dwelling 27.028950 37.02641 33.04696 41.41911
Phyllobates bicolor Anura EN Ground-dwelling 24.872899 36.63482 32.08500 40.59020
Phyllobates bicolor Anura EN Ground-dwelling 24.153339 36.53677 32.05564 40.53014
Phyllobates bicolor Anura EN Ground-dwelling 26.181845 36.81319 32.19779 40.75063
Phyllobates lugubris Anura LC Ground-dwelling 26.338311 36.92181 32.71173 40.97155
Phyllobates lugubris Anura LC Ground-dwelling 25.658948 36.82804 32.56637 40.81946
Phyllobates lugubris Anura LC Ground-dwelling 27.617273 37.09834 32.83663 41.11256
Phyllobates vittatus Anura VU Stream-dwelling 23.779541 35.94489 31.57088 40.22381
Phyllobates vittatus Anura VU Stream-dwelling 23.011027 35.83933 31.41820 40.09785
Phyllobates vittatus Anura VU Stream-dwelling 25.105183 36.12698 31.76350 40.46068
Hyloxalus aeruginosus Anura DD Stream-dwelling 20.305860 35.63767 31.60179 39.58739
Hyloxalus aeruginosus Anura DD Stream-dwelling 19.198666 35.48755 31.53302 39.48819
Hyloxalus aeruginosus Anura DD Stream-dwelling 22.523955 35.93841 31.77066 39.79775
Hyloxalus anthracinus Anura CR Ground-dwelling 20.535827 36.21121 32.20982 40.39386
Hyloxalus anthracinus Anura CR Ground-dwelling 18.480343 35.93475 32.14254 40.20558
Hyloxalus anthracinus Anura CR Ground-dwelling 23.090691 36.55483 32.56725 40.78049
Hyloxalus awa Anura LC Ground-dwelling 23.817831 36.95002 34.05913 40.16874
Hyloxalus awa Anura LC Ground-dwelling 22.642589 36.79159 34.06588 40.08952
Hyloxalus awa Anura LC Ground-dwelling 25.673478 37.20016 34.23382 40.40416
Hyloxalus azureiventris Anura EN Ground-dwelling 24.344348 36.84605 33.26462 41.25748
Hyloxalus azureiventris Anura EN Ground-dwelling 23.718874 36.76044 33.17247 41.17469
Hyloxalus azureiventris Anura EN Ground-dwelling 25.665115 37.02681 33.33391 41.39456
Hyloxalus chlorocraspedus Anura DD Arboreal 25.932989 36.86388 33.10599 41.18882
Hyloxalus chlorocraspedus Anura DD Arboreal 25.330486 36.78269 33.03446 41.07318
Hyloxalus chlorocraspedus Anura DD Arboreal 27.081686 37.01866 33.08844 41.31549
Hyloxalus betancuri Anura DD Stream-dwelling 25.746102 36.36829 32.26257 39.79342
Hyloxalus betancuri Anura DD Stream-dwelling 24.994043 36.26780 32.24918 39.79453
Hyloxalus betancuri Anura DD Stream-dwelling 26.951857 36.52942 32.42981 40.09054
Hyloxalus sauli Anura LC Ground-dwelling 24.741534 37.59176 34.52059 41.23736
Hyloxalus sauli Anura LC Ground-dwelling 23.892298 37.47744 34.43138 41.08925
Hyloxalus sauli Anura LC Ground-dwelling 26.304859 37.80219 34.79983 41.57131
Hyloxalus borjai Anura DD Stream-dwelling 21.959825 35.87948 31.62809 40.00521
Hyloxalus borjai Anura DD Stream-dwelling 20.686309 35.70505 31.58862 39.89556
Hyloxalus borjai Anura DD Stream-dwelling 23.846526 36.13791 31.79019 40.20114
Hyloxalus breviquartus Anura LC Ground-dwelling 23.745967 36.71951 32.46973 40.63417
Hyloxalus breviquartus Anura LC Ground-dwelling 22.866727 36.59808 32.32579 40.47141
Hyloxalus breviquartus Anura LC Ground-dwelling 25.305233 36.93486 32.58445 40.77341
Hyloxalus cevallosi Anura EN Ground-dwelling 25.453202 36.90090 32.71613 40.54998
Hyloxalus cevallosi Anura EN Ground-dwelling 24.665251 36.79430 32.60124 40.42119
Hyloxalus cevallosi Anura EN Ground-dwelling 26.933381 37.10114 33.35615 41.20719
Hyloxalus chocoensis Anura EN Ground-dwelling 25.302234 37.02431 33.35094 41.54058
Hyloxalus chocoensis Anura EN Ground-dwelling 24.581574 36.92438 33.28902 41.42489
Hyloxalus chocoensis Anura EN Ground-dwelling 26.663928 37.21312 32.74380 41.00212
Hyloxalus craspedoceps Anura DD Stream-dwelling 24.021783 36.12185 32.35665 40.45448
Hyloxalus craspedoceps Anura DD Stream-dwelling 23.410536 36.03684 32.26488 40.33839
Hyloxalus craspedoceps Anura DD Stream-dwelling 25.363768 36.30850 32.62911 40.75591
Hyloxalus delatorreae Anura CR Stream-dwelling 20.556552 35.63501 31.64333 39.45199
Hyloxalus delatorreae Anura CR Stream-dwelling 18.946918 35.41296 31.58816 39.39713
Hyloxalus delatorreae Anura CR Stream-dwelling 22.778661 35.94155 32.04914 39.90634
Hyloxalus eleutherodactylus Anura DD Stream-dwelling 24.021783 36.18138 31.78435 39.93197
Hyloxalus eleutherodactylus Anura DD Stream-dwelling 23.410536 36.09818 31.72103 39.84180
Hyloxalus eleutherodactylus Anura DD Stream-dwelling 25.363768 36.36403 31.92136 40.10099
Hyloxalus exasperatus Anura DD Ground-dwelling 23.049225 36.78704 32.66011 40.70620
Hyloxalus exasperatus Anura DD Ground-dwelling 21.493692 36.56956 32.40662 40.36032
Hyloxalus exasperatus Anura DD Ground-dwelling 25.325715 37.10532 32.95240 41.17287
Hyloxalus excisus Anura DD Semi-aquatic 21.959825 36.78240 33.08352 40.57083
Hyloxalus excisus Anura DD Semi-aquatic 20.686309 36.60481 32.99124 40.43996
Hyloxalus excisus Anura DD Semi-aquatic 23.846526 37.04550 33.35383 40.84183
Hyloxalus faciopunctulatus Anura DD Ground-dwelling 29.099921 37.52373 33.32273 41.13541
Hyloxalus faciopunctulatus Anura DD Ground-dwelling 28.343957 37.42136 33.21370 40.99622
Hyloxalus faciopunctulatus Anura DD Ground-dwelling 30.693206 37.73948 33.51891 41.52323
Hyloxalus fallax Anura DD Ground-dwelling 25.005479 36.96667 33.08033 41.00228
Hyloxalus fallax Anura DD Ground-dwelling 23.606320 36.77603 32.87668 40.74253
Hyloxalus fallax Anura DD Ground-dwelling 26.955510 37.23237 33.11741 41.08267
Hyloxalus fascianigrus Anura VU Ground-dwelling 24.810914 36.96066 33.07127 41.00770
Hyloxalus fascianigrus Anura VU Ground-dwelling 24.108127 36.86396 33.01876 40.92914
Hyloxalus fascianigrus Anura VU Ground-dwelling 26.070488 37.13395 33.25575 41.25849
Hyloxalus fuliginosus Anura DD Stream-dwelling 23.546002 36.13306 32.83044 40.57450
Hyloxalus fuliginosus Anura DD Stream-dwelling 22.594071 36.00346 32.71023 40.42751
Hyloxalus fuliginosus Anura DD Stream-dwelling 25.371396 36.38157 32.81951 40.59317
Hyloxalus idiomelus Anura DD Stream-dwelling 21.422387 35.87937 32.04961 39.77419
Hyloxalus idiomelus Anura DD Stream-dwelling 20.467645 35.75014 31.87296 39.60799
Hyloxalus idiomelus Anura DD Stream-dwelling 23.163460 36.11503 32.29642 40.14471
Hyloxalus infraguttatus Anura NT Ground-dwelling 24.385251 36.95080 32.73133 40.67212
Hyloxalus infraguttatus Anura NT Ground-dwelling 23.291528 36.79911 32.53004 40.49153
Hyloxalus infraguttatus Anura NT Ground-dwelling 26.265697 37.21159 32.88823 40.98930
Hyloxalus insulatus Anura VU Stream-dwelling 22.228727 35.95817 32.20217 40.01458
Hyloxalus insulatus Anura VU Stream-dwelling 21.440334 35.84849 31.77516 39.57526
Hyloxalus insulatus Anura VU Stream-dwelling 23.646201 36.15536 32.37291 40.17216
Hyloxalus lehmanni Anura NT Ground-dwelling 23.776868 36.73800 32.74674 40.37959
Hyloxalus lehmanni Anura NT Ground-dwelling 22.778050 36.60233 32.58758 40.13149
Hyloxalus lehmanni Anura NT Ground-dwelling 25.381163 36.95592 33.04913 40.76617
Hyloxalus leucophaeus Anura DD Stream-dwelling 22.538913 35.94931 32.35179 40.37398
Hyloxalus leucophaeus Anura DD Stream-dwelling 21.736625 35.84022 32.23568 40.26632
Hyloxalus leucophaeus Anura DD Stream-dwelling 23.802966 36.12119 32.53473 40.57362
Hyloxalus sordidatus Anura DD Stream-dwelling 22.722179 35.95402 31.79165 39.68561
Hyloxalus sordidatus Anura DD Stream-dwelling 21.916600 35.84408 31.71966 39.59345
Hyloxalus sordidatus Anura DD Stream-dwelling 24.276297 36.16610 32.21952 40.15643
Hyloxalus littoralis Anura LC Ground-dwelling 20.979647 36.51212 33.17944 40.89856
Hyloxalus littoralis Anura LC Ground-dwelling 20.005122 36.38141 33.07480 40.74551
Hyloxalus littoralis Anura LC Ground-dwelling 22.897432 36.76934 33.30089 41.11539
Hyloxalus mittermeieri Anura DD Stream-dwelling 20.305860 35.62245 31.68054 39.62248
Hyloxalus mittermeieri Anura DD Stream-dwelling 19.198666 35.47224 31.72086 39.71707
Hyloxalus mittermeieri Anura DD Stream-dwelling 22.523955 35.92339 31.96472 40.01773
Hyloxalus mystax Anura DD Stream-dwelling 25.562622 36.38543 32.05814 40.02551
Hyloxalus mystax Anura DD Stream-dwelling 24.507041 36.24339 32.01719 39.95272
Hyloxalus mystax Anura DD Stream-dwelling 27.560739 36.65431 32.34437 40.41202
Hyloxalus parcus Anura DD Stream-dwelling 24.698762 36.30763 32.26067 40.18116
Hyloxalus parcus Anura DD Stream-dwelling 23.813822 36.18705 32.17773 40.08947
Hyloxalus parcus Anura DD Stream-dwelling 26.444972 36.54558 32.39591 40.31849
Hyloxalus patitae Anura DD Stream-dwelling 22.618688 36.03421 31.89944 40.19713
Hyloxalus patitae Anura DD Stream-dwelling 21.958574 35.94501 31.81563 40.08414
Hyloxalus patitae Anura DD Stream-dwelling 23.898670 36.20718 32.03274 40.38357
Hyloxalus pinguis Anura EN Ground-dwelling 22.833468 36.62174 32.67717 40.37324
Hyloxalus pinguis Anura EN Ground-dwelling 21.394430 36.42485 32.45979 40.16636
Hyloxalus pinguis Anura EN Ground-dwelling 24.669687 36.87298 32.87087 40.70549
Hyloxalus pulcherrimus Anura DD Stream-dwelling 21.108641 35.66594 31.57655 39.62284
Hyloxalus pulcherrimus Anura DD Stream-dwelling 20.363794 35.56513 31.37124 39.43775
Hyloxalus pulcherrimus Anura DD Stream-dwelling 22.363404 35.83574 31.68928 39.78582
Hyloxalus pumilus Anura DD Stream-dwelling 25.562622 36.38086 32.49746 40.52615
Hyloxalus pumilus Anura DD Stream-dwelling 24.507041 36.23671 32.28630 40.32618
Hyloxalus pumilus Anura DD Stream-dwelling 27.560739 36.65371 32.39177 40.54525
Hyloxalus ramosi Anura EN Ground-dwelling 23.687173 36.78483 32.86605 40.85935
Hyloxalus ramosi Anura EN Ground-dwelling 22.753999 36.65853 32.85121 40.75408
Hyloxalus ramosi Anura EN Ground-dwelling 25.296937 37.00270 32.95540 40.95070
Hyloxalus ruizi Anura CR Ground-dwelling 24.790993 36.88748 33.10651 40.85164
Hyloxalus ruizi Anura CR Ground-dwelling 24.132263 36.79796 32.97995 40.72012
Hyloxalus ruizi Anura CR Ground-dwelling 26.160418 37.07357 33.34885 41.12052
Hyloxalus saltuarius Anura DD Ground-dwelling 25.253417 37.08809 33.28325 41.23321
Hyloxalus saltuarius Anura DD Ground-dwelling 24.621379 37.00188 33.22187 41.13985
Hyloxalus saltuarius Anura DD Ground-dwelling 26.713953 37.28730 33.45743 41.48146
Hyloxalus shuar Anura NT Ground-dwelling 23.752163 36.80813 32.41104 40.80419
Hyloxalus shuar Anura NT Ground-dwelling 22.478259 36.63300 32.43206 40.73666
Hyloxalus shuar Anura NT Ground-dwelling 25.717108 37.07828 32.61620 41.08668
Hyloxalus spilotogaster Anura DD Ground-dwelling 24.022160 36.74925 32.86647 40.73685
Hyloxalus spilotogaster Anura DD Ground-dwelling 23.320574 36.65327 32.89265 40.68839
Hyloxalus spilotogaster Anura DD Ground-dwelling 25.414498 36.93975 33.11338 41.03046
Hyloxalus subpunctatus Anura LC Ground-dwelling 22.992371 36.64562 32.38844 40.32590
Hyloxalus subpunctatus Anura LC Ground-dwelling 22.118649 36.52730 32.32800 40.24245
Hyloxalus subpunctatus Anura LC Ground-dwelling 24.751450 36.88383 32.45637 40.54606
Hyloxalus sylvaticus Anura EN Stream-dwelling 22.602751 35.95868 31.65177 39.71253
Hyloxalus sylvaticus Anura EN Stream-dwelling 21.868814 35.85967 31.59231 39.64662
Hyloxalus sylvaticus Anura EN Stream-dwelling 24.173626 36.17062 31.86257 39.92873
Hyloxalus utcubambensis Anura DD Ground-dwelling 21.823777 36.44674 32.55541 40.23545
Hyloxalus utcubambensis Anura DD Ground-dwelling 21.050210 36.34131 32.49454 40.16743
Hyloxalus utcubambensis Anura DD Ground-dwelling 23.083185 36.61840 32.73105 40.42206
Hyloxalus vergeli Anura VU Ground-dwelling 22.708986 36.76823 32.70850 40.69548
Hyloxalus vergeli Anura VU Ground-dwelling 21.862202 36.65463 32.60011 40.52534
Hyloxalus vergeli Anura VU Ground-dwelling 24.338987 36.98690 32.68426 40.75847
Ameerega rubriventris Anura EN Ground-dwelling 23.535775 37.82356 34.33977 41.00104
Ameerega rubriventris Anura EN Ground-dwelling 22.914830 37.73847 34.12721 40.72563
Ameerega rubriventris Anura EN Ground-dwelling 24.751708 37.99019 34.06859 40.76637
Ameerega macero Anura LC Ground-dwelling 23.100063 37.77731 34.57354 40.97454
Ameerega macero Anura LC Ground-dwelling 22.432701 37.68597 34.52937 40.91931
Ameerega macero Anura LC Ground-dwelling 24.227672 37.93165 34.64815 41.02200
Ameerega bassleri Anura VU Ground-dwelling 23.605042 37.78972 34.74204 41.09825
Ameerega bassleri Anura VU Ground-dwelling 22.870243 37.68965 34.57796 40.94740
Ameerega bassleri Anura VU Ground-dwelling 25.057733 37.98756 34.91698 41.40444
Ameerega berohoka Anura LC Ground-dwelling 27.567874 38.41479 35.38922 41.87919
Ameerega berohoka Anura LC Ground-dwelling 26.461140 38.26392 35.25337 41.68336
Ameerega berohoka Anura LC Ground-dwelling 29.685594 38.70348 35.45957 41.97950
Ameerega bilinguis Anura LC Ground-dwelling 26.506009 38.24359 34.88825 41.55929
Ameerega bilinguis Anura LC Ground-dwelling 25.685729 38.12880 34.80892 41.47312
Ameerega bilinguis Anura LC Ground-dwelling 28.018111 38.45519 35.11213 41.86163
Ameerega boliviana Anura NT Ground-dwelling 20.052093 37.37992 34.37928 40.96969
Ameerega boliviana Anura NT Ground-dwelling 19.244638 37.27035 34.23759 40.80155
Ameerega boliviana Anura NT Ground-dwelling 21.354360 37.55662 34.57087 41.20762
Ameerega braccata Anura LC Ground-dwelling 27.974622 38.45621 34.95891 41.66494
Ameerega braccata Anura LC Ground-dwelling 26.936676 38.31467 34.67935 41.34194
Ameerega braccata Anura LC Ground-dwelling 30.111574 38.74761 35.13168 42.03216
Ameerega flavopicta Anura LC Stream-dwelling 26.738666 37.68896 34.35287 40.92605
Ameerega flavopicta Anura LC Stream-dwelling 25.677939 37.54108 34.26131 40.75048
Ameerega flavopicta Anura LC Stream-dwelling 28.834142 37.98111 34.48005 41.33119
Ameerega cainarachi Anura EN Stream-dwelling 24.326099 37.40107 34.06309 41.15088
Ameerega cainarachi Anura EN Stream-dwelling 23.709835 37.31578 34.09700 41.16245
Ameerega cainarachi Anura EN Stream-dwelling 25.613448 37.57921 34.36375 41.41866
Ameerega smaragdina Anura DD Ground-dwelling 21.012652 37.53030 34.42801 40.80297
Ameerega smaragdina Anura DD Ground-dwelling 20.177954 37.41606 34.26364 40.57620
Ameerega smaragdina Anura DD Ground-dwelling 22.689323 37.75975 34.46013 40.97277
Ameerega petersi Anura LC Ground-dwelling 24.417577 38.01033 34.62243 41.19236
Ameerega petersi Anura LC Ground-dwelling 23.770082 37.92172 34.55357 41.09793
Ameerega petersi Anura LC Ground-dwelling 25.666806 38.18127 34.75814 41.44594
Ameerega picta Anura LC Ground-dwelling 27.460103 38.49244 35.31266 41.71293
Ameerega picta Anura LC Ground-dwelling 26.640599 38.38044 35.26109 41.63907
Ameerega picta Anura LC Ground-dwelling 29.163633 38.72525 35.61547 42.15916
Ameerega parvula Anura LC Ground-dwelling 26.302450 38.19039 34.96175 41.30982
Ameerega parvula Anura LC Ground-dwelling 25.405835 38.06731 34.93474 41.21938
Ameerega parvula Anura LC Ground-dwelling 27.946405 38.41606 35.08991 41.56734
Ameerega pongoensis Anura VU Stream-dwelling 24.892541 37.38435 34.21730 40.79298
Ameerega pongoensis Anura VU Stream-dwelling 24.256721 37.29723 33.99164 40.51863
Ameerega pongoensis Anura VU Stream-dwelling 26.202237 37.56379 34.52299 41.19865
Ameerega planipaleae Anura CR Stream-dwelling 21.012652 36.90404 34.11992 40.47065
Ameerega planipaleae Anura CR Stream-dwelling 20.177954 36.78881 34.01303 40.40175
Ameerega planipaleae Anura CR Stream-dwelling 22.689323 37.13549 34.25266 40.70333
Ameerega pulchripecta Anura LC Ground-dwelling 27.236622 38.42390 35.38399 41.54282
Ameerega pulchripecta Anura LC Ground-dwelling 26.690475 38.34981 35.33759 41.44883
Ameerega pulchripecta Anura LC Ground-dwelling 28.461765 38.59009 35.46053 41.62603
Ameerega simulans Anura LC Ground-dwelling 20.601790 37.45839 33.90142 40.44266
Ameerega simulans Anura LC Ground-dwelling 19.671627 37.33061 33.83500 40.34065
Ameerega simulans Anura LC Ground-dwelling 21.694986 37.60857 34.11307 40.61028
Ameerega yungicola Anura LC Ground-dwelling 20.079143 37.35963 33.98331 40.44131
Ameerega yungicola Anura LC Ground-dwelling 19.323211 37.25684 33.88976 40.35762
Ameerega yungicola Anura LC Ground-dwelling 21.365322 37.53452 34.10997 40.54595
Ameerega silverstonei Anura EN Ground-dwelling 23.837271 37.76954 34.56228 40.94640
Ameerega silverstonei Anura EN Ground-dwelling 23.193486 37.68332 34.32335 40.68745
Ameerega silverstonei Anura EN Ground-dwelling 25.205765 37.95282 34.61705 41.04417
Colostethus agilis Anura EN Stream-dwelling 24.316552 36.39590 32.43834 40.63692
Colostethus agilis Anura EN Stream-dwelling 23.429703 36.27143 32.30751 40.42396
Colostethus agilis Anura EN Stream-dwelling 25.720288 36.59290 32.60342 40.86723
Colostethus furviventris Anura DD Ground-dwelling 25.746102 37.30187 33.71436 41.06484
Colostethus furviventris Anura DD Ground-dwelling 24.994043 37.19828 33.47241 40.77371
Colostethus furviventris Anura DD Ground-dwelling 26.951857 37.46794 33.80547 41.17187
Colostethus imbricolus Anura EN Stream-dwelling 26.040462 36.67459 32.67524 40.48364
Colostethus imbricolus Anura EN Stream-dwelling 25.341635 36.58136 32.78186 40.56290
Colostethus imbricolus Anura EN Stream-dwelling 27.430096 36.85999 32.97760 40.81750
Colostethus inguinalis Anura LC Stream-dwelling 25.982879 36.62933 33.01655 40.98167
Colostethus inguinalis Anura LC Stream-dwelling 25.304070 36.53709 33.04373 40.93085
Colostethus inguinalis Anura LC Stream-dwelling 27.324883 36.81169 33.10582 41.17036
Colostethus panamansis Anura LC Stream-dwelling 27.055383 36.85483 32.96832 40.92519
Colostethus panamansis Anura LC Stream-dwelling 26.468504 36.77426 32.79705 40.77737
Colostethus panamansis Anura LC Stream-dwelling 28.278097 37.02268 33.14970 41.05871
Colostethus latinasus Anura CR Stream-dwelling 26.181906 36.60492 32.36351 40.46486
Colostethus latinasus Anura CR Stream-dwelling 25.505355 36.51078 32.31918 40.39347
Colostethus latinasus Anura CR Stream-dwelling 27.570562 36.79813 32.71525 40.88669
Colostethus pratti Anura LC Ground-dwelling 26.946339 37.37681 33.09772 41.24893
Colostethus pratti Anura LC Ground-dwelling 26.313464 37.28975 33.01617 41.13554
Colostethus pratti Anura LC Ground-dwelling 28.198882 37.54910 33.15508 41.33712
Colostethus lynchi Anura DD Stream-dwelling 25.952777 36.67182 32.22017 40.28211
Colostethus lynchi Anura DD Stream-dwelling 25.296430 36.58120 32.12768 40.15552
Colostethus lynchi Anura DD Stream-dwelling 27.263195 36.85274 32.70109 40.84360
Colostethus mertensi Anura VU Stream-dwelling 22.768671 36.18303 32.32186 40.33596
Colostethus mertensi Anura VU Stream-dwelling 21.751043 36.04383 32.22091 40.16633
Colostethus mertensi Anura VU Stream-dwelling 24.401367 36.40636 32.76186 40.88896
Colostethus poecilonotus Anura DD Stream-dwelling 20.305860 35.81731 31.86562 39.56176
Colostethus poecilonotus Anura DD Stream-dwelling 19.198666 35.66549 31.77027 39.42355
Colostethus poecilonotus Anura DD Stream-dwelling 22.523955 36.12144 31.99868 39.80892
Colostethus ruthveni Anura NT Ground-dwelling 26.756267 37.34223 33.59395 42.01331
Colostethus ruthveni Anura NT Ground-dwelling 25.955280 37.23342 33.08536 41.45838
Colostethus ruthveni Anura NT Ground-dwelling 28.451154 37.57249 33.72505 42.23356
Colostethus thorntoni Anura VU Stream-dwelling 23.499493 36.31618 32.09565 39.93106
Colostethus thorntoni Anura VU Stream-dwelling 22.573781 36.18637 32.01860 39.82937
Colostethus thorntoni Anura VU Stream-dwelling 25.034323 36.53140 32.16462 40.07510
Colostethus ucumari Anura EN Stream-dwelling 21.124264 35.91798 32.15080 40.09177
Colostethus ucumari Anura EN Stream-dwelling 20.218761 35.79310 32.00806 39.91885
Colostethus ucumari Anura EN Stream-dwelling 22.820677 36.15193 32.46600 40.49602
Epipedobates narinensis Anura DD Ground-dwelling 25.496327 38.32718 35.72023 40.72854
Epipedobates narinensis Anura DD Ground-dwelling 24.785097 38.23002 35.65408 40.60330
Epipedobates narinensis Anura DD Ground-dwelling 26.774574 38.50179 35.83237 41.00069
Silverstoneia erasmios Anura EN Ground-dwelling 24.913367 37.80064 34.37137 41.21328
Silverstoneia erasmios Anura EN Ground-dwelling 24.197155 37.70245 34.31128 41.10446
Silverstoneia erasmios Anura EN Ground-dwelling 26.314412 37.99272 34.52811 41.48936
Silverstoneia flotator Anura LC Ground-dwelling 26.678667 37.98109 34.55750 41.54717
Silverstoneia flotator Anura LC Ground-dwelling 26.052883 37.89734 34.34482 41.29319
Silverstoneia flotator Anura LC Ground-dwelling 27.905836 38.14534 34.69035 41.73935
Silverstoneia nubicola Anura VU Ground-dwelling 26.340464 38.01298 34.43087 41.56825
Silverstoneia nubicola Anura VU Ground-dwelling 25.691292 37.92380 34.32883 41.43749
Silverstoneia nubicola Anura VU Ground-dwelling 27.632735 38.19051 34.57332 41.75456
Allobates algorei Anura NT Ground-dwelling 24.535906 37.00980 32.84743 40.99107
Allobates algorei Anura NT Ground-dwelling 23.638196 36.88717 32.79229 40.90561
Allobates algorei Anura NT Ground-dwelling 26.090234 37.22212 32.97898 41.19885
Allobates bromelicola Anura VU Ground-dwelling 26.826561 37.38646 33.31057 41.75527
Allobates bromelicola Anura VU Ground-dwelling 26.155457 37.29429 32.88163 41.28816
Allobates bromelicola Anura VU Ground-dwelling 28.382836 37.60019 33.47817 41.97785
Allobates brunneus Anura LC Ground-dwelling 28.120738 37.56653 33.64603 41.99768
Allobates brunneus Anura LC Ground-dwelling 27.396328 37.46635 33.40070 41.69869
Allobates brunneus Anura LC Ground-dwelling 29.730662 37.78918 33.94244 42.33573
Allobates crombiei Anura LC Ground-dwelling 27.961768 37.41198 33.43891 41.57247
Allobates crombiei Anura LC Ground-dwelling 27.157145 37.30256 33.40116 41.42773
Allobates crombiei Anura LC Ground-dwelling 29.679512 37.64559 33.73279 41.97756
Allobates caeruleodactylus Anura DD Ground-dwelling 28.573192 37.62994 33.37344 41.55880
Allobates caeruleodactylus Anura DD Ground-dwelling 27.880860 37.53353 33.19851 41.34664
Allobates caeruleodactylus Anura DD Ground-dwelling 30.219675 37.85922 33.65580 41.89507
Allobates caribe Anura CR Ground-dwelling 26.880586 37.36582 33.22132 41.30783
Allobates caribe Anura CR Ground-dwelling 26.247396 37.27899 33.20747 41.26243
Allobates caribe Anura CR Ground-dwelling 28.358386 37.56849 33.51599 41.55898
Allobates chalcopis Anura CR Ground-dwelling 27.218899 37.52366 33.62247 41.52884
Allobates chalcopis Anura CR Ground-dwelling 26.729963 37.45580 33.57367 41.46621
Allobates chalcopis Anura CR Ground-dwelling 28.004252 37.63266 33.66128 41.66786
Allobates subfolionidificans Anura VU Ground-dwelling 29.482752 37.31461 34.11831 40.66989
Allobates subfolionidificans Anura VU Ground-dwelling 28.433878 37.16819 33.93377 40.40296
Allobates subfolionidificans Anura VU Ground-dwelling 31.290311 37.56694 34.36353 41.05118
Allobates fratisenescus Anura VU Ground-dwelling 24.284469 36.95366 32.98743 41.30947
Allobates fratisenescus Anura VU Ground-dwelling 23.142847 36.79594 32.78549 41.04125
Allobates fratisenescus Anura VU Ground-dwelling 26.108177 37.20563 33.17860 41.54134
Allobates fuscellus Anura DD Ground-dwelling 28.852832 37.66544 33.86497 42.20445
Allobates fuscellus Anura DD Ground-dwelling 28.070421 37.55802 33.70369 42.04961
Allobates fuscellus Anura DD Ground-dwelling 30.450612 37.88481 34.09141 42.52116
Allobates gasconi Anura DD Ground-dwelling 28.506417 37.54026 33.70918 42.00180
Allobates gasconi Anura DD Ground-dwelling 27.726622 37.43224 33.44224 41.73658
Allobates gasconi Anura DD Ground-dwelling 30.044050 37.75326 33.76570 42.13545
Allobates marchesianus Anura LC Ground-dwelling 28.102613 37.59663 33.67477 41.74883
Allobates marchesianus Anura LC Ground-dwelling 27.357098 37.49360 33.49514 41.56557
Allobates marchesianus Anura LC Ground-dwelling 29.698989 37.81725 33.84027 41.94906
Allobates goianus Anura DD Ground-dwelling 26.424331 37.30238 33.76310 41.74060
Allobates goianus Anura DD Ground-dwelling 25.171885 37.13109 32.94268 40.86211
Allobates goianus Anura DD Ground-dwelling 28.607335 37.60093 33.83426 42.03402
Allobates granti Anura LC Ground-dwelling 27.280786 37.40325 32.85119 41.14244
Allobates granti Anura LC Ground-dwelling 26.673692 37.32138 32.84639 41.05673
Allobates granti Anura LC Ground-dwelling 28.905770 37.62240 33.01664 41.41493
Allobates ornatus Anura DD Ground-dwelling 24.021783 37.01908 33.04931 40.72132
Allobates ornatus Anura DD Ground-dwelling 23.410536 36.93493 32.95916 40.64463
Allobates ornatus Anura DD Ground-dwelling 25.363768 37.20382 33.20018 40.89352
Allobates humilis Anura EN Ground-dwelling 26.672843 37.25137 33.11506 41.10297
Allobates humilis Anura EN Ground-dwelling 25.823888 37.13595 32.97365 40.96810
Allobates humilis Anura EN Ground-dwelling 28.219786 37.46168 33.32526 41.29705
Allobates pittieri Anura LC Ground-dwelling 26.290122 37.21045 33.03423 41.21917
Allobates pittieri Anura LC Ground-dwelling 25.564104 37.11031 32.86722 41.04775
Allobates pittieri Anura LC Ground-dwelling 27.729306 37.40898 33.03493 41.27875
Allobates juanii Anura EN Ground-dwelling 23.210805 36.83465 32.71188 40.38823
Allobates juanii Anura EN Ground-dwelling 22.314408 36.71240 32.58716 40.21583
Allobates juanii Anura EN Ground-dwelling 24.894311 37.06424 32.93607 40.71756
Allobates kingsburyi Anura EN Ground-dwelling 22.772920 36.82553 32.83511 40.53236
Allobates kingsburyi Anura EN Ground-dwelling 21.184011 36.60717 32.72617 40.43432
Allobates kingsburyi Anura EN Ground-dwelling 24.943916 37.12390 33.41956 41.19098
Allobates mandelorum Anura EN Ground-dwelling 27.030356 37.45167 33.20831 41.23980
Allobates mandelorum Anura EN Ground-dwelling 26.334644 37.35609 33.20126 41.12757
Allobates mandelorum Anura EN Ground-dwelling 28.598041 37.66706 33.58803 41.73559
Allobates masniger Anura DD Ground-dwelling 27.678760 37.53839 33.47501 41.70541
Allobates masniger Anura DD Ground-dwelling 26.997061 37.44385 33.66088 41.83909
Allobates masniger Anura DD Ground-dwelling 29.360599 37.77165 33.55531 41.83273
Allobates nidicola Anura DD Ground-dwelling 28.504213 37.57377 33.41396 41.92583
Allobates nidicola Anura DD Ground-dwelling 27.793841 37.47584 33.28554 41.76399
Allobates nidicola Anura DD Ground-dwelling 30.186407 37.80566 33.58163 42.15036
Allobates melanolaemus Anura LC Ground-dwelling 28.932901 37.61452 33.46802 41.63473
Allobates melanolaemus Anura LC Ground-dwelling 28.139204 37.50727 33.40975 41.54100
Allobates melanolaemus Anura LC Ground-dwelling 30.390737 37.81152 33.51329 41.70618
Allobates myersi Anura LC Ground-dwelling 28.195502 37.60193 33.55179 41.41558
Allobates myersi Anura LC Ground-dwelling 27.472395 37.50191 33.50412 41.34374
Allobates myersi Anura LC Ground-dwelling 29.709770 37.81140 33.73282 41.67804
Allobates niputidea Anura LC Ground-dwelling 26.150164 37.31785 33.56691 41.66229
Allobates niputidea Anura LC Ground-dwelling 25.425303 37.21881 33.41468 41.57081
Allobates niputidea Anura LC Ground-dwelling 27.723564 37.53284 33.66255 41.84191
Allobates olfersioides Anura VU Ground-dwelling 25.309400 36.97433 33.05404 41.02138
Allobates olfersioides Anura VU Ground-dwelling 24.379212 36.84969 32.90139 40.85285
Allobates olfersioides Anura VU Ground-dwelling 26.992015 37.19978 33.21865 41.31198
Allobates paleovarzensis Anura NT Ground-dwelling 28.491840 37.64343 33.24550 41.78715
Allobates paleovarzensis Anura NT Ground-dwelling 27.796802 37.54814 32.82579 41.36240
Allobates paleovarzensis Anura NT Ground-dwelling 30.022806 37.85332 33.35543 42.04052
Allobates sumtuosus Anura DD Ground-dwelling 27.448925 37.46134 33.44220 41.95320
Allobates sumtuosus Anura DD Ground-dwelling 26.758152 37.36589 33.31459 41.77547
Allobates sumtuosus Anura DD Ground-dwelling 28.907016 37.66282 33.42974 42.09375
Allobates sanmartini Anura DD Ground-dwelling 26.516499 37.45728 33.52882 42.09407
Allobates sanmartini Anura DD Ground-dwelling 25.598703 37.33072 33.23271 41.82437
Allobates sanmartini Anura DD Ground-dwelling 28.318282 37.70573 33.72449 42.36329
Allobates talamancae Anura LC Ground-dwelling 26.134645 37.24778 33.06079 41.16751
Allobates talamancae Anura LC Ground-dwelling 25.426255 37.15243 32.97966 41.05074
Allobates talamancae Anura LC Ground-dwelling 27.490013 37.43023 33.46210 41.63192
Allobates vanzolinius Anura LC Ground-dwelling 28.998456 37.70409 34.14957 41.93820
Allobates vanzolinius Anura LC Ground-dwelling 28.198149 37.59312 34.03506 41.76083
Allobates vanzolinius Anura LC Ground-dwelling 30.610220 37.92757 34.29442 42.22062
Allobates wayuu Anura LC Ground-dwelling 26.810229 37.32468 33.18301 41.53712
Allobates wayuu Anura LC Ground-dwelling 26.314569 37.25669 33.04779 41.36509
Allobates wayuu Anura LC Ground-dwelling 27.717967 37.44920 33.15825 41.55420
Allobates undulatus Anura VU Ground-dwelling 26.759197 37.27855 33.49855 42.18932
Allobates undulatus Anura VU Ground-dwelling 26.094635 37.18786 33.32053 41.99135
Allobates undulatus Anura VU Ground-dwelling 28.102812 37.46191 33.68002 42.39787
Anomaloglossus ayarzaguenai Anura VU Stream-dwelling 25.413875 36.48134 31.61290 41.02405
Anomaloglossus ayarzaguenai Anura VU Stream-dwelling 24.575085 36.36522 31.33978 40.74720
Anomaloglossus ayarzaguenai Anura VU Stream-dwelling 26.912863 36.68886 31.78707 41.23346
Anomaloglossus baeobatrachus Anura DD Ground-dwelling 27.491256 37.45175 32.92547 42.02316
Anomaloglossus baeobatrachus Anura DD Ground-dwelling 26.853892 37.36200 32.80379 41.91611
Anomaloglossus baeobatrachus Anura DD Ground-dwelling 29.002275 37.66454 33.09789 42.32564
Anomaloglossus beebei Anura EN Arboreal 26.634291 37.12867 32.68433 41.28854
Anomaloglossus beebei Anura EN Arboreal 25.965013 37.03637 32.59317 41.19699
Anomaloglossus beebei Anura EN Arboreal 28.137979 37.33605 33.00811 41.57927
Anomaloglossus roraima Anura EN Ground-dwelling 26.386750 37.30057 33.30227 42.09429
Anomaloglossus roraima Anura EN Ground-dwelling 25.707210 37.20647 32.87488 41.65678
Anomaloglossus roraima Anura EN Ground-dwelling 27.920527 37.51296 33.28154 42.16788
Anomaloglossus breweri Anura NT Semi-aquatic 25.635717 37.43141 33.00713 41.92782
Anomaloglossus breweri Anura NT Semi-aquatic 24.877378 37.32705 33.02859 41.98579
Anomaloglossus breweri Anura NT Semi-aquatic 27.417978 37.67666 33.15230 42.29720
Anomaloglossus degranvillei Anura CR Stream-dwelling 27.532084 36.88640 32.45138 41.94789
Anomaloglossus degranvillei Anura CR Stream-dwelling 26.866417 36.79340 32.35217 41.83941
Anomaloglossus degranvillei Anura CR Stream-dwelling 29.442491 37.15331 32.76865 42.37143
Anomaloglossus kaiei Anura EN Ground-dwelling 26.634291 37.37961 33.14940 42.07372
Anomaloglossus kaiei Anura EN Ground-dwelling 25.965013 37.28770 33.09890 42.01131
Anomaloglossus kaiei Anura EN Ground-dwelling 28.137979 37.58610 33.32394 42.26898
Anomaloglossus guanayensis Anura NT Stream-dwelling 26.759197 36.75859 32.12590 41.67116
Anomaloglossus guanayensis Anura NT Stream-dwelling 26.094635 36.66699 32.24449 41.67377
Anomaloglossus guanayensis Anura NT Stream-dwelling 28.102812 36.94380 32.37716 41.95374
Anomaloglossus murisipanensis Anura VU Ground-dwelling 25.635717 37.18289 32.54757 42.10173
Anomaloglossus murisipanensis Anura VU Ground-dwelling 24.877378 37.07741 32.39284 41.94304
Anomaloglossus murisipanensis Anura VU Ground-dwelling 27.417978 37.43080 32.66778 42.28989
Anomaloglossus parimae Anura DD Stream-dwelling 25.955113 36.66054 32.50079 41.74572
Anomaloglossus parimae Anura DD Stream-dwelling 25.288524 36.56763 32.42164 41.64949
Anomaloglossus parimae Anura DD Stream-dwelling 27.413210 36.86378 32.67393 41.95621
Anomaloglossus parkerae Anura DD Ground-dwelling 25.457948 37.12351 32.17596 41.45265
Anomaloglossus parkerae Anura DD Ground-dwelling 24.682403 37.01650 32.07898 41.30471
Anomaloglossus parkerae Anura DD Ground-dwelling 27.292061 37.37657 32.40372 41.74277
Anomaloglossus praderioi Anura EN Ground-dwelling 26.386750 37.36626 32.91816 41.81289
Anomaloglossus praderioi Anura EN Ground-dwelling 25.707210 37.27167 32.81413 41.67904
Anomaloglossus praderioi Anura EN Ground-dwelling 27.920527 37.57975 33.13442 42.09194
Anomaloglossus rufulus Anura NT Ground-dwelling 25.263245 37.13873 32.40085 41.62809
Anomaloglossus rufulus Anura NT Ground-dwelling 24.500720 37.03361 32.32053 41.53056
Anomaloglossus rufulus Anura NT Ground-dwelling 27.093739 37.39108 32.60690 41.86221
Anomaloglossus shrevei Anura NT Stream-dwelling 25.661020 36.58448 32.20989 41.43899
Anomaloglossus shrevei Anura NT Stream-dwelling 25.001401 36.49250 32.08500 41.30777
Anomaloglossus shrevei Anura NT Stream-dwelling 27.238038 36.80437 32.60513 41.89653
Anomaloglossus stepheni Anura LC Ground-dwelling 28.386617 37.64411 33.00845 42.07257
Anomaloglossus stepheni Anura LC Ground-dwelling 27.661530 37.54497 32.94918 41.95989
Anomaloglossus stepheni Anura LC Ground-dwelling 30.037180 37.86979 33.25674 42.46686
Anomaloglossus tamacuarensis Anura DD Stream-dwelling 26.992680 36.77301 31.70618 41.19854
Anomaloglossus tamacuarensis Anura DD Stream-dwelling 26.321889 36.68079 31.59642 41.12956
Anomaloglossus tamacuarensis Anura DD Stream-dwelling 28.425982 36.97006 31.88013 41.34592
Anomaloglossus tepuyensis Anura DD Stream-dwelling 25.824577 36.59900 32.11845 41.39198
Anomaloglossus tepuyensis Anura DD Stream-dwelling 25.051367 36.49288 32.02742 41.31801
Anomaloglossus tepuyensis Anura DD Stream-dwelling 27.554962 36.83648 32.05081 41.32979
Anomaloglossus triunfo Anura DD Stream-dwelling 26.013438 36.60452 32.04389 41.02320
Anomaloglossus triunfo Anura DD Stream-dwelling 25.225357 36.49660 31.93628 40.89173
Anomaloglossus triunfo Anura DD Stream-dwelling 27.691946 36.83436 32.21524 41.18824
Anomaloglossus wothuja Anura LC Stream-dwelling 27.706177 36.84386 31.98166 41.40984
Anomaloglossus wothuja Anura LC Stream-dwelling 27.079627 36.75830 31.98756 41.35905
Anomaloglossus wothuja Anura LC Stream-dwelling 28.967034 37.01605 32.21648 41.68624
Rheobates palmatus Anura LC Stream-dwelling 23.788444 36.16782 31.49854 40.66473
Rheobates palmatus Anura LC Stream-dwelling 22.991140 36.05954 31.35427 40.53291
Rheobates palmatus Anura LC Stream-dwelling 25.399594 36.38662 31.63740 40.83776
Rheobates pseudopalmatus Anura LC Stream-dwelling 24.915942 36.39466 31.90703 41.07116
Rheobates pseudopalmatus Anura LC Stream-dwelling 24.133256 36.28623 31.91666 41.05232
Rheobates pseudopalmatus Anura LC Stream-dwelling 26.439125 36.60569 32.05633 41.31629
Aromobates saltuensis Anura EN Stream-dwelling 24.579676 36.38292 31.31282 40.65204
Aromobates saltuensis Anura EN Stream-dwelling 23.598329 36.24837 31.19135 40.46163
Aromobates saltuensis Anura EN Stream-dwelling 26.226024 36.60863 31.45863 40.82844
Aromobates capurinensis Anura DD Stream-dwelling 25.445939 36.64247 32.24912 41.77978
Aromobates capurinensis Anura DD Stream-dwelling 24.543351 36.51604 32.11892 41.60679
Aromobates capurinensis Anura DD Stream-dwelling 27.031556 36.86459 32.57792 42.09153
Aromobates duranti Anura CR Stream-dwelling 25.445939 36.56859 31.40244 41.12467
Aromobates duranti Anura CR Stream-dwelling 24.543351 36.44459 31.31477 41.02014
Aromobates duranti Anura CR Stream-dwelling 27.031556 36.78643 31.58839 41.34381
Aromobates mayorgai Anura EN Stream-dwelling 26.081594 36.63712 31.81066 41.09441
Aromobates mayorgai Anura EN Stream-dwelling 25.212821 36.51773 31.72995 40.96891
Aromobates mayorgai Anura EN Stream-dwelling 27.650603 36.85275 31.76496 41.05151
Aromobates meridensis Anura CR Stream-dwelling 25.445939 36.62567 31.53570 41.02760
Aromobates meridensis Anura CR Stream-dwelling 24.543351 36.50117 31.44299 40.90194
Aromobates meridensis Anura CR Stream-dwelling 27.031556 36.84438 31.76894 41.32405
Aromobates molinarii Anura CR Stream-dwelling 25.445939 36.52794 31.56869 41.15689
Aromobates molinarii Anura CR Stream-dwelling 24.543351 36.40286 31.81051 41.38192
Aromobates molinarii Anura CR Stream-dwelling 27.031556 36.74766 31.87249 41.43145
Aromobates orostoma Anura CR Stream-dwelling 25.445939 36.58857 31.96655 41.08546
Aromobates orostoma Anura CR Stream-dwelling 24.543351 36.46473 31.96834 41.05510
Aromobates orostoma Anura CR Stream-dwelling 27.031556 36.80612 32.03587 41.21811
Mannophryne caquetio Anura EN Stream-dwelling 26.384918 36.64089 31.97920 41.31105
Mannophryne caquetio Anura EN Stream-dwelling 25.623372 36.53578 31.88271 41.14377
Mannophryne caquetio Anura EN Stream-dwelling 27.795946 36.83564 31.76874 41.22095
Mannophryne collaris Anura EN Stream-dwelling 25.445939 36.53734 31.96976 41.34452
Mannophryne collaris Anura EN Stream-dwelling 24.543351 36.41472 32.09406 41.45051
Mannophryne collaris Anura EN Stream-dwelling 27.031556 36.75274 32.14595 41.52391
Mannophryne herminae Anura NT Stream-dwelling 26.678151 36.60811 31.59377 40.87988
Mannophryne herminae Anura NT Stream-dwelling 25.963270 36.51041 31.57012 40.88154
Mannophryne herminae Anura NT Stream-dwelling 28.180786 36.81347 31.71006 41.03844
Mannophryne larandina Anura DD Ground-dwelling 26.628438 37.29463 32.28193 41.91852
Mannophryne larandina Anura DD Ground-dwelling 25.765485 37.17717 32.19613 41.81092
Mannophryne larandina Anura DD Ground-dwelling 28.169923 37.50445 32.55339 42.24371
Mannophryne yustizi Anura EN Stream-dwelling 25.203531 36.38518 31.83880 41.35730
Mannophryne yustizi Anura EN Stream-dwelling 24.273673 36.25842 31.75071 41.22635
Mannophryne yustizi Anura EN Stream-dwelling 27.056592 36.63779 32.42327 41.96146
Mannophryne lamarcai Anura EN Stream-dwelling 26.357961 36.67559 32.01436 41.14088
Mannophryne lamarcai Anura EN Stream-dwelling 25.399787 36.54241 32.24356 41.33766
Mannophryne lamarcai Anura EN Stream-dwelling 27.780686 36.87335 32.00603 41.16661
Mannophryne cordilleriana Anura VU Stream-dwelling 26.717248 36.68680 32.04723 41.48599
Mannophryne cordilleriana Anura VU Stream-dwelling 25.882292 36.57186 31.99673 41.38486
Mannophryne cordilleriana Anura VU Stream-dwelling 28.269649 36.90049 32.17931 41.67724
Mannophryne leonardoi Anura NT Stream-dwelling 26.795104 36.62424 32.19464 41.02258
Mannophryne leonardoi Anura NT Stream-dwelling 25.994402 36.51557 32.13340 40.90627
Mannophryne leonardoi Anura NT Stream-dwelling 28.468857 36.85140 32.48223 41.34611
Mannophryne trinitatis Anura LC Stream-dwelling 26.327489 36.70633 32.40629 41.46887
Mannophryne trinitatis Anura LC Stream-dwelling 25.811870 36.63577 32.31696 41.39014
Mannophryne trinitatis Anura LC Stream-dwelling 27.134356 36.81676 32.52232 41.64253
Mannophryne venezuelensis Anura NT Stream-dwelling 26.606700 36.68744 32.09977 41.28640
Mannophryne venezuelensis Anura NT Stream-dwelling 25.982069 36.60210 32.05123 41.19668
Mannophryne venezuelensis Anura NT Stream-dwelling 27.907344 36.86512 32.21101 41.39645
Mannophryne neblina Anura CR Stream-dwelling 26.826561 36.67091 32.25826 41.63817
Mannophryne neblina Anura CR Stream-dwelling 26.155457 36.57814 32.15788 41.54929
Mannophryne neblina Anura CR Stream-dwelling 28.382836 36.88604 32.35968 41.87121
Mannophryne oblitterata Anura NT Stream-dwelling 26.386163 36.68022 32.14666 41.20647
Mannophryne oblitterata Anura NT Stream-dwelling 25.388181 36.54241 32.05867 41.08905
Mannophryne oblitterata Anura NT Stream-dwelling 27.914767 36.89131 32.28224 41.51243
Mannophryne olmonae Anura VU Stream-dwelling 26.614467 36.68621 32.23632 41.55977
Mannophryne olmonae Anura VU Stream-dwelling 26.237296 36.63515 32.20509 41.50485
Mannophryne olmonae Anura VU Stream-dwelling 27.226432 36.76905 32.31044 41.65579
Mannophryne riveroi Anura EN Stream-dwelling 26.479711 36.71939 32.00601 41.12594
Mannophryne riveroi Anura EN Stream-dwelling 25.877888 36.63719 31.93433 41.02438
Mannophryne riveroi Anura EN Stream-dwelling 27.645281 36.87859 32.14219 41.26875
Mannophryne speeri Anura CR Stream-dwelling 25.203531 36.47591 31.93907 41.10120
Mannophryne speeri Anura CR Stream-dwelling 24.273673 36.34690 31.86270 40.94645
Mannophryne speeri Anura CR Stream-dwelling 27.056592 36.73301 32.14058 41.42411
Mannophryne trujillensis Anura EN Stream-dwelling 26.628438 36.63362 32.10246 41.30573
Mannophryne trujillensis Anura EN Stream-dwelling 25.765485 36.51526 31.99856 41.17278
Mannophryne trujillensis Anura EN Stream-dwelling 28.169923 36.84503 31.94643 41.25460
Cryptobatrachus boulengeri Anura VU Stream-dwelling 26.883206 37.33956 33.04484 42.05045
Cryptobatrachus boulengeri Anura VU Stream-dwelling 26.042323 37.22468 32.89808 41.88823
Cryptobatrachus boulengeri Anura VU Stream-dwelling 28.606507 37.57500 33.10443 42.27792
Cryptobatrachus fuhrmanni Anura LC Stream-dwelling 24.032837 36.94634 32.52709 41.61557
Cryptobatrachus fuhrmanni Anura LC Stream-dwelling 23.204153 36.83585 32.52732 41.65608
Cryptobatrachus fuhrmanni Anura LC Stream-dwelling 25.656273 37.16279 32.57892 41.77947
Hemiphractus bubalus Anura VU Arboreal 24.217651 37.41282 32.85182 42.29430
Hemiphractus bubalus Anura VU Arboreal 23.173596 37.27553 32.75781 42.14640
Hemiphractus bubalus Anura VU Arboreal 25.926944 37.63759 33.31421 42.80799
Hemiphractus proboscideus Anura LC Arboreal 27.117610 37.77194 33.17365 42.44868
Hemiphractus proboscideus Anura LC Arboreal 26.333956 37.66811 33.07381 42.34394
Hemiphractus proboscideus Anura LC Arboreal 28.647001 37.97456 33.40471 42.67958
Hemiphractus fasciatus Anura VU Arboreal 24.643213 37.57306 32.71837 42.05942
Hemiphractus fasciatus Anura VU Arboreal 23.691015 37.44602 32.91539 42.26208
Hemiphractus fasciatus Anura VU Arboreal 26.203205 37.78120 32.96076 42.31456
Hemiphractus johnsoni Anura EN Arboreal 22.376189 37.16360 32.67205 41.71635
Hemiphractus johnsoni Anura EN Arboreal 21.363649 37.03015 32.64973 41.67787
Hemiphractus johnsoni Anura EN Arboreal 24.075556 37.38758 32.75943 41.86529
Hemiphractus scutatus Anura LC Arboreal 26.498078 37.65793 32.72479 42.32475
Hemiphractus scutatus Anura LC Arboreal 25.713051 37.55442 32.63749 42.20390
Hemiphractus scutatus Anura LC Arboreal 27.987675 37.85434 32.89831 42.49520
Hemiphractus helioi Anura LC Arboreal 22.447713 37.25435 33.08700 42.18843
Hemiphractus helioi Anura LC Arboreal 21.595085 37.14093 32.87985 41.97583
Hemiphractus helioi Anura LC Arboreal 23.697654 37.42061 32.89558 42.00862
Flectonotus fitzgeraldi Anura LC Arboreal 26.602142 37.57643 33.12670 42.36760
Flectonotus fitzgeraldi Anura LC Arboreal 26.059772 37.50557 33.06382 42.28579
Flectonotus fitzgeraldi Anura LC Arboreal 27.657000 37.71424 33.24887 42.56114
Flectonotus pygmaeus Anura LC Arboreal 25.796205 37.53649 33.24723 42.65816
Flectonotus pygmaeus Anura LC Arboreal 24.968484 37.42561 33.11154 42.51893
Flectonotus pygmaeus Anura LC Arboreal 27.323497 37.74107 33.45718 42.92951
Stefania ackawaio Anura VU Arboreal 26.634291 37.63030 32.66781 42.10100
Stefania ackawaio Anura VU Arboreal 25.965013 37.54118 32.57439 41.97404
Stefania ackawaio Anura VU Arboreal 28.137979 37.83052 33.25764 42.84914
Stefania marahuaquensis Anura NT Ground-dwelling 25.661020 37.67291 32.75268 41.94031
Stefania marahuaquensis Anura NT Ground-dwelling 25.001401 37.58460 32.62658 41.75883
Stefania marahuaquensis Anura NT Ground-dwelling 27.238038 37.88404 33.18767 42.39640
Stefania ayangannae Anura VU Arboreal 26.634291 37.54130 33.08476 41.79176
Stefania ayangannae Anura VU Arboreal 25.965013 37.45320 33.00805 41.70586
Stefania ayangannae Anura VU Arboreal 28.137979 37.73923 33.33835 42.09737
Stefania coxi Anura VU Arboreal 26.634291 37.65354 32.59323 41.99648
Stefania coxi Anura VU Arboreal 25.965013 37.56483 32.55542 41.89104
Stefania coxi Anura VU Arboreal 28.137979 37.85283 33.02329 42.44280
Stefania riveroi Anura VU Ground-dwelling 26.386750 37.69413 32.90637 42.26045
Stefania riveroi Anura VU Ground-dwelling 25.707210 37.60515 32.81050 42.11302
Stefania riveroi Anura VU Ground-dwelling 27.920527 37.89497 33.43111 42.92310
Stefania riae Anura NT Arboreal 25.500814 37.52668 33.17546 42.08302
Stefania riae Anura NT Arboreal 24.675066 37.41690 33.11660 42.04214
Stefania riae Anura NT Arboreal 27.054357 37.73320 33.28620 42.24470
Stefania oculosa Anura VU Ground-dwelling 25.413875 37.59599 33.03714 42.02917
Stefania oculosa Anura VU Ground-dwelling 24.575085 37.48384 32.59092 41.56573
Stefania oculosa Anura VU Ground-dwelling 26.912863 37.79640 33.25404 42.23722
Stefania breweri Anura VU Arboreal 28.111650 37.91992 33.62607 42.55202
Stefania breweri Anura VU Arboreal 27.458676 37.83388 33.54591 42.41053
Stefania breweri Anura VU Arboreal 29.455754 38.09701 33.54011 42.56028
Stefania goini Anura NT Ground-dwelling 25.661020 37.78796 33.14066 42.42681
Stefania goini Anura NT Ground-dwelling 25.001401 37.69886 33.08100 42.34006
Stefania goini Anura NT Ground-dwelling 27.238038 38.00098 33.20479 42.52092
Stefania evansi Anura DD Stream-dwelling 26.865673 37.20132 32.68343 41.50811
Stefania evansi Anura DD Stream-dwelling 26.225045 37.11592 32.59609 41.42258
Stefania evansi Anura DD Stream-dwelling 28.253708 37.38635 32.85045 41.70156
Stefania scalae Anura LC Stream-dwelling 25.972272 37.05522 32.20838 41.76644
Stefania scalae Anura LC Stream-dwelling 25.232928 36.95776 31.98058 41.48656
Stefania scalae Anura LC Stream-dwelling 27.661667 37.27793 32.61301 42.16315
Stefania tamacuarina Anura DD Stream-dwelling 27.072310 37.24898 32.67976 42.00385
Stefania tamacuarina Anura DD Stream-dwelling 26.418052 37.16255 32.89252 42.22242
Stefania tamacuarina Anura DD Stream-dwelling 28.545199 37.44355 32.97430 42.34783
Stefania roraimae Anura EN Ground-dwelling 26.386750 37.75607 33.29143 42.38941
Stefania roraimae Anura EN Ground-dwelling 25.707210 37.66414 33.26652 42.29206
Stefania roraimae Anura EN Ground-dwelling 27.920527 37.96358 33.50537 42.75065
Stefania woodleyi Anura DD Stream-dwelling 26.881832 37.24090 32.62935 42.07250
Stefania woodleyi Anura DD Stream-dwelling 26.222816 37.15226 32.55024 41.96340
Stefania woodleyi Anura DD Stream-dwelling 28.355431 37.43911 32.87844 42.43980
Stefania percristata Anura VU Arboreal 25.413875 37.47056 33.13447 41.88376
Stefania percristata Anura VU Arboreal 24.575085 37.35811 33.22759 41.98452
Stefania percristata Anura VU Arboreal 26.912863 37.67152 33.30710 42.10240
Stefania schuberti Anura NT Ground-dwelling 25.824577 37.69403 32.78361 41.81757
Stefania schuberti Anura NT Ground-dwelling 25.051367 37.58994 32.71536 41.68722
Stefania schuberti Anura NT Ground-dwelling 27.554962 37.92699 33.26768 42.42928
Stefania ginesi Anura NT Arboreal 25.263245 37.54264 32.79218 42.22064
Stefania ginesi Anura NT Arboreal 24.500720 37.44106 32.64865 42.05325
Stefania ginesi Anura NT Arboreal 27.093739 37.78650 33.09487 42.51033
Stefania satelles Anura NT Ground-dwelling 25.349143 37.62226 33.07153 42.31458
Stefania satelles Anura NT Ground-dwelling 24.533076 37.51392 32.97476 42.14579
Stefania satelles Anura NT Ground-dwelling 27.207084 37.86893 33.02044 42.33924
Fritziana fissilis Anura LC Arboreal 25.669723 37.53352 32.68794 41.80074
Fritziana fissilis Anura LC Arboreal 24.521960 37.38272 32.60795 41.68678
Fritziana fissilis Anura LC Arboreal 27.671297 37.79649 32.98721 42.13759
Fritziana ohausi Anura LC Arboreal 25.616699 37.59332 32.98776 41.98091
Fritziana ohausi Anura LC Arboreal 24.489874 37.44778 32.87971 41.80921
Fritziana ohausi Anura LC Arboreal 27.582205 37.84718 33.28183 42.33130
Fritziana goeldii Anura LC Arboreal 25.662704 37.59251 33.12623 42.10705
Fritziana goeldii Anura LC Arboreal 24.421013 37.42588 33.01120 41.93533
Fritziana goeldii Anura LC Arboreal 27.857608 37.88707 33.51839 42.53586
Gastrotheca abdita Anura DD Arboreal 24.022160 37.63809 33.83510 41.90718
Gastrotheca abdita Anura DD Arboreal 23.320574 37.54689 33.69977 41.70557
Gastrotheca abdita Anura DD Arboreal 25.414498 37.81907 33.90407 42.07892
Gastrotheca andaquiensis Anura LC Arboreal 23.607521 37.59061 33.86483 41.71603
Gastrotheca andaquiensis Anura LC Arboreal 22.421691 37.43867 33.71436 41.50587
Gastrotheca andaquiensis Anura LC Arboreal 25.395027 37.81964 34.05860 41.95621
Gastrotheca albolineata Anura LC Arboreal 25.709907 37.91815 33.71869 41.55348
Gastrotheca albolineata Anura LC Arboreal 24.771074 37.79624 33.62995 41.40622
Gastrotheca albolineata Anura LC Arboreal 27.416044 38.13970 33.87996 41.85131
Gastrotheca ernestoi Anura DD Arboreal 25.993696 38.07310 34.23001 42.05221
Gastrotheca ernestoi Anura DD Arboreal 24.808276 37.91750 34.13221 41.85355
Gastrotheca ernestoi Anura DD Arboreal 27.957763 38.33090 34.49509 42.53489
Gastrotheca fulvorufa Anura DD Arboreal 25.510287 37.83898 33.95335 41.98463
Gastrotheca fulvorufa Anura DD Arboreal 24.567625 37.71530 33.84774 41.85771
Gastrotheca fulvorufa Anura DD Arboreal 27.163123 38.05585 34.13851 42.23225
Gastrotheca microdiscus Anura LC Arboreal 25.462667 37.94296 34.25409 42.73057
Gastrotheca microdiscus Anura LC Arboreal 24.253698 37.78469 33.65119 42.02590
Gastrotheca microdiscus Anura LC Arboreal 27.513175 38.21141 34.37686 42.97582
Gastrotheca bufona Anura VU Arboreal 24.179372 37.79899 33.64487 41.47990
Gastrotheca bufona Anura VU Arboreal 23.316419 37.68750 33.47567 41.29014
Gastrotheca bufona Anura VU Arboreal 25.664184 37.99082 33.81631 41.67263
Gastrotheca orophylax Anura VU Arboreal 22.791091 37.68313 34.49252 40.82993
Gastrotheca orophylax Anura VU Arboreal 21.484109 37.51041 34.39054 40.68227
Gastrotheca orophylax Anura VU Arboreal 24.670803 37.93155 34.90902 41.32403
Gastrotheca plumbea Anura VU Arboreal 23.223041 37.78160 33.88368 40.65253
Gastrotheca plumbea Anura VU Arboreal 21.587392 37.56774 33.72187 40.43211
Gastrotheca plumbea Anura VU Arboreal 25.446872 38.07235 34.52185 41.37279
Gastrotheca monticola Anura LC Arboreal 21.747264 37.44508 33.95924 41.00984
Gastrotheca monticola Anura LC Arboreal 20.827583 37.32549 33.62468 40.61672
Gastrotheca monticola Anura LC Arboreal 23.384710 37.65802 34.12778 41.24162
Gastrotheca antoniiochoai Anura DD Stream-dwelling 15.323045 36.06617 32.90611 39.60943
Gastrotheca antoniiochoai Anura DD Stream-dwelling 11.264668 35.54350 32.11744 38.77233
Gastrotheca antoniiochoai Anura DD Stream-dwelling 17.134228 36.29943 32.79354 39.52090
Gastrotheca excubitor Anura VU Arboreal 17.705656 36.81392 33.86950 40.00784
Gastrotheca excubitor Anura VU Arboreal 15.001934 36.46414 33.34344 39.46655
Gastrotheca excubitor Anura VU Arboreal 19.268942 37.01615 33.78091 39.98384
Gastrotheca ochoai Anura EN Arboreal 16.918302 36.71585 33.58932 39.92000
Gastrotheca ochoai Anura EN Arboreal 13.275282 36.25079 33.02268 39.36043
Gastrotheca ochoai Anura EN Arboreal 18.757121 36.95059 33.83438 40.20475
Gastrotheca rebeccae Anura EN Arboreal 17.246028 36.81561 33.33731 39.95209
Gastrotheca rebeccae Anura EN Arboreal 15.244695 36.55537 33.01514 39.61772
Gastrotheca rebeccae Anura EN Arboreal 18.862491 37.02581 33.43556 40.13247
Gastrotheca christiani Anura CR Arboreal 22.860302 37.44982 34.62309 40.50251
Gastrotheca christiani Anura CR Arboreal 21.222878 37.23694 34.16802 39.97414
Gastrotheca christiani Anura CR Arboreal 25.222075 37.75688 34.63708 40.64186
Gastrotheca lauzuricae Anura CR Arboreal 14.331934 36.35406 33.30852 39.18375
Gastrotheca lauzuricae Anura CR Arboreal 13.213313 36.21126 33.10274 39.01162
Gastrotheca lauzuricae Anura CR Arboreal 16.050315 36.57343 33.60070 39.49942
Gastrotheca chrysosticta Anura EN Arboreal 22.553662 37.40507 34.48754 40.25723
Gastrotheca chrysosticta Anura EN Arboreal 21.163167 37.22639 34.24243 39.93147
Gastrotheca chrysosticta Anura EN Arboreal 24.457455 37.64971 34.55380 40.46934
Gastrotheca gracilis Anura EN Arboreal 20.714070 37.22316 34.41048 40.28460
Gastrotheca gracilis Anura EN Arboreal 19.225121 37.03209 34.00442 39.81657
Gastrotheca gracilis Anura EN Arboreal 23.338879 37.55999 34.60930 40.66084
Gastrotheca griswoldi Anura LC Ground-dwelling 17.308438 36.88076 33.94141 40.19404
Gastrotheca griswoldi Anura LC Ground-dwelling 16.342441 36.75623 33.78029 40.03584
Gastrotheca griswoldi Anura LC Ground-dwelling 18.874583 37.08265 33.76622 39.98663
Gastrotheca marsupiata Anura LC Arboreal 17.130552 36.76955 33.69524 39.79388
Gastrotheca marsupiata Anura LC Arboreal 15.686602 36.58867 33.39542 39.48368
Gastrotheca marsupiata Anura LC Arboreal 19.151325 37.02270 34.32181 40.39310
Gastrotheca peruana Anura LC Ground-dwelling 18.951691 37.13293 34.26562 39.80884
Gastrotheca peruana Anura LC Ground-dwelling 17.915550 36.99722 34.30075 39.81810
Gastrotheca peruana Anura LC Ground-dwelling 20.878892 37.38536 34.58415 40.18192
Gastrotheca zeugocystis Anura DD Ground-dwelling 15.191863 36.68676 33.87992 39.80472
Gastrotheca zeugocystis Anura DD Ground-dwelling 13.688102 36.49201 33.68740 39.59658
Gastrotheca zeugocystis Anura DD Ground-dwelling 18.280341 37.08675 34.30580 40.30583
Gastrotheca argenteovirens Anura LC Stream-dwelling 24.052975 37.66082 34.58199 40.98309
Gastrotheca argenteovirens Anura LC Stream-dwelling 23.067408 37.53171 34.50049 40.81289
Gastrotheca argenteovirens Anura LC Stream-dwelling 25.554222 37.85749 34.68652 41.24235
Gastrotheca trachyceps Anura EN Arboreal 22.833468 37.95556 34.86188 40.87301
Gastrotheca trachyceps Anura EN Arboreal 21.394430 37.77152 34.83919 40.80007
Gastrotheca trachyceps Anura EN Arboreal 24.669687 38.19040 35.05127 41.16320
Gastrotheca aureomaculata Anura EN Arboreal 23.977690 38.15411 35.00949 41.19806
Gastrotheca aureomaculata Anura EN Arboreal 22.933899 38.01841 34.85873 40.98658
Gastrotheca aureomaculata Anura EN Arboreal 25.566312 38.36063 35.39995 41.69464
Gastrotheca ruizi Anura NT Arboreal 24.280282 38.12066 35.11058 41.11136
Gastrotheca ruizi Anura NT Arboreal 23.402296 38.00590 35.07912 41.05871
Gastrotheca ruizi Anura NT Arboreal 25.677250 38.30326 35.19771 41.28221
Gastrotheca dunni Anura LC Arboreal 21.959825 37.81441 34.72116 40.97095
Gastrotheca dunni Anura LC Arboreal 20.686309 37.64960 34.71824 40.87551
Gastrotheca dunni Anura LC Arboreal 23.846526 38.05857 34.53763 40.90736
Gastrotheca nicefori Anura LC Arboreal 24.626986 38.14620 34.59021 41.21576
Gastrotheca nicefori Anura LC Arboreal 23.807739 38.04084 34.66828 41.28432
Gastrotheca nicefori Anura LC Arboreal 26.177372 38.34558 34.78829 41.46306
Gastrotheca ovifera Anura VU Arboreal 26.532132 38.30396 34.90293 41.99735
Gastrotheca ovifera Anura VU Arboreal 25.800733 38.20895 34.87100 41.95135
Gastrotheca ovifera Anura VU Arboreal 27.991576 38.49356 35.05096 42.20893
Gastrotheca phalarosa Anura DD Arboreal 22.538913 37.83005 34.41325 41.21022
Gastrotheca phalarosa Anura DD Arboreal 21.736625 37.72769 34.35498 41.13954
Gastrotheca phalarosa Anura DD Arboreal 23.802966 37.99133 34.29831 41.12373
Gastrotheca atympana Anura VU Arboreal 18.941621 37.22553 32.87283 40.77231
Gastrotheca atympana Anura VU Arboreal 18.119049 37.11725 32.71937 40.62229
Gastrotheca atympana Anura VU Arboreal 20.438975 37.42265 33.07028 40.97732
Gastrotheca testudinea Anura LC Arboreal 20.902227 37.49949 33.72443 41.46743
Gastrotheca testudinea Anura LC Arboreal 19.729171 37.34209 33.59599 41.27611
Gastrotheca testudinea Anura LC Arboreal 22.492906 37.71293 34.31538 42.09386
Gastrotheca pacchamama Anura EN Ground-dwelling 17.829095 37.20008 33.02195 41.11436
Gastrotheca pacchamama Anura EN Ground-dwelling 16.184600 36.98090 32.88410 41.03277
Gastrotheca pacchamama Anura EN Ground-dwelling 19.376701 37.40635 33.33172 41.34342
Gastrotheca carinaceps Anura DD Arboreal 21.012652 37.32746 33.59293 41.34548
Gastrotheca carinaceps Anura DD Arboreal 20.177954 37.21744 33.42265 41.18814
Gastrotheca carinaceps Anura DD Arboreal 22.689323 37.54845 33.72136 41.52642
Gastrotheca cornuta Anura EN Arboreal 25.451583 37.94078 33.85333 41.67368
Gastrotheca cornuta Anura EN Arboreal 24.620696 37.83115 33.71435 41.50649
Gastrotheca cornuta Anura EN Arboreal 26.923123 38.13493 34.02953 41.86348
Gastrotheca dendronastes Anura EN Arboreal 24.522106 37.79704 33.95188 41.63315
Gastrotheca dendronastes Anura EN Arboreal 23.826275 37.70633 33.81252 41.46474
Gastrotheca dendronastes Anura EN Arboreal 25.878795 37.97391 34.02894 41.84975
Gastrotheca helenae Anura EN Ground-dwelling 22.264420 37.63549 33.37592 41.10597
Gastrotheca helenae Anura EN Ground-dwelling 21.177532 37.49360 33.23833 40.95054
Gastrotheca helenae Anura EN Ground-dwelling 23.874959 37.84573 33.51724 41.32830
Gastrotheca longipes Anura LC Arboreal 24.482638 37.92193 33.59010 41.49434
Gastrotheca longipes Anura LC Arboreal 23.595858 37.80627 33.54721 41.36634
Gastrotheca longipes Anura LC Arboreal 26.146223 38.13889 34.39798 42.43297
Gastrotheca guentheri Anura DD Arboreal 25.065123 37.87942 33.98412 41.71032
Gastrotheca guentheri Anura DD Arboreal 24.244506 37.77402 33.75089 41.42304
Gastrotheca guentheri Anura DD Arboreal 26.451483 38.05748 34.13694 41.90842
Gastrotheca weinlandii Anura LC Arboreal 24.029081 37.74652 34.04036 41.46887
Gastrotheca weinlandii Anura LC Arboreal 23.011476 37.61376 33.95259 41.37462
Gastrotheca weinlandii Anura LC Arboreal 25.695273 37.96390 34.09096 41.71064
Gastrotheca flamma Anura DD Arboreal 24.870493 37.82404 33.77570 41.81021
Gastrotheca flamma Anura DD Arboreal 23.992743 37.71015 33.77422 41.75427
Gastrotheca flamma Anura DD Arboreal 26.744182 38.06715 34.12923 42.24473
Gastrotheca walkeri Anura VU Arboreal 26.532132 38.02815 33.89034 41.68898
Gastrotheca walkeri Anura VU Arboreal 25.800733 37.93170 33.78348 41.53310
Gastrotheca walkeri Anura VU Arboreal 27.991576 38.22060 34.23878 42.09306
Gastrotheca espeletia Anura EN Arboreal 23.534709 37.66749 33.91343 41.81801
Gastrotheca espeletia Anura EN Arboreal 22.542747 37.53909 33.79631 41.67228
Gastrotheca espeletia Anura EN Arboreal 25.040373 37.86239 34.11909 42.04227
Gastrotheca galeata Anura DD Ground-dwelling 22.602751 37.72169 33.81860 41.82972
Gastrotheca galeata Anura DD Ground-dwelling 21.868814 37.62641 33.49450 41.52072
Gastrotheca galeata Anura DD Ground-dwelling 24.173626 37.92561 34.00618 42.03386
Gastrotheca ossilaginis Anura DD Arboreal 22.538913 37.51019 34.06255 42.08105
Gastrotheca ossilaginis Anura DD Arboreal 21.736625 37.40673 33.98800 41.96026
Gastrotheca ossilaginis Anura DD Arboreal 23.802966 37.67319 34.07453 42.14060
Gastrotheca piperata Anura LC Arboreal 18.373837 37.04515 33.15834 41.01258
Gastrotheca piperata Anura LC Arboreal 17.415068 36.91912 33.23009 41.05473
Gastrotheca piperata Anura LC Arboreal 19.848472 37.23899 33.48893 41.41834
Gastrotheca psychrophila Anura EN Ground-dwelling 22.504554 37.67771 33.46522 41.54370
Gastrotheca psychrophila Anura EN Ground-dwelling 21.223948 37.51173 33.29215 41.39273
Gastrotheca psychrophila Anura EN Ground-dwelling 24.506837 37.93723 34.19401 42.28625
Gastrotheca stictopleura Anura EN Arboreal 19.881692 37.16628 33.35857 41.36288
Gastrotheca stictopleura Anura EN Arboreal 18.893809 37.03642 33.21148 41.19866
Gastrotheca stictopleura Anura EN Arboreal 21.876961 37.42858 33.65682 41.70771
Gastrotheca splendens Anura DD Arboreal 22.415740 37.46816 33.47740 41.11743
Gastrotheca splendens Anura DD Arboreal 21.616824 37.36208 33.38575 41.01398
Gastrotheca splendens Anura DD Arboreal 23.646629 37.63159 33.73234 41.38699
Gastrotheca williamsoni Anura DD Stream-dwelling 26.678151 37.60154 33.74478 41.97307
Gastrotheca williamsoni Anura DD Stream-dwelling 25.963270 37.51096 33.54007 41.75501
Gastrotheca williamsoni Anura DD Stream-dwelling 28.180786 37.79195 33.92385 42.17617
Gastrotheca fissipes Anura LC Arboreal 25.224460 37.88710 33.65003 41.94992
Gastrotheca fissipes Anura LC Arboreal 24.339358 37.77151 33.55762 41.82386
Gastrotheca fissipes Anura LC Arboreal 26.805589 38.09358 33.81773 42.26494
Ceuthomantis aracamuni Anura VU Stream-dwelling 26.913050 36.56902 31.87456 41.27159
Ceuthomantis aracamuni Anura VU Stream-dwelling 26.225726 36.47717 31.80477 41.12033
Ceuthomantis aracamuni Anura VU Stream-dwelling 28.306766 36.75527 31.97850 41.44558
Ceuthomantis cavernibardus Anura DD Ground-dwelling 27.072310 37.10032 32.41592 42.20452
Ceuthomantis cavernibardus Anura DD Ground-dwelling 26.418052 37.01049 32.13495 41.88212
Ceuthomantis cavernibardus Anura DD Ground-dwelling 28.545199 37.30255 32.48763 42.40060
Ceuthomantis duellmani Anura NT Ground-dwelling 25.413875 36.91018 32.61481 42.10754
Ceuthomantis duellmani Anura NT Ground-dwelling 24.575085 36.79435 32.34468 41.84689
Ceuthomantis duellmani Anura NT Ground-dwelling 26.912863 37.11720 32.48030 42.02508
Brachycephalus alipioi Anura DD Ground-dwelling 25.625862 36.83366 32.05042 41.55223
Brachycephalus alipioi Anura DD Ground-dwelling 24.800864 36.71991 32.00265 41.45716
Brachycephalus alipioi Anura DD Ground-dwelling 27.220602 37.05354 32.04364 41.71116
Brachycephalus hermogenesi Anura LC Ground-dwelling 25.588294 36.83606 32.14037 41.72617
Brachycephalus hermogenesi Anura LC Ground-dwelling 24.142601 36.63813 31.94449 41.45696
Brachycephalus hermogenesi Anura LC Ground-dwelling 28.017215 37.16862 31.80506 41.52812
Brachycephalus nodoterga Anura DD Ground-dwelling 25.767088 36.84341 31.92693 41.66587
Brachycephalus nodoterga Anura DD Ground-dwelling 24.218770 36.63181 31.79109 41.50632
Brachycephalus nodoterga Anura DD Ground-dwelling 28.316567 37.19183 32.10523 41.96731
Brachycephalus vertebralis Anura DD Ground-dwelling 25.654426 36.85374 32.20182 41.41786
Brachycephalus vertebralis Anura DD Ground-dwelling 24.464173 36.68919 32.00998 41.21367
Brachycephalus vertebralis Anura DD Ground-dwelling 27.716517 37.13882 32.75795 41.95520
Brachycephalus ephippium Anura LC Ground-dwelling 25.392441 36.71862 32.30113 41.50732
Brachycephalus ephippium Anura LC Ground-dwelling 24.460908 36.59249 32.13576 41.37292
Brachycephalus ephippium Anura LC Ground-dwelling 27.079962 36.94711 32.48966 41.79048
Brachycephalus brunneus Anura DD Ground-dwelling 23.836674 36.58408 31.89989 41.28251
Brachycephalus brunneus Anura DD Ground-dwelling 21.947547 36.32356 31.52150 40.91538
Brachycephalus brunneus Anura DD Ground-dwelling 26.445416 36.94384 32.21506 41.65613
Brachycephalus izecksohni Anura DD Ground-dwelling 24.139907 36.59224 31.31153 41.15452
Brachycephalus izecksohni Anura DD Ground-dwelling 22.399972 36.35408 31.50845 41.33311
Brachycephalus izecksohni Anura DD Ground-dwelling 26.818981 36.95896 31.69913 41.59764
Brachycephalus ferruginus Anura DD Ground-dwelling 23.836674 36.56123 31.93624 41.50384
Brachycephalus ferruginus Anura DD Ground-dwelling 21.947547 36.30645 31.75992 41.32976
Brachycephalus ferruginus Anura DD Ground-dwelling 26.445416 36.91306 32.12157 41.73880
Brachycephalus pernix Anura DD Ground-dwelling 23.836674 36.58833 31.63633 41.08831
Brachycephalus pernix Anura DD Ground-dwelling 21.947547 36.33060 31.44464 40.87218
Brachycephalus pernix Anura DD Ground-dwelling 26.445416 36.94423 32.01154 41.54640
Brachycephalus pombali Anura DD Ground-dwelling 23.836674 36.60516 32.33764 41.34476
Brachycephalus pombali Anura DD Ground-dwelling 21.947547 36.34738 32.08964 41.08722
Brachycephalus pombali Anura DD Ground-dwelling 26.445416 36.96113 32.54780 41.79608
Brachycephalus didactylus Anura LC Ground-dwelling 25.646276 36.81493 32.47120 41.34481
Brachycephalus didactylus Anura LC Ground-dwelling 24.606403 36.67267 32.46556 41.27927
Brachycephalus didactylus Anura LC Ground-dwelling 27.443967 37.06086 32.55027 41.53716
Ischnocnema bolbodactyla Anura LC Ground-dwelling 25.580465 36.82271 31.26556 41.30327
Ischnocnema bolbodactyla Anura LC Ground-dwelling 24.284451 36.64469 31.11325 41.15830
Ischnocnema bolbodactyla Anura LC Ground-dwelling 27.689515 37.11240 31.45322 41.51058
Ischnocnema octavioi Anura LC Ground-dwelling 25.863077 36.80613 31.60265 41.43220
Ischnocnema octavioi Anura LC Ground-dwelling 24.710436 36.64956 31.47284 41.22823
Ischnocnema octavioi Anura LC Ground-dwelling 27.717472 37.05802 31.72894 41.59578
Ischnocnema verrucosa Anura DD Ground-dwelling 25.528853 36.74970 31.71161 41.55742
Ischnocnema verrucosa Anura DD Ground-dwelling 24.483642 36.60486 31.32140 41.17381
Ischnocnema verrucosa Anura DD Ground-dwelling 27.492901 37.02187 32.04796 41.92217
Ischnocnema juipoca Anura LC Ground-dwelling 25.737043 36.73058 32.59887 41.82814
Ischnocnema juipoca Anura LC Ground-dwelling 24.506323 36.56348 32.15185 41.36807
Ischnocnema juipoca Anura LC Ground-dwelling 28.119708 37.05409 32.77111 42.13589
Ischnocnema spanios Anura DD Ground-dwelling 24.843556 36.70989 31.76264 41.20184
Ischnocnema spanios Anura DD Ground-dwelling 23.494971 36.52292 31.67787 41.06482
Ischnocnema spanios Anura DD Ground-dwelling 27.086180 37.02080 32.27276 41.82697
Ischnocnema holti Anura DD Ground-dwelling 26.367176 36.88853 31.76881 41.51210
Ischnocnema holti Anura DD Ground-dwelling 25.114381 36.71579 31.69728 41.47413
Ischnocnema holti Anura DD Ground-dwelling 28.661754 37.20493 32.26904 42.07962
Ischnocnema lactea Anura LC Ground-dwelling 25.642797 36.78470 31.73815 41.21959
Ischnocnema lactea Anura LC Ground-dwelling 24.412498 36.61371 31.64666 41.04413
Ischnocnema lactea Anura LC Ground-dwelling 27.885121 37.09636 31.93561 41.56357
Ischnocnema epipeda Anura NT Ground-dwelling 25.507727 36.76142 32.48315 41.76318
Ischnocnema epipeda Anura NT Ground-dwelling 24.733105 36.65535 32.34891 41.63229
Ischnocnema epipeda Anura NT Ground-dwelling 27.100258 36.97949 32.62228 42.01432
Ischnocnema erythromera Anura DD Ground-dwelling 26.332966 36.97380 31.75612 41.41720
Ischnocnema erythromera Anura DD Ground-dwelling 25.152380 36.81210 31.64560 41.27470
Ischnocnema erythromera Anura DD Ground-dwelling 28.199008 37.22938 31.92641 41.66787
Ischnocnema guentheri Anura LC Ground-dwelling 25.448978 36.87116 31.85924 41.43161
Ischnocnema guentheri Anura LC Ground-dwelling 24.033607 36.67822 32.12052 41.65420
Ischnocnema guentheri Anura LC Ground-dwelling 27.810445 37.19306 32.17427 41.83811
Ischnocnema henselii Anura LC Ground-dwelling 25.102238 36.80839 32.10476 41.37060
Ischnocnema henselii Anura LC Ground-dwelling 23.431092 36.58121 32.12612 41.36629
Ischnocnema henselii Anura LC Ground-dwelling 27.601924 37.14819 32.36610 41.68013
Ischnocnema izecksohni Anura DD Ground-dwelling 24.826713 36.69914 31.88743 41.53897
Ischnocnema izecksohni Anura DD Ground-dwelling 23.454470 36.51204 31.69527 41.29425
Ischnocnema izecksohni Anura DD Ground-dwelling 27.381718 37.04752 32.08770 41.84718
Ischnocnema nasuta Anura LC Arboreal 25.586707 36.59963 31.30577 41.29192
Ischnocnema nasuta Anura LC Arboreal 24.406946 36.44039 31.32333 41.25730
Ischnocnema nasuta Anura LC Arboreal 27.809065 36.89959 32.13168 42.26459
Ischnocnema oea Anura NT Ground-dwelling 25.507727 36.88262 32.15643 41.27746
Ischnocnema oea Anura NT Ground-dwelling 24.733105 36.77647 32.02256 41.13560
Ischnocnema oea Anura NT Ground-dwelling 27.100258 37.10085 32.37677 41.47868
Ischnocnema gehrti Anura DD Ground-dwelling 25.405019 36.79639 31.53132 41.17875
Ischnocnema gehrti Anura DD Ground-dwelling 23.841325 36.58349 31.25951 40.89590
Ischnocnema gehrti Anura DD Ground-dwelling 27.977586 37.14664 31.66115 41.56111
Ischnocnema gualteri Anura LC Ground-dwelling 26.332966 36.98397 32.34377 41.77464
Ischnocnema gualteri Anura LC Ground-dwelling 25.152380 36.82109 32.20465 41.54625
Ischnocnema gualteri Anura LC Ground-dwelling 28.199008 37.24141 32.58324 42.07779
Ischnocnema hoehnei Anura LC Ground-dwelling 25.472870 36.74960 31.94488 41.22112
Ischnocnema hoehnei Anura LC Ground-dwelling 24.211605 36.57528 32.12986 41.31081
Ischnocnema hoehnei Anura LC Ground-dwelling 27.609252 37.04488 32.14892 41.56961
Ischnocnema venancioi Anura LC Ground-dwelling 26.101082 36.89338 32.08394 41.59961
Ischnocnema venancioi Anura LC Ground-dwelling 24.918619 36.73067 31.95728 41.48316
Ischnocnema venancioi Anura LC Ground-dwelling 28.024590 37.15807 32.21563 41.86889
Ischnocnema parva Anura LC Ground-dwelling 25.568114 36.67770 32.78458 42.71756
Ischnocnema parva Anura LC Ground-dwelling 24.389995 36.51428 32.49877 42.43241
Ischnocnema parva Anura LC Ground-dwelling 27.630118 36.96373 31.87794 41.91492
Ischnocnema sambaqui Anura DD Ground-dwelling 23.836674 36.61756 31.92775 41.36602
Ischnocnema sambaqui Anura DD Ground-dwelling 21.947547 36.35686 31.70085 41.09758
Ischnocnema sambaqui Anura DD Ground-dwelling 26.445416 36.97756 32.18993 41.78657
Ischnocnema manezinho Anura NT Ground-dwelling 24.386123 36.69366 32.13717 41.08386
Ischnocnema manezinho Anura NT Ground-dwelling 22.684134 36.45876 31.92177 40.84325
Ischnocnema manezinho Anura NT Ground-dwelling 26.960128 37.04891 32.56838 41.56049
Ischnocnema nigriventris Anura DD Ground-dwelling 25.405019 36.75419 31.90633 41.12875
Ischnocnema nigriventris Anura DD Ground-dwelling 23.841325 36.53776 31.82882 40.97930
Ischnocnema nigriventris Anura DD Ground-dwelling 27.977586 37.11026 32.31762 41.55613
Ischnocnema paranaensis Anura DD Ground-dwelling 23.836674 36.47514 32.22124 41.24408
Ischnocnema paranaensis Anura DD Ground-dwelling 21.947547 36.21940 31.71905 40.76311
Ischnocnema paranaensis Anura DD Ground-dwelling 26.445416 36.82831 32.54988 41.61965
Ischnocnema penaxavantinho Anura DD Ground-dwelling 25.837829 36.79298 31.95098 41.16680
Ischnocnema penaxavantinho Anura DD Ground-dwelling 24.666666 36.63125 31.74473 40.90222
Ischnocnema penaxavantinho Anura DD Ground-dwelling 28.114614 37.10739 32.26591 41.55223
Ischnocnema pusilla Anura DD Ground-dwelling 25.654426 36.79853 32.04343 41.42337
Ischnocnema pusilla Anura DD Ground-dwelling 24.464173 36.63607 31.75792 41.09558
Ischnocnema pusilla Anura DD Ground-dwelling 27.716517 37.08000 32.46389 41.76842
Ischnocnema randorum Anura DD Ground-dwelling 24.282093 36.72419 32.20696 41.45030
Ischnocnema randorum Anura DD Ground-dwelling 23.148617 36.56656 32.09565 41.27395
Ischnocnema randorum Anura DD Ground-dwelling 26.194774 36.99019 32.40778 41.78196
Adelophryne adiastola Anura LC Ground-dwelling 28.676719 37.51692 32.66903 41.92997
Adelophryne adiastola Anura LC Ground-dwelling 27.921540 37.41159 32.63273 41.85269
Adelophryne adiastola Anura LC Ground-dwelling 30.168733 37.72502 32.95141 42.25908
Adelophryne gutturosa Anura LC Ground-dwelling 27.149237 37.12846 32.27530 41.89425
Adelophryne gutturosa Anura LC Ground-dwelling 26.514725 37.04133 32.52852 42.13528
Adelophryne gutturosa Anura LC Ground-dwelling 28.657584 37.33558 33.13531 42.79929
Adelophryne patamona Anura DD Ground-dwelling 26.634291 37.19782 32.43655 41.87126
Adelophryne patamona Anura DD Ground-dwelling 25.965013 37.10571 32.35064 41.78193
Adelophryne patamona Anura DD Ground-dwelling 28.137979 37.40477 32.60425 42.04089
Adelophryne baturitensis Anura VU Ground-dwelling 26.264261 37.25712 32.86782 41.77210
Adelophryne baturitensis Anura VU Ground-dwelling 25.309643 37.12635 32.76819 41.60921
Adelophryne baturitensis Anura VU Ground-dwelling 27.548704 37.43308 33.06777 42.05992
Adelophryne maranguapensis Anura EN Ground-dwelling 26.545960 37.32583 32.71348 41.59669
Adelophryne maranguapensis Anura EN Ground-dwelling 25.626366 37.20017 32.56049 41.48176
Adelophryne maranguapensis Anura EN Ground-dwelling 27.859855 37.50537 32.86698 41.81532
Adelophryne pachydactyla Anura DD Ground-dwelling 24.868561 36.95647 32.36797 41.53599
Adelophryne pachydactyla Anura DD Ground-dwelling 23.971055 36.83199 32.19682 41.31835
Adelophryne pachydactyla Anura DD Ground-dwelling 26.562263 37.19138 32.59835 41.73156
Phyzelaphryne miriamae Anura LC Ground-dwelling 28.632279 37.39871 32.63458 42.13202
Phyzelaphryne miriamae Anura LC Ground-dwelling 27.885349 37.29835 32.48268 41.95843
Phyzelaphryne miriamae Anura LC Ground-dwelling 30.243299 37.61517 32.76882 42.41136
Diasporus anthrax Anura VU Arboreal 24.141171 37.04701 32.78269 41.60890
Diasporus anthrax Anura VU Arboreal 23.344372 36.93571 32.69454 41.50294
Diasporus anthrax Anura VU Arboreal 25.650502 37.25782 32.85316 41.69221
Diasporus diastema Anura LC Arboreal 26.741851 37.40257 33.29885 42.09735
Diasporus diastema Anura LC Arboreal 25.993030 37.29896 33.38043 42.12096
Diasporus diastema Anura LC Arboreal 28.178248 37.60130 33.52213 42.29757
Diasporus hylaeformis Anura LC Arboreal 25.901212 37.29098 32.16971 41.40384
Diasporus hylaeformis Anura LC Arboreal 25.164386 37.19001 32.08507 41.26394
Diasporus hylaeformis Anura LC Arboreal 27.272766 37.47893 32.43467 41.76098
Diasporus quidditus Anura LC Arboreal 26.271128 37.37268 33.45226 42.19397
Diasporus quidditus Anura LC Arboreal 25.620688 37.28227 33.38748 42.10256
Diasporus quidditus Anura LC Arboreal 27.580309 37.55466 33.33611 42.17366
Diasporus gularis Anura LC Arboreal 25.137702 37.23336 32.71365 41.41786
Diasporus gularis Anura LC Arboreal 24.231997 37.10863 32.62240 41.32049
Diasporus gularis Anura LC Arboreal 26.698981 37.44837 32.89322 41.64127
Diasporus tigrillo Anura NT Arboreal 17.078254 36.11961 32.29929 40.80858
Diasporus tigrillo Anura NT Arboreal 15.980470 35.96860 31.66135 40.15743
Diasporus tigrillo Anura NT Arboreal 18.397641 36.30111 32.49060 40.99185
Diasporus tinker Anura LC Arboreal 25.700623 37.25987 32.92142 41.51725
Diasporus tinker Anura LC Arboreal 24.998080 37.16292 32.81326 41.36583
Diasporus tinker Anura LC Arboreal 27.045903 37.44553 32.91944 41.59232
Diasporus ventrimaculatus Anura LC Arboreal 22.415988 36.85975 32.41100 40.86453
Diasporus ventrimaculatus Anura LC Arboreal 21.585361 36.74578 32.37506 40.79201
Diasporus ventrimaculatus Anura LC Arboreal 23.641771 37.02795 32.75532 41.23346
Diasporus vocator Anura LC Ground-dwelling 25.845444 37.44600 33.11512 42.14385
Diasporus vocator Anura LC Ground-dwelling 25.189408 37.35700 32.63760 41.65061
Diasporus vocator Anura LC Ground-dwelling 27.019749 37.60531 33.27156 42.36937
Eleutherodactylus abbotti Anura LC Ground-dwelling 27.400210 37.93798 33.83834 42.27899
Eleutherodactylus abbotti Anura LC Ground-dwelling 26.987185 37.88156 33.76834 42.21710
Eleutherodactylus abbotti Anura LC Ground-dwelling 28.099845 38.03353 33.94430 42.39072
Eleutherodactylus audanti Anura VU Ground-dwelling 27.630689 37.96762 33.47718 42.00618
Eleutherodactylus audanti Anura VU Ground-dwelling 27.213623 37.91025 33.44001 41.91048
Eleutherodactylus audanti Anura VU Ground-dwelling 28.262586 38.05456 33.61927 42.19542
Eleutherodactylus parabates Anura EN Ground-dwelling 27.252255 37.89269 33.80478 42.02111
Eleutherodactylus parabates Anura EN Ground-dwelling 26.903471 37.84409 33.76384 41.98277
Eleutherodactylus parabates Anura EN Ground-dwelling 27.812455 37.97076 33.86572 42.07335
Eleutherodactylus haitianus Anura EN Ground-dwelling 26.984112 37.89907 33.71702 41.78092
Eleutherodactylus haitianus Anura EN Ground-dwelling 26.588709 37.84387 33.67457 41.72361
Eleutherodactylus haitianus Anura EN Ground-dwelling 27.649649 37.99197 33.85320 41.89941
Eleutherodactylus pituinus Anura EN Ground-dwelling 27.378150 37.94140 33.83011 42.18204
Eleutherodactylus pituinus Anura EN Ground-dwelling 26.796011 37.86012 33.77414 42.02850
Eleutherodactylus pituinus Anura EN Ground-dwelling 28.182156 38.05366 33.76394 42.14774
Eleutherodactylus acmonis Anura EN Ground-dwelling 27.476555 37.96864 33.38563 41.67186
Eleutherodactylus acmonis Anura EN Ground-dwelling 27.076189 37.91361 33.35056 41.64338
Eleutherodactylus acmonis Anura EN Ground-dwelling 28.133805 38.05897 33.44319 41.72926
Eleutherodactylus bresslerae Anura CR Ground-dwelling 27.431514 37.96976 33.58540 42.16096
Eleutherodactylus bresslerae Anura CR Ground-dwelling 26.983821 37.90812 33.62979 42.17337
Eleutherodactylus bresslerae Anura CR Ground-dwelling 28.117010 38.06414 33.68025 42.24244
Eleutherodactylus ricordii Anura VU Ground-dwelling 27.622878 38.00525 34.09604 42.59712
Eleutherodactylus ricordii Anura VU Ground-dwelling 27.205066 37.94780 34.03756 42.51429
Eleutherodactylus ricordii Anura VU Ground-dwelling 28.280356 38.09566 34.18386 42.72746
Eleutherodactylus grahami Anura EN Ground-dwelling 28.077857 37.92730 33.79236 42.10114
Eleutherodactylus grahami Anura EN Ground-dwelling 27.601933 37.86363 34.01457 42.32057
Eleutherodactylus grahami Anura EN Ground-dwelling 28.909602 38.03858 33.87461 42.21347
Eleutherodactylus rhodesi Anura CR Ground-dwelling 27.507073 37.91147 33.78532 42.21270
Eleutherodactylus rhodesi Anura CR Ground-dwelling 27.090490 37.85457 33.59124 42.01875
Eleutherodactylus rhodesi Anura CR Ground-dwelling 28.249431 38.01285 33.92084 42.34099
Eleutherodactylus weinlandi Anura LC Ground-dwelling 27.184347 37.79273 33.77371 41.98382
Eleutherodactylus weinlandi Anura LC Ground-dwelling 26.782406 37.73794 33.67026 41.86701
Eleutherodactylus weinlandi Anura LC Ground-dwelling 27.886383 37.88843 33.40395 41.64022
Eleutherodactylus pictissimus Anura LC Ground-dwelling 27.546745 37.93362 33.66850 42.29157
Eleutherodactylus pictissimus Anura LC Ground-dwelling 27.112765 37.87389 33.63375 42.25808
Eleutherodactylus pictissimus Anura LC Ground-dwelling 28.202581 38.02389 33.75950 42.37286
Eleutherodactylus lentus Anura EN Ground-dwelling 27.002369 37.84032 33.23873 41.52336
Eleutherodactylus lentus Anura EN Ground-dwelling 26.404526 37.75655 33.21625 41.43324
Eleutherodactylus lentus Anura EN Ground-dwelling 27.754851 37.94576 33.32724 41.65287
Eleutherodactylus monensis Anura VU Ground-dwelling 26.963730 37.76572 33.20471 41.44867
Eleutherodactylus monensis Anura VU Ground-dwelling 26.488202 37.70015 33.11761 41.30274
Eleutherodactylus monensis Anura VU Ground-dwelling 27.567507 37.84896 33.25527 41.57135
Eleutherodactylus probolaeus Anura EN Ground-dwelling 27.190926 37.85845 33.58875 42.08429
Eleutherodactylus probolaeus Anura EN Ground-dwelling 26.803712 37.80578 33.53062 42.01546
Eleutherodactylus probolaeus Anura EN Ground-dwelling 28.006417 37.96937 33.68152 42.19754
Eleutherodactylus adelus Anura EN Ground-dwelling 27.273960 38.67580 35.41885 42.18253
Eleutherodactylus adelus Anura EN Ground-dwelling 26.738942 38.60372 35.36690 42.11713
Eleutherodactylus adelus Anura EN Ground-dwelling 28.087052 38.78535 35.44760 42.24843
Eleutherodactylus pezopetrus Anura CR Ground-dwelling 27.574156 38.75585 35.43927 42.33218
Eleutherodactylus pezopetrus Anura CR Ground-dwelling 27.107815 38.69270 35.38600 42.25353
Eleutherodactylus pezopetrus Anura CR Ground-dwelling 28.274503 38.85069 35.45248 42.38025
Eleutherodactylus blairhedgesi Anura CR Ground-dwelling 27.170199 38.74533 35.10516 42.47806
Eleutherodactylus blairhedgesi Anura CR Ground-dwelling 26.574098 38.66593 34.94882 42.29467
Eleutherodactylus blairhedgesi Anura CR Ground-dwelling 28.159868 38.87716 35.18671 42.63947
Eleutherodactylus thomasi Anura EN Ground-dwelling 27.311573 38.81394 34.95925 42.12947
Eleutherodactylus thomasi Anura EN Ground-dwelling 26.810269 38.74507 34.89067 42.04858
Eleutherodactylus thomasi Anura EN Ground-dwelling 28.209994 38.93736 35.00149 42.27078
Eleutherodactylus pinarensis Anura EN Ground-dwelling 27.326082 38.82090 35.32606 42.24886
Eleutherodactylus pinarensis Anura EN Ground-dwelling 26.782282 38.74595 35.27585 42.12610
Eleutherodactylus pinarensis Anura EN Ground-dwelling 28.221629 38.94433 35.36699 42.35039
Eleutherodactylus casparii Anura EN Ground-dwelling 27.506125 39.01159 36.01115 42.07703
Eleutherodactylus casparii Anura EN Ground-dwelling 27.004505 38.94310 36.00355 42.03020
Eleutherodactylus casparii Anura EN Ground-dwelling 28.418766 39.13619 36.04587 42.18785
Eleutherodactylus guanahacabibes Anura EN Ground-dwelling 27.366571 38.87214 35.50394 42.21616
Eleutherodactylus guanahacabibes Anura EN Ground-dwelling 26.826845 38.79990 35.54815 42.21957
Eleutherodactylus guanahacabibes Anura EN Ground-dwelling 28.173781 38.98018 35.56895 42.32013
Eleutherodactylus simulans Anura EN Stream-dwelling 27.431514 38.30331 34.84501 41.73838
Eleutherodactylus simulans Anura EN Stream-dwelling 26.983821 38.24183 34.76861 41.62356
Eleutherodactylus simulans Anura EN Stream-dwelling 28.117010 38.39744 34.96057 41.89239
Eleutherodactylus tonyi Anura CR Ground-dwelling 27.343027 38.83101 35.23399 41.98519
Eleutherodactylus tonyi Anura CR Ground-dwelling 26.973151 38.78098 35.36587 42.09303
Eleutherodactylus tonyi Anura CR Ground-dwelling 27.938955 38.91162 35.30707 42.11301
Eleutherodactylus rogersi Anura LC Ground-dwelling 27.382195 38.91292 35.21846 42.33540
Eleutherodactylus rogersi Anura LC Ground-dwelling 26.799872 38.83339 35.19579 42.25071
Eleutherodactylus rogersi Anura LC Ground-dwelling 28.360915 39.04657 35.00932 42.20921
Eleutherodactylus goini Anura VU Ground-dwelling 27.341065 38.80864 35.67351 42.28468
Eleutherodactylus goini Anura VU Ground-dwelling 26.808193 38.73550 35.57747 42.15275
Eleutherodactylus goini Anura VU Ground-dwelling 28.173039 38.92284 35.73830 42.44438
Eleutherodactylus albipes Anura CR Ground-dwelling 27.517039 38.00198 33.76384 42.56102
Eleutherodactylus albipes Anura CR Ground-dwelling 27.158080 37.95311 33.73005 42.51405
Eleutherodactylus albipes Anura CR Ground-dwelling 28.169278 38.09080 33.83818 42.68849
Eleutherodactylus maestrensis Anura DD Ground-dwelling 27.500756 38.11358 33.74443 42.31144
Eleutherodactylus maestrensis Anura DD Ground-dwelling 27.145657 38.06447 33.51502 42.04135
Eleutherodactylus maestrensis Anura DD Ground-dwelling 28.131256 38.20077 33.82589 42.40857
Eleutherodactylus dimidiatus Anura NT Ground-dwelling 27.451448 38.12238 33.67251 42.21358
Eleutherodactylus dimidiatus Anura NT Ground-dwelling 26.990056 38.05970 33.62448 42.13838
Eleutherodactylus dimidiatus Anura NT Ground-dwelling 28.226998 38.22773 34.06140 42.63351
Eleutherodactylus emiliae Anura EN Ground-dwelling 27.563189 38.15762 34.21177 42.57439
Eleutherodactylus emiliae Anura EN Ground-dwelling 27.060264 38.08864 34.14344 42.49074
Eleutherodactylus emiliae Anura EN Ground-dwelling 28.504649 38.28675 34.30269 42.69561
Eleutherodactylus albolabris Anura LC Arboreal 25.509532 37.51583 33.23548 41.42255
Eleutherodactylus albolabris Anura LC Arboreal 24.564680 37.38465 33.15571 41.23706
Eleutherodactylus albolabris Anura LC Arboreal 27.320450 37.76725 33.49645 41.80563
Eleutherodactylus alcoae Anura LC Ground-dwelling 27.462306 38.10649 33.75038 42.05848
Eleutherodactylus alcoae Anura LC Ground-dwelling 27.076098 38.05318 33.73168 42.03265
Eleutherodactylus alcoae Anura LC Ground-dwelling 28.088519 38.19292 33.74339 42.06481
Eleutherodactylus armstrongi Anura EN Arboreal 27.462306 37.89807 34.10030 42.09665
Eleutherodactylus armstrongi Anura EN Arboreal 27.076098 37.84462 34.07652 42.04646
Eleutherodactylus armstrongi Anura EN Arboreal 28.088519 37.98474 34.17478 42.25657
Eleutherodactylus leoncei Anura EN Ground-dwelling 27.503677 38.02548 33.74989 42.03164
Eleutherodactylus leoncei Anura EN Ground-dwelling 27.101103 37.97041 33.64953 41.92262
Eleutherodactylus leoncei Anura EN Ground-dwelling 28.141286 38.11270 33.81093 42.10341
Eleutherodactylus alticola Anura CR Ground-dwelling 27.654909 36.78838 33.80065 40.04771
Eleutherodactylus alticola Anura CR Ground-dwelling 27.271497 36.73608 33.76518 39.99610
Eleutherodactylus alticola Anura CR Ground-dwelling 28.285005 36.87433 33.84430 40.17199
Eleutherodactylus nubicola Anura EN Ground-dwelling 27.654909 36.76032 33.74051 39.83605
Eleutherodactylus nubicola Anura EN Ground-dwelling 27.271497 36.70707 33.70592 39.74652
Eleutherodactylus nubicola Anura EN Ground-dwelling 28.285005 36.84783 33.84003 39.99169
Eleutherodactylus fuscus Anura EN Ground-dwelling 27.422557 36.68710 33.60221 39.76222
Eleutherodactylus fuscus Anura EN Ground-dwelling 27.065147 36.63816 33.56853 39.68346
Eleutherodactylus fuscus Anura EN Ground-dwelling 27.986910 36.76437 33.65541 39.87438
Eleutherodactylus junori Anura CR Ground-dwelling 27.386647 36.68673 34.05498 39.77770
Eleutherodactylus junori Anura CR Ground-dwelling 27.038864 36.63881 34.01733 39.72139
Eleutherodactylus junori Anura CR Ground-dwelling 27.934792 36.76224 34.02529 39.79535
Eleutherodactylus andrewsi Anura EN Stream-dwelling 27.654909 36.12445 32.61938 39.37655
Eleutherodactylus andrewsi Anura EN Stream-dwelling 27.271497 36.07208 32.53813 39.26295
Eleutherodactylus andrewsi Anura EN Stream-dwelling 28.285005 36.21050 32.57363 39.39409
Eleutherodactylus griphus Anura EN Ground-dwelling 27.386647 36.79479 33.96945 39.69256
Eleutherodactylus griphus Anura EN Ground-dwelling 27.038864 36.74680 33.93620 39.64686
Eleutherodactylus griphus Anura EN Ground-dwelling 27.934792 36.87042 34.08191 39.84323
Eleutherodactylus glaucoreius Anura EN Ground-dwelling 27.519179 36.74410 33.52635 39.56270
Eleutherodactylus glaucoreius Anura EN Ground-dwelling 27.126436 36.69076 33.48782 39.49882
Eleutherodactylus glaucoreius Anura EN Ground-dwelling 28.142441 36.82875 33.86768 39.95719
Eleutherodactylus pantoni Anura VU Ground-dwelling 27.500008 36.81752 33.71271 39.70826
Eleutherodactylus pantoni Anura VU Ground-dwelling 27.133930 36.76702 33.66576 39.65438
Eleutherodactylus pantoni Anura VU Ground-dwelling 28.086275 36.89840 33.76262 39.80784
Eleutherodactylus pentasyringos Anura EN Ground-dwelling 27.519179 36.70521 33.88408 39.93445
Eleutherodactylus pentasyringos Anura EN Ground-dwelling 27.126436 36.65156 33.84938 39.85450
Eleutherodactylus pentasyringos Anura EN Ground-dwelling 28.142441 36.79035 33.89186 39.99413
Eleutherodactylus jamaicensis Anura CR Arboreal 27.477170 36.61991 33.56132 39.51648
Eleutherodactylus jamaicensis Anura CR Arboreal 27.099192 36.56895 33.58649 39.52526
Eleutherodactylus jamaicensis Anura CR Arboreal 28.073345 36.70030 33.73067 39.72933
Eleutherodactylus luteolus Anura EN Ground-dwelling 27.422557 36.78626 33.90960 40.12384
Eleutherodactylus luteolus Anura EN Ground-dwelling 27.065147 36.73758 33.91171 40.11679
Eleutherodactylus luteolus Anura EN Ground-dwelling 27.986910 36.86312 33.94691 40.20445
Eleutherodactylus cavernicola Anura CR Ground-dwelling 27.433563 36.87962 33.84760 40.17167
Eleutherodactylus cavernicola Anura CR Ground-dwelling 27.043203 36.82534 33.48384 39.79617
Eleutherodactylus cavernicola Anura CR Ground-dwelling 28.036791 36.96351 33.94416 40.30046
Eleutherodactylus grabhami Anura EN Ground-dwelling 27.442930 36.94892 33.77124 40.37236
Eleutherodactylus grabhami Anura EN Ground-dwelling 27.078442 36.89801 33.66035 40.21472
Eleutherodactylus grabhami Anura EN Ground-dwelling 28.015842 37.02895 33.81166 40.46003
Eleutherodactylus sisyphodemus Anura CR Ground-dwelling 27.386647 36.72729 33.47842 40.07058
Eleutherodactylus sisyphodemus Anura CR Ground-dwelling 27.038864 36.68121 33.37888 39.93509
Eleutherodactylus sisyphodemus Anura CR Ground-dwelling 27.934792 36.79993 33.55448 40.17548
Eleutherodactylus gundlachi Anura EN Ground-dwelling 27.509937 36.95929 33.62056 40.34357
Eleutherodactylus gundlachi Anura EN Ground-dwelling 27.101949 36.90319 33.66374 40.36495
Eleutherodactylus gundlachi Anura EN Ground-dwelling 28.182517 37.05178 33.71843 40.49113
Eleutherodactylus amadeus Anura CR Ground-dwelling 27.757701 37.96991 33.65309 42.14194
Eleutherodactylus amadeus Anura CR Ground-dwelling 27.326143 37.91092 33.62239 42.08255
Eleutherodactylus amadeus Anura CR Ground-dwelling 28.383886 38.05551 33.68846 42.22813
Eleutherodactylus caribe Anura CR Ground-dwelling 27.438964 37.99720 34.08981 42.09392
Eleutherodactylus caribe Anura CR Ground-dwelling 27.062001 37.94579 34.04381 42.02613
Eleutherodactylus caribe Anura CR Ground-dwelling 28.070644 38.08333 34.15414 42.20753
Eleutherodactylus eunaster Anura CR Arboreal 27.757701 37.84971 33.92584 42.19567
Eleutherodactylus eunaster Anura CR Arboreal 27.326143 37.79056 33.84701 42.14066
Eleutherodactylus eunaster Anura CR Arboreal 28.383886 37.93552 34.03168 42.29494
Eleutherodactylus corona Anura CR Arboreal 27.438964 37.81308 33.16688 42.25803
Eleutherodactylus corona Anura CR Arboreal 27.062001 37.76187 33.08326 42.17119
Eleutherodactylus corona Anura CR Arboreal 28.070644 37.89890 33.21534 42.32788
Eleutherodactylus heminota Anura VU Arboreal 27.630689 37.87534 33.78674 42.15274
Eleutherodactylus heminota Anura VU Arboreal 27.213623 37.81823 33.72709 42.09436
Eleutherodactylus heminota Anura VU Arboreal 28.262586 37.96188 34.00437 42.31769
Eleutherodactylus bakeri Anura CR Arboreal 27.757701 37.93488 33.91748 42.64353
Eleutherodactylus bakeri Anura CR Arboreal 27.326143 37.87465 33.91977 42.62459
Eleutherodactylus bakeri Anura CR Arboreal 28.383886 38.02228 34.15526 42.89589
Eleutherodactylus dolomedes Anura CR Arboreal 27.438964 37.86092 33.53881 42.00089
Eleutherodactylus dolomedes Anura CR Arboreal 27.062001 37.80945 33.39412 41.86209
Eleutherodactylus dolomedes Anura CR Arboreal 28.070644 37.94717 33.70375 42.17989
Eleutherodactylus glaphycompus Anura EN Ground-dwelling 27.756834 38.06268 33.52403 42.11908
Eleutherodactylus glaphycompus Anura EN Ground-dwelling 27.317007 38.00226 33.45612 42.02136
Eleutherodactylus glaphycompus Anura EN Ground-dwelling 28.412630 38.15276 33.54251 42.16569
Eleutherodactylus thorectes Anura CR Ground-dwelling 27.757701 38.10859 33.97986 42.31490
Eleutherodactylus thorectes Anura CR Ground-dwelling 27.326143 38.04863 33.92492 42.26349
Eleutherodactylus thorectes Anura CR Ground-dwelling 28.383886 38.19559 34.02412 42.40824
Eleutherodactylus jugans Anura CR Ground-dwelling 27.503677 38.02329 33.82552 42.10028
Eleutherodactylus jugans Anura CR Ground-dwelling 27.101103 37.96770 33.84160 42.10514
Eleutherodactylus jugans Anura CR Ground-dwelling 28.141286 38.11133 33.96220 42.26668
Eleutherodactylus apostates Anura CR Ground-dwelling 27.757701 38.12514 33.60340 42.13289
Eleutherodactylus apostates Anura CR Ground-dwelling 27.326143 38.06578 33.54834 42.04336
Eleutherodactylus apostates Anura CR Ground-dwelling 28.383886 38.21127 33.61053 42.14325
Eleutherodactylus oxyrhyncus Anura CR Ground-dwelling 27.756834 38.05482 33.99434 42.32424
Eleutherodactylus oxyrhyncus Anura CR Ground-dwelling 27.317007 37.99465 33.83542 42.17172
Eleutherodactylus oxyrhyncus Anura CR Ground-dwelling 28.412630 38.14455 34.12764 42.36884
Eleutherodactylus furcyensis Anura CR Ground-dwelling 27.503677 37.97705 33.43712 41.63483
Eleutherodactylus furcyensis Anura CR Ground-dwelling 27.101103 37.92235 33.41727 41.58245
Eleutherodactylus furcyensis Anura CR Ground-dwelling 28.141286 38.06370 33.78878 42.02111
Eleutherodactylus rufifemoralis Anura EN Ground-dwelling 27.252255 37.99564 34.07833 41.94279
Eleutherodactylus rufifemoralis Anura EN Ground-dwelling 26.903471 37.94868 34.01499 41.88596
Eleutherodactylus rufifemoralis Anura EN Ground-dwelling 27.812455 38.07107 34.18497 42.05080
Eleutherodactylus amplinympha Anura EN Arboreal 26.353656 38.29372 34.92439 41.78879
Eleutherodactylus amplinympha Anura EN Arboreal 25.843037 38.22536 34.87762 41.75732
Eleutherodactylus amplinympha Anura EN Arboreal 27.130866 38.39777 35.04495 41.95897
Eleutherodactylus martinicensis Anura NT Ground-dwelling 26.963979 38.50906 35.58190 41.95629
Eleutherodactylus martinicensis Anura NT Ground-dwelling 26.447813 38.43918 35.51281 41.88460
Eleutherodactylus martinicensis Anura NT Ground-dwelling 27.750454 38.61553 35.66351 42.08798
Eleutherodactylus barlagnei Anura EN Stream-dwelling 26.706321 37.85743 34.20147 41.56153
Eleutherodactylus barlagnei Anura EN Stream-dwelling 26.197484 37.78913 34.18565 41.48511
Eleutherodactylus barlagnei Anura EN Stream-dwelling 27.482949 37.96167 34.48892 41.88705
Eleutherodactylus pinchoni Anura EN Ground-dwelling 26.706321 38.45312 34.89622 42.05429
Eleutherodactylus pinchoni Anura EN Ground-dwelling 26.197484 38.38344 34.83862 41.98256
Eleutherodactylus pinchoni Anura EN Ground-dwelling 27.482949 38.55948 34.91702 42.13009
Eleutherodactylus angustidigitorum Anura LC Ground-dwelling 24.070575 37.45026 33.29831 41.76469
Eleutherodactylus angustidigitorum Anura LC Ground-dwelling 23.036319 37.30838 33.23850 41.68955
Eleutherodactylus angustidigitorum Anura LC Ground-dwelling 25.869554 37.69705 33.60659 42.14860
Eleutherodactylus cochranae Anura LC Arboreal 27.010929 39.37044 36.50505 42.75183
Eleutherodactylus cochranae Anura LC Arboreal 26.472971 39.29707 36.51291 42.74653
Eleutherodactylus cochranae Anura LC Arboreal 27.729291 39.46841 36.13223 42.44250
Eleutherodactylus hedricki Anura EN Arboreal 26.882112 39.33826 36.54976 42.96646
Eleutherodactylus hedricki Anura EN Arboreal 26.344935 39.26494 35.95748 42.36403
Eleutherodactylus hedricki Anura EN Arboreal 27.616751 39.43854 36.57276 43.04077
Eleutherodactylus schwartzi Anura EN Arboreal 27.246704 39.59199 36.79548 42.47399
Eleutherodactylus schwartzi Anura EN Arboreal 26.571018 39.50014 36.82609 42.46612
Eleutherodactylus schwartzi Anura EN Arboreal 28.104304 39.70856 36.87175 42.59492
Eleutherodactylus gryllus Anura CR Ground-dwelling 26.834978 39.43389 36.07397 42.60283
Eleutherodactylus gryllus Anura CR Ground-dwelling 26.247976 39.35447 36.00053 42.49018
Eleutherodactylus gryllus Anura CR Ground-dwelling 27.603780 39.53791 36.15408 42.76391
Eleutherodactylus cooki Anura EN Ground-dwelling 26.882112 39.38543 35.99214 42.73988
Eleutherodactylus cooki Anura EN Ground-dwelling 26.344935 39.31112 35.75832 42.49433
Eleutherodactylus cooki Anura EN Ground-dwelling 27.616751 39.48704 36.07027 42.86998
Eleutherodactylus locustus Anura EN Ground-dwelling 26.882112 39.40817 36.42367 42.60098
Eleutherodactylus locustus Anura EN Ground-dwelling 26.344935 39.33461 36.35051 42.51918
Eleutherodactylus locustus Anura EN Ground-dwelling 27.616751 39.50878 36.52340 42.72951
Eleutherodactylus atkinsi Anura LC Ground-dwelling 27.419634 38.03357 33.99350 42.08072
Eleutherodactylus atkinsi Anura LC Ground-dwelling 26.937499 37.96625 33.95335 42.02560
Eleutherodactylus atkinsi Anura LC Ground-dwelling 28.245246 38.14885 34.12438 42.25244
Eleutherodactylus intermedius Anura EN Ground-dwelling 27.645267 37.91723 33.82886 42.09917
Eleutherodactylus intermedius Anura EN Ground-dwelling 27.213706 37.85836 33.76040 42.04339
Eleutherodactylus intermedius Anura EN Ground-dwelling 28.298620 38.00637 33.92767 42.20277
Eleutherodactylus varleyi Anura LC Arboreal 27.427776 37.76929 33.64997 41.78705
Eleutherodactylus varleyi Anura LC Arboreal 26.944155 37.70247 33.56628 41.69433
Eleutherodactylus varleyi Anura LC Arboreal 28.253231 37.88335 33.75737 41.94532
Eleutherodactylus cubanus Anura CR Ground-dwelling 27.517039 38.03987 33.92592 42.38036
Eleutherodactylus cubanus Anura CR Ground-dwelling 27.158080 37.99046 33.79955 42.25012
Eleutherodactylus cubanus Anura CR Ground-dwelling 28.169278 38.12965 33.99468 42.48233
Eleutherodactylus iberia Anura CR Ground-dwelling 27.431514 37.95661 33.92481 42.10068
Eleutherodactylus iberia Anura CR Ground-dwelling 26.983821 37.89588 33.89208 42.01547
Eleutherodactylus iberia Anura CR Ground-dwelling 28.117010 38.04960 33.84350 42.06182
Eleutherodactylus jaumei Anura CR Ground-dwelling 27.517039 38.01534 33.35577 41.95066
Eleutherodactylus jaumei Anura CR Ground-dwelling 27.158080 37.96608 33.87203 42.45126
Eleutherodactylus jaumei Anura CR Ground-dwelling 28.169278 38.10484 33.44096 42.10678
Eleutherodactylus limbatus Anura VU Ground-dwelling 27.417305 37.94309 33.76556 42.28485
Eleutherodactylus limbatus Anura VU Ground-dwelling 26.942713 37.87854 33.15774 41.64647
Eleutherodactylus limbatus Anura VU Ground-dwelling 28.200992 38.04968 33.79474 42.35293
Eleutherodactylus orientalis Anura CR Ground-dwelling 27.431514 37.96401 33.67998 42.00550
Eleutherodactylus orientalis Anura CR Ground-dwelling 26.983821 37.90337 33.60788 41.91230
Eleutherodactylus orientalis Anura CR Ground-dwelling 28.117010 38.05685 33.87245 42.20368
Eleutherodactylus etheridgei Anura EN Ground-dwelling 27.824399 38.00377 33.85152 42.18551
Eleutherodactylus etheridgei Anura EN Ground-dwelling 27.362674 37.94142 33.84033 42.15992
Eleutherodactylus etheridgei Anura EN Ground-dwelling 28.473107 38.09138 33.97701 42.31537
Eleutherodactylus auriculatoides Anura VU Arboreal 26.894731 37.74198 33.71812 42.01786
Eleutherodactylus auriculatoides Anura VU Arboreal 26.483788 37.68534 33.66287 41.94312
Eleutherodactylus auriculatoides Anura VU Arboreal 27.595380 37.83856 33.74190 42.14530
Eleutherodactylus montanus Anura EN Arboreal 26.894731 37.75855 33.45852 41.62557
Eleutherodactylus montanus Anura EN Arboreal 26.483788 37.70195 33.40460 41.56504
Eleutherodactylus montanus Anura EN Arboreal 27.595380 37.85504 33.69320 41.88622
Eleutherodactylus patriciae Anura EN Ground-dwelling 26.984112 37.98411 34.17666 42.35802
Eleutherodactylus patriciae Anura EN Ground-dwelling 26.588709 37.92986 34.01789 42.18961
Eleutherodactylus patriciae Anura EN Ground-dwelling 27.649649 38.07544 34.26716 42.45186
Eleutherodactylus fowleri Anura CR Arboreal 27.503677 37.80645 33.70541 41.79004
Eleutherodactylus fowleri Anura CR Arboreal 27.101103 37.75071 33.65227 41.69667
Eleutherodactylus fowleri Anura CR Arboreal 28.141286 37.89473 33.64164 41.74385
Eleutherodactylus lamprotes Anura CR Arboreal 27.757701 37.85909 33.92489 42.20764
Eleutherodactylus lamprotes Anura CR Arboreal 27.326143 37.79843 33.88133 42.16080
Eleutherodactylus lamprotes Anura CR Arboreal 28.383886 37.94710 34.01589 42.33584
Eleutherodactylus guantanamera Anura VU Arboreal 27.693437 37.84137 33.72959 41.93891
Eleutherodactylus guantanamera Anura VU Arboreal 27.236390 37.77857 33.64933 41.84731
Eleutherodactylus guantanamera Anura VU Arboreal 28.354408 37.93218 33.79442 42.06484
Eleutherodactylus ionthus Anura EN Arboreal 27.605181 37.77767 33.53314 41.73071
Eleutherodactylus ionthus Anura EN Arboreal 27.202932 37.72288 33.49242 41.69885
Eleutherodactylus ionthus Anura EN Arboreal 28.244745 37.86480 33.61610 41.86277
Eleutherodactylus varians Anura VU Arboreal 27.377792 37.80442 33.83221 42.29192
Eleutherodactylus varians Anura VU Arboreal 26.866437 37.73400 33.78480 42.24916
Eleutherodactylus varians Anura VU Arboreal 28.259254 37.92581 33.76978 42.27666
Eleutherodactylus leberi Anura EN Arboreal 27.500756 37.92693 33.40816 41.77717
Eleutherodactylus leberi Anura EN Arboreal 27.145657 37.87905 33.35886 41.73440
Eleutherodactylus leberi Anura EN Arboreal 28.131256 38.01194 33.63555 42.06869
Eleutherodactylus melacara Anura EN Arboreal 27.468813 37.88264 33.26165 41.88220
Eleutherodactylus melacara Anura EN Arboreal 27.112540 37.83440 33.39943 42.00526
Eleutherodactylus melacara Anura EN Arboreal 28.129738 37.97212 33.35597 41.97714
Eleutherodactylus sommeri Anura EN Arboreal 27.250553 37.81698 33.83250 42.21512
Eleutherodactylus sommeri Anura EN Arboreal 26.884252 37.76705 34.17338 42.55791
Eleutherodactylus sommeri Anura EN Arboreal 27.923157 37.90867 33.93161 42.30696
Eleutherodactylus wetmorei Anura VU Arboreal 27.630689 37.87792 33.71166 41.93249
Eleutherodactylus wetmorei Anura VU Arboreal 27.213623 37.82049 33.70808 41.88896
Eleutherodactylus wetmorei Anura VU Arboreal 28.262586 37.96493 33.83039 42.13790
Eleutherodactylus auriculatus Anura LC Arboreal 27.411046 37.77642 33.42139 41.77051
Eleutherodactylus auriculatus Anura LC Arboreal 26.932036 37.71143 33.28378 41.62292
Eleutherodactylus auriculatus Anura LC Arboreal 28.218889 37.88604 33.45967 41.85246
Eleutherodactylus principalis Anura EN Arboreal 27.502835 37.77125 33.64924 42.01601
Eleutherodactylus principalis Anura EN Arboreal 27.045818 37.70930 33.61266 41.95399
Eleutherodactylus principalis Anura EN Arboreal 28.195756 37.86516 33.77156 42.18683
Eleutherodactylus glamyrus Anura EN Arboreal 27.517039 37.87240 33.59794 42.27378
Eleutherodactylus glamyrus Anura EN Arboreal 27.158080 37.82260 33.54311 42.18939
Eleutherodactylus glamyrus Anura EN Arboreal 28.169278 37.96290 33.00969 41.71051
Eleutherodactylus bartonsmithi Anura CR Arboreal 27.502835 37.88201 33.53867 41.75654
Eleutherodactylus bartonsmithi Anura CR Arboreal 27.045818 37.81873 33.48205 41.72233
Eleutherodactylus bartonsmithi Anura CR Arboreal 28.195756 37.97797 33.63475 41.83467
Eleutherodactylus mariposa Anura CR Arboreal 27.574156 37.88887 33.59151 42.16784
Eleutherodactylus mariposa Anura CR Arboreal 27.107815 37.82536 33.61616 42.18390
Eleutherodactylus mariposa Anura CR Arboreal 28.274503 37.98424 33.66536 42.25294
Eleutherodactylus ronaldi Anura VU Arboreal 27.547111 37.83101 33.76545 42.32004
Eleutherodactylus ronaldi Anura VU Arboreal 27.145706 37.77632 33.69370 42.26394
Eleutherodactylus ronaldi Anura VU Arboreal 28.198770 37.91981 33.87224 42.44762
Eleutherodactylus eileenae Anura NT Arboreal 27.363101 37.87146 33.59345 42.30991
Eleutherodactylus eileenae Anura NT Arboreal 26.848209 37.80032 33.56554 42.27157
Eleutherodactylus eileenae Anura NT Arboreal 28.247183 37.99360 33.64137 42.37574
Eleutherodactylus ruthae Anura EN Ground-dwelling 27.153500 37.78521 33.92216 42.21180
Eleutherodactylus ruthae Anura EN Ground-dwelling 26.765864 37.73338 33.89384 42.13314
Eleutherodactylus ruthae Anura EN Ground-dwelling 27.886435 37.88323 33.96822 42.27117
Eleutherodactylus hypostenor Anura EN Fossorial 27.315909 38.82498 34.74208 42.93100
Eleutherodactylus hypostenor Anura EN Fossorial 26.964779 38.77764 34.71267 42.89522
Eleutherodactylus hypostenor Anura EN Fossorial 27.897720 38.90344 34.86970 43.05431
Eleutherodactylus parapelates Anura CR Fossorial 27.757701 38.94550 35.09368 43.14904
Eleutherodactylus parapelates Anura CR Fossorial 27.326143 38.88637 35.07370 43.08630
Eleutherodactylus parapelates Anura CR Fossorial 28.383886 39.03130 35.07801 43.18303
Eleutherodactylus chlorophenax Anura CR Ground-dwelling 27.757701 38.04096 34.03022 42.17989
Eleutherodactylus chlorophenax Anura CR Ground-dwelling 27.326143 37.98076 33.99507 42.11691
Eleutherodactylus chlorophenax Anura CR Ground-dwelling 28.383886 38.12831 34.13789 42.33276
Eleutherodactylus nortoni Anura CR Arboreal 27.630689 37.81625 34.17306 42.61014
Eleutherodactylus nortoni Anura CR Arboreal 27.213623 37.75966 34.19528 42.61264
Eleutherodactylus nortoni Anura CR Arboreal 28.262586 37.90198 34.41072 42.87075
Eleutherodactylus inoptatus Anura NT Ground-dwelling 27.304693 37.91646 33.49937 41.76799
Eleutherodactylus inoptatus Anura NT Ground-dwelling 26.901219 37.86051 33.45812 41.69280
Eleutherodactylus inoptatus Anura NT Ground-dwelling 27.992162 38.01177 33.78115 42.07225
Eleutherodactylus brevirostris Anura CR Ground-dwelling 27.757701 38.06051 34.18678 42.70085
Eleutherodactylus brevirostris Anura CR Ground-dwelling 27.326143 38.00091 34.16912 42.59850
Eleutherodactylus brevirostris Anura CR Ground-dwelling 28.383886 38.14698 34.17313 42.76268
Eleutherodactylus ventrilineatus Anura CR Ground-dwelling 27.757701 37.98100 34.00717 42.33035
Eleutherodactylus ventrilineatus Anura CR Ground-dwelling 27.326143 37.92246 33.96025 42.26948
Eleutherodactylus ventrilineatus Anura CR Ground-dwelling 28.383886 38.06594 34.07042 42.44317
Eleutherodactylus glandulifer Anura CR Stream-dwelling 27.757701 37.26691 32.94464 41.51391
Eleutherodactylus glandulifer Anura CR Stream-dwelling 27.326143 37.20849 33.08733 41.61344
Eleutherodactylus glandulifer Anura CR Stream-dwelling 28.383886 37.35168 33.00692 41.61270
Eleutherodactylus sciagraphus Anura CR Ground-dwelling 27.438964 37.89204 33.47779 41.95276
Eleutherodactylus sciagraphus Anura CR Ground-dwelling 27.062001 37.84108 33.63185 42.06479
Eleutherodactylus sciagraphus Anura CR Ground-dwelling 28.070644 37.97744 33.53385 42.05850
Eleutherodactylus counouspeus Anura EN Ground-dwelling 27.757701 38.00253 34.04333 42.20948
Eleutherodactylus counouspeus Anura EN Ground-dwelling 27.326143 37.94388 33.98788 42.16979
Eleutherodactylus counouspeus Anura EN Ground-dwelling 28.383886 38.08763 34.12326 42.29203
Eleutherodactylus cuneatus Anura LC Ground-dwelling 27.547111 37.93354 33.29865 42.16831
Eleutherodactylus cuneatus Anura LC Ground-dwelling 27.145706 37.87824 33.26863 42.11628
Eleutherodactylus cuneatus Anura LC Ground-dwelling 28.198770 38.02331 33.48435 42.37660
Eleutherodactylus turquinensis Anura CR Stream-dwelling 27.468813 37.19199 32.33549 41.08855
Eleutherodactylus turquinensis Anura CR Stream-dwelling 27.112540 37.14383 32.27848 41.01915
Eleutherodactylus turquinensis Anura CR Stream-dwelling 28.129738 37.28135 32.44127 41.21728
Eleutherodactylus cystignathoides Anura LC Ground-dwelling 24.171416 37.43305 33.42886 41.74271
Eleutherodactylus cystignathoides Anura LC Ground-dwelling 23.252503 37.30673 33.25871 41.53671
Eleutherodactylus cystignathoides Anura LC Ground-dwelling 26.117205 37.70055 33.70345 42.10846
Eleutherodactylus nitidus Anura LC Ground-dwelling 24.124119 37.55621 33.76598 42.11847
Eleutherodactylus nitidus Anura LC Ground-dwelling 22.984547 37.40050 33.53469 41.84603
Eleutherodactylus nitidus Anura LC Ground-dwelling 26.189102 37.83836 33.77603 42.23510
Eleutherodactylus pipilans Anura LC Ground-dwelling 26.506092 37.80538 33.85767 42.04067
Eleutherodactylus pipilans Anura LC Ground-dwelling 25.466879 37.66268 33.68351 41.80708
Eleutherodactylus pipilans Anura LC Ground-dwelling 28.408486 38.06662 34.35359 42.61837
Eleutherodactylus marnockii Anura LC Ground-dwelling 24.331598 37.65426 33.77826 41.72828
Eleutherodactylus marnockii Anura LC Ground-dwelling 23.039646 37.47234 33.61294 41.57716
Eleutherodactylus marnockii Anura LC Ground-dwelling 26.618583 37.97630 33.82733 41.92162
Eleutherodactylus symingtoni Anura CR Ground-dwelling 27.298995 37.90976 33.91913 42.02384
Eleutherodactylus symingtoni Anura CR Ground-dwelling 26.762429 37.83572 33.96741 42.03033
Eleutherodactylus symingtoni Anura CR Ground-dwelling 28.199300 38.03400 33.98712 42.09387
Eleutherodactylus zeus Anura EN Ground-dwelling 27.330522 37.82379 33.61619 41.80075
Eleutherodactylus zeus Anura EN Ground-dwelling 26.793698 37.75091 33.56857 41.73112
Eleutherodactylus zeus Anura EN Ground-dwelling 28.140611 37.93378 33.68435 41.93185
Eleutherodactylus dennisi Anura LC Ground-dwelling 23.752709 37.42364 33.30567 41.35343
Eleutherodactylus dennisi Anura LC Ground-dwelling 22.865035 37.30113 33.30478 41.32852
Eleutherodactylus dennisi Anura LC Ground-dwelling 25.482996 37.66244 33.47074 41.54767
Eleutherodactylus dilatus Anura LC Ground-dwelling 25.149511 37.62193 33.85213 41.89351
Eleutherodactylus dilatus Anura LC Ground-dwelling 24.010788 37.46549 33.61091 41.66997
Eleutherodactylus dilatus Anura LC Ground-dwelling 27.212280 37.90532 33.98087 42.13979
Eleutherodactylus diplasius Anura CR Arboreal 27.757701 37.74073 33.66659 41.90295
Eleutherodactylus diplasius Anura CR Arboreal 27.326143 37.68068 33.62307 41.83242
Eleutherodactylus diplasius Anura CR Arboreal 28.383886 37.82785 33.72158 42.00331
Eleutherodactylus flavescens Anura NT Ground-dwelling 27.030132 37.88829 33.98555 42.09690
Eleutherodactylus flavescens Anura NT Ground-dwelling 26.614189 37.83105 33.93354 42.02281
Eleutherodactylus flavescens Anura NT Ground-dwelling 27.769712 37.99009 34.04331 42.23707
Eleutherodactylus grandis Anura EN Ground-dwelling 19.615331 36.77860 33.19574 41.22327
Eleutherodactylus grandis Anura EN Ground-dwelling 18.329823 36.60294 32.91457 40.96941
Eleutherodactylus grandis Anura EN Ground-dwelling 22.683425 37.19786 33.60993 41.57461
Eleutherodactylus greyi Anura EN Ground-dwelling 27.444280 37.89112 33.89576 42.25564
Eleutherodactylus greyi Anura EN Ground-dwelling 26.949059 37.82283 33.70485 42.04996
Eleutherodactylus greyi Anura EN Ground-dwelling 28.344212 38.01523 33.99431 42.38745
Eleutherodactylus guttilatus Anura LC Ground-dwelling 22.606563 37.34310 33.12237 41.82118
Eleutherodactylus guttilatus Anura LC Ground-dwelling 21.377241 37.17609 32.94225 41.61712
Eleutherodactylus guttilatus Anura LC Ground-dwelling 24.917707 37.65706 33.53198 42.28686
Eleutherodactylus interorbitalis Anura LC Ground-dwelling 24.724626 37.66010 33.30328 41.75103
Eleutherodactylus interorbitalis Anura LC Ground-dwelling 22.934026 37.41355 33.14718 41.44103
Eleutherodactylus interorbitalis Anura LC Ground-dwelling 27.288960 38.01320 33.73311 42.31741
Eleutherodactylus juanariveroi Anura CR Arboreal 26.929247 37.74150 33.57819 42.15773
Eleutherodactylus juanariveroi Anura CR Arboreal 26.441893 37.67458 33.52828 42.07921
Eleutherodactylus juanariveroi Anura CR Arboreal 27.629723 37.83770 33.61204 42.22206
Eleutherodactylus klinikowskii Anura EN Arboreal 27.330522 37.77634 33.88263 42.15973
Eleutherodactylus klinikowskii Anura EN Arboreal 26.793698 37.70307 33.81965 42.08605
Eleutherodactylus klinikowskii Anura EN Arboreal 28.140611 37.88692 33.91234 42.27091
Eleutherodactylus zugi Anura EN Ground-dwelling 27.316613 37.94843 34.15420 41.91822
Eleutherodactylus zugi Anura EN Ground-dwelling 26.779634 37.87446 34.09438 41.85135
Eleutherodactylus zugi Anura EN Ground-dwelling 28.198275 38.06989 34.24043 42.06095
Eleutherodactylus paralius Anura NT Ground-dwelling 27.083968 37.97643 33.99634 42.11636
Eleutherodactylus paralius Anura NT Ground-dwelling 26.695195 37.92298 33.95930 42.04341
Eleutherodactylus paralius Anura NT Ground-dwelling 27.772900 38.07116 34.00062 42.15043
Eleutherodactylus leprus Anura LC Ground-dwelling 26.291434 37.68616 33.10839 41.57014
Eleutherodactylus leprus Anura LC Ground-dwelling 25.315199 37.55420 33.00739 41.42191
Eleutherodactylus leprus Anura LC Ground-dwelling 28.240626 37.94963 33.36077 41.87505
Eleutherodactylus longipes Anura LC Ground-dwelling 23.437894 37.41780 33.16369 41.39772
Eleutherodactylus longipes Anura LC Ground-dwelling 22.437962 37.28262 32.92269 41.06750
Eleutherodactylus longipes Anura LC Ground-dwelling 25.422248 37.68605 32.97982 41.23712
Eleutherodactylus maurus Anura VU Ground-dwelling 23.358394 37.31359 33.19046 41.19318
Eleutherodactylus maurus Anura VU Ground-dwelling 22.294787 37.16589 33.12067 41.08325
Eleutherodactylus maurus Anura VU Ground-dwelling 25.628096 37.62877 33.66345 41.70244
Eleutherodactylus michaelschmidi Anura EN Ground-dwelling 27.500756 37.89181 33.61034 41.76405
Eleutherodactylus michaelschmidi Anura EN Ground-dwelling 27.145657 37.84369 33.62776 41.76887
Eleutherodactylus michaelschmidi Anura EN Ground-dwelling 28.131256 37.97724 33.70146 41.86663
Eleutherodactylus minutus Anura EN Ground-dwelling 26.894731 37.86565 33.70005 42.04604
Eleutherodactylus minutus Anura EN Ground-dwelling 26.483788 37.81061 33.41248 41.73692
Eleutherodactylus minutus Anura EN Ground-dwelling 27.595380 37.95948 33.73962 42.11457
Eleutherodactylus poolei Anura CR Ground-dwelling 27.507073 37.89405 33.16109 41.97337
Eleutherodactylus poolei Anura CR Ground-dwelling 27.090490 37.83728 33.14253 41.90996
Eleutherodactylus poolei Anura CR Ground-dwelling 28.249431 37.99520 33.56813 42.45364
Eleutherodactylus modestus Anura LC Ground-dwelling 26.138164 37.80708 33.58313 41.86982
Eleutherodactylus modestus Anura LC Ground-dwelling 25.111717 37.66233 33.42692 41.74719
Eleutherodactylus modestus Anura LC Ground-dwelling 27.823414 38.04473 33.83000 42.19097
Eleutherodactylus notidodes Anura EN Ground-dwelling 27.252255 37.99116 33.69105 42.04020
Eleutherodactylus notidodes Anura EN Ground-dwelling 26.903471 37.94316 33.65234 41.98315
Eleutherodactylus notidodes Anura EN Ground-dwelling 27.812455 38.06826 33.91940 42.31324
Eleutherodactylus pallidus Anura LC Ground-dwelling 25.291519 37.72272 33.82849 41.93025
Eleutherodactylus pallidus Anura LC Ground-dwelling 24.052316 37.55445 33.75645 41.82587
Eleutherodactylus pallidus Anura LC Ground-dwelling 27.218678 37.98440 34.09889 42.27934
Eleutherodactylus paulsoni Anura CR Ground-dwelling 27.757701 37.96849 33.92343 42.11704
Eleutherodactylus paulsoni Anura CR Ground-dwelling 27.326143 37.90935 33.57351 41.77899
Eleutherodactylus paulsoni Anura CR Ground-dwelling 28.383886 38.05430 33.97610 42.17247
Eleutherodactylus unicolor Anura CR Ground-dwelling 26.834978 37.16277 33.25140 41.14370
Eleutherodactylus unicolor Anura CR Ground-dwelling 26.247976 37.08157 33.22815 41.10998
Eleutherodactylus unicolor Anura CR Ground-dwelling 27.603780 37.26911 33.31026 41.24831
Eleutherodactylus verruculatus Anura DD Ground-dwelling 25.458091 36.97776 33.17158 40.72123
Eleutherodactylus verruculatus Anura DD Ground-dwelling 24.953062 36.90756 33.09351 40.60144
Eleutherodactylus verruculatus Anura DD Ground-dwelling 26.956993 37.18613 33.34179 40.96600
Eleutherodactylus riparius Anura LC Ground-dwelling 27.368783 37.90629 34.02937 42.31561
Eleutherodactylus riparius Anura LC Ground-dwelling 26.874710 37.83926 33.97515 42.25677
Eleutherodactylus riparius Anura LC Ground-dwelling 28.229471 38.02305 34.24007 42.53348
Eleutherodactylus rivularis Anura CR Stream-dwelling 27.500756 37.32726 33.14739 41.46394
Eleutherodactylus rivularis Anura CR Stream-dwelling 27.145657 37.27782 33.09142 41.39982
Eleutherodactylus rivularis Anura CR Stream-dwelling 28.131256 37.41504 33.27018 41.57877
Eleutherodactylus rubrimaculatus Anura LC Arboreal 26.080394 37.64328 33.19484 41.67092
Eleutherodactylus rubrimaculatus Anura LC Arboreal 25.121260 37.51162 33.04487 41.48077
Eleutherodactylus rubrimaculatus Anura LC Arboreal 28.107199 37.92149 33.49163 42.04463
Eleutherodactylus rufescens Anura VU Ground-dwelling 24.670883 37.57015 34.05073 42.29395
Eleutherodactylus rufescens Anura VU Ground-dwelling 23.708554 37.43853 33.86335 42.12533
Eleutherodactylus rufescens Anura VU Ground-dwelling 26.321401 37.79588 34.19416 42.50674
Eleutherodactylus saxatilis Anura NT Ground-dwelling 24.000338 37.44744 33.14974 41.18733
Eleutherodactylus saxatilis Anura NT Ground-dwelling 22.542409 37.24674 32.97944 40.94738
Eleutherodactylus saxatilis Anura NT Ground-dwelling 26.476743 37.78835 33.70285 41.87539
Eleutherodactylus semipalmatus Anura CR Stream-dwelling 27.438964 37.36623 32.94556 41.32157
Eleutherodactylus semipalmatus Anura CR Stream-dwelling 27.062001 37.31437 32.92878 41.29788
Eleutherodactylus semipalmatus Anura CR Stream-dwelling 28.070644 37.45314 33.03236 41.42608
Eleutherodactylus syristes Anura LC Ground-dwelling 25.471965 37.57358 32.97015 41.36953
Eleutherodactylus syristes Anura LC Ground-dwelling 24.318876 37.42060 32.92401 41.28084
Eleutherodactylus syristes Anura LC Ground-dwelling 27.400088 37.82938 33.43703 41.83690
Eleutherodactylus teretistes Anura VU Ground-dwelling 25.869161 37.75989 33.78431 42.11787
Eleutherodactylus teretistes Anura VU Ground-dwelling 24.642081 37.59570 33.74216 42.08251
Eleutherodactylus teretistes Anura VU Ground-dwelling 27.702420 38.00517 34.03295 42.37283
Eleutherodactylus tetajulia Anura CR Ground-dwelling 27.431514 37.85795 33.64501 41.98775
Eleutherodactylus tetajulia Anura CR Ground-dwelling 26.983821 37.79766 33.58490 41.91706
Eleutherodactylus tetajulia Anura CR Ground-dwelling 28.117010 37.95025 33.70847 42.08722
Eleutherodactylus toa Anura EN Stream-dwelling 27.502835 37.39119 33.61654 41.99826
Eleutherodactylus toa Anura EN Stream-dwelling 27.045818 37.32837 33.55302 41.91950
Eleutherodactylus toa Anura EN Stream-dwelling 28.195756 37.48645 33.62624 42.03111
Eleutherodactylus verrucipes Anura LC Ground-dwelling 23.039285 37.38795 33.69937 41.58005
Eleutherodactylus verrucipes Anura LC Ground-dwelling 21.998929 37.24380 33.61445 41.45043
Eleutherodactylus verrucipes Anura LC Ground-dwelling 25.156353 37.68128 34.03790 42.04934
Eleutherodactylus warreni Anura CR Ground-dwelling 27.457000 38.03624 33.16938 42.20527
Eleutherodactylus warreni Anura CR Ground-dwelling 27.043154 37.97935 33.13967 42.11002
Eleutherodactylus warreni Anura CR Ground-dwelling 28.209663 38.13969 33.47460 42.57245
Craugastor stadelmani Anura CR Stream-dwelling 26.157984 36.15347 32.13090 40.54967
Craugastor stadelmani Anura CR Stream-dwelling 25.537721 36.06789 32.05556 40.45688
Craugastor stadelmani Anura CR Stream-dwelling 27.383776 36.32258 32.27721 40.77787
Craugastor alfredi Anura LC Arboreal 26.687911 36.57191 32.37737 41.62430
Craugastor alfredi Anura LC Arboreal 25.709218 36.43573 32.32577 41.46610
Craugastor alfredi Anura LC Arboreal 28.663450 36.84680 32.20936 41.53289
Craugastor amniscola Anura VU Stream-dwelling 25.562245 35.89882 31.84888 40.13486
Craugastor amniscola Anura VU Stream-dwelling 24.442707 35.74422 31.30850 39.61236
Craugastor amniscola Anura VU Stream-dwelling 27.699077 36.19389 32.17253 40.60179
Craugastor batrachylus Anura DD Ground-dwelling 23.698697 36.30319 31.79964 40.42244
Craugastor batrachylus Anura DD Ground-dwelling 22.747751 36.17223 31.66715 40.23164
Craugastor batrachylus Anura DD Ground-dwelling 25.180769 36.50730 31.96021 40.61499
Craugastor cuaquero Anura DD Ground-dwelling 27.435694 36.84272 32.64723 41.21532
Craugastor cuaquero Anura DD Ground-dwelling 26.744760 36.74699 32.33361 40.91218
Craugastor cuaquero Anura DD Ground-dwelling 29.013624 37.06133 32.84732 41.46155
Craugastor melanostictus Anura LC Ground-dwelling 26.230091 36.69066 32.63053 41.43897
Craugastor melanostictus Anura LC Ground-dwelling 25.537512 36.59383 32.08115 40.85224
Craugastor melanostictus Anura LC Ground-dwelling 27.554387 36.87580 32.18847 41.06657
Craugastor emcelae Anura CR Ground-dwelling 27.832466 36.88163 32.45585 41.57324
Craugastor emcelae Anura CR Ground-dwelling 27.239510 36.79837 32.58143 41.61611
Craugastor emcelae Anura CR Ground-dwelling 28.911379 37.03313 32.54955 41.74673
Craugastor angelicus Anura CR Stream-dwelling 27.435694 36.28603 32.17607 40.71632
Craugastor angelicus Anura CR Stream-dwelling 26.744760 36.19135 32.03771 40.58294
Craugastor angelicus Anura CR Stream-dwelling 29.013624 36.50226 32.46023 40.97262
Craugastor rugulosus Anura LC Stream-dwelling 26.166859 35.93758 31.39850 40.46642
Craugastor rugulosus Anura LC Stream-dwelling 25.119011 35.79259 31.18834 40.17140
Craugastor rugulosus Anura LC Stream-dwelling 28.074969 36.20162 31.60389 40.75618
Craugastor ranoides Anura CR Stream-dwelling 27.170788 36.06027 32.04382 40.65734
Craugastor ranoides Anura CR Stream-dwelling 26.414929 35.95821 31.93932 40.54280
Craugastor ranoides Anura CR Stream-dwelling 28.642577 36.25901 32.24731 40.93955
Craugastor fleischmanni Anura CR Stream-dwelling 27.435694 36.21438 31.81653 40.35120
Craugastor fleischmanni Anura CR Stream-dwelling 26.744760 36.11776 31.69806 40.22501
Craugastor fleischmanni Anura CR Stream-dwelling 29.013624 36.43504 32.05816 40.65934
Craugastor rupinius Anura LC Ground-dwelling 26.294641 36.55968 32.19575 40.98991
Craugastor rupinius Anura LC Ground-dwelling 25.414930 36.43857 32.11703 40.85316
Craugastor rupinius Anura LC Ground-dwelling 28.268043 36.83137 32.34689 41.29669
Craugastor obesus Anura CR Stream-dwelling 27.832466 36.28235 31.96036 40.63566
Craugastor obesus Anura CR Stream-dwelling 27.239510 36.20064 32.08863 40.76618
Craugastor obesus Anura CR Stream-dwelling 28.911379 36.43102 32.12264 40.79348
Craugastor megacephalus Anura LC Ground-dwelling 26.676648 36.59791 32.02938 41.19196
Craugastor megacephalus Anura LC Ground-dwelling 25.908889 36.49249 31.91880 41.08459
Craugastor megacephalus Anura LC Ground-dwelling 28.150381 36.80027 32.24369 41.46696
Craugastor aphanus Anura EN Ground-dwelling 25.174190 36.63329 32.11649 40.77932
Craugastor aphanus Anura EN Ground-dwelling 24.673669 36.56378 32.04098 40.71735
Craugastor aphanus Anura EN Ground-dwelling 26.575538 36.82793 32.28454 40.97283
Craugastor augusti Anura LC Ground-dwelling 23.875269 36.27047 31.75598 40.49115
Craugastor augusti Anura LC Ground-dwelling 22.511487 36.08622 31.70286 40.36511
Craugastor augusti Anura LC Ground-dwelling 26.215592 36.58664 32.42739 41.20574
Craugastor tarahumaraensis Anura LC Ground-dwelling 24.092450 36.35375 31.87983 40.35778
Craugastor tarahumaraensis Anura LC Ground-dwelling 22.265757 36.10095 31.63505 40.10054
Craugastor tarahumaraensis Anura LC Ground-dwelling 26.827993 36.73232 32.65735 41.25931
Craugastor polymniae Anura NT Arboreal 22.187059 35.99115 31.77299 40.43669
Craugastor polymniae Anura NT Arboreal 20.787577 35.79603 31.17805 39.83977
Craugastor polymniae Anura NT Arboreal 25.070986 36.39324 31.96707 40.67742
Craugastor aurilegulus Anura VU Stream-dwelling 26.042835 35.97361 31.79254 40.97242
Craugastor aurilegulus Anura VU Stream-dwelling 25.461351 35.89390 31.75999 40.87677
Craugastor aurilegulus Anura VU Stream-dwelling 27.331187 36.15022 31.84364 41.02241
Craugastor azueroensis Anura EN Stream-dwelling 26.103002 36.10663 31.63080 40.65021
Craugastor azueroensis Anura EN Stream-dwelling 25.648867 36.04430 32.07456 41.09967
Craugastor azueroensis Anura EN Stream-dwelling 27.073797 36.23988 31.76677 40.75987
Craugastor vocalis Anura LC Arboreal 24.771381 36.41940 31.60102 40.34343
Craugastor vocalis Anura LC Arboreal 23.452022 36.23665 31.44751 40.09778
Craugastor vocalis Anura LC Arboreal 26.830108 36.70457 31.83655 40.73152
Craugastor berkenbuschii Anura LC Stream-dwelling 24.855419 35.89164 31.21890 40.53888
Craugastor berkenbuschii Anura LC Stream-dwelling 23.829782 35.74912 31.26155 40.49460
Craugastor berkenbuschii Anura LC Stream-dwelling 26.991313 36.18843 31.26322 40.57720
Craugastor vulcani Anura EN Stream-dwelling 26.976054 36.11351 31.73179 40.59200
Craugastor vulcani Anura EN Stream-dwelling 25.987890 35.97714 31.65470 40.44566
Craugastor vulcani Anura EN Stream-dwelling 29.057037 36.40069 31.88612 40.94595
Craugastor bocourti Anura EN Arboreal 25.712479 36.44917 32.23012 40.67098
Craugastor bocourti Anura EN Arboreal 24.700136 36.31027 32.17465 40.59486
Craugastor bocourti Anura EN Arboreal 27.813634 36.73745 32.49064 41.00008
Craugastor spatulatus Anura EN Ground-dwelling 24.535477 36.43587 32.42618 41.31646
Craugastor spatulatus Anura EN Ground-dwelling 23.369889 36.27497 32.19500 41.04430
Craugastor spatulatus Anura EN Ground-dwelling 26.871316 36.75832 32.05223 41.09265
Craugastor stuarti Anura VU Stream-dwelling 25.625041 35.89594 31.52917 40.42682
Craugastor stuarti Anura VU Stream-dwelling 24.633625 35.75841 31.37778 40.24473
Craugastor stuarti Anura VU Stream-dwelling 27.725457 36.18731 31.75660 40.81066
Craugastor uno Anura VU Ground-dwelling 25.726642 36.61779 32.12601 40.93531
Craugastor uno Anura VU Ground-dwelling 24.686571 36.47263 31.98694 40.74312
Craugastor uno Anura VU Ground-dwelling 27.475809 36.86192 32.40676 41.34831
Craugastor xucanebi Anura VU Ground-dwelling 25.102391 36.51264 32.22235 41.06912
Craugastor xucanebi Anura VU Ground-dwelling 23.998372 36.35965 32.13826 40.93169
Craugastor xucanebi Anura VU Ground-dwelling 27.286540 36.81531 32.24718 41.16409
Craugastor bransfordii Anura LC Ground-dwelling 26.555226 36.71705 32.08978 40.80797
Craugastor bransfordii Anura LC Ground-dwelling 25.763672 36.60908 31.97542 40.67438
Craugastor bransfordii Anura LC Ground-dwelling 28.039375 36.91948 32.39936 41.17403
Craugastor polyptychus Anura LC Ground-dwelling 24.131713 36.40361 32.07772 40.61241
Craugastor polyptychus Anura LC Ground-dwelling 23.339747 36.29507 31.99560 40.47810
Craugastor polyptychus Anura LC Ground-dwelling 25.465173 36.58635 32.20318 40.84799
Craugastor underwoodi Anura LC Ground-dwelling 25.530710 36.55928 32.38208 41.04292
Craugastor underwoodi Anura LC Ground-dwelling 24.759212 36.45406 32.24376 40.90464
Craugastor underwoodi Anura LC Ground-dwelling 26.950139 36.75287 32.61521 41.28415
Craugastor lauraster Anura LC Ground-dwelling 26.531699 36.71428 32.13858 40.94168
Craugastor lauraster Anura LC Ground-dwelling 25.681981 36.59483 32.18038 40.89739
Craugastor lauraster Anura LC Ground-dwelling 28.159554 36.94311 32.21650 41.10758
Craugastor stejnegerianus Anura LC Ground-dwelling 23.861533 36.32430 32.28697 41.08111
Craugastor stejnegerianus Anura LC Ground-dwelling 23.129436 36.22262 31.64321 40.47109
Craugastor stejnegerianus Anura LC Ground-dwelling 24.987270 36.48066 32.31859 41.16813
Craugastor persimilis Anura LC Ground-dwelling 24.131713 36.45914 32.24895 40.78318
Craugastor persimilis Anura LC Ground-dwelling 23.339747 36.34993 32.12123 40.61718
Craugastor persimilis Anura LC Ground-dwelling 25.465173 36.64301 32.17953 40.72857
Craugastor brocchi Anura VU Stream-dwelling 25.102391 35.94088 31.96685 40.65643
Craugastor brocchi Anura VU Stream-dwelling 23.998372 35.78856 31.81194 40.49718
Craugastor brocchi Anura VU Stream-dwelling 27.286540 36.24222 32.29974 41.04198
Craugastor gollmeri Anura LC Ground-dwelling 26.571542 36.73268 32.78833 41.11098
Craugastor gollmeri Anura LC Ground-dwelling 25.927097 36.64318 32.76248 41.06016
Craugastor gollmeri Anura LC Ground-dwelling 27.840940 36.90897 32.84275 41.25349
Craugastor chac Anura LC Ground-dwelling 26.186148 36.62896 32.41279 40.85769
Craugastor chac Anura LC Ground-dwelling 25.451583 36.52743 32.23746 40.65948
Craugastor chac Anura LC Ground-dwelling 27.751310 36.84529 32.42954 40.99931
Craugastor lineatus Anura LC Ground-dwelling 26.030103 36.67931 32.43616 40.64627
Craugastor lineatus Anura LC Ground-dwelling 24.988083 36.53099 32.36198 40.48347
Craugastor lineatus Anura LC Ground-dwelling 28.121426 36.97699 33.05283 41.38148
Craugastor laticeps Anura LC Ground-dwelling 26.587118 36.70380 32.72581 41.21170
Craugastor laticeps Anura LC Ground-dwelling 25.679437 36.57790 32.64132 41.15787
Craugastor laticeps Anura LC Ground-dwelling 28.396260 36.95475 32.85856 41.52245
Craugastor mimus Anura LC Ground-dwelling 26.335831 36.68875 32.52497 41.11047
Craugastor mimus Anura LC Ground-dwelling 25.537053 36.57760 32.44447 40.99532
Craugastor mimus Anura LC Ground-dwelling 27.890734 36.90513 32.46954 41.29412
Craugastor noblei Anura LC Ground-dwelling 26.594464 36.79981 32.31968 40.87174
Craugastor noblei Anura LC Ground-dwelling 25.831108 36.69275 32.34553 40.92458
Craugastor noblei Anura LC Ground-dwelling 28.081620 37.00839 32.76356 41.37757
Craugastor campbelli Anura CR Arboreal 25.174190 36.42024 31.77843 40.54537
Craugastor campbelli Anura CR Arboreal 24.673669 36.35032 31.76365 40.48904
Craugastor campbelli Anura CR Arboreal 26.575538 36.61602 31.92269 40.79030
Craugastor decoratus Anura LC Arboreal 24.125784 36.24920 31.85931 40.67741
Craugastor decoratus Anura LC Arboreal 23.108000 36.10736 31.61752 40.41396
Craugastor decoratus Anura LC Arboreal 26.321910 36.55525 32.05885 40.95143
Craugastor charadra Anura VU Stream-dwelling 26.148464 35.98993 31.36290 39.96207
Craugastor charadra Anura VU Stream-dwelling 25.307816 35.87555 31.28385 39.82167
Craugastor charadra Anura VU Stream-dwelling 27.964329 36.23702 32.03241 40.71794
Craugastor opimus Anura LC Ground-dwelling 26.271128 36.61031 32.58921 41.20819
Craugastor opimus Anura LC Ground-dwelling 25.620688 36.52045 32.48580 41.04678
Craugastor opimus Anura LC Ground-dwelling 27.580309 36.79118 32.77408 41.42816
Craugastor chingopetaca Anura VU Ground-dwelling 27.433662 36.89419 32.39548 41.08223
Craugastor chingopetaca Anura VU Ground-dwelling 26.650433 36.78567 32.30974 40.95364
Craugastor chingopetaca Anura VU Ground-dwelling 28.989401 37.10974 32.44742 41.25697
Craugastor hobartsmithi Anura LC Ground-dwelling 25.039750 36.48694 31.72124 40.52232
Craugastor hobartsmithi Anura LC Ground-dwelling 23.951101 36.33928 31.69162 40.39861
Craugastor hobartsmithi Anura LC Ground-dwelling 26.920237 36.74202 32.02880 40.94488
Craugastor pelorus Anura VU Stream-dwelling 27.695251 36.32526 32.10854 41.00794
Craugastor pelorus Anura VU Stream-dwelling 26.712363 36.18712 32.05670 40.94350
Craugastor pelorus Anura VU Stream-dwelling 29.467457 36.57434 32.18562 41.31528
Craugastor coffeus Anura CR Ground-dwelling 25.828093 36.49045 32.53557 41.12956
Craugastor coffeus Anura CR Ground-dwelling 25.139401 36.39713 32.32180 40.93322
Craugastor coffeus Anura CR Ground-dwelling 27.446889 36.70980 32.71183 41.38832
Craugastor pozo Anura CR Ground-dwelling 26.988391 36.72960 32.14618 40.83388
Craugastor pozo Anura CR Ground-dwelling 26.008286 36.59487 32.02707 40.69534
Craugastor pozo Anura CR Ground-dwelling 29.015985 37.00833 32.43530 41.09074
Craugastor talamancae Anura LC Arboreal 26.694613 37.35327 33.93248 40.89412
Craugastor talamancae Anura LC Arboreal 25.990772 37.25660 33.84519 40.78321
Craugastor talamancae Anura LC Arboreal 28.023234 37.53575 34.00710 41.03151
Craugastor raniformis Anura LC Ground-dwelling 25.850393 37.41887 33.93658 40.83244
Craugastor raniformis Anura LC Ground-dwelling 25.128789 37.31966 33.93593 40.80058
Craugastor raniformis Anura LC Ground-dwelling 27.347098 37.62463 33.97489 40.89684
Craugastor taurus Anura EN Stream-dwelling 27.253173 35.97650 31.48454 40.33196
Craugastor taurus Anura EN Stream-dwelling 26.703919 35.90086 31.44345 40.23455
Craugastor taurus Anura EN Stream-dwelling 28.282085 36.11818 31.55790 40.51445
Craugastor cyanochthebius Anura EN Arboreal 25.174190 36.38335 32.52923 41.15050
Craugastor cyanochthebius Anura EN Arboreal 24.673669 36.31455 32.47743 41.03133
Craugastor cyanochthebius Anura EN Arboreal 26.575538 36.57599 32.67425 41.36823
Craugastor silvicola Anura DD Ground-dwelling 27.781178 36.88434 32.83725 41.22243
Craugastor silvicola Anura DD Ground-dwelling 26.782294 36.74988 32.73986 41.07343
Craugastor silvicola Anura DD Ground-dwelling 29.726741 37.14621 32.96757 41.42429
Craugastor escoces Anura CR Stream-dwelling 27.435694 36.17624 31.91866 41.14677
Craugastor escoces Anura CR Stream-dwelling 26.744760 36.08229 31.84587 41.05531
Craugastor escoces Anura CR Stream-dwelling 29.013624 36.39080 32.08490 41.49300
Craugastor nefrens Anura CR Arboreal 25.174190 36.47133 32.07402 41.07225
Craugastor nefrens Anura CR Arboreal 24.673669 36.40325 31.80807 40.80915
Craugastor nefrens Anura CR Arboreal 26.575538 36.66194 32.27637 41.27723
Craugastor podiciferus Anura LC Ground-dwelling 25.530710 36.54365 31.96263 40.55972
Craugastor podiciferus Anura LC Ground-dwelling 24.759212 36.43717 31.92660 40.48289
Craugastor podiciferus Anura LC Ground-dwelling 26.950139 36.73956 32.17384 40.82124
Craugastor glaucus Anura EN Ground-dwelling 26.975420 36.82713 32.65646 41.65762
Craugastor glaucus Anura EN Ground-dwelling 25.877101 36.67648 32.53329 41.56217
Craugastor glaucus Anura EN Ground-dwelling 28.732078 37.06806 33.06542 42.26616
Craugastor monnichorum Anura EN Ground-dwelling 26.873222 36.79851 32.31316 41.79847
Craugastor monnichorum Anura EN Ground-dwelling 26.223180 36.70792 32.21824 41.71798
Craugastor monnichorum Anura EN Ground-dwelling 28.107506 36.97053 32.48624 41.95130
Craugastor greggi Anura EN Stream-dwelling 23.549203 35.75376 31.07290 39.77995
Craugastor greggi Anura EN Stream-dwelling 22.340200 35.58792 31.07679 39.74133
Craugastor greggi Anura EN Stream-dwelling 26.016726 36.09224 31.46406 40.33670
Craugastor guerreroensis Anura EN Ground-dwelling 25.149511 36.48310 31.98387 40.33210
Craugastor guerreroensis Anura EN Ground-dwelling 24.010788 36.33073 31.86143 40.19271
Craugastor guerreroensis Anura EN Ground-dwelling 27.212280 36.75912 32.12862 40.60689
Craugastor montanus Anura EN Ground-dwelling 26.520262 36.65416 32.49433 40.87779
Craugastor montanus Anura EN Ground-dwelling 25.489154 36.51355 32.25794 40.58028
Craugastor montanus Anura EN Ground-dwelling 28.646972 36.94420 32.66323 41.13286
Craugastor gulosus Anura CR Ground-dwelling 24.247729 36.42039 32.03111 40.52855
Craugastor gulosus Anura CR Ground-dwelling 23.486497 36.31341 31.96121 40.42565
Craugastor gulosus Anura CR Ground-dwelling 25.406800 36.58327 32.12213 40.75747
Craugastor laevissimus Anura EN Stream-dwelling 26.352782 36.12660 31.93896 40.84247
Craugastor laevissimus Anura EN Stream-dwelling 25.474455 36.00416 31.82074 40.73260
Craugastor laevissimus Anura EN Stream-dwelling 28.064507 36.36522 32.09791 41.11497
Craugastor inachus Anura CR Stream-dwelling 26.789390 36.18858 31.97472 40.87995
Craugastor inachus Anura CR Stream-dwelling 25.919808 36.06825 31.90715 40.76268
Craugastor inachus Anura CR Stream-dwelling 28.621708 36.44215 31.90198 40.83842
Craugastor mexicanus Anura LC Ground-dwelling 24.620359 35.87407 32.00891 39.92524
Craugastor mexicanus Anura LC Ground-dwelling 23.545905 35.72273 31.90552 39.75993
Craugastor mexicanus Anura LC Ground-dwelling 26.763966 36.17599 32.55553 40.57763
Craugastor omiltemanus Anura LC Ground-dwelling 25.273746 35.99871 32.18725 39.88633
Craugastor omiltemanus Anura LC Ground-dwelling 24.305333 35.86389 32.10790 39.73997
Craugastor omiltemanus Anura LC Ground-dwelling 27.098261 36.25272 32.39714 40.20004
Craugastor rugosus Anura LC Ground-dwelling 24.812458 35.99552 32.19753 39.83524
Craugastor rugosus Anura LC Ground-dwelling 24.080462 35.89414 32.13678 39.75209
Craugastor rugosus Anura LC Ground-dwelling 26.063102 36.16873 32.25977 39.98201
Craugastor tabasarae Anura CR Arboreal 26.496631 38.49818 34.85949 42.43516
Craugastor tabasarae Anura CR Arboreal 25.880173 38.41487 34.73615 42.27571
Craugastor tabasarae Anura CR Arboreal 27.758337 38.66870 35.13815 42.79212
Craugastor rayo Anura EN Stream-dwelling 17.078254 36.79190 33.22630 40.40869
Craugastor rayo Anura EN Stream-dwelling 15.980470 36.64232 33.11900 40.27349
Craugastor rayo Anura EN Stream-dwelling 18.397641 36.97167 33.26401 40.45163
Craugastor matudai Anura EN Ground-dwelling 25.833150 36.53566 31.98040 40.37254
Craugastor matudai Anura EN Ground-dwelling 24.954271 36.41699 31.86559 40.20397
Craugastor matudai Anura EN Ground-dwelling 27.918184 36.81717 32.29833 40.77243
Craugastor yucatanensis Anura NT Ground-dwelling 27.483354 36.80013 32.69873 41.25119
Craugastor yucatanensis Anura NT Ground-dwelling 26.932033 36.72532 32.76990 41.27142
Craugastor yucatanensis Anura NT Ground-dwelling 28.746322 36.97150 32.92594 41.49724
Craugastor megalotympanum Anura EN Ground-dwelling 26.976054 36.86592 32.79459 41.25762
Craugastor megalotympanum Anura EN Ground-dwelling 25.987890 36.72738 32.52635 40.94033
Craugastor megalotympanum Anura EN Ground-dwelling 29.057037 37.15767 33.07784 41.64178
Craugastor rivulus Anura VU Stream-dwelling 24.553518 35.88312 31.93735 40.51472
Craugastor rivulus Anura VU Stream-dwelling 23.448581 35.73412 31.78396 40.36017
Craugastor rivulus Anura VU Stream-dwelling 26.810763 36.18750 32.16880 40.88934
Craugastor milesi Anura CR Stream-dwelling 25.174190 35.90385 30.98796 39.76353
Craugastor milesi Anura CR Stream-dwelling 24.673669 35.83471 31.04189 39.81129
Craugastor milesi Anura CR Stream-dwelling 26.575538 36.09742 31.13560 39.96322
Craugastor sandersoni Anura EN Stream-dwelling 26.249736 36.03261 31.90457 40.80463
Craugastor sandersoni Anura EN Stream-dwelling 25.599837 35.94399 31.59773 40.42379
Craugastor sandersoni Anura EN Stream-dwelling 27.688254 36.22877 32.10765 41.05191
Craugastor occidentalis Anura LC Ground-dwelling 24.889488 36.43791 31.99800 40.47750
Craugastor occidentalis Anura LC Ground-dwelling 23.731591 36.27831 31.84125 40.29267
Craugastor occidentalis Anura LC Ground-dwelling 26.783504 36.69899 32.04548 40.58444
Craugastor palenque Anura VU Stream-dwelling 26.141881 36.06628 32.01360 40.36357
Craugastor palenque Anura VU Stream-dwelling 25.047294 35.91488 31.81134 40.15098
Craugastor palenque Anura VU Stream-dwelling 28.225005 36.35442 32.32013 40.70259
Craugastor pygmaeus Anura LC Ground-dwelling 25.763724 36.60695 32.19512 40.97218
Craugastor pygmaeus Anura LC Ground-dwelling 24.691322 36.46035 32.04895 40.74616
Craugastor pygmaeus Anura LC Ground-dwelling 27.758900 36.87971 32.55237 41.41199
Craugastor pechorum Anura EN Stream-dwelling 26.206645 36.14974 31.47951 40.28147
Craugastor pechorum Anura EN Stream-dwelling 25.785031 36.09098 31.44275 40.22065
Craugastor pechorum Anura EN Stream-dwelling 27.279702 36.29930 31.54711 40.42597
Craugastor rostralis Anura VU Ground-dwelling 26.148464 36.66501 32.58640 41.03761
Craugastor rostralis Anura VU Ground-dwelling 25.307816 36.54924 32.49429 40.87387
Craugastor rostralis Anura VU Ground-dwelling 27.964329 36.91509 32.81185 41.28558
Craugastor sabrinus Anura NT Ground-dwelling 26.440361 36.68242 32.51126 41.18411
Craugastor sabrinus Anura NT Ground-dwelling 25.739439 36.58601 32.45787 41.11862
Craugastor sabrinus Anura NT Ground-dwelling 27.933426 36.88777 32.59516 41.34035
Craugastor psephosypharus Anura NT Ground-dwelling 26.194195 36.65221 32.49835 41.04082
Craugastor psephosypharus Anura NT Ground-dwelling 25.426972 36.54513 32.34769 40.84795
Craugastor psephosypharus Anura NT Ground-dwelling 27.856319 36.88419 32.57443 41.13048
Craugastor taylori Anura CR Ground-dwelling 28.032287 36.92886 32.93764 41.59927
Craugastor taylori Anura CR Ground-dwelling 26.957643 36.77875 32.69252 41.31479
Craugastor taylori Anura CR Ground-dwelling 29.772279 37.17192 33.16710 41.86128
Craugastor emleni Anura EN Ground-dwelling 25.238943 36.53697 32.19226 40.85840
Craugastor emleni Anura EN Ground-dwelling 24.139830 36.38559 32.08574 40.72164
Craugastor emleni Anura EN Ground-dwelling 27.350544 36.82780 32.49702 41.29446
Craugastor daryi Anura EN Stream-dwelling 24.942963 35.51610 31.15249 40.26574
Craugastor daryi Anura EN Stream-dwelling 23.795138 35.35949 31.05671 40.20360
Craugastor daryi Anura EN Stream-dwelling 27.309028 35.83893 31.15466 40.37764
Haddadus aramunha Anura DD Ground-dwelling 24.351994 35.60063 30.79633 39.89179
Haddadus aramunha Anura DD Ground-dwelling 23.147698 35.42966 30.62313 39.69133
Haddadus aramunha Anura DD Ground-dwelling 26.920740 35.96530 31.25672 40.49947
Haddadus plicifer Anura DD Ground-dwelling 25.709735 35.74899 31.03488 40.36778
Haddadus plicifer Anura DD Ground-dwelling 24.760959 35.61943 30.91174 40.20867
Haddadus plicifer Anura DD Ground-dwelling 27.080743 35.93621 31.21283 40.61501
Haddadus binotatus Anura LC Ground-dwelling 25.339133 35.77685 31.74326 40.72369
Haddadus binotatus Anura LC Ground-dwelling 24.137531 35.60710 31.62758 40.57941
Haddadus binotatus Anura LC Ground-dwelling 27.519307 36.08486 31.41608 40.48455
Atopophrynus syntomopus Anura CR Stream-dwelling 22.792552 33.67482 29.22227 37.33194
Atopophrynus syntomopus Anura CR Stream-dwelling 22.040989 33.56697 29.10107 37.21255
Atopophrynus syntomopus Anura CR Stream-dwelling 24.304586 33.89180 29.34874 37.51892
Lynchius flavomaculatus Anura DD Ground-dwelling 22.742062 34.26082 30.08175 38.44831
Lynchius flavomaculatus Anura DD Ground-dwelling 21.460819 34.08012 29.66914 38.01255
Lynchius flavomaculatus Anura DD Ground-dwelling 24.767746 34.54652 30.31456 38.74638
Lynchius parkeri Anura EN Ground-dwelling 22.602751 34.28007 30.23212 38.42326
Lynchius parkeri Anura EN Ground-dwelling 21.868814 34.17569 30.18836 38.37124
Lynchius parkeri Anura EN Ground-dwelling 24.173626 34.50350 30.56869 38.74243
Lynchius nebulanastes Anura EN Ground-dwelling 22.602751 34.21934 30.37133 38.59161
Lynchius nebulanastes Anura EN Ground-dwelling 21.868814 34.11510 30.27170 38.49838
Lynchius nebulanastes Anura EN Ground-dwelling 24.173626 34.44245 30.55624 38.76520
Lynchius simmonsi Anura VU Ground-dwelling 25.562622 34.62274 30.00812 38.33353
Lynchius simmonsi Anura VU Ground-dwelling 24.507041 34.47320 30.03594 38.34445
Lynchius simmonsi Anura VU Ground-dwelling 27.560739 34.90581 30.45847 38.87327
Oreobates choristolemma Anura VU Ground-dwelling 19.856727 33.48506 30.30149 36.46649
Oreobates choristolemma Anura VU Ground-dwelling 19.013765 33.36403 30.15380 36.31959
Oreobates choristolemma Anura VU Ground-dwelling 21.131850 33.66812 30.51120 36.75677
Oreobates sanderi Anura LC Ground-dwelling 18.861890 33.21633 30.28297 36.22298
Oreobates sanderi Anura LC Ground-dwelling 18.013589 33.09372 30.18112 36.11591
Oreobates sanderi Anura LC Ground-dwelling 20.247963 33.41667 30.41639 36.43106
Oreobates sanctaecrucis Anura LC Ground-dwelling 22.189247 33.93373 30.67108 37.51032
Oreobates sanctaecrucis Anura LC Ground-dwelling 21.309440 33.80669 30.56707 37.33150
Oreobates sanctaecrucis Anura LC Ground-dwelling 23.466538 34.11817 30.75281 37.61671
Oreobates discoidalis Anura DD Ground-dwelling 19.670437 34.07215 30.85872 37.43333
Oreobates discoidalis Anura DD Ground-dwelling 18.211891 33.86413 30.72297 37.33407
Oreobates discoidalis Anura DD Ground-dwelling 22.144370 34.42499 31.08715 37.66980
Oreobates ibischi Anura LC Ground-dwelling 21.619057 34.29997 30.83119 37.76973
Oreobates ibischi Anura LC Ground-dwelling 20.678880 34.16530 30.61952 37.51092
Oreobates ibischi Anura LC Ground-dwelling 23.050134 34.50496 30.82582 37.80324
Oreobates madidi Anura LC Ground-dwelling 20.815031 34.48618 31.39103 37.72363
Oreobates madidi Anura LC Ground-dwelling 20.183546 34.39793 31.28745 37.62858
Oreobates madidi Anura LC Ground-dwelling 22.055989 34.65961 31.53620 37.95521
Oreobates crepitans Anura DD Ground-dwelling 27.892401 35.03800 31.28975 38.82344
Oreobates crepitans Anura DD Ground-dwelling 26.829170 34.88492 31.04958 38.54479
Oreobates crepitans Anura DD Ground-dwelling 29.894754 35.32628 31.51441 39.09297
Oreobates heterodactylus Anura DD Ground-dwelling 28.046074 34.98612 31.10517 38.34517
Oreobates heterodactylus Anura DD Ground-dwelling 27.148540 34.85871 30.96311 38.15680
Oreobates heterodactylus Anura DD Ground-dwelling 29.941233 35.25515 31.38808 38.75003
Oreobates zongoensis Anura CR Ground-dwelling 17.757819 33.49932 30.17727 37.31992
Oreobates zongoensis Anura CR Ground-dwelling 16.741006 33.35552 29.91385 36.99840
Oreobates zongoensis Anura CR Ground-dwelling 19.207708 33.70437 29.86227 37.01176
Oreobates ayacucho Anura EN Ground-dwelling 19.043751 32.80493 29.54974 36.14077
Oreobates ayacucho Anura EN Ground-dwelling 15.969081 32.36155 28.80845 35.42452
Oreobates ayacucho Anura EN Ground-dwelling 20.906225 33.07350 29.79903 36.45717
Oreobates pereger Anura EN Ground-dwelling 16.619574 32.52162 28.75218 35.65270
Oreobates pereger Anura EN Ground-dwelling 15.677156 32.38513 28.63811 35.55203
Oreobates pereger Anura EN Ground-dwelling 18.068780 32.73152 29.01351 35.89930
Oreobates lehri Anura EN Ground-dwelling 17.961728 31.52022 28.77266 34.83740
Oreobates lehri Anura EN Ground-dwelling 16.016319 31.23213 28.39424 34.52460
Oreobates lehri Anura EN Ground-dwelling 19.489051 31.74641 28.91864 35.03790
Oreobates saxatilis Anura LC Ground-dwelling 20.868354 35.55145 32.33963 38.27294
Oreobates saxatilis Anura LC Ground-dwelling 20.147525 35.44897 32.24990 38.12056
Oreobates saxatilis Anura LC Ground-dwelling 22.086454 35.72462 32.45976 38.40906
Oreobates lundbergi Anura EN Ground-dwelling 21.012652 33.91546 30.37467 37.74839
Oreobates lundbergi Anura EN Ground-dwelling 20.177954 33.79830 30.30907 37.70923
Oreobates lundbergi Anura EN Ground-dwelling 22.689323 34.15081 30.74332 38.19100
Phrynopus auriculatus Anura DD Ground-dwelling 21.012652 34.01036 29.91124 37.80405
Phrynopus auriculatus Anura DD Ground-dwelling 20.177954 33.88862 29.78549 37.62579
Phrynopus auriculatus Anura DD Ground-dwelling 22.689323 34.25490 29.82640 37.76449
Phrynopus barthlenae Anura EN Ground-dwelling 18.964672 33.71436 29.53921 37.76549
Phrynopus barthlenae Anura EN Ground-dwelling 18.049350 33.58465 29.23104 37.51791
Phrynopus barthlenae Anura EN Ground-dwelling 20.714852 33.96237 29.77006 38.01113
Phrynopus horstpauli Anura EN Arboreal 19.199032 33.61571 29.65586 37.80558
Phrynopus horstpauli Anura EN Arboreal 18.184274 33.46867 29.46878 37.60309
Phrynopus horstpauli Anura EN Arboreal 21.218805 33.90836 29.82049 38.00273
Phrynopus bracki Anura DD Ground-dwelling 21.012652 34.01233 29.86177 38.03787
Phrynopus bracki Anura DD Ground-dwelling 20.177954 33.89262 29.74840 37.92535
Phrynopus bracki Anura DD Ground-dwelling 22.689323 34.25281 30.30942 38.46034
Phrynopus bufoides Anura DD Ground-dwelling 21.012652 34.01453 30.40637 38.47271
Phrynopus bufoides Anura DD Ground-dwelling 20.177954 33.89516 30.29247 38.35548
Phrynopus bufoides Anura DD Ground-dwelling 22.689323 34.25430 30.75137 38.82988
Phrynopus dagmarae Anura EN Ground-dwelling 19.652437 33.89844 30.14566 38.23772
Phrynopus dagmarae Anura EN Ground-dwelling 18.682694 33.75989 29.99959 38.11602
Phrynopus dagmarae Anura EN Ground-dwelling 21.586434 34.17475 30.29766 38.49001
Phrynopus heimorum Anura CR Ground-dwelling 17.078267 33.56578 28.90040 37.52524
Phrynopus heimorum Anura CR Ground-dwelling 15.868726 33.39220 28.62623 37.33976
Phrynopus heimorum Anura CR Ground-dwelling 19.497596 33.91297 29.30676 37.99515
Phrynopus juninensis Anura CR Ground-dwelling 16.870590 33.46965 29.35649 37.15876
Phrynopus juninensis Anura CR Ground-dwelling 16.060145 33.35586 29.28431 37.04266
Phrynopus juninensis Anura CR Ground-dwelling 18.188627 33.65470 29.44305 37.34757
Phrynopus kauneorum Anura EN Ground-dwelling 19.316212 33.88081 29.97320 37.86878
Phrynopus kauneorum Anura EN Ground-dwelling 18.251736 33.72903 29.81955 37.69948
Phrynopus kauneorum Anura EN Ground-dwelling 21.470781 34.18801 30.27474 38.21311
Phrynopus kotosh Anura DD Ground-dwelling 15.191863 33.24500 29.15182 37.39459
Phrynopus kotosh Anura DD Ground-dwelling 13.688102 33.03302 29.00740 37.25543
Phrynopus kotosh Anura DD Ground-dwelling 18.280341 33.68038 29.51052 37.80762
Phrynopus miroslawae Anura DD Ground-dwelling 21.012652 34.10603 29.69516 37.93137
Phrynopus miroslawae Anura DD Ground-dwelling 20.177954 33.98599 29.56798 37.81198
Phrynopus miroslawae Anura DD Ground-dwelling 22.689323 34.34714 30.22146 38.58145
Phrynopus montium Anura EN Ground-dwelling 16.870590 33.53255 29.15870 37.63714
Phrynopus montium Anura EN Ground-dwelling 16.060145 33.41508 29.15440 37.61154
Phrynopus montium Anura EN Ground-dwelling 18.188627 33.72358 29.56699 38.02433
Phrynopus nicoleae Anura DD Ground-dwelling 21.012652 34.03735 30.12442 38.05088
Phrynopus nicoleae Anura DD Ground-dwelling 20.177954 33.91833 29.96133 37.87091
Phrynopus nicoleae Anura DD Ground-dwelling 22.689323 34.27642 30.33115 38.35893
Phrynopus oblivius Anura DD Ground-dwelling 16.870590 33.50889 29.41950 37.30780
Phrynopus oblivius Anura DD Ground-dwelling 16.060145 33.39216 29.38387 37.30112
Phrynopus oblivius Anura DD Ground-dwelling 18.188627 33.69873 29.72455 37.60643
Phrynopus paucari Anura DD Ground-dwelling 21.012652 33.96301 29.96284 38.42637
Phrynopus paucari Anura DD Ground-dwelling 20.177954 33.84318 29.86487 38.29706
Phrynopus paucari Anura DD Ground-dwelling 22.689323 34.20373 30.12810 38.57403
Phrynopus peruanus Anura CR Ground-dwelling 16.870590 33.42961 29.65596 37.65034
Phrynopus peruanus Anura CR Ground-dwelling 16.060145 33.31530 29.57991 37.57790
Phrynopus peruanus Anura CR Ground-dwelling 18.188627 33.61552 29.80282 37.82390
Phrynopus pesantesi Anura DD Ground-dwelling 21.012652 33.99360 29.97210 38.07162
Phrynopus pesantesi Anura DD Ground-dwelling 20.177954 33.87424 29.95131 38.01025
Phrynopus pesantesi Anura DD Ground-dwelling 22.689323 34.23336 30.19074 38.30501
Phrynopus tautzorum Anura DD Ground-dwelling 18.964672 33.80719 29.45153 37.62682
Phrynopus tautzorum Anura DD Ground-dwelling 18.049350 33.67606 29.36041 37.55436
Phrynopus tautzorum Anura DD Ground-dwelling 20.714852 34.05794 29.64472 37.83423
Phrynopus thompsoni Anura DD Ground-dwelling 22.355543 34.23207 30.41859 38.36797
Phrynopus thompsoni Anura DD Ground-dwelling 21.452041 34.10354 29.89115 37.86841
Phrynopus thompsoni Anura DD Ground-dwelling 23.805729 34.43838 30.53135 38.45882
Phrynopus tribulosus Anura LC Ground-dwelling 21.012652 33.97823 30.08301 38.38849
Phrynopus tribulosus Anura LC Ground-dwelling 20.177954 33.85978 29.68414 37.94688
Phrynopus tribulosus Anura LC Ground-dwelling 22.689323 34.21617 30.06583 38.43298
Pristimantis aaptus Anura LC Ground-dwelling 29.039133 35.10955 30.73904 39.38729
Pristimantis aaptus Anura LC Ground-dwelling 28.269760 34.99961 30.67030 39.26107
Pristimantis aaptus Anura LC Ground-dwelling 30.584570 35.33038 30.58480 39.38811
Pristimantis acatallelus Anura LC Arboreal 24.572330 34.46784 30.44543 38.60913
Pristimantis acatallelus Anura LC Arboreal 23.758611 34.35390 30.20272 38.32504
Pristimantis acatallelus Anura LC Arboreal 25.974912 34.66424 30.52432 38.73123
Pristimantis acerus Anura EN Arboreal 21.046238 33.97128 30.08055 38.10965
Pristimantis acerus Anura EN Arboreal 18.738360 33.64825 29.55032 37.64102
Pristimantis acerus Anura EN Arboreal 23.735443 34.34768 30.38505 38.43515
Pristimantis lymani Anura LC Arboreal 23.671049 36.82719 33.89765 40.39585
Pristimantis lymani Anura LC Arboreal 22.748657 36.70087 33.70964 40.16190
Pristimantis lymani Anura LC Arboreal 25.326737 37.05394 34.09740 40.63508
Pristimantis achuar Anura LC Ground-dwelling 25.686350 34.73270 30.57974 38.88569
Pristimantis achuar Anura LC Ground-dwelling 24.911090 34.62164 30.49153 38.79537
Pristimantis achuar Anura LC Ground-dwelling 27.204444 34.95017 30.73215 39.15124
Pristimantis actinolaimus Anura EN Arboreal 22.792552 34.25340 30.18865 38.60330
Pristimantis actinolaimus Anura EN Arboreal 22.040989 34.14509 30.10981 38.48196
Pristimantis actinolaimus Anura EN Arboreal 24.304586 34.47131 30.31676 38.82061
Pristimantis acuminatus Anura LC Arboreal 25.157192 34.49675 30.24858 38.81338
Pristimantis acuminatus Anura LC Arboreal 24.267496 34.37163 30.14492 38.58738
Pristimantis acuminatus Anura LC Arboreal 26.841638 34.73362 30.19597 38.91882
Pristimantis acutirostris Anura EN Arboreal 22.013728 34.03582 29.70604 37.99699
Pristimantis acutirostris Anura EN Arboreal 21.137557 33.91227 29.64624 37.90102
Pristimantis acutirostris Anura EN Arboreal 23.830870 34.29205 30.19092 38.63723
Pristimantis adiastolus Anura LC Arboreal 21.012652 34.07320 29.72009 37.97937
Pristimantis adiastolus Anura LC Arboreal 20.177954 33.95584 29.61418 37.84521
Pristimantis adiastolus Anura LC Arboreal 22.689323 34.30893 30.42856 38.72838
Pristimantis aemulatus Anura EN Arboreal 26.219010 34.71762 30.56875 39.00126
Pristimantis aemulatus Anura EN Arboreal 25.544335 34.62121 30.50238 38.92359
Pristimantis aemulatus Anura EN Arboreal 27.553766 34.90835 30.62812 39.17987
Pristimantis affinis Anura EN Arboreal 22.977523 34.26556 30.15078 38.39937
Pristimantis affinis Anura EN Arboreal 22.085246 34.13770 30.06755 38.26585
Pristimantis affinis Anura EN Arboreal 24.609919 34.49946 30.29154 38.54644
Pristimantis alalocophus Anura EN Arboreal 22.355465 34.05815 29.74594 37.80765
Pristimantis alalocophus Anura EN Arboreal 21.502710 33.93687 29.73067 37.77894
Pristimantis alalocophus Anura EN Arboreal 23.944685 34.28417 29.96577 38.00323
Pristimantis albertus Anura VU Ground-dwelling 18.941621 33.82405 29.95712 37.38715
Pristimantis albertus Anura VU Ground-dwelling 18.119049 33.70618 29.91859 37.30436
Pristimantis albertus Anura VU Ground-dwelling 20.438975 34.03862 30.12583 37.59303
Pristimantis altae Anura LC Arboreal 25.960264 34.77083 30.41408 38.87839
Pristimantis altae Anura LC Arboreal 25.278068 34.67448 30.35653 38.79611
Pristimantis altae Anura LC Arboreal 27.293748 34.95916 30.33828 38.87600
Pristimantis pardalis Anura LC Arboreal 26.213930 34.81361 30.62844 39.46572
Pristimantis pardalis Anura LC Arboreal 25.594181 34.72614 30.56978 39.39033
Pristimantis pardalis Anura LC Arboreal 27.359794 34.97535 30.72331 39.59191
Pristimantis altamazonicus Anura LC Ground-dwelling 27.031913 34.99466 31.04272 39.46721
Pristimantis altamazonicus Anura LC Ground-dwelling 26.266986 34.88623 30.21962 38.56859
Pristimantis altamazonicus Anura LC Ground-dwelling 28.523877 35.20615 31.22290 39.65088
Pristimantis altamnis Anura LC Arboreal 23.680922 34.37378 30.34119 38.52663
Pristimantis altamnis Anura LC Arboreal 22.694324 34.23481 30.23334 38.35361
Pristimantis altamnis Anura LC Arboreal 25.357132 34.60990 30.34241 38.69103
Pristimantis kichwarum Anura LC Ground-dwelling 24.408453 34.67509 30.10881 38.55509
Pristimantis kichwarum Anura LC Ground-dwelling 23.230029 34.50719 30.35857 38.71119
Pristimantis kichwarum Anura LC Ground-dwelling 26.235757 34.93543 30.43921 38.99592
Pristimantis amydrotus Anura DD Arboreal 24.352695 34.40969 30.34538 38.20769
Pristimantis amydrotus Anura DD Arboreal 23.754925 34.32672 30.22978 38.07138
Pristimantis amydrotus Anura DD Arboreal 25.398234 34.55479 30.47500 38.39960
Pristimantis anemerus Anura DD Arboreal 22.602751 34.25539 29.97225 38.00619
Pristimantis anemerus Anura DD Arboreal 21.868814 34.15085 29.95437 37.93684
Pristimantis anemerus Anura DD Arboreal 24.173626 34.47914 30.68234 38.68062
Pristimantis angustilineatus Anura EN Arboreal 24.179450 34.47698 30.32860 38.77181
Pristimantis angustilineatus Anura EN Arboreal 23.449222 34.37376 30.24867 38.67655
Pristimantis angustilineatus Anura EN Arboreal 25.556092 34.67157 30.41164 38.91453
Pristimantis brevifrons Anura LC Arboreal 23.713568 34.39530 30.32835 38.33647
Pristimantis brevifrons Anura LC Arboreal 22.821458 34.26804 30.20385 38.17876
Pristimantis brevifrons Anura LC Arboreal 25.223076 34.61064 30.39697 38.47552
Pristimantis aniptopalmatus Anura LC Ground-dwelling 21.012652 34.15531 30.11950 38.00808
Pristimantis aniptopalmatus Anura LC Ground-dwelling 20.177954 34.03598 30.14572 38.01749
Pristimantis aniptopalmatus Anura LC Ground-dwelling 22.689323 34.39500 30.40744 38.31425
Pristimantis anolirex Anura VU Arboreal 23.060547 34.32415 30.51750 38.66482
Pristimantis anolirex Anura VU Arboreal 22.206096 34.20364 30.41838 38.52757
Pristimantis anolirex Anura VU Arboreal 24.664197 34.55033 30.29244 38.38450
Pristimantis lutitus Anura EN Arboreal 23.327220 34.37517 29.93415 38.12172
Pristimantis lutitus Anura EN Arboreal 22.462145 34.25364 30.29606 38.39445
Pristimantis lutitus Anura EN Arboreal 24.851831 34.58936 30.32168 38.54001
Pristimantis merostictus Anura VU Arboreal 22.734574 34.22936 30.49005 38.85186
Pristimantis merostictus Anura VU Arboreal 21.871461 34.10639 30.39725 38.71931
Pristimantis merostictus Anura VU Arboreal 24.442473 34.47268 30.73088 39.16724
Pristimantis apiculatus Anura EN Ground-dwelling 22.593496 34.26410 30.42427 38.38001
Pristimantis apiculatus Anura EN Ground-dwelling 21.178511 34.06238 30.19841 38.12431
Pristimantis apiculatus Anura EN Ground-dwelling 24.575191 34.54661 30.75755 38.75523
Pristimantis appendiculatus Anura LC Ground-dwelling 22.483509 34.27781 30.20122 38.33023
Pristimantis appendiculatus Anura LC Ground-dwelling 21.107539 34.08122 29.59152 37.75804
Pristimantis appendiculatus Anura LC Ground-dwelling 24.413477 34.55356 30.45434 38.58182
Pristimantis aquilonaris Anura LC Ground-dwelling 23.179600 34.50506 30.27892 38.62305
Pristimantis aquilonaris Anura LC Ground-dwelling 22.448026 34.40006 30.15212 38.45000
Pristimantis aquilonaris Anura LC Ground-dwelling 24.714297 34.72534 30.67776 39.09065
Pristimantis ardalonychus Anura EN Arboreal 22.288852 34.22237 29.78936 37.85894
Pristimantis ardalonychus Anura EN Arboreal 21.448609 34.10325 29.67064 37.67658
Pristimantis ardalonychus Anura EN Arboreal 23.896896 34.45034 30.32368 38.39555
Pristimantis atrabracus Anura DD Arboreal 24.022160 34.48676 30.56426 38.45298
Pristimantis atrabracus Anura DD Arboreal 23.320574 34.38811 30.48664 38.32372
Pristimantis atrabracus Anura DD Arboreal 25.414498 34.68254 30.82044 38.78316
Pristimantis atratus Anura VU Arboreal 22.988492 34.21290 29.81781 38.14454
Pristimantis atratus Anura VU Arboreal 21.711177 34.03459 29.63000 37.94195
Pristimantis atratus Anura VU Arboreal 24.998861 34.49356 30.19876 38.56826
Pristimantis aurantiguttatus Anura EN Arboreal 25.972630 34.65158 30.62616 39.02690
Pristimantis aurantiguttatus Anura EN Arboreal 25.278269 34.55369 30.54555 38.92076
Pristimantis aurantiguttatus Anura EN Arboreal 27.256273 34.83254 30.88337 39.29297
Pristimantis aureolineatus Anura LC Arboreal 26.342184 34.67411 30.49502 38.75775
Pristimantis aureolineatus Anura LC Arboreal 25.534500 34.55906 30.32558 38.61717
Pristimantis aureolineatus Anura LC Arboreal 27.873033 34.89218 30.54139 38.93515
Pristimantis aureoventris Anura EN Arboreal 26.386750 34.67572 30.11012 38.38870
Pristimantis aureoventris Anura EN Arboreal 25.707210 34.57772 30.35676 38.59143
Pristimantis aureoventris Anura EN Arboreal 27.920527 34.89691 30.28885 38.57628
Pristimantis jester Anura LC Arboreal 26.634291 34.65556 30.57482 38.58968
Pristimantis jester Anura LC Arboreal 25.965013 34.56226 30.64641 38.63229
Pristimantis jester Anura LC Arboreal 28.137979 34.86517 30.70554 38.76052
Pristimantis avicuporum Anura LC Ground-dwelling 24.022160 34.50055 30.64190 38.43581
Pristimantis avicuporum Anura LC Ground-dwelling 23.320574 34.40042 30.51734 38.23436
Pristimantis avicuporum Anura LC Ground-dwelling 25.414498 34.69927 30.48030 38.35263
Pristimantis avius Anura DD Arboreal 27.072310 34.78597 30.69830 38.84302
Pristimantis avius Anura DD Arboreal 26.418052 34.69503 30.58907 38.71295
Pristimantis avius Anura DD Arboreal 28.545199 34.99071 30.71020 38.93963
Pristimantis bacchus Anura EN Arboreal 22.245615 34.22505 30.55056 38.53386
Pristimantis bacchus Anura EN Arboreal 21.369508 34.09954 30.41217 38.38741
Pristimantis bacchus Anura EN Arboreal 24.109886 34.49213 30.68437 38.77153
Pristimantis baiotis Anura NT Arboreal 26.219010 34.74211 30.91033 39.14084
Pristimantis baiotis Anura NT Arboreal 25.544335 34.64671 30.44108 38.71135
Pristimantis baiotis Anura NT Arboreal 27.553766 34.93084 31.01045 39.26250
Pristimantis balionotus Anura EN Arboreal 22.504554 34.02182 29.84869 38.07747
Pristimantis balionotus Anura EN Arboreal 21.223948 33.83938 29.70118 37.87599
Pristimantis balionotus Anura EN Arboreal 24.506837 34.30707 30.47053 38.72668
Pristimantis bambu Anura EN Arboreal 20.535827 33.82364 29.75352 38.16257
Pristimantis bambu Anura EN Arboreal 18.480343 33.53381 29.46804 37.82867
Pristimantis bambu Anura EN Arboreal 23.090691 34.18389 29.95680 38.41940
Pristimantis simonbolivari Anura EN Ground-dwelling 22.287150 34.28886 30.20170 38.36469
Pristimantis simonbolivari Anura EN Ground-dwelling 20.278491 34.00580 29.97896 38.12438
Pristimantis simonbolivari Anura EN Ground-dwelling 24.609385 34.61610 30.63900 38.81502
Pristimantis baryecuus Anura EN Arboreal 23.049225 34.25176 30.13858 38.25375
Pristimantis baryecuus Anura EN Arboreal 21.493692 34.03000 30.01488 38.06049
Pristimantis baryecuus Anura EN Arboreal 25.325715 34.57629 30.64328 38.76356
Pristimantis batrachites Anura EN Arboreal 22.264420 34.17694 30.12528 38.52806
Pristimantis batrachites Anura EN Arboreal 21.177532 34.02353 29.49466 37.86437
Pristimantis batrachites Anura EN Arboreal 23.874959 34.40425 30.33275 38.69770
Pristimantis bearsei Anura DD Stream-dwelling 24.021783 33.94191 29.86222 38.13167
Pristimantis bearsei Anura DD Stream-dwelling 23.410536 33.85621 29.79135 37.99964
Pristimantis bearsei Anura DD Stream-dwelling 25.363768 34.13007 30.19004 38.51804
Pristimantis bellator Anura LC Arboreal 23.179600 34.22305 29.93314 38.05116
Pristimantis bellator Anura LC Arboreal 22.448026 34.11904 30.06144 38.11884
Pristimantis bellator Anura LC Arboreal 24.714297 34.44126 30.16659 38.26483
Pristimantis bellona Anura EN Arboreal 26.219010 34.64442 30.27943 38.86874
Pristimantis bellona Anura EN Arboreal 25.544335 34.54850 30.54758 39.10216
Pristimantis bellona Anura EN Arboreal 27.553766 34.83417 30.41455 38.99300
Pristimantis bicumulus Anura VU Ground-dwelling 26.436249 34.82670 30.88824 39.45775
Pristimantis bicumulus Anura VU Ground-dwelling 25.696256 34.72239 30.28009 38.78013
Pristimantis bicumulus Anura VU Ground-dwelling 27.808205 35.02009 30.69972 39.26697
Pristimantis bipunctatus Anura LC Ground-dwelling 19.976128 33.98973 29.99129 38.19581
Pristimantis bipunctatus Anura LC Ground-dwelling 19.223006 33.88435 30.07166 38.26997
Pristimantis bipunctatus Anura LC Ground-dwelling 21.307373 34.17599 30.24347 38.43839
Pristimantis boulengeri Anura LC Arboreal 23.686461 34.35241 30.33294 38.57141
Pristimantis boulengeri Anura LC Arboreal 22.845272 34.23190 30.21957 38.43679
Pristimantis boulengeri Anura LC Arboreal 25.170339 34.56498 30.48381 38.80888
Pristimantis simoterus Anura NT Ground-dwelling 22.409385 34.35771 30.06335 38.10925
Pristimantis simoterus Anura NT Ground-dwelling 21.593296 34.24228 29.94562 37.95124
Pristimantis simoterus Anura NT Ground-dwelling 23.972185 34.57878 30.68539 38.75472
Pristimantis chloronotus Anura LC Arboreal 22.707101 34.22063 30.57147 38.60041
Pristimantis chloronotus Anura LC Arboreal 21.283172 34.01856 30.45725 38.43618
Pristimantis chloronotus Anura LC Arboreal 24.660567 34.49784 30.58284 38.71843
Pristimantis bromeliaceus Anura LC Arboreal 22.726174 34.07975 30.21097 38.27126
Pristimantis bromeliaceus Anura LC Arboreal 21.601468 33.92068 30.06104 38.10153
Pristimantis bromeliaceus Anura LC Arboreal 24.591966 34.34364 30.42481 38.55281
Pristimantis buckleyi Anura LC Arboreal 24.010244 32.87561 29.48595 35.88307
Pristimantis buckleyi Anura LC Arboreal 23.059260 32.73865 29.37751 35.73381
Pristimantis buckleyi Anura LC Arboreal 25.542663 33.09632 29.80236 36.27317
Pristimantis cabrerai Anura DD Arboreal 24.174982 34.39999 29.92438 37.98597
Pristimantis cabrerai Anura DD Arboreal 23.319443 34.27771 29.84647 37.87942
Pristimantis cabrerai Anura DD Arboreal 25.697440 34.61760 30.23983 38.29576
Pristimantis cacao Anura CR Ground-dwelling 22.833468 34.38660 30.10236 38.10599
Pristimantis cacao Anura CR Ground-dwelling 21.394430 34.18346 30.16904 38.15893
Pristimantis cacao Anura CR Ground-dwelling 24.669687 34.64582 30.36132 38.42442
Pristimantis caeruleonotus Anura DD Arboreal 23.756449 34.39480 30.31894 38.24923
Pristimantis caeruleonotus Anura DD Arboreal 23.027238 34.29156 30.24740 38.11708
Pristimantis caeruleonotus Anura DD Arboreal 25.254968 34.60695 30.51640 38.52532
Pristimantis cajamarcensis Anura LC Arboreal 22.991138 34.28047 30.64624 38.91066
Pristimantis cajamarcensis Anura LC Arboreal 22.017909 34.14167 30.39068 38.62060
Pristimantis cajamarcensis Anura LC Arboreal 24.646383 34.51654 30.85542 39.05128
Pristimantis calcaratus Anura VU Ground-dwelling 24.339054 34.68355 30.41811 38.90782
Pristimantis calcaratus Anura VU Ground-dwelling 23.604569 34.57833 30.36736 38.80784
Pristimantis calcaratus Anura VU Ground-dwelling 25.715244 34.88069 30.52898 39.03777
Pristimantis calcarulatus Anura VU Arboreal 23.075663 34.13627 30.01111 38.04836
Pristimantis calcarulatus Anura VU Arboreal 21.392822 33.89830 29.64206 37.72983
Pristimantis calcarulatus Anura VU Arboreal 25.301338 34.45101 30.38770 38.42820
Pristimantis cantitans Anura NT Ground-dwelling 26.831723 34.83620 30.67728 38.73318
Pristimantis cantitans Anura NT Ground-dwelling 26.139692 34.73943 30.50582 38.52862
Pristimantis cantitans Anura NT Ground-dwelling 28.163382 35.02241 30.86041 39.03941
Pristimantis capitonis Anura EN Ground-dwelling 23.825667 34.57513 30.40487 38.44424
Pristimantis capitonis Anura EN Ground-dwelling 22.732519 34.42068 30.31865 38.37570
Pristimantis capitonis Anura EN Ground-dwelling 25.431194 34.80197 30.66911 38.78223
Pristimantis caprifer Anura CR Arboreal 24.837390 34.53676 30.53870 38.91361
Pristimantis caprifer Anura CR Arboreal 23.969348 34.41433 30.50089 38.83895
Pristimantis caprifer Anura CR Arboreal 26.230072 34.73320 30.73132 39.15679
Pristimantis carlossanchezi Anura EN Arboreal 24.007236 34.33917 30.09767 38.25607
Pristimantis carlossanchezi Anura EN Arboreal 23.230464 34.23063 29.99464 38.10443
Pristimantis carlossanchezi Anura EN Arboreal 25.516152 34.55002 30.63664 38.84751
Pristimantis carmelitae Anura EN Ground-dwelling 27.897278 35.09879 31.23703 39.03216
Pristimantis carmelitae Anura EN Ground-dwelling 27.110966 34.98765 31.17241 38.97621
Pristimantis carmelitae Anura EN Ground-dwelling 29.700198 35.35362 31.52580 39.31287
Pristimantis carranguerorum Anura EN Ground-dwelling 22.392831 34.34621 29.86434 38.17373
Pristimantis carranguerorum Anura EN Ground-dwelling 21.447444 34.21565 29.72707 38.01330
Pristimantis carranguerorum Anura EN Ground-dwelling 24.281794 34.60707 30.05241 38.47556
Pristimantis lynchi Anura LC Ground-dwelling 22.086222 34.25730 30.59396 38.67543
Pristimantis lynchi Anura LC Ground-dwelling 21.163068 34.12758 30.50379 38.58059
Pristimantis lynchi Anura LC Ground-dwelling 23.928784 34.51620 30.80346 38.79485
Pristimantis caryophyllaceus Anura LC Ground-dwelling 26.549979 34.91624 30.93823 38.87939
Pristimantis caryophyllaceus Anura LC Ground-dwelling 25.902489 34.82659 30.73137 38.61342
Pristimantis caryophyllaceus Anura LC Ground-dwelling 27.827762 35.09317 30.83727 38.80019
Pristimantis celator Anura VU Arboreal 23.429248 34.20941 29.80826 38.29308
Pristimantis celator Anura VU Arboreal 22.044582 34.01340 29.59618 38.02781
Pristimantis celator Anura VU Arboreal 25.366739 34.48368 30.02022 38.53051
Pristimantis cerasinus Anura LC Ground-dwelling 26.664791 34.85186 30.77100 38.97919
Pristimantis cerasinus Anura LC Ground-dwelling 25.971906 34.75340 30.70910 38.87458
Pristimantis cerasinus Anura LC Ground-dwelling 28.040362 35.04734 30.95989 39.22905
Pristimantis ceuthospilus Anura VU Arboreal 23.477723 34.35351 30.34824 38.42296
Pristimantis ceuthospilus Anura VU Arboreal 22.811870 34.25822 30.25164 38.30838
Pristimantis ceuthospilus Anura VU Arboreal 24.785930 34.54075 30.48644 38.60925
Pristimantis chalceus Anura LC Arboreal 25.016800 34.68018 30.79160 38.83983
Pristimantis chalceus Anura LC Arboreal 24.095836 34.54832 30.63561 38.62126
Pristimantis chalceus Anura LC Arboreal 26.596979 34.90644 31.21156 39.34912
Pristimantis charlottevillensis Anura VU Ground-dwelling 26.614467 34.96423 30.42481 39.00504
Pristimantis charlottevillensis Anura VU Ground-dwelling 26.237296 34.91027 30.38868 38.95127
Pristimantis charlottevillensis Anura VU Ground-dwelling 27.226432 35.05179 30.60367 39.19468
Pristimantis chiastonotus Anura LC Ground-dwelling 27.259062 34.98596 30.66837 39.19917
Pristimantis chiastonotus Anura LC Ground-dwelling 26.673794 34.90282 30.59385 39.06058
Pristimantis chiastonotus Anura LC Ground-dwelling 28.671630 35.18664 30.78255 39.42391
Pristimantis chimu Anura DD Arboreal 24.352695 34.43472 30.02579 38.76580
Pristimantis chimu Anura DD Arboreal 23.754925 34.34877 29.93031 38.58733
Pristimantis chimu Anura DD Arboreal 25.398234 34.58506 30.11906 38.92574
Pristimantis chrysops Anura CR Arboreal 24.417562 34.39928 30.46564 38.53773
Pristimantis chrysops Anura CR Arboreal 23.685573 34.29603 30.19599 38.25416
Pristimantis chrysops Anura CR Arboreal 25.735753 34.58523 30.66501 38.77350
Pristimantis citriogaster Anura EN Stream-dwelling 23.542316 33.90918 30.08697 38.15098
Pristimantis citriogaster Anura EN Stream-dwelling 22.509152 33.76522 30.02705 38.02583
Pristimantis citriogaster Anura EN Stream-dwelling 25.319874 34.15685 30.17210 38.38245
Pristimantis malkini Anura LC Ground-dwelling 27.193479 35.07929 30.69123 38.90050
Pristimantis malkini Anura LC Ground-dwelling 26.443221 34.97283 30.67651 38.84999
Pristimantis malkini Anura LC Ground-dwelling 28.677050 35.28980 30.95797 39.23438
Pristimantis colodactylus Anura LC Arboreal 23.160770 34.29037 30.24958 38.39026
Pristimantis colodactylus Anura LC Arboreal 21.979410 34.12374 30.16381 38.33586
Pristimantis colodactylus Anura LC Arboreal 25.068134 34.55940 30.42218 38.67698
Pristimantis colomai Anura VU Arboreal 23.330496 36.22224 33.31815 39.15309
Pristimantis colomai Anura VU Arboreal 22.323155 36.08049 33.12070 38.88152
Pristimantis colomai Anura VU Arboreal 24.940923 36.44886 33.45242 39.42722
Pristimantis colonensis Anura VU Arboreal 23.981957 34.43916 30.23747 38.50712
Pristimantis colonensis Anura VU Arboreal 23.052156 34.30606 30.14374 38.36504
Pristimantis colonensis Anura VU Arboreal 25.509285 34.65778 30.47073 38.79432
Pristimantis colostichos Anura EN Ground-dwelling 25.445939 34.65672 30.97358 39.26949
Pristimantis colostichos Anura EN Ground-dwelling 24.543351 34.52846 30.85363 39.11096
Pristimantis colostichos Anura EN Ground-dwelling 27.031556 34.88204 31.03971 39.43073
Pristimantis condor Anura LC Arboreal 23.311117 34.25034 29.94285 38.24762
Pristimantis condor Anura LC Arboreal 22.035996 34.07334 29.85431 38.12017
Pristimantis condor Anura LC Arboreal 25.326878 34.53014 30.31582 38.71231
Pristimantis paramerus Anura EN Ground-dwelling 26.263875 34.85695 30.80219 39.16588
Pristimantis paramerus Anura EN Ground-dwelling 25.397043 34.73490 30.80546 39.10780
Pristimantis paramerus Anura EN Ground-dwelling 27.823709 35.07659 31.13764 39.68441
Pristimantis cordovae Anura EN Ground-dwelling 20.556919 34.11460 29.90124 37.98216
Pristimantis cordovae Anura EN Ground-dwelling 19.506305 33.96370 29.81582 37.89221
Pristimantis cordovae Anura EN Ground-dwelling 22.430522 34.38372 30.21587 38.32939
Pristimantis corniger Anura EN Ground-dwelling 24.992331 34.60495 30.99966 39.01850
Pristimantis corniger Anura EN Ground-dwelling 24.247535 34.49821 30.85362 38.85249
Pristimantis corniger Anura EN Ground-dwelling 26.442817 34.81282 31.24379 39.34960
Pristimantis coronatus Anura DD Ground-dwelling 23.179600 34.33344 30.52303 38.65119
Pristimantis coronatus Anura DD Ground-dwelling 22.448026 34.22936 30.40995 38.50791
Pristimantis coronatus Anura DD Ground-dwelling 24.714297 34.55178 30.74476 38.91087
Pristimantis corrugatus Anura LC Arboreal 21.317805 34.03494 29.91480 37.89332
Pristimantis corrugatus Anura LC Arboreal 20.433028 33.90803 29.76544 37.76474
Pristimantis corrugatus Anura LC Arboreal 22.896775 34.26142 30.19886 38.21138
Pristimantis cosnipatae Anura CR Arboreal 15.323045 33.11466 29.66928 37.58529
Pristimantis cosnipatae Anura CR Arboreal 11.264668 32.54185 28.82278 36.79743
Pristimantis cosnipatae Anura CR Arboreal 17.134228 33.37030 29.82468 37.77350
Pristimantis cremnobates Anura EN Stream-dwelling 23.546002 33.89001 29.82434 38.28508
Pristimantis cremnobates Anura EN Stream-dwelling 22.594071 33.75068 29.62756 38.03839
Pristimantis cremnobates Anura EN Stream-dwelling 25.371396 34.15718 30.14633 38.61948
Pristimantis labiosus Anura LC Arboreal 24.249070 34.62663 31.35458 38.01418
Pristimantis labiosus Anura LC Arboreal 23.217829 34.47998 31.24729 37.92246
Pristimantis labiosus Anura LC Arboreal 25.871481 34.85734 31.37424 38.07073
Pristimantis cristinae Anura EN Arboreal 26.777894 34.67114 30.58692 38.91208
Pristimantis cristinae Anura EN Arboreal 25.908244 34.54817 30.64371 38.91564
Pristimantis cristinae Anura EN Arboreal 28.696471 34.94244 30.74103 39.12890
Pristimantis croceoinguinis Anura LC Arboreal 25.903712 34.74138 30.71841 39.18676
Pristimantis croceoinguinis Anura LC Arboreal 24.925246 34.60235 30.46100 38.86824
Pristimantis croceoinguinis Anura LC Arboreal 27.579527 34.97949 30.94337 39.47720
Pristimantis crucifer Anura NT Arboreal 23.941795 34.55121 30.78043 39.28934
Pristimantis crucifer Anura NT Arboreal 22.700272 34.37480 30.70270 39.13514
Pristimantis crucifer Anura NT Arboreal 25.745944 34.80756 31.20572 39.83995
Pristimantis cruciocularis Anura LC Ground-dwelling 21.156071 34.14586 30.29072 38.06187
Pristimantis cruciocularis Anura LC Ground-dwelling 20.506724 34.05244 30.20756 37.98177
Pristimantis cruciocularis Anura LC Ground-dwelling 22.335073 34.31547 30.42880 38.24224
Pristimantis cruentus Anura LC Arboreal 26.705662 34.85383 30.91546 39.08452
Pristimantis cruentus Anura LC Arboreal 26.082475 34.76582 30.85797 38.96091
Pristimantis cruentus Anura LC Arboreal 27.963286 35.03144 31.10946 39.34185
Pristimantis cryophilius Anura EN Ground-dwelling 23.499563 34.46851 30.34545 38.17918
Pristimantis cryophilius Anura EN Ground-dwelling 22.018834 34.25973 30.12350 37.93346
Pristimantis cryophilius Anura EN Ground-dwelling 25.735214 34.78373 30.63646 38.53589
Pristimantis cryptomelas Anura NT Ground-dwelling 22.924202 34.41749 30.33643 38.51673
Pristimantis cryptomelas Anura NT Ground-dwelling 21.737450 34.24886 30.10999 38.25149
Pristimantis cryptomelas Anura NT Ground-dwelling 24.861322 34.69275 30.62144 38.86212
Pristimantis cuentasi Anura EN Ground-dwelling 26.506328 34.79041 30.92966 38.65005
Pristimantis cuentasi Anura EN Ground-dwelling 25.603521 34.66178 30.77565 38.43208
Pristimantis cuentasi Anura EN Ground-dwelling 28.419449 35.06297 31.06658 38.95098
Pristimantis cuneirostris Anura DD Arboreal 24.022160 34.40784 29.95144 38.09359
Pristimantis cuneirostris Anura DD Arboreal 23.320574 34.30726 29.86603 37.97676
Pristimantis cuneirostris Anura DD Arboreal 25.414498 34.60744 30.01469 38.20236
Pristimantis gentryi Anura EN Ground-dwelling 22.853210 34.65838 31.22732 37.49244
Pristimantis gentryi Anura EN Ground-dwelling 20.944706 34.38684 31.00098 37.16865
Pristimantis gentryi Anura EN Ground-dwelling 25.231795 34.99679 31.93172 38.34656
Pristimantis truebae Anura EN Arboreal 22.318862 34.42729 31.27464 37.38557
Pristimantis truebae Anura EN Arboreal 20.406089 34.15354 31.10444 37.12869
Pristimantis truebae Anura EN Arboreal 24.773074 34.77852 31.66047 37.90209
Pristimantis degener Anura EN Arboreal 22.975794 34.19357 30.05879 38.27218
Pristimantis degener Anura EN Arboreal 21.781938 34.02195 29.89262 38.08157
Pristimantis degener Anura EN Arboreal 24.793926 34.45494 30.44170 38.71789
Pristimantis deinops Anura CR Arboreal 24.417562 34.45385 30.43635 38.18589
Pristimantis deinops Anura CR Arboreal 23.685573 34.35076 30.30567 38.02210
Pristimantis deinops Anura CR Arboreal 25.735753 34.63950 30.51373 38.40039
Pristimantis delicatus Anura EN Arboreal 27.897278 34.85096 30.66110 39.23335
Pristimantis delicatus Anura EN Arboreal 27.110966 34.74168 30.53666 39.08333
Pristimantis delicatus Anura EN Arboreal 29.700198 35.10153 30.82891 39.50431
Pristimantis delius Anura DD Ground-dwelling 27.084551 34.94307 30.63372 38.87507
Pristimantis delius Anura DD Ground-dwelling 26.337291 34.83778 30.52618 38.73299
Pristimantis delius Anura DD Ground-dwelling 28.778389 35.18173 30.89328 39.28470
Pristimantis dendrobatoides Anura LC Arboreal 26.764062 34.82612 30.63974 39.08426
Pristimantis dendrobatoides Anura LC Arboreal 26.075433 34.72647 30.56736 38.92857
Pristimantis dendrobatoides Anura LC Arboreal 28.279628 35.04542 31.12184 39.74576
Pristimantis devillei Anura EN Arboreal 21.675664 34.00809 29.71798 37.85831
Pristimantis devillei Anura EN Arboreal 19.896150 33.75539 29.69793 37.84055
Pristimantis devillei Anura EN Arboreal 24.116448 34.35468 30.18104 38.43745
Pristimantis surdus Anura EN Ground-dwelling 20.180939 33.95595 29.64856 38.07109
Pristimantis surdus Anura EN Ground-dwelling 18.072574 33.65835 29.60069 38.00656
Pristimantis surdus Anura EN Ground-dwelling 22.820081 34.32847 30.07674 38.46457
Pristimantis diadematus Anura LC Arboreal 24.658588 34.46421 30.13112 38.54083
Pristimantis diadematus Anura LC Arboreal 23.933778 34.35882 30.09494 38.45817
Pristimantis diadematus Anura LC Arboreal 26.034137 34.66423 30.18349 38.63748
Pristimantis diaphonus Anura CR Arboreal 24.817867 34.55225 30.61548 38.74058
Pristimantis diaphonus Anura CR Arboreal 24.070609 34.44402 30.47235 38.60751
Pristimantis diaphonus Anura CR Arboreal 26.192700 34.75138 30.75364 38.98555
Pristimantis diogenes Anura CR Stream-dwelling 24.215542 33.95836 30.22941 38.50630
Pristimantis diogenes Anura CR Stream-dwelling 23.173833 33.81386 30.16889 38.36871
Pristimantis diogenes Anura CR Stream-dwelling 25.704822 34.16493 30.31355 38.77284
Pristimantis dissimulatus Anura EN Arboreal 19.805326 33.72169 30.03704 37.85507
Pristimantis dissimulatus Anura EN Arboreal 17.198230 33.35844 29.86713 37.64319
Pristimantis dissimulatus Anura EN Arboreal 22.861501 34.14751 30.27302 38.18823
Pristimantis divnae Anura LC Arboreal 19.219198 33.63022 29.12357 37.62433
Pristimantis divnae Anura LC Arboreal 17.951224 33.44948 28.82625 37.30177
Pristimantis divnae Anura LC Arboreal 20.432261 33.80313 29.25277 37.72805
Pristimantis dorsopictus Anura VU Arboreal 21.402784 34.02930 29.52262 37.86993
Pristimantis dorsopictus Anura VU Arboreal 20.374610 33.88472 29.41288 37.73439
Pristimantis dorsopictus Anura VU Arboreal 23.162627 34.27676 29.98776 38.40382
Pristimantis duellmani Anura VU Arboreal 22.978376 34.29265 30.17062 38.75267
Pristimantis duellmani Anura VU Arboreal 21.697908 34.11128 30.13861 38.57921
Pristimantis duellmani Anura VU Arboreal 24.782432 34.54819 30.44421 39.00833
Pristimantis quinquagesimus Anura VU Arboreal 23.327223 34.27916 29.99428 38.23122
Pristimantis quinquagesimus Anura VU Arboreal 21.979423 34.09125 29.89050 38.06930
Pristimantis quinquagesimus Anura VU Arboreal 25.266682 34.54954 30.06952 38.38945
Pristimantis duende Anura VU Ground-dwelling 24.017258 34.53880 30.52905 38.93309
Pristimantis duende Anura VU Ground-dwelling 23.300537 34.43700 30.43958 38.81863
Pristimantis duende Anura VU Ground-dwelling 25.278806 34.71799 30.70577 39.11346
Pristimantis dundeei Anura DD Arboreal 26.291601 34.71984 30.81744 39.23547
Pristimantis dundeei Anura DD Arboreal 25.333427 34.58369 30.69088 39.09758
Pristimantis dundeei Anura DD Arboreal 28.002644 34.96299 31.03357 39.49627
Pristimantis epacrus Anura LC Ground-dwelling 24.992331 34.71441 30.31216 38.84257
Pristimantis epacrus Anura LC Ground-dwelling 24.247535 34.60785 30.04620 38.58968
Pristimantis epacrus Anura LC Ground-dwelling 26.442817 34.92193 30.63555 39.32977
Pristimantis eremitus Anura VU Arboreal 22.593496 34.19340 29.99762 38.26822
Pristimantis eremitus Anura VU Arboreal 21.178511 33.99697 29.86623 38.08192
Pristimantis eremitus Anura VU Arboreal 24.575191 34.46850 30.27340 38.63034
Pristimantis eriphus Anura VU Arboreal 22.707101 34.13983 29.73813 37.82228
Pristimantis eriphus Anura VU Arboreal 21.283172 33.93577 29.56535 37.59398
Pristimantis eriphus Anura VU Arboreal 24.660567 34.41977 30.00316 38.14279
Pristimantis ernesti Anura VU Arboreal 23.546002 34.32353 30.37309 38.93570
Pristimantis ernesti Anura VU Arboreal 22.594071 34.18757 30.35013 38.83952
Pristimantis ernesti Anura VU Arboreal 25.371396 34.58423 30.44757 39.08883
Pristimantis erythropleura Anura LC Arboreal 24.101908 34.33858 30.33446 38.76529
Pristimantis erythropleura Anura LC Arboreal 23.243963 34.21826 30.25613 38.67724
Pristimantis erythropleura Anura LC Arboreal 25.565703 34.54386 30.46223 38.98982
Pristimantis esmeraldas Anura LC Arboreal 24.558423 34.47032 30.39158 38.73642
Pristimantis esmeraldas Anura LC Arboreal 23.728848 34.35316 30.25532 38.52815
Pristimantis esmeraldas Anura LC Arboreal 26.063523 34.68289 30.36073 38.74373
Pristimantis eugeniae Anura EN Arboreal 22.208003 34.14132 30.37258 38.67770
Pristimantis eugeniae Anura EN Arboreal 20.442740 33.89286 30.07107 38.37765
Pristimantis eugeniae Anura EN Arboreal 24.557603 34.47201 30.42804 38.81783
Pristimantis euphronides Anura CR Ground-dwelling 27.806278 35.06838 30.91966 38.93495
Pristimantis euphronides Anura CR Ground-dwelling 27.273428 34.99242 30.89072 38.84137
Pristimantis euphronides Anura CR Ground-dwelling 28.700806 35.19591 31.14125 39.26192
Pristimantis shrevei Anura EN Arboreal 27.060737 34.79600 31.02472 38.99836
Pristimantis shrevei Anura EN Arboreal 26.593129 34.73109 30.95526 38.89382
Pristimantis shrevei Anura EN Arboreal 27.836829 34.90373 30.78953 38.79922
Pristimantis eurydactylus Anura LC Arboreal 27.790950 34.82055 30.18437 38.92391
Pristimantis eurydactylus Anura LC Arboreal 27.037190 34.71408 30.32470 38.99180
Pristimantis eurydactylus Anura LC Arboreal 29.290254 35.03232 30.39746 39.24554
Pristimantis exoristus Anura DD Arboreal 24.759402 34.57099 30.02621 38.72818
Pristimantis exoristus Anura DD Arboreal 23.927890 34.45485 29.94189 38.57063
Pristimantis exoristus Anura DD Arboreal 26.418105 34.80265 30.80904 39.71625
Pristimantis factiosus Anura LC Arboreal 23.499493 34.35775 30.55439 38.63888
Pristimantis factiosus Anura LC Arboreal 22.573781 34.22652 30.46185 38.50498
Pristimantis factiosus Anura LC Arboreal 25.034323 34.57534 30.63315 38.75044
Pristimantis fasciatus Anura VU Arboreal 26.874786 34.91974 30.36203 38.61797
Pristimantis fasciatus Anura VU Arboreal 26.081905 34.80735 30.32350 38.52150
Pristimantis fasciatus Anura VU Arboreal 28.455309 35.14377 30.66188 39.04089
Pristimantis fetosus Anura NT Arboreal 22.792552 34.20344 29.91596 37.93229
Pristimantis fetosus Anura NT Arboreal 22.040989 34.09715 30.23514 38.22702
Pristimantis fetosus Anura NT Arboreal 24.304586 34.41727 30.09357 38.15210
Pristimantis floridus Anura DD Arboreal 19.805326 33.79348 29.51323 38.18479
Pristimantis floridus Anura DD Arboreal 17.198230 33.42267 28.93203 37.51143
Pristimantis floridus Anura DD Arboreal 22.861501 34.22816 29.85918 38.58832
Pristimantis gaigei Anura LC Ground-dwelling 25.394368 34.66556 30.52847 39.26911
Pristimantis gaigei Anura LC Ground-dwelling 24.663104 34.56345 30.54406 39.24676
Pristimantis gaigei Anura LC Ground-dwelling 26.815339 34.86396 30.70632 39.48102
Pristimantis galdi Anura LC Arboreal 23.395974 34.22049 30.15007 38.58488
Pristimantis galdi Anura LC Arboreal 22.230687 34.05488 29.93742 38.38712
Pristimantis galdi Anura LC Arboreal 25.281915 34.48854 30.21879 38.72546
Pristimantis ganonotus Anura DD Arboreal 20.170576 33.90072 29.81744 38.00724
Pristimantis ganonotus Anura DD Arboreal 17.839286 33.57075 29.37380 37.47385
Pristimantis ganonotus Anura DD Arboreal 22.976096 34.29781 30.14955 38.39102
Pristimantis gladiator Anura VU Fossorial 22.707101 35.28857 31.14667 39.34304
Pristimantis gladiator Anura VU Fossorial 21.283172 35.08816 30.94202 39.11619
Pristimantis gladiator Anura VU Fossorial 24.660567 35.56352 31.37813 39.67636
Pristimantis glandulosus Anura EN Ground-dwelling 21.675664 34.22963 30.05153 38.64058
Pristimantis glandulosus Anura EN Ground-dwelling 19.896150 33.97504 29.86992 38.40622
Pristimantis glandulosus Anura EN Ground-dwelling 24.116448 34.57882 30.03369 38.76233
Pristimantis inusitatus Anura EN Arboreal 21.675664 34.06472 30.02657 38.47563
Pristimantis inusitatus Anura EN Arboreal 19.896150 33.81140 29.74759 38.12429
Pristimantis inusitatus Anura EN Arboreal 24.116448 34.41218 30.07990 38.55580
Pristimantis gracilis Anura VU Arboreal 23.362438 34.22071 30.13481 38.71851
Pristimantis gracilis Anura VU Arboreal 22.562962 34.11167 30.03784 38.61930
Pristimantis gracilis Anura VU Arboreal 24.839549 34.42216 30.27606 38.87394
Pristimantis grandiceps Anura EN Arboreal 22.245615 34.12516 30.21490 38.38860
Pristimantis grandiceps Anura EN Arboreal 21.369508 34.00153 30.08404 38.19364
Pristimantis grandiceps Anura EN Arboreal 24.109886 34.38822 30.45761 38.75350
Pristimantis gutturalis Anura LC Arboreal 27.297582 34.95189 30.81037 39.41616
Pristimantis gutturalis Anura LC Arboreal 26.739014 34.87176 30.77689 39.38047
Pristimantis gutturalis Anura LC Arboreal 28.687231 35.15123 30.74818 39.50496
Pristimantis hectus Anura VU Ground-dwelling 22.641490 34.27891 30.49128 38.28389
Pristimantis hectus Anura VU Ground-dwelling 21.221695 34.07570 30.20967 37.99891
Pristimantis hectus Anura VU Ground-dwelling 24.594090 34.55839 30.69390 38.51735
Pristimantis helvolus Anura EN Arboreal 23.499493 34.31299 30.11922 38.13106
Pristimantis helvolus Anura EN Arboreal 22.573781 34.18050 29.91654 37.91355
Pristimantis helvolus Anura EN Arboreal 25.034323 34.53267 30.56784 38.59505
Pristimantis hernandezi Anura EN Arboreal 24.224885 34.37130 30.14533 38.26031
Pristimantis hernandezi Anura EN Arboreal 23.177962 34.22136 29.96563 38.06015
Pristimantis hernandezi Anura EN Arboreal 25.848876 34.60389 30.37244 38.47317
Pristimantis huicundo Anura EN Arboreal 22.405728 34.21767 30.04419 38.18590
Pristimantis huicundo Anura EN Arboreal 21.240835 34.05102 29.95754 38.00345
Pristimantis huicundo Anura EN Arboreal 24.132230 34.46467 30.42158 38.65322
Pristimantis hybotragus Anura EN Arboreal 24.817867 34.46550 30.23461 38.75253
Pristimantis hybotragus Anura EN Arboreal 24.070609 34.36020 30.17678 38.68384
Pristimantis hybotragus Anura EN Arboreal 26.192700 34.65924 30.26817 38.83462
Pristimantis ignicolor Anura EN Arboreal 21.798297 34.05835 30.14813 37.83575
Pristimantis ignicolor Anura EN Arboreal 20.205317 33.83183 29.90181 37.64540
Pristimantis ignicolor Anura EN Arboreal 23.999839 34.37141 30.45416 38.16938
Pristimantis illotus Anura NT Arboreal 22.003303 34.11638 29.83349 38.27944
Pristimantis illotus Anura NT Arboreal 20.402547 33.89006 29.85719 38.17222
Pristimantis illotus Anura NT Arboreal 24.125637 34.41645 30.02513 38.58335
Pristimantis imitatrix Anura LC Ground-dwelling 22.352696 34.36771 30.42426 38.52424
Pristimantis imitatrix Anura LC Ground-dwelling 21.676980 34.27111 30.27428 38.34884
Pristimantis imitatrix Anura LC Ground-dwelling 23.552463 34.53924 30.62351 38.81150
Pristimantis incanus Anura EN Arboreal 21.798297 34.21731 30.26479 38.58754
Pristimantis incanus Anura EN Arboreal 20.205317 33.98992 29.91032 38.16331
Pristimantis incanus Anura EN Arboreal 23.999839 34.53158 30.55823 38.88202
Pristimantis infraguttatus Anura DD Arboreal 20.305860 33.78348 29.58874 37.55852
Pristimantis infraguttatus Anura DD Arboreal 19.198666 33.62499 29.42144 37.36552
Pristimantis infraguttatus Anura DD Arboreal 22.523955 34.10099 29.80112 37.96796
Pristimantis inguinalis Anura LC Arboreal 27.256605 34.87407 31.11188 38.73713
Pristimantis inguinalis Anura LC Arboreal 26.631380 34.78473 30.96598 38.56298
Pristimantis inguinalis Anura LC Arboreal 28.787866 35.09288 31.18710 38.88030
Pristimantis insignitus Anura NT Ground-dwelling 26.777894 34.97479 30.58203 39.18620
Pristimantis insignitus Anura NT Ground-dwelling 25.908244 34.84990 30.48503 39.01155
Pristimantis insignitus Anura NT Ground-dwelling 28.696471 35.25031 30.98700 39.58877
Pristimantis ixalus Anura DD Stream-dwelling 24.390020 33.95596 30.00061 38.18810
Pristimantis ixalus Anura DD Stream-dwelling 23.746759 33.86471 29.98475 38.10527
Pristimantis ixalus Anura DD Stream-dwelling 25.828703 34.16006 30.11084 38.38716
Pristimantis jaimei Anura CR Arboreal 24.215542 34.40254 30.01734 38.28253
Pristimantis jaimei Anura CR Arboreal 23.173833 34.25636 30.20812 38.41570
Pristimantis jaimei Anura CR Arboreal 25.704822 34.61153 30.28496 38.56224
Pristimantis johannesdei Anura VU Arboreal 25.173220 34.56824 30.67679 38.74325
Pristimantis johannesdei Anura VU Arboreal 24.471974 34.46969 30.54542 38.58730
Pristimantis johannesdei Anura VU Arboreal 26.551608 34.76197 30.89280 38.96830
Pristimantis jorgevelosai Anura EN Stream-dwelling 23.392915 33.76127 29.22664 37.64903
Pristimantis jorgevelosai Anura EN Stream-dwelling 22.591262 33.64664 29.16454 37.55668
Pristimantis jorgevelosai Anura EN Stream-dwelling 24.955324 33.98467 29.28002 37.89056
Pristimantis juanchoi Anura VU Arboreal 24.339054 34.50561 30.36225 38.56226
Pristimantis juanchoi Anura VU Arboreal 23.604569 34.40238 30.28635 38.48130
Pristimantis juanchoi Anura VU Arboreal 25.715244 34.69904 30.56310 38.81513
Pristimantis palmeri Anura LC Arboreal 23.871472 34.49804 30.24320 38.56375
Pristimantis palmeri Anura LC Arboreal 23.018590 34.37627 30.05293 38.37042
Pristimantis palmeri Anura LC Arboreal 25.352109 34.70945 30.36715 38.75533
Pristimantis jubatus Anura NT Arboreal 24.215542 34.41559 30.18316 38.43995
Pristimantis jubatus Anura NT Arboreal 23.173833 34.26925 30.07200 38.26829
Pristimantis jubatus Anura NT Arboreal 25.704822 34.62482 30.50744 38.84031
Pristimantis kareliae Anura CR Stream-dwelling 26.717248 34.41659 29.73441 38.30250
Pristimantis kareliae Anura CR Stream-dwelling 25.882292 34.29802 29.64775 38.18644
Pristimantis kareliae Anura CR Stream-dwelling 28.269649 34.63704 29.94330 38.56744
Pristimantis katoptroides Anura LC Arboreal 23.629382 34.30013 29.90080 37.78276
Pristimantis katoptroides Anura LC Arboreal 22.527274 34.14567 29.83932 37.65788
Pristimantis katoptroides Anura LC Arboreal 25.493829 34.56142 30.22798 38.22190
Pristimantis lacrimosus Anura LC Arboreal 24.378238 34.43923 30.17703 38.47181
Pristimantis lacrimosus Anura LC Arboreal 23.614721 34.33230 30.42156 38.66995
Pristimantis lacrimosus Anura LC Arboreal 25.761182 34.63291 30.54859 38.96316
Pristimantis lanthanites Anura LC Ground-dwelling 26.969595 34.96613 30.95582 39.23602
Pristimantis lanthanites Anura LC Ground-dwelling 26.197368 34.85701 30.85862 39.14097
Pristimantis lanthanites Anura LC Ground-dwelling 28.488592 35.18077 31.11608 39.49358
Pristimantis thectopternus Anura LC Arboreal 23.713568 34.25395 29.87877 38.05355
Pristimantis thectopternus Anura LC Arboreal 22.821458 34.13016 29.79648 37.93797
Pristimantis thectopternus Anura LC Arboreal 25.223076 34.46342 30.08101 38.38248
Pristimantis lasalleorum Anura EN Arboreal 26.219010 34.69388 30.37897 38.68337
Pristimantis lasalleorum Anura EN Arboreal 25.544335 34.59860 30.20911 38.48558
Pristimantis lasalleorum Anura EN Arboreal 27.553766 34.88239 30.76053 39.12012
Pristimantis lemur Anura VU Arboreal 24.201905 34.39798 30.17090 38.47465
Pristimantis lemur Anura VU Arboreal 23.314010 34.27133 30.05920 38.31959
Pristimantis lemur Anura VU Arboreal 25.710667 34.61319 30.28777 38.68171
Pristimantis leoni Anura LC Ground-dwelling 22.787610 34.38901 30.28553 38.14513
Pristimantis leoni Anura LC Ground-dwelling 21.468643 34.20302 30.17759 37.90183
Pristimantis leoni Anura LC Ground-dwelling 24.635865 34.64962 30.75404 38.77271
Pristimantis leptolophus Anura LC Arboreal 24.323068 34.43485 30.64424 38.94779
Pristimantis leptolophus Anura LC Arboreal 23.430470 34.30854 30.47132 38.70508
Pristimantis leptolophus Anura LC Arboreal 25.823682 34.64720 30.90081 39.20537
Pristimantis leucopus Anura EN Arboreal 22.794783 34.18840 30.15375 38.03272
Pristimantis leucopus Anura EN Arboreal 21.708861 34.03373 30.06243 37.87283
Pristimantis leucopus Anura EN Arboreal 24.569008 34.44111 30.41000 38.35005
Pristimantis librarius Anura DD Arboreal 25.523923 33.17402 30.07424 36.32876
Pristimantis librarius Anura DD Arboreal 24.751857 33.06365 29.80189 36.00755
Pristimantis librarius Anura DD Arboreal 27.000038 33.38503 30.14419 36.48974
Pristimantis lichenoides Anura CR Stream-dwelling 22.792552 33.79203 29.50414 37.60682
Pristimantis lichenoides Anura CR Stream-dwelling 22.040989 33.68558 29.40519 37.50311
Pristimantis lichenoides Anura CR Stream-dwelling 24.304586 34.00618 29.65485 37.87053
Pristimantis lirellus Anura LC Arboreal 23.399738 34.11624 29.90202 37.77600
Pristimantis lirellus Anura LC Arboreal 22.607124 34.00575 29.72119 37.56200
Pristimantis lirellus Anura LC Arboreal 24.945947 34.33178 29.95795 37.83555
Pristimantis lividus Anura EN Arboreal 21.675664 34.00469 29.74648 38.14668
Pristimantis lividus Anura EN Arboreal 19.896150 33.75182 29.66336 37.91739
Pristimantis lividus Anura EN Arboreal 24.116448 34.35154 30.33406 38.80582
Pristimantis llojsintuta Anura LC Arboreal 19.341542 33.76567 29.67659 37.68391
Pristimantis llojsintuta Anura LC Arboreal 18.452185 33.64158 29.56188 37.56449
Pristimantis llojsintuta Anura LC Arboreal 20.718589 33.95780 30.07999 38.09435
Pristimantis loustes Anura EN Ground-dwelling 22.975794 34.29771 30.56054 38.79252
Pristimantis loustes Anura EN Ground-dwelling 21.781938 34.12837 30.41373 38.55893
Pristimantis loustes Anura EN Ground-dwelling 24.793926 34.55561 30.06687 38.42087
Pristimantis lucasi Anura LC Arboreal 21.012652 33.95856 29.58838 37.79694
Pristimantis lucasi Anura LC Arboreal 20.177954 33.83905 29.54191 37.68978
Pristimantis lucasi Anura LC Arboreal 22.689323 34.19861 29.51741 37.80226
Pristimantis luscombei Anura DD Arboreal 25.983830 34.71780 30.49420 38.93520
Pristimantis luscombei Anura DD Arboreal 25.209779 34.60693 30.39943 38.80239
Pristimantis luscombei Anura DD Arboreal 27.644080 34.95561 30.65822 39.13671
Pristimantis luteolateralis Anura NT Arboreal 19.805326 33.71637 29.89308 37.98965
Pristimantis luteolateralis Anura NT Arboreal 17.198230 33.35113 29.48824 37.61021
Pristimantis luteolateralis Anura NT Arboreal 22.861501 34.14451 30.29339 38.45051
Pristimantis walkeri Anura LC Arboreal 23.846814 34.43980 30.11763 38.17975
Pristimantis walkeri Anura LC Arboreal 22.589124 34.26125 30.01249 38.05636
Pristimantis walkeri Anura LC Arboreal 25.801638 34.71731 30.45197 38.64884
Pristimantis lythrodes Anura LC Arboreal 29.056341 35.15810 31.12225 39.85280
Pristimantis lythrodes Anura LC Arboreal 28.242148 35.04343 31.02076 39.70684
Pristimantis lythrodes Anura LC Arboreal 30.566952 35.37084 31.10800 39.98450
Pristimantis maculosus Anura VU Arboreal 21.402784 34.00536 30.28398 38.24959
Pristimantis maculosus Anura VU Arboreal 20.374610 33.85536 29.87277 37.78789
Pristimantis maculosus Anura VU Arboreal 23.162627 34.26211 30.25789 38.28235
Pristimantis marahuaka Anura NT Ground-dwelling 25.661020 34.70967 30.40182 38.78630
Pristimantis marahuaka Anura NT Ground-dwelling 25.001401 34.61688 30.52911 38.88923
Pristimantis marahuaka Anura NT Ground-dwelling 27.238038 34.93152 31.03008 39.47523
Pristimantis marmoratus Anura LC Ground-dwelling 27.096911 35.02846 30.80157 39.03172
Pristimantis marmoratus Anura LC Ground-dwelling 26.452339 34.93622 30.72752 38.90263
Pristimantis marmoratus Anura LC Ground-dwelling 28.551607 35.23663 30.90434 39.33680
Pristimantis pulvinatus Anura LC Arboreal 26.410663 34.71559 30.40636 38.60629
Pristimantis pulvinatus Anura LC Arboreal 25.687349 34.61373 30.34872 38.48004
Pristimantis pulvinatus Anura LC Arboreal 27.995839 34.93883 30.65978 38.90436
Pristimantis mars Anura CR Ground-dwelling 22.792552 34.35028 30.58951 38.51825
Pristimantis mars Anura CR Ground-dwelling 22.040989 34.24426 30.50511 38.37954
Pristimantis mars Anura CR Ground-dwelling 24.304586 34.56358 30.77154 38.72890
Pristimantis martiae Anura LC Ground-dwelling 27.079886 35.00923 30.60067 38.92633
Pristimantis martiae Anura LC Ground-dwelling 26.319647 34.90065 30.53706 38.84605
Pristimantis martiae Anura LC Ground-dwelling 28.576106 35.22291 30.80785 39.18660
Pristimantis megalops Anura NT Ground-dwelling 26.777894 35.01758 31.04322 39.20561
Pristimantis megalops Anura NT Ground-dwelling 25.908244 34.89641 30.80071 38.96705
Pristimantis megalops Anura NT Ground-dwelling 28.696471 35.28490 31.21659 39.50817
Pristimantis melanogaster Anura NT Ground-dwelling 21.823777 34.19601 29.92099 38.06761
Pristimantis melanogaster Anura NT Ground-dwelling 21.050210 34.08679 29.85851 37.97619
Pristimantis melanogaster Anura NT Ground-dwelling 23.083185 34.37383 30.07287 38.23802
Pristimantis melanoproctus Anura DD Arboreal 22.264420 34.01511 30.11169 38.05963
Pristimantis melanoproctus Anura DD Arboreal 21.177532 33.86264 30.18917 38.07208
Pristimantis melanoproctus Anura DD Arboreal 23.874959 34.24102 30.23343 38.31770
Pristimantis memorans Anura DD Stream-dwelling 27.072310 34.43769 30.04968 38.50540
Pristimantis memorans Anura DD Stream-dwelling 26.418052 34.34433 29.90796 38.36759
Pristimantis memorans Anura DD Stream-dwelling 28.545199 34.64787 30.62433 39.10448
Pristimantis mendax Anura LC Arboreal 20.823230 33.89557 29.97401 37.75649
Pristimantis mendax Anura LC Arboreal 19.811205 33.75386 29.87560 37.63549
Pristimantis mendax Anura LC Arboreal 22.117339 34.07678 30.08526 37.94575
Pristimantis meridionalis Anura DD Arboreal 20.146531 33.85363 29.31276 37.55741
Pristimantis meridionalis Anura DD Arboreal 19.060773 33.69835 29.35416 37.56005
Pristimantis meridionalis Anura DD Arboreal 22.671692 34.21476 29.73088 38.00830
Pristimantis metabates Anura EN Stream-dwelling 24.792391 34.02026 29.82498 38.02691
Pristimantis metabates Anura EN Stream-dwelling 23.913808 33.89581 29.72244 37.87073
Pristimantis metabates Anura EN Stream-dwelling 26.487618 34.26040 30.03705 38.32825
Pristimantis minutulus Anura DD Arboreal 21.815670 33.96563 29.96380 38.40391
Pristimantis minutulus Anura DD Arboreal 21.068264 33.86132 29.70985 38.13467
Pristimantis minutulus Anura DD Arboreal 23.293997 34.17195 30.11788 38.57611
Pristimantis miyatai Anura LC Arboreal 23.030730 34.26630 30.34709 38.12828
Pristimantis miyatai Anura LC Arboreal 22.170912 34.14363 30.27427 37.99184
Pristimantis miyatai Anura LC Arboreal 24.734881 34.50944 30.47201 38.32211
Pristimantis mnionaetes Anura EN Arboreal 22.354356 34.15826 29.78016 38.35699
Pristimantis mnionaetes Anura EN Arboreal 21.407774 34.02411 29.45970 37.98853
Pristimantis mnionaetes Anura EN Arboreal 24.256757 34.42788 30.08674 38.66231
Pristimantis modipeplus Anura EN Arboreal 22.287150 34.10752 29.36024 37.83369
Pristimantis modipeplus Anura EN Arboreal 20.278491 33.82755 29.44102 37.87843
Pristimantis modipeplus Anura EN Arboreal 24.609385 34.43119 29.63574 38.15002
Pristimantis molybrignus Anura CR Arboreal 24.297884 34.35213 29.89269 38.67722
Pristimantis molybrignus Anura CR Arboreal 23.460990 34.23415 29.43078 38.15926
Pristimantis molybrignus Anura CR Arboreal 25.711770 34.55145 29.72849 38.59122
Pristimantis mondolfii Anura DD Arboreal 22.264420 34.12442 30.25732 38.26142
Pristimantis mondolfii Anura DD Arboreal 21.177532 33.97111 30.15244 38.12933
Pristimantis mondolfii Anura DD Arboreal 23.874959 34.35160 30.40329 38.42560
Pristimantis moro Anura LC Arboreal 27.062872 34.83492 30.23782 38.81192
Pristimantis moro Anura LC Arboreal 26.440747 34.74772 30.16011 38.76204
Pristimantis moro Anura LC Arboreal 28.348893 35.01517 30.40466 39.03681
Pristimantis muricatus Anura VU Arboreal 22.986312 34.25910 29.94075 38.51377
Pristimantis muricatus Anura VU Arboreal 21.456474 34.04212 29.80784 38.30123
Pristimantis muricatus Anura VU Arboreal 25.131200 34.56333 30.17235 38.83746
Pristimantis muscosus Anura NT Stream-dwelling 23.364958 33.73276 29.68443 38.14413
Pristimantis muscosus Anura NT Stream-dwelling 22.463387 33.60711 29.58083 38.04225
Pristimantis muscosus Anura NT Stream-dwelling 25.167216 33.98395 30.01469 38.43028
Pristimantis museosus Anura VU Arboreal 27.143689 34.72569 31.06784 39.38228
Pristimantis museosus Anura VU Arboreal 26.535016 34.63900 31.06636 39.32955
Pristimantis museosus Anura VU Arboreal 28.322437 34.89358 30.67669 39.05288
Pristimantis myersi Anura LC Ground-dwelling 23.798011 34.48409 30.39714 38.54595
Pristimantis myersi Anura LC Ground-dwelling 22.733007 34.33290 30.19236 38.30753
Pristimantis myersi Anura LC Ground-dwelling 25.341396 34.70320 30.49551 38.63447
Pristimantis myops Anura EN Arboreal 24.017258 34.53886 30.49338 39.05449
Pristimantis myops Anura EN Arboreal 23.300537 34.43595 30.47623 39.00008
Pristimantis myops Anura EN Arboreal 25.278806 34.72000 30.54932 39.07108
Pristimantis nephophilus Anura NT Arboreal 23.362375 34.28690 30.39357 38.15635
Pristimantis nephophilus Anura NT Arboreal 22.583969 34.17750 30.21266 37.97341
Pristimantis nephophilus Anura NT Arboreal 24.955619 34.51082 30.65524 38.50250
Pristimantis nicefori Anura LC Arboreal 22.807291 34.19088 29.78846 37.88073
Pristimantis nicefori Anura LC Arboreal 21.891493 34.06087 29.69954 37.81675
Pristimantis nicefori Anura LC Arboreal 24.423414 34.42030 30.07327 38.18593
Pristimantis nigrogriseus Anura VU Stream-dwelling 22.516485 33.72669 30.19352 37.99039
Pristimantis nigrogriseus Anura VU Stream-dwelling 21.000347 33.51365 29.99758 37.75057
Pristimantis nigrogriseus Anura VU Stream-dwelling 24.655648 34.02728 30.05475 37.84115
Pristimantis nyctophylax Anura VU Arboreal 23.033729 34.28777 30.58966 38.52380
Pristimantis nyctophylax Anura VU Arboreal 21.190651 34.02465 30.20305 37.97147
Pristimantis nyctophylax Anura VU Arboreal 25.447074 34.63230 30.57457 38.62702
Pristimantis subsigillatus Anura LC Arboreal 24.854980 34.51773 30.46238 38.32608
Pristimantis subsigillatus Anura LC Arboreal 23.954972 34.39191 30.38333 38.20621
Pristimantis subsigillatus Anura LC Arboreal 26.450712 34.74081 31.00140 38.96563
Pristimantis obmutescens Anura LC Arboreal 23.825667 34.33897 30.58581 38.62879
Pristimantis obmutescens Anura LC Arboreal 22.732519 34.18343 30.42607 38.41056
Pristimantis obmutescens Anura LC Arboreal 25.431194 34.56742 30.74325 38.92735
Pristimantis ocellatus Anura EN Arboreal 24.041569 34.35680 30.60015 38.51295
Pristimantis ocellatus Anura EN Arboreal 23.117262 34.22556 30.42767 38.33217
Pristimantis ocellatus Anura EN Arboreal 25.544805 34.57023 30.69657 38.64956
Pristimantis ocreatus Anura EN Fossorial 22.043563 35.29202 31.31724 39.94894
Pristimantis ocreatus Anura EN Fossorial 20.823650 35.11903 30.89443 39.49158
Pristimantis ocreatus Anura EN Fossorial 23.766620 35.53635 31.54024 40.23703
Pristimantis thymelensis Anura LC Ground-dwelling 22.193201 34.36157 30.41521 38.66041
Pristimantis thymelensis Anura LC Ground-dwelling 20.754678 34.15745 30.19280 38.48747
Pristimantis thymelensis Anura LC Ground-dwelling 24.152256 34.63957 30.71809 38.93798
Pristimantis pyrrhomerus Anura EN Ground-dwelling 23.075663 34.46938 30.59128 39.10195
Pristimantis pyrrhomerus Anura EN Ground-dwelling 21.392822 34.23294 30.38426 38.80185
Pristimantis pyrrhomerus Anura EN Ground-dwelling 25.301338 34.78210 30.90035 39.49896
Pristimantis olivaceus Anura LC Arboreal 20.163525 33.85363 29.61474 37.89987
Pristimantis olivaceus Anura LC Arboreal 19.157461 33.71311 29.50562 37.80115
Pristimantis olivaceus Anura LC Arboreal 21.412036 34.02801 29.74698 38.02924
Pristimantis orcesi Anura LC Arboreal 20.796214 33.95409 30.10365 37.97031
Pristimantis orcesi Anura LC Arboreal 18.725995 33.65575 29.87727 37.65150
Pristimantis orcesi Anura LC Arboreal 23.335059 34.31995 30.37950 38.30059
Pristimantis orcus Anura LC Arboreal 26.394729 34.73247 30.91893 38.86208
Pristimantis orcus Anura LC Arboreal 25.649257 34.62752 30.83093 38.77569
Pristimantis orcus Anura LC Arboreal 27.880927 34.94171 31.04341 39.07509
Pristimantis orestes Anura EN Ground-dwelling 23.407640 34.44677 30.31037 38.32028
Pristimantis orestes Anura EN Ground-dwelling 21.963850 34.23986 30.36910 38.42434
Pristimantis orestes Anura EN Ground-dwelling 25.659722 34.76953 30.52813 38.63238
Pristimantis ornatissimus Anura EN Arboreal 22.986312 34.39640 30.47824 38.79327
Pristimantis ornatissimus Anura EN Arboreal 21.456474 34.17837 30.29907 38.54959
Pristimantis ornatissimus Anura EN Arboreal 25.131200 34.70208 30.76016 39.17976
Pristimantis ornatus Anura EN Ground-dwelling 21.012652 34.04553 29.79993 37.93645
Pristimantis ornatus Anura EN Ground-dwelling 20.177954 33.92828 29.69219 37.80430
Pristimantis ornatus Anura EN Ground-dwelling 22.689323 34.28105 30.19901 38.37842
Pristimantis orpacobates Anura NT Arboreal 24.548500 34.52313 30.36128 38.78861
Pristimantis orpacobates Anura NT Arboreal 23.721586 34.40545 30.22770 38.63169
Pristimantis orpacobates Anura NT Arboreal 25.991336 34.72846 30.50634 39.06066
Pristimantis orphnolaimus Anura LC Arboreal 25.967437 34.69431 30.63732 38.66550
Pristimantis orphnolaimus Anura LC Arboreal 25.186814 34.58288 30.61755 38.62618
Pristimantis orphnolaimus Anura LC Arboreal 27.448762 34.90576 30.83480 38.90359
Pristimantis ortizi Anura DD Arboreal 22.043563 34.19019 30.18366 38.27268
Pristimantis ortizi Anura DD Arboreal 20.823650 34.01680 29.94421 37.96903
Pristimantis ortizi Anura DD Arboreal 23.766620 34.43510 30.27578 38.46485
Pristimantis padrecarlosi Anura DD Stream-dwelling 23.815844 33.77914 30.22827 38.11119
Pristimantis padrecarlosi Anura DD Stream-dwelling 22.972317 33.66246 30.17210 38.04758
Pristimantis padrecarlosi Anura DD Stream-dwelling 25.359876 33.99271 30.31425 38.23119
Pristimantis paisa Anura LC Stream-dwelling 21.402784 33.59859 29.43048 37.93010
Pristimantis paisa Anura LC Stream-dwelling 20.374610 33.45209 29.34507 37.78573
Pristimantis paisa Anura LC Stream-dwelling 23.162627 33.84935 29.43002 38.01461
Pristimantis pardalinus Anura EN Ground-dwelling 16.870590 33.53937 29.29957 38.05171
Pristimantis pardalinus Anura EN Ground-dwelling 16.060145 33.42370 28.97741 37.69456
Pristimantis pardalinus Anura EN Ground-dwelling 18.188627 33.72749 29.21945 38.01188
Pristimantis parectatus Anura EN Arboreal 22.376189 34.16972 30.12752 38.40210
Pristimantis parectatus Anura EN Arboreal 21.363649 34.02452 30.27209 38.53637
Pristimantis parectatus Anura EN Arboreal 24.075556 34.41341 30.27441 38.58730
Pristimantis parvillus Anura LC Arboreal 24.468017 34.63258 30.64556 38.78143
Pristimantis parvillus Anura LC Arboreal 23.238705 34.45911 30.46691 38.53681
Pristimantis parvillus Anura LC Arboreal 26.366107 34.90043 30.89079 39.03027
Pristimantis pastazensis Anura EN Arboreal 22.287150 34.19804 30.69408 38.26924
Pristimantis pastazensis Anura EN Arboreal 20.278491 33.91749 30.31851 37.92189
Pristimantis pastazensis Anura EN Arboreal 24.609385 34.52237 30.99593 38.59308
Pristimantis pataikos Anura DD Arboreal 21.422387 33.95593 30.19307 38.23142
Pristimantis pataikos Anura DD Arboreal 20.467645 33.82277 30.11283 38.10148
Pristimantis pataikos Anura DD Arboreal 23.163460 34.19876 30.41204 38.46836
Pristimantis paulodutrai Anura LC Arboreal 25.025055 34.54813 30.03651 38.25026
Pristimantis paulodutrai Anura LC Arboreal 24.123429 34.42204 29.86315 38.08401
Pristimantis paulodutrai Anura LC Arboreal 26.765543 34.79154 30.17833 38.41719
Pristimantis paululus Anura LC Ground-dwelling 24.484385 34.59796 30.60890 38.79128
Pristimantis paululus Anura LC Ground-dwelling 23.450924 34.45215 30.42056 38.53002
Pristimantis paululus Anura LC Ground-dwelling 26.181884 34.83747 30.46878 38.75170
Pristimantis pecki Anura DD Arboreal 24.034799 34.28297 30.04799 38.20254
Pristimantis pecki Anura DD Arboreal 22.952035 34.12918 29.92455 38.05651
Pristimantis pecki Anura DD Arboreal 25.885246 34.54579 30.37260 38.61899
Pristimantis pedimontanus Anura VU Ground-dwelling 25.359489 34.76958 30.74174 38.70321
Pristimantis pedimontanus Anura VU Ground-dwelling 24.472673 34.64383 30.66369 38.60313
Pristimantis pedimontanus Anura VU Ground-dwelling 26.961144 34.99670 31.17875 39.20772
Pristimantis penelopus Anura LC Arboreal 25.195923 34.59820 30.25441 38.31935
Pristimantis penelopus Anura LC Arboreal 24.440461 34.48989 30.22907 38.22670
Pristimantis penelopus Anura LC Arboreal 26.709090 34.81514 30.75441 38.93074
Pristimantis peraticus Anura LC Ground-dwelling 24.898747 34.75505 30.60958 38.86210
Pristimantis peraticus Anura LC Ground-dwelling 24.206488 34.65647 30.58354 38.76979
Pristimantis peraticus Anura LC Ground-dwelling 26.233951 34.94518 30.62741 38.91406
Pristimantis percnopterus Anura LC Arboreal 23.231951 34.23695 30.45286 38.69086
Pristimantis percnopterus Anura LC Arboreal 22.397080 34.11883 30.30006 38.54340
Pristimantis percnopterus Anura LC Arboreal 24.865708 34.46810 30.50065 38.79726
Pristimantis percultus Anura EN Arboreal 22.504554 34.09309 30.59031 38.47650
Pristimantis percultus Anura EN Arboreal 21.223948 33.91371 30.46839 38.31184
Pristimantis percultus Anura EN Arboreal 24.506837 34.37355 30.85041 38.79925
Pristimantis permixtus Anura LC Arboreal 23.652758 34.32760 30.68071 38.63267
Pristimantis permixtus Anura LC Arboreal 22.826373 34.20999 30.13598 38.08803
Pristimantis permixtus Anura LC Arboreal 25.175497 34.54430 30.84605 38.87180
Pristimantis uranobates Anura LC Stream-dwelling 22.801170 33.73971 29.60529 37.68907
Pristimantis uranobates Anura LC Stream-dwelling 21.907362 33.61462 29.46710 37.51181
Pristimantis uranobates Anura LC Stream-dwelling 24.391156 33.96222 29.69747 37.86207
Pristimantis peruvianus Anura LC Ground-dwelling 27.042358 34.90184 30.59501 39.00242
Pristimantis peruvianus Anura LC Ground-dwelling 26.276651 34.79599 30.46007 38.87875
Pristimantis peruvianus Anura LC Ground-dwelling 28.530492 35.10757 30.72647 39.20517
Pristimantis petersi Anura NT Arboreal 23.717477 34.51032 30.23417 38.65837
Pristimantis petersi Anura NT Arboreal 22.564346 34.34534 30.02379 38.33852
Pristimantis petersi Anura NT Arboreal 25.455238 34.75895 30.57360 39.08447
Pristimantis petrobardus Anura EN Arboreal 22.730668 34.23450 29.89613 37.89429
Pristimantis petrobardus Anura EN Arboreal 22.059360 34.13892 29.83249 37.79534
Pristimantis petrobardus Anura EN Arboreal 23.880819 34.39826 30.44148 38.46863
Pristimantis phalaroinguinis Anura DD Arboreal 24.352695 34.48256 30.06200 38.24328
Pristimantis phalaroinguinis Anura DD Arboreal 23.754925 34.39773 29.98938 38.14837
Pristimantis phalaroinguinis Anura DD Arboreal 25.398234 34.63093 30.10865 38.38447
Pristimantis phalarus Anura EN Arboreal 24.017258 34.32725 30.65230 39.00111
Pristimantis phalarus Anura EN Arboreal 23.300537 34.22594 30.54199 38.87409
Pristimantis phalarus Anura EN Arboreal 25.278806 34.50558 30.80950 39.24223
Pristimantis philipi Anura DD Arboreal 26.647145 34.81431 30.96382 38.94695
Pristimantis philipi Anura DD Arboreal 25.667294 34.67529 30.86664 38.78304
Pristimantis philipi Anura DD Arboreal 28.530719 35.08154 31.08154 39.15984
Pristimantis piceus Anura LC Ground-dwelling 23.406217 34.41760 30.40122 38.42720
Pristimantis piceus Anura LC Ground-dwelling 22.524869 34.29191 30.29611 38.28218
Pristimantis piceus Anura LC Ground-dwelling 24.960578 34.63926 30.50825 38.59390
Pristimantis pinguis Anura EN Ground-dwelling 22.168477 34.27288 30.21754 38.41039
Pristimantis pinguis Anura EN Ground-dwelling 21.462046 34.17178 30.15476 38.29816
Pristimantis pinguis Anura EN Ground-dwelling 23.378595 34.44606 30.32340 38.64195
Pristimantis pirrensis Anura NT Arboreal 26.181906 34.72346 30.74371 38.76180
Pristimantis pirrensis Anura NT Arboreal 25.505355 34.62798 30.61187 38.58701
Pristimantis pirrensis Anura NT Arboreal 27.570562 34.91942 30.93195 38.98224
Pristimantis platychilus Anura VU Arboreal 24.866990 34.56659 30.51659 38.56399
Pristimantis platychilus Anura VU Arboreal 23.990652 34.44002 30.45227 38.45941
Pristimantis platychilus Anura VU Arboreal 26.289028 34.77199 30.70291 38.79743
Pristimantis pleurostriatus Anura DD Arboreal 25.445939 34.49760 30.50051 38.61946
Pristimantis pleurostriatus Anura DD Arboreal 24.543351 34.37050 30.39141 38.45118
Pristimantis pleurostriatus Anura DD Arboreal 27.031556 34.72087 30.52930 38.74984
Pristimantis polemistes Anura CR Stream-dwelling 26.219010 34.32193 29.98295 38.60086
Pristimantis polemistes Anura CR Stream-dwelling 25.544335 34.22664 29.91224 38.48409
Pristimantis polemistes Anura CR Stream-dwelling 27.553766 34.51046 30.18256 38.88302
Pristimantis polychrus Anura VU Arboreal 24.689340 34.53317 30.20323 38.20694
Pristimantis polychrus Anura VU Arboreal 23.973000 34.43146 30.11748 38.08559
Pristimantis polychrus Anura VU Arboreal 26.055510 34.72715 30.10776 38.17813
Pristimantis prolatus Anura LC Arboreal 23.018716 34.29329 30.00233 38.25205
Pristimantis prolatus Anura LC Arboreal 21.678176 34.10247 30.19625 38.46009
Pristimantis prolatus Anura LC Arboreal 25.024877 34.57885 30.21856 38.49449
Pristimantis proserpens Anura VU Arboreal 22.988492 34.22544 30.09475 38.25631
Pristimantis proserpens Anura VU Arboreal 21.711177 34.04813 29.95593 38.02925
Pristimantis proserpens Anura VU Arboreal 24.998861 34.50452 30.55037 38.76587
Pristimantis pruinatus Anura VU Arboreal 26.904248 34.85653 30.71073 39.27012
Pristimantis pruinatus Anura VU Arboreal 26.184749 34.75487 30.55993 39.03776
Pristimantis pruinatus Anura VU Arboreal 28.223952 35.04301 30.96457 39.61818
Pristimantis pseudoacuminatus Anura LC Ground-dwelling 25.455232 34.69319 30.82662 39.13617
Pristimantis pseudoacuminatus Anura LC Ground-dwelling 24.624372 34.57675 30.77631 39.09797
Pristimantis pseudoacuminatus Anura LC Ground-dwelling 26.961897 34.90433 30.94366 39.31593
Pristimantis pteridophilus Anura EN Arboreal 20.180939 33.77744 29.39868 37.72890
Pristimantis pteridophilus Anura EN Arboreal 18.072574 33.47356 29.26010 37.47146
Pristimantis pteridophilus Anura EN Arboreal 22.820081 34.15782 29.73305 38.21246
Pristimantis ptochus Anura EN Arboreal 24.179450 34.35397 30.29406 38.32439
Pristimantis ptochus Anura EN Arboreal 23.449222 34.25257 30.52122 38.54550
Pristimantis ptochus Anura EN Arboreal 25.556092 34.54513 30.48800 38.58132
Pristimantis zophus Anura NT Arboreal 24.635791 34.39274 29.93377 38.10346
Pristimantis zophus Anura NT Arboreal 23.745595 34.26829 29.85457 37.93641
Pristimantis zophus Anura NT Arboreal 26.161725 34.60606 30.20449 38.41575
Pristimantis pugnax Anura CR Stream-dwelling 23.953287 33.83668 30.02209 38.23245
Pristimantis pugnax Anura CR Stream-dwelling 23.036761 33.70795 29.79125 37.99656
Pristimantis pugnax Anura CR Stream-dwelling 25.504116 34.05450 30.15669 38.33717
Pristimantis quantus Anura EN Arboreal 24.017258 34.39314 30.41071 38.77348
Pristimantis quantus Anura EN Arboreal 23.300537 34.29138 29.78096 38.09376
Pristimantis quantus Anura EN Arboreal 25.278806 34.57226 30.55175 39.00522
Pristimantis racemus Anura VU Arboreal 23.602394 34.41398 30.38368 38.49462
Pristimantis racemus Anura VU Arboreal 22.841030 34.30546 30.30102 38.38489
Pristimantis racemus Anura VU Arboreal 25.082707 34.62498 30.35464 38.53310
Pristimantis ramagii Anura LC Ground-dwelling 25.279521 34.68520 30.66616 38.74829
Pristimantis ramagii Anura LC Ground-dwelling 24.365008 34.55383 30.55051 38.64179
Pristimantis ramagii Anura LC Ground-dwelling 26.869239 34.91356 30.57951 38.73879
Pristimantis repens Anura EN Ground-dwelling 24.280282 34.42544 30.46544 38.39757
Pristimantis repens Anura EN Ground-dwelling 23.402296 34.30236 30.34918 38.24012
Pristimantis repens Anura EN Ground-dwelling 25.677250 34.62127 30.57452 38.54863
Pristimantis restrepoi Anura LC Ground-dwelling 24.689340 34.59902 30.73549 38.81060
Pristimantis restrepoi Anura LC Ground-dwelling 23.973000 34.49878 30.38497 38.43233
Pristimantis restrepoi Anura LC Ground-dwelling 26.055510 34.79019 30.56827 38.73993
Pristimantis reticulatus Anura DD Arboreal 26.826561 34.78684 30.96072 38.87379
Pristimantis reticulatus Anura DD Arboreal 26.155457 34.69187 30.86852 38.78104
Pristimantis reticulatus Anura DD Arboreal 28.382836 35.00709 31.10636 39.09825
Pristimantis rhabdocnemus Anura LC Arboreal 21.012652 33.94310 29.99740 38.12133
Pristimantis rhabdocnemus Anura LC Arboreal 20.177954 33.82743 29.88902 38.01451
Pristimantis rhabdocnemus Anura LC Arboreal 22.689323 34.17547 30.03665 38.22977
Pristimantis rhabdolaemus Anura LC Arboreal 17.777785 33.47035 29.66979 37.63922
Pristimantis rhabdolaemus Anura LC Arboreal 16.259792 33.25322 29.50233 37.49033
Pristimantis rhabdolaemus Anura LC Arboreal 19.192063 33.67265 29.87803 37.84021
Pristimantis rhodoplichus Anura EN Ground-dwelling 23.179600 34.39572 30.36450 38.55617
Pristimantis rhodoplichus Anura EN Ground-dwelling 22.448026 34.29383 30.28817 38.44806
Pristimantis rhodoplichus Anura EN Ground-dwelling 24.714297 34.60944 30.53854 38.79468
Pristimantis rhodostichus Anura LC Arboreal 23.740790 34.29955 30.11154 38.08977
Pristimantis rhodostichus Anura LC Arboreal 22.922245 34.18471 30.07184 37.99095
Pristimantis rhodostichus Anura LC Arboreal 25.347201 34.52492 30.15900 38.22631
Pristimantis ridens Anura LC Arboreal 26.540936 34.79496 30.83128 39.45434
Pristimantis ridens Anura LC Arboreal 25.824582 34.69246 30.76326 39.35034
Pristimantis ridens Anura LC Arboreal 27.958067 34.99771 31.00151 39.67983
Pristimantis rivasi Anura VU Ground-dwelling 26.539014 34.97459 31.03620 39.56106
Pristimantis rivasi Anura VU Ground-dwelling 25.711502 34.85747 30.77094 39.28502
Pristimantis rivasi Anura VU Ground-dwelling 28.229537 35.21387 31.20386 39.76785
Pristimantis riveroi Anura DD Arboreal 26.678151 34.69771 30.34882 38.72000
Pristimantis riveroi Anura DD Arboreal 25.963270 34.59656 30.26886 38.63275
Pristimantis riveroi Anura DD Arboreal 28.180786 34.91031 30.46560 38.90339
Pristimantis versicolor Anura LC Arboreal 23.601658 34.69973 31.37531 38.10240
Pristimantis versicolor Anura LC Arboreal 22.518885 34.54940 31.17271 37.84960
Pristimantis versicolor Anura LC Arboreal 25.475904 34.95994 31.65795 38.42990
Pristimantis rosadoi Anura VU Arboreal 23.846699 34.39717 30.15492 38.34278
Pristimantis rosadoi Anura VU Arboreal 22.628820 34.22333 30.00534 38.22209
Pristimantis rosadoi Anura VU Arboreal 25.717057 34.66414 30.38025 38.57495
Pristimantis roseus Anura LC Stream-dwelling 25.853817 34.24534 30.31894 38.34259
Pristimantis roseus Anura LC Stream-dwelling 25.158341 34.14535 30.11174 38.09268
Pristimantis roseus Anura LC Stream-dwelling 27.202289 34.43921 30.40491 38.48310
Pristimantis rozei Anura DD Arboreal 26.826561 34.70052 30.85507 39.45635
Pristimantis rozei Anura DD Arboreal 26.155457 34.60837 30.76902 39.35733
Pristimantis rozei Anura DD Arboreal 28.382836 34.91422 30.78231 39.47520
Pristimantis rubicundus Anura EN Arboreal 22.772920 34.14710 29.38923 38.01148
Pristimantis rubicundus Anura EN Arboreal 21.184011 33.92083 29.11520 37.67063
Pristimantis rubicundus Anura EN Arboreal 24.943916 34.45626 29.74799 38.37341
Pristimantis ruedai Anura VU Stream-dwelling 24.689340 34.02234 29.77282 37.90168
Pristimantis ruedai Anura VU Stream-dwelling 23.973000 33.92137 29.68894 37.80133
Pristimantis ruedai Anura VU Stream-dwelling 26.055510 34.21492 29.92797 38.16374
Pristimantis rufioculis Anura VU Arboreal 23.252891 34.25282 30.50991 38.81349
Pristimantis rufioculis Anura VU Arboreal 22.376702 34.12993 30.42177 38.69024
Pristimantis rufioculis Anura VU Arboreal 24.926272 34.48752 30.69031 39.04095
Pristimantis ruidus Anura DD Arboreal 26.647145 34.67555 30.52926 39.05495
Pristimantis ruidus Anura DD Arboreal 25.667294 34.53589 30.36030 38.83150
Pristimantis ruidus Anura DD Arboreal 28.530719 34.94404 30.66348 39.27898
Pristimantis ruthveni Anura EN Ground-dwelling 26.777894 35.01312 30.85357 39.00011
Pristimantis ruthveni Anura EN Ground-dwelling 25.908244 34.88920 30.75310 38.87377
Pristimantis ruthveni Anura EN Ground-dwelling 28.696471 35.28649 31.09344 39.33756
Pristimantis saltissimus Anura LC Arboreal 26.634291 34.63165 30.91136 38.80913
Pristimantis saltissimus Anura LC Arboreal 25.965013 34.53959 30.83746 38.70259
Pristimantis saltissimus Anura LC Arboreal 28.137979 34.83848 30.92807 38.88781
Pristimantis samaipatae Anura LC Arboreal 22.189247 34.10258 30.43253 38.28911
Pristimantis samaipatae Anura LC Arboreal 21.309440 33.97874 30.29268 38.13336
Pristimantis samaipatae Anura LC Arboreal 23.466538 34.28237 30.59788 38.51514
Pristimantis sanctaemartae Anura NT Arboreal 26.777894 34.71721 30.68242 38.75435
Pristimantis sanctaemartae Anura NT Arboreal 25.908244 34.59184 30.51307 38.58830
Pristimantis sanctaemartae Anura NT Arboreal 28.696471 34.99382 31.06715 39.19182
Pristimantis sanguineus Anura NT Arboreal 24.897171 34.55811 30.31941 38.52809
Pristimantis sanguineus Anura NT Arboreal 24.175650 34.45444 30.15428 38.37968
Pristimantis sanguineus Anura NT Arboreal 26.286305 34.75771 30.52127 38.76797
Pristimantis satagius Anura EN Ground-dwelling 26.219010 34.81406 30.67477 39.05378
Pristimantis satagius Anura EN Ground-dwelling 25.544335 34.71822 30.56741 38.94230
Pristimantis satagius Anura EN Ground-dwelling 27.553766 35.00365 30.88136 39.27976
Pristimantis schultei Anura VU Arboreal 21.993893 34.11854 29.94031 38.37519
Pristimantis schultei Anura VU Arboreal 21.154915 34.00115 29.60092 38.00721
Pristimantis schultei Anura VU Arboreal 23.526206 34.33293 29.77347 38.20407
Pristimantis scitulus Anura DD Arboreal 15.448306 33.06912 29.24894 36.88340
Pristimantis scitulus Anura DD Arboreal 14.520308 32.93823 29.07454 36.72389
Pristimantis scitulus Anura DD Arboreal 16.818757 33.26241 29.40016 37.08311
Pristimantis scoloblepharus Anura EN Stream-dwelling 22.376189 33.56620 29.77124 37.85653
Pristimantis scoloblepharus Anura EN Stream-dwelling 21.363649 33.42199 29.67678 37.72641
Pristimantis scoloblepharus Anura EN Stream-dwelling 24.075556 33.80822 29.87876 38.07493
Pristimantis scolodiscus Anura VU Arboreal 23.522886 34.38610 30.27264 38.42640
Pristimantis scolodiscus Anura VU Arboreal 22.505271 34.24066 30.13458 38.22417
Pristimantis scolodiscus Anura VU Arboreal 25.146421 34.61814 30.50699 38.75757
Pristimantis scopaeus Anura LC Arboreal 22.217802 34.07517 29.96032 37.97356
Pristimantis scopaeus Anura LC Arboreal 21.369450 33.95433 29.85548 37.88903
Pristimantis scopaeus Anura LC Arboreal 23.805985 34.30139 30.14349 38.23488
Pristimantis seorsus Anura DD Arboreal 20.410419 33.89434 29.66537 38.30457
Pristimantis seorsus Anura DD Arboreal 19.911299 33.82312 29.59476 38.24292
Pristimantis seorsus Anura DD Arboreal 21.271727 34.01725 29.77908 38.40178
Pristimantis serendipitus Anura EN Ground-dwelling 22.164010 34.25262 30.03470 38.33026
Pristimantis serendipitus Anura EN Ground-dwelling 21.259620 34.12251 29.70907 37.99730
Pristimantis serendipitus Anura EN Ground-dwelling 23.969227 34.51232 30.22962 38.52231
Pristimantis signifer Anura CR Ground-dwelling 24.017258 34.51535 30.88252 39.01830
Pristimantis signifer Anura CR Ground-dwelling 23.300537 34.41309 30.73171 38.83010
Pristimantis signifer Anura CR Ground-dwelling 25.278806 34.69534 31.01368 39.21855
Pristimantis silverstonei Anura VU Arboreal 24.854555 34.59028 29.98962 38.78604
Pristimantis silverstonei Anura VU Arboreal 24.125762 34.48682 29.88672 38.68078
Pristimantis silverstonei Anura VU Arboreal 26.185464 34.77922 30.16909 39.00070
Pristimantis simonsii Anura VU Ground-dwelling 22.168477 34.17159 30.08651 37.97722
Pristimantis simonsii Anura VU Ground-dwelling 21.462046 34.07206 30.10667 37.94228
Pristimantis simonsii Anura VU Ground-dwelling 23.378595 34.34209 30.25109 38.17614
Pristimantis simoteriscus Anura EN Ground-dwelling 21.124264 34.09391 30.18220 38.43867
Pristimantis simoteriscus Anura EN Ground-dwelling 20.218761 33.96724 30.07060 38.32253
Pristimantis simoteriscus Anura EN Ground-dwelling 22.820677 34.33121 30.38842 38.68514
Pristimantis siopelus Anura VU Arboreal 24.617070 34.38751 30.51177 38.55608
Pristimantis siopelus Anura VU Arboreal 23.951937 34.29194 30.42459 38.46126
Pristimantis siopelus Anura VU Arboreal 25.851409 34.56488 30.62403 38.73206
Pristimantis skydmainos Anura LC Arboreal 23.826240 34.34155 29.97730 38.32720
Pristimantis skydmainos Anura LC Arboreal 23.070129 34.23511 29.90884 38.23237
Pristimantis skydmainos Anura LC Arboreal 25.060167 34.51524 30.16482 38.50770
Pristimantis sobetes Anura EN Arboreal 19.805326 33.75827 29.69650 37.94926
Pristimantis sobetes Anura EN Arboreal 17.198230 33.38167 29.39324 37.48939
Pristimantis sobetes Anura EN Arboreal 22.861501 34.19975 30.29575 38.60203
Pristimantis spectabilis Anura DD Arboreal 21.012652 34.01870 29.71398 38.07031
Pristimantis spectabilis Anura DD Arboreal 20.177954 33.90064 29.46455 37.80358
Pristimantis spectabilis Anura DD Arboreal 22.689323 34.25585 30.29025 38.65953
Pristimantis spilogaster Anura CR Arboreal 24.390020 34.44993 30.15595 38.35259
Pristimantis spilogaster Anura CR Arboreal 23.746759 34.35752 30.02759 38.22518
Pristimantis spilogaster Anura CR Arboreal 25.828703 34.65662 30.43950 38.66469
Pristimantis spinosus Anura EN Arboreal 23.049225 34.29174 30.04519 38.08655
Pristimantis spinosus Anura EN Arboreal 21.493692 34.06955 29.72523 37.71044
Pristimantis spinosus Anura EN Arboreal 25.325715 34.61691 30.27834 38.40663
Pristimantis stenodiscus Anura CR Ground-dwelling 26.826561 34.88978 31.01114 39.36350
Pristimantis stenodiscus Anura CR Ground-dwelling 26.155457 34.79429 30.80471 39.12907
Pristimantis stenodiscus Anura CR Ground-dwelling 28.382836 35.11123 30.51386 39.05048
Pristimantis sternothylax Anura LC Arboreal 23.991462 34.36093 30.33436 38.49140
Pristimantis sternothylax Anura LC Arboreal 23.218412 34.25131 30.27944 38.36013
Pristimantis sternothylax Anura LC Arboreal 25.472846 34.57101 30.75188 38.99812
Pristimantis stictoboubonus Anura DD Arboreal 22.538913 34.30476 30.75106 38.44538
Pristimantis stictoboubonus Anura DD Arboreal 21.736625 34.19007 30.72094 38.39870
Pristimantis stictoboubonus Anura DD Arboreal 23.802966 34.48546 30.83771 38.53368
Pristimantis stictogaster Anura LC Ground-dwelling 21.012652 34.24205 29.64950 37.94381
Pristimantis stictogaster Anura LC Ground-dwelling 20.177954 34.12378 30.07291 38.36259
Pristimantis stictogaster Anura LC Ground-dwelling 22.689323 34.47963 30.27207 38.59533
Pristimantis suetus Anura VU Arboreal 23.687173 34.33051 30.28114 38.04581
Pristimantis suetus Anura VU Arboreal 22.753999 34.19845 30.19573 38.04535
Pristimantis suetus Anura VU Arboreal 25.296937 34.55834 30.52421 38.22694
Pristimantis sulculus Anura VU Arboreal 24.617070 34.54260 30.54749 39.03408
Pristimantis sulculus Anura VU Arboreal 23.951937 34.44783 30.48569 38.89857
Pristimantis sulculus Anura VU Arboreal 25.851409 34.71848 30.59753 39.14046
Pristimantis supernatis Anura VU Stream-dwelling 23.359399 33.70523 30.12285 38.13583
Pristimantis supernatis Anura VU Stream-dwelling 22.255668 33.54824 30.01927 37.99804
Pristimantis supernatis Anura VU Stream-dwelling 24.947702 33.93116 30.11180 38.23131
Pristimantis susaguae Anura EN Arboreal 23.382173 34.24749 30.10326 38.46039
Pristimantis susaguae Anura EN Arboreal 22.612540 34.13690 30.25681 38.52700
Pristimantis susaguae Anura EN Arboreal 25.028162 34.48400 30.48681 38.89485
Pristimantis taciturnus Anura DD Stream-dwelling 22.833468 33.69218 30.00329 38.26455
Pristimantis taciturnus Anura DD Stream-dwelling 21.394430 33.48479 29.75483 37.97914
Pristimantis taciturnus Anura DD Stream-dwelling 24.669687 33.95681 30.09299 38.37349
Pristimantis yukpa Anura LC Ground-dwelling 26.160242 36.18247 33.29325 39.41270
Pristimantis yukpa Anura LC Ground-dwelling 25.324144 36.06662 33.27491 39.36257
Pristimantis yukpa Anura LC Ground-dwelling 27.881412 36.42098 33.44029 39.71564
Pristimantis tamsitti Anura VU Arboreal 24.905302 34.57550 30.60639 38.56853
Pristimantis tamsitti Anura VU Arboreal 24.122920 34.46636 30.57335 38.52288
Pristimantis tamsitti Anura VU Arboreal 26.352438 34.77736 30.86919 38.84613
Pristimantis tantanti Anura LC Arboreal 22.046556 34.10983 30.01775 38.28057
Pristimantis tantanti Anura LC Arboreal 21.477821 34.02818 29.91377 38.17473
Pristimantis tantanti Anura LC Arboreal 23.006501 34.24763 29.97175 38.28696
Pristimantis tanyrhynchus Anura DD Arboreal 20.410419 34.00151 29.86293 37.90646
Pristimantis tanyrhynchus Anura DD Arboreal 19.911299 33.92868 29.79898 37.83847
Pristimantis tanyrhynchus Anura DD Arboreal 21.271727 34.12718 29.95548 37.95717
Pristimantis tayrona Anura NT Arboreal 26.777894 34.86142 30.83785 39.40800
Pristimantis tayrona Anura NT Arboreal 25.908244 34.73806 30.59829 39.14811
Pristimantis tayrona Anura NT Arboreal 28.696471 35.13358 31.11814 39.79707
Pristimantis telefericus Anura CR Ground-dwelling 25.445939 34.80473 30.78434 38.73013
Pristimantis telefericus Anura CR Ground-dwelling 24.543351 34.67684 30.50827 38.39995
Pristimantis telefericus Anura CR Ground-dwelling 27.031556 35.02940 30.84992 38.89265
Pristimantis tenebrionis Anura EN Arboreal 24.046640 34.42296 30.17896 38.33614
Pristimantis tenebrionis Anura EN Arboreal 22.875889 34.25598 29.98878 38.13109
Pristimantis tenebrionis Anura EN Arboreal 25.887767 34.68555 30.41995 38.68253
Pristimantis thymalopsoides Anura EN Arboreal 19.805326 33.81550 29.55132 37.55566
Pristimantis thymalopsoides Anura EN Arboreal 17.198230 33.44125 29.38111 37.43875
Pristimantis thymalopsoides Anura EN Arboreal 22.861501 34.25423 30.32797 38.40327
Pristimantis torrenticola Anura CR Arboreal 22.792552 34.25139 30.33630 38.19076
Pristimantis torrenticola Anura CR Arboreal 22.040989 34.14474 30.23435 38.05675
Pristimantis torrenticola Anura CR Arboreal 24.304586 34.46596 30.51995 38.52689
Pristimantis tribulosus Anura CR Arboreal 22.792552 34.19850 30.21421 38.43425
Pristimantis tribulosus Anura CR Arboreal 22.040989 34.09217 30.37805 38.55959
Pristimantis tribulosus Anura CR Arboreal 24.304586 34.41241 30.50553 38.81172
Pristimantis tubernasus Anura DD Arboreal 25.081242 34.57362 30.25876 38.52579
Pristimantis tubernasus Anura DD Arboreal 24.199220 34.44812 30.16742 38.37627
Pristimantis tubernasus Anura DD Arboreal 26.635088 34.79471 30.46134 38.81944
Pristimantis turik Anura DD Arboreal 27.517901 34.93568 31.24200 39.36492
Pristimantis turik Anura DD Arboreal 26.477539 34.78610 31.10099 39.20042
Pristimantis turik Anura DD Arboreal 29.383272 35.20389 31.56970 39.87386
Pristimantis turpinorum Anura DD Arboreal 26.614467 34.79974 30.77896 39.53558
Pristimantis turpinorum Anura DD Arboreal 26.237296 34.74665 30.67987 39.42946
Pristimantis turpinorum Anura DD Arboreal 27.226432 34.88588 30.85497 39.65789
Pristimantis turumiquirensis Anura CR Ground-dwelling 26.860678 34.88288 30.74275 39.30457
Pristimantis turumiquirensis Anura CR Ground-dwelling 26.190430 34.78790 30.72987 39.21399
Pristimantis turumiquirensis Anura CR Ground-dwelling 28.431470 35.10549 31.09232 39.72632
Pristimantis uisae Anura VU Arboreal 23.113019 34.18369 30.21515 38.08645
Pristimantis uisae Anura VU Arboreal 22.284642 34.06736 30.17665 37.99086
Pristimantis uisae Anura VU Arboreal 24.763755 34.41549 30.41987 38.35410
Pristimantis urichi Anura LC Ground-dwelling 26.423148 35.00823 30.58936 38.91148
Pristimantis urichi Anura LC Ground-dwelling 25.953678 34.94059 30.49373 38.82322
Pristimantis urichi Anura LC Ground-dwelling 27.165048 35.11513 30.69755 39.07122
Pristimantis variabilis Anura LC Arboreal 26.769227 34.77124 30.30692 38.69254
Pristimantis variabilis Anura LC Arboreal 26.005201 34.66243 30.39181 38.70488
Pristimantis variabilis Anura LC Arboreal 28.250858 34.98226 30.77757 39.26434
Pristimantis veletis Anura CR Arboreal 22.792552 34.22849 29.91012 38.08947
Pristimantis veletis Anura CR Arboreal 22.040989 34.12102 30.12946 38.32230
Pristimantis veletis Anura CR Arboreal 24.304586 34.44469 30.20364 38.43577
Pristimantis ventriguttatus Anura DD Arboreal 24.352695 34.51875 30.48100 38.64639
Pristimantis ventriguttatus Anura DD Arboreal 23.754925 34.43374 30.57696 38.71154
Pristimantis ventriguttatus Anura DD Arboreal 25.398234 34.66745 30.62725 38.81609
Pristimantis ventrimarmoratus Anura LC Ground-dwelling 23.742766 34.44005 29.81031 38.07765
Pristimantis ventrimarmoratus Anura LC Ground-dwelling 22.973157 34.32980 29.73343 38.01583
Pristimantis ventrimarmoratus Anura LC Ground-dwelling 25.112705 34.63631 29.91656 38.27475
Pristimantis verecundus Anura NT Arboreal 22.483509 34.20830 29.94579 38.58426
Pristimantis verecundus Anura NT Arboreal 21.107539 34.01300 30.24879 38.82320
Pristimantis verecundus Anura NT Arboreal 24.413477 34.48222 30.20587 38.93408
Pristimantis vicarius Anura NT Ground-dwelling 23.901928 34.47603 30.90934 39.07822
Pristimantis vicarius Anura NT Ground-dwelling 22.941316 34.34299 30.80168 38.96813
Pristimantis vicarius Anura NT Ground-dwelling 25.418278 34.68602 30.98579 39.19366
Pristimantis vidua Anura EN Ground-dwelling 21.252659 34.16888 30.16416 38.13695
Pristimantis vidua Anura EN Ground-dwelling 19.420658 33.91093 30.01141 37.91601
Pristimantis vidua Anura EN Ground-dwelling 23.758706 34.52173 30.34277 38.49399
Pristimantis viejas Anura LC Ground-dwelling 25.102723 34.63685 30.97893 39.00940
Pristimantis viejas Anura LC Ground-dwelling 24.352081 34.53137 30.96522 38.96578
Pristimantis viejas Anura LC Ground-dwelling 26.547289 34.83985 30.94932 39.02539
Pristimantis vilarsi Anura LC Ground-dwelling 27.561659 35.00649 30.95930 39.50424
Pristimantis vilarsi Anura LC Ground-dwelling 26.828745 34.90332 30.84470 39.39315
Pristimantis vilarsi Anura LC Ground-dwelling 29.111961 35.22474 30.73686 39.41390
Pristimantis vilcabambae Anura DD Arboreal 20.410419 34.08420 30.24589 38.02906
Pristimantis vilcabambae Anura DD Arboreal 19.911299 34.01357 30.24642 37.98019
Pristimantis vilcabambae Anura DD Arboreal 21.271727 34.20608 30.09961 37.95432
Pristimantis vinhai Anura LC Ground-dwelling 25.013166 34.70152 30.46097 38.44564
Pristimantis vinhai Anura LC Ground-dwelling 24.113377 34.57277 30.24082 38.24880
Pristimantis vinhai Anura LC Ground-dwelling 26.763900 34.95203 30.84711 38.87896
Pristimantis viridicans Anura EN Ground-dwelling 24.416317 34.66834 30.56949 38.59543
Pristimantis viridicans Anura EN Ground-dwelling 23.472758 34.53328 30.31204 38.28002
Pristimantis viridicans Anura EN Ground-dwelling 25.867448 34.87604 30.68045 38.75255
Pristimantis viridis Anura EN Arboreal 25.973775 34.57647 30.57911 38.85089
Pristimantis viridis Anura EN Arboreal 25.275238 34.47730 30.50838 38.74352
Pristimantis viridis Anura EN Arboreal 27.319325 34.76750 30.74090 39.06340
Pristimantis wagteri Anura EN Ground-dwelling 21.823777 34.31717 30.36260 38.09722
Pristimantis wagteri Anura EN Ground-dwelling 21.050210 34.20746 30.46802 38.11695
Pristimantis wagteri Anura EN Ground-dwelling 23.083185 34.49578 30.47096 38.23430
Pristimantis waoranii Anura LC Arboreal 25.691768 34.62690 30.26552 39.06688
Pristimantis waoranii Anura LC Arboreal 24.948293 34.52068 30.16051 38.97950
Pristimantis waoranii Anura LC Arboreal 27.093538 34.82716 30.34424 39.24732
Pristimantis wiensi Anura DD Arboreal 22.602751 34.07540 29.81849 38.03841
Pristimantis wiensi Anura DD Arboreal 21.868814 33.97195 29.70320 37.93739
Pristimantis wiensi Anura DD Arboreal 24.173626 34.29681 30.15771 38.39843
Pristimantis xeniolum Anura VU Arboreal 24.017258 34.41892 29.94884 38.18726
Pristimantis xeniolum Anura VU Arboreal 23.300537 34.31756 30.03761 38.24179
Pristimantis xeniolum Anura VU Arboreal 25.278806 34.59733 30.10929 38.41818
Pristimantis xestus Anura VU Arboreal 25.728540 34.65477 30.80504 39.21438
Pristimantis xestus Anura VU Arboreal 25.006141 34.55331 30.72725 39.09878
Pristimantis xestus Anura VU Arboreal 27.084885 34.84526 30.73795 39.20036
Pristimantis xylochobates Anura CR Arboreal 24.017258 34.42673 30.12215 38.34542
Pristimantis xylochobates Anura CR Arboreal 23.300537 34.32366 30.10968 38.28091
Pristimantis xylochobates Anura CR Arboreal 25.278806 34.60816 30.31155 38.60251
Pristimantis yaviensis Anura NT Ground-dwelling 26.831723 34.85930 30.34645 38.40694
Pristimantis yaviensis Anura NT Ground-dwelling 26.139692 34.76321 30.40246 38.43624
Pristimantis yaviensis Anura NT Ground-dwelling 28.163382 35.04422 30.45564 38.56199
Pristimantis yustizi Anura VU Arboreal 25.251915 34.62936 30.70627 38.56915
Pristimantis yustizi Anura VU Arboreal 24.328467 34.49679 30.48474 38.32433
Pristimantis yustizi Anura VU Arboreal 26.880536 34.86317 30.90853 38.88983
Pristimantis zeuctotylus Anura LC Ground-dwelling 27.356662 34.92971 30.47820 39.12594
Pristimantis zeuctotylus Anura LC Ground-dwelling 26.725375 34.84059 30.41710 39.01846
Pristimantis zeuctotylus Anura LC Ground-dwelling 28.828048 35.13743 30.57234 39.31522
Pristimantis zimmermanae Anura LC Ground-dwelling 28.244707 35.22480 30.74010 39.14604
Pristimantis zimmermanae Anura LC Ground-dwelling 27.568607 35.12851 30.75287 39.09968
Pristimantis zimmermanae Anura LC Ground-dwelling 29.906803 35.46151 30.92311 39.47371
Pristimantis zoilae Anura EN Arboreal 23.943495 34.45789 29.95713 38.22180
Pristimantis zoilae Anura EN Arboreal 22.852655 34.30365 30.01600 38.23460
Pristimantis zoilae Anura EN Arboreal 25.503091 34.67840 30.36423 38.67594
Dischidodactylus colonnelloi Anura NT Ground-dwelling 25.661020 33.45911 29.01256 37.24329
Dischidodactylus colonnelloi Anura NT Ground-dwelling 25.001401 33.36355 28.88907 37.16063
Dischidodactylus colonnelloi Anura NT Ground-dwelling 27.238038 33.68757 29.28460 37.46413
Dischidodactylus duidensis Anura NT Ground-dwelling 25.661020 33.58699 29.79250 37.88674
Dischidodactylus duidensis Anura NT Ground-dwelling 25.001401 33.49229 29.71463 37.77422
Dischidodactylus duidensis Anura NT Ground-dwelling 27.238038 33.81341 29.97584 38.19527
Geobatrachus walkeri Anura EN Ground-dwelling 26.777894 33.66340 29.58802 38.02865
Geobatrachus walkeri Anura EN Ground-dwelling 25.908244 33.53923 29.47989 37.84647
Geobatrachus walkeri Anura EN Ground-dwelling 28.696471 33.93732 29.82657 38.43059
Niceforonia adenobrachia Anura EN Ground-dwelling 21.124264 32.89168 28.94523 37.33235
Niceforonia adenobrachia Anura EN Ground-dwelling 20.218761 32.76219 28.30719 36.69328
Niceforonia adenobrachia Anura EN Ground-dwelling 22.820677 33.13428 29.29922 37.65399
Niceforonia nana Anura VU Ground-dwelling 23.203191 33.29346 29.20981 37.30457
Niceforonia nana Anura VU Ground-dwelling 22.400613 33.17744 29.09923 37.20074
Niceforonia nana Anura VU Ground-dwelling 24.891970 33.53758 29.42861 37.62428
Strabomantis anatipes Anura VU Stream-dwelling 24.274031 32.70113 28.11323 36.77843
Strabomantis anatipes Anura VU Stream-dwelling 23.341886 32.56812 28.01285 36.63297
Strabomantis anatipes Anura VU Stream-dwelling 25.765650 32.91397 28.13319 36.86982
Strabomantis ingeri Anura VU Ground-dwelling 23.330647 33.21560 29.15821 37.57990
Strabomantis ingeri Anura VU Ground-dwelling 22.500624 33.09568 29.04391 37.44383
Strabomantis ingeri Anura VU Ground-dwelling 24.914615 33.44443 29.27547 37.75941
Strabomantis cheiroplethus Anura EN Stream-dwelling 25.427727 32.93907 28.53982 37.17622
Strabomantis cheiroplethus Anura EN Stream-dwelling 24.711264 32.83478 28.62068 37.17767
Strabomantis cheiroplethus Anura EN Stream-dwelling 26.717328 33.12677 29.02809 37.70430
Strabomantis anomalus Anura LC Stream-dwelling 25.149973 32.81412 28.36194 37.37168
Strabomantis anomalus Anura LC Stream-dwelling 24.349873 32.70067 28.28241 37.25638
Strabomantis anomalus Anura LC Stream-dwelling 26.607868 33.02083 28.40553 37.45721
Strabomantis bufoniformis Anura EN Stream-dwelling 25.996004 32.99830 28.75069 37.49524
Strabomantis bufoniformis Anura EN Stream-dwelling 25.302269 32.89747 28.64358 37.38840
Strabomantis bufoniformis Anura EN Stream-dwelling 27.403180 33.20282 28.92137 37.72000
Strabomantis cadenai Anura CR Ground-dwelling 26.219010 33.69336 28.98881 37.97030
Strabomantis cadenai Anura CR Ground-dwelling 25.544335 33.59587 28.57837 37.53632
Strabomantis cadenai Anura CR Ground-dwelling 27.553766 33.88624 29.12169 38.14323
Strabomantis ruizi Anura EN Ground-dwelling 24.417562 33.39401 28.97219 37.61063
Strabomantis ruizi Anura EN Ground-dwelling 23.685573 33.28899 28.79635 37.43338
Strabomantis ruizi Anura EN Ground-dwelling 25.735753 33.58314 29.47941 38.16695
Strabomantis helonotus Anura CR Ground-dwelling 21.894371 33.13501 28.83688 37.16263
Strabomantis helonotus Anura CR Ground-dwelling 20.214275 32.89441 28.62633 36.89462
Strabomantis helonotus Anura CR Ground-dwelling 24.164051 33.46005 29.02820 37.40896
Strabomantis zygodactylus Anura LC Stream-dwelling 25.432119 33.02784 28.11316 37.24452
Strabomantis zygodactylus Anura LC Stream-dwelling 24.729621 32.92807 28.11115 37.17417
Strabomantis zygodactylus Anura LC Stream-dwelling 26.805242 33.22284 28.47281 37.67527
Strabomantis cornutus Anura VU Ground-dwelling 23.806982 33.32818 28.93039 37.38224
Strabomantis cornutus Anura VU Ground-dwelling 22.706602 33.17005 28.84496 37.31223
Strabomantis cornutus Anura VU Ground-dwelling 25.534857 33.57649 29.16816 37.67159
Strabomantis laticorpus Anura DD Ground-dwelling 27.812573 33.93326 29.87702 38.48955
Strabomantis laticorpus Anura DD Ground-dwelling 27.084203 33.82880 29.83935 38.36717
Strabomantis laticorpus Anura DD Ground-dwelling 29.356453 34.15468 29.75560 38.50602
Strabomantis biporcatus Anura LC Ground-dwelling 26.735490 33.80865 29.48513 38.31717
Strabomantis biporcatus Anura LC Ground-dwelling 25.952444 33.69622 29.41620 38.17739
Strabomantis biporcatus Anura LC Ground-dwelling 28.204327 34.01954 29.45633 38.37503
Strabomantis cerastes Anura LC Ground-dwelling 24.354201 33.40703 29.54758 38.36569
Strabomantis cerastes Anura LC Ground-dwelling 23.483979 33.28314 29.49495 38.29285
Strabomantis cerastes Anura LC Ground-dwelling 25.828695 33.61694 29.67417 38.51440
Strabomantis necopinus Anura VU Ground-dwelling 22.629374 33.12116 28.53535 36.91180
Strabomantis necopinus Anura VU Ground-dwelling 21.664633 32.98337 28.38121 36.72510
Strabomantis necopinus Anura VU Ground-dwelling 24.306895 33.36076 28.92290 37.42598
Strabomantis sulcatus Anura LC Ground-dwelling 26.686038 33.76995 29.61491 38.22812
Strabomantis sulcatus Anura LC Ground-dwelling 25.917489 33.65881 28.92093 37.52582
Strabomantis sulcatus Anura LC Ground-dwelling 28.163458 33.98361 29.69139 38.34133
Barycholos pulcher Anura LC Ground-dwelling 24.983246 32.46909 28.34700 36.35049
Barycholos pulcher Anura LC Ground-dwelling 23.788670 32.29338 28.13298 36.14495
Barycholos pulcher Anura LC Ground-dwelling 26.891631 32.74981 28.59120 36.72768
Barycholos ternetzi Anura LC Ground-dwelling 26.918716 32.66654 28.62334 36.89130
Barycholos ternetzi Anura LC Ground-dwelling 25.806140 32.50178 28.49461 36.70957
Barycholos ternetzi Anura LC Ground-dwelling 29.035613 32.98004 28.85190 37.28955
Noblella heyeri Anura LC Ground-dwelling 22.945956 32.31802 29.00447 36.14894
Noblella heyeri Anura LC Ground-dwelling 21.989481 32.18031 28.87979 35.98528
Noblella heyeri Anura LC Ground-dwelling 24.665310 32.56558 29.12865 36.37212
Noblella lochites Anura EN Ground-dwelling 24.698762 32.56842 28.84816 36.42303
Noblella lochites Anura EN Ground-dwelling 23.813822 32.43928 28.73720 36.28110
Noblella lochites Anura EN Ground-dwelling 26.444972 32.82324 29.31262 36.96463
Noblella lynchi Anura EN Ground-dwelling 23.280537 32.14561 27.92622 35.99230
Noblella lynchi Anura EN Ground-dwelling 22.528599 32.03585 27.87342 35.85578
Noblella lynchi Anura EN Ground-dwelling 24.608732 32.33950 28.36058 36.47895
Noblella ritarasquinae Anura LC Ground-dwelling 18.373837 31.48859 27.79300 35.20623
Noblella ritarasquinae Anura LC Ground-dwelling 17.415068 31.34955 27.58318 35.00511
Noblella ritarasquinae Anura LC Ground-dwelling 19.848472 31.70243 28.08810 35.52570
Noblella carrascoicola Anura LC Ground-dwelling 18.373837 31.43564 27.59858 35.32909
Noblella carrascoicola Anura LC Ground-dwelling 17.415068 31.29744 27.48651 35.16779
Noblella carrascoicola Anura LC Ground-dwelling 19.848472 31.64819 27.70989 35.47900
Noblella coloma Anura CR Ground-dwelling 19.805326 31.66349 27.88829 35.72388
Noblella coloma Anura CR Ground-dwelling 17.198230 31.28381 27.32538 35.16355
Noblella coloma Anura CR Ground-dwelling 22.861501 32.10859 28.14865 35.97115
Noblella duellmani Anura DD Ground-dwelling 21.012652 31.77498 27.72619 35.68454
Noblella duellmani Anura DD Ground-dwelling 20.177954 31.65337 27.69330 35.65408
Noblella duellmani Anura DD Ground-dwelling 22.689323 32.01925 27.90616 35.84477
Bryophryne bustamantei Anura LC Ground-dwelling 18.677429 29.45213 26.09775 32.65872
Bryophryne bustamantei Anura LC Ground-dwelling 16.787942 29.16458 25.91784 32.44133
Bryophryne bustamantei Anura LC Ground-dwelling 20.115611 29.67100 26.22552 32.87735
Bryophryne zonalis Anura DD Ground-dwelling 16.733884 29.15890 25.96243 32.14292
Bryophryne zonalis Anura DD Ground-dwelling 13.215925 28.63478 25.36870 31.47989
Bryophryne zonalis Anura DD Ground-dwelling 18.422273 29.41044 26.46214 32.61343
Euparkerella brasiliensis Anura LC Ground-dwelling 26.332966 32.56940 28.50364 36.60806
Euparkerella brasiliensis Anura LC Ground-dwelling 25.152380 32.39901 28.35358 36.39418
Euparkerella brasiliensis Anura LC Ground-dwelling 28.199008 32.83870 28.75882 36.98707
Euparkerella cochranae Anura LC Ground-dwelling 25.911811 32.49211 28.39962 36.30936
Euparkerella cochranae Anura LC Ground-dwelling 24.894809 32.34793 28.35094 36.19025
Euparkerella cochranae Anura LC Ground-dwelling 27.611345 32.73304 28.72124 36.82387
Euparkerella tridactyla Anura VU Ground-dwelling 25.507727 32.49328 28.41691 36.56582
Euparkerella tridactyla Anura VU Ground-dwelling 24.733105 32.38012 28.33986 36.43282
Euparkerella tridactyla Anura VU Ground-dwelling 27.100258 32.72591 28.62863 36.93107
Euparkerella robusta Anura VU Ground-dwelling 24.842333 32.33861 28.04213 36.44353
Euparkerella robusta Anura VU Ground-dwelling 24.180948 32.24426 27.68040 36.03102
Euparkerella robusta Anura VU Ground-dwelling 26.164946 32.52729 28.18056 36.62509
Holoaden bradei Anura CR Ground-dwelling 26.367176 32.59953 28.28301 36.64100
Holoaden bradei Anura CR Ground-dwelling 25.114381 32.41667 28.14881 36.43560
Holoaden bradei Anura CR Ground-dwelling 28.661754 32.93445 28.91655 37.44933
Holoaden pholeter Anura DD Ground-dwelling 26.644333 32.60124 28.42050 36.51965
Holoaden pholeter Anura DD Ground-dwelling 25.472962 32.43146 28.20860 36.21141
Holoaden pholeter Anura DD Ground-dwelling 28.583817 32.88236 28.58627 36.84237
Holoaden luederwaldti Anura DD Ground-dwelling 25.472870 32.49800 28.28922 36.58354
Holoaden luederwaldti Anura DD Ground-dwelling 24.211605 32.31474 28.11557 36.40168
Holoaden luederwaldti Anura DD Ground-dwelling 27.609252 32.80842 28.58178 36.93728
Psychrophrynella bagrecito Anura CR Ground-dwelling 16.733884 30.94233 27.29889 34.73546
Psychrophrynella bagrecito Anura CR Ground-dwelling 13.215925 30.42263 26.52307 33.91212
Psychrophrynella bagrecito Anura CR Ground-dwelling 18.422273 31.19175 27.10047 34.60753
Ceratophrys testudo Anura DD Ground-dwelling 22.287150 39.68058 36.03010 42.57750
Ceratophrys testudo Anura DD Ground-dwelling 20.278491 39.42046 36.23329 42.71437
Ceratophrys testudo Anura DD Ground-dwelling 24.609385 39.98130 36.85402 43.43895
Ceratophrys calcarata Anura LC Fossorial 26.912919 41.23150 37.61872 44.86473
Ceratophrys calcarata Anura LC Fossorial 26.117619 41.12761 37.74918 44.90636
Ceratophrys calcarata Anura LC Fossorial 28.531160 41.44291 37.83995 45.17865
Ceratophrys cornuta Anura LC Ground-dwelling 27.306555 40.35163 36.69419 44.23068
Ceratophrys cornuta Anura LC Ground-dwelling 26.582524 40.25525 36.59001 44.11386
Ceratophrys cornuta Anura LC Ground-dwelling 28.856670 40.55799 36.85795 44.48768
Ceratophrys stolzmanni Anura VU Fossorial 24.227053 40.86159 37.26736 44.42852
Ceratophrys stolzmanni Anura VU Fossorial 23.100245 40.71495 37.11498 44.21907
Ceratophrys stolzmanni Anura VU Fossorial 26.141456 41.11072 37.46422 44.74290
Ceratophrys ornata Anura NT Fossorial 22.325708 40.60146 37.57812 43.09587
Ceratophrys ornata Anura NT Fossorial 20.471693 40.36639 37.48330 42.91580
Ceratophrys ornata Anura NT Fossorial 25.701678 41.02948 37.92392 43.63373
Chacophrys pierottii Anura LC Fossorial 24.906794 41.26153 37.75276 45.11115
Chacophrys pierottii Anura LC Fossorial 23.390244 41.06738 37.56273 44.83758
Chacophrys pierottii Anura LC Fossorial 27.548416 41.59973 38.06267 45.62694
Lepidobatrachus asper Anura NT Ground-dwelling 26.241797 40.86295 37.48387 44.46010
Lepidobatrachus asper Anura NT Ground-dwelling 24.558029 40.64577 37.30113 44.22816
Lepidobatrachus asper Anura NT Ground-dwelling 29.106683 41.23249 37.72916 44.83065
Lepidobatrachus laevis Anura LC Ground-dwelling 26.617157 40.95258 37.32792 44.50110
Lepidobatrachus laevis Anura LC Ground-dwelling 25.112827 40.75857 37.01512 44.11625
Lepidobatrachus laevis Anura LC Ground-dwelling 29.231053 41.28969 37.47769 44.80339
Insuetophrynus acarpicus Anura EN Stream-dwelling 16.896544 36.06734 31.64116 40.47928
Insuetophrynus acarpicus Anura EN Stream-dwelling 15.001245 35.81699 31.78964 40.74251
Insuetophrynus acarpicus Anura EN Stream-dwelling 20.736999 36.57463 31.92824 40.94481
Rhinoderma darwinii Anura EN Ground-dwelling 14.554910 36.34144 31.97901 41.43277
Rhinoderma darwinii Anura EN Ground-dwelling 12.563284 36.07855 31.22381 40.73742
Rhinoderma darwinii Anura EN Ground-dwelling 18.797760 36.90150 32.45971 41.88116
Rhinoderma rufum Anura CR Ground-dwelling 18.991084 36.90260 32.16051 41.70085
Rhinoderma rufum Anura CR Ground-dwelling 17.298316 36.68050 32.02506 41.59064
Rhinoderma rufum Anura CR Ground-dwelling 22.242324 37.32918 32.85379 42.44393
Telmatobius arequipensis Anura NT Aquatic 15.193694 36.68236 32.09192 41.30746
Telmatobius arequipensis Anura NT Aquatic 13.556787 36.46481 31.84717 41.08771
Telmatobius arequipensis Anura NT Aquatic 17.949445 37.04861 32.51233 41.63361
Telmatobius oxycephalus Anura EN Aquatic 17.826316 37.02970 32.67250 41.76197
Telmatobius oxycephalus Anura EN Aquatic 16.290223 36.82373 32.55334 41.62939
Telmatobius oxycephalus Anura EN Aquatic 20.029840 37.32517 32.91077 41.90414
Telmatobius sanborni Anura CR Semi-aquatic 16.014487 36.86840 32.50909 41.51255
Telmatobius sanborni Anura CR Semi-aquatic 15.217165 36.76232 32.23376 41.30510
Telmatobius sanborni Anura CR Semi-aquatic 17.722618 37.09566 32.75121 41.74317
Telmatobius verrucosus Anura CR Aquatic 18.508470 37.11436 32.60405 41.67782
Telmatobius verrucosus Anura CR Aquatic 17.604262 36.99430 32.43852 41.52764
Telmatobius verrucosus Anura CR Aquatic 19.881487 37.29667 32.49020 41.59882
Telmatobius atacamensis Anura CR Aquatic 14.220559 36.42963 31.79247 40.80227
Telmatobius atacamensis Anura CR Aquatic 12.439452 36.19454 31.53943 40.50389
Telmatobius atacamensis Anura CR Aquatic 16.530001 36.73444 31.93254 40.95520
Telmatobius ignavus Anura EN Semi-aquatic 22.602751 37.60799 33.22691 42.72372
Telmatobius ignavus Anura EN Semi-aquatic 21.868814 37.51000 32.76997 42.23561
Telmatobius ignavus Anura EN Semi-aquatic 24.173626 37.81771 33.50276 43.01317
Telmatobius atahualpai Anura VU Semi-aquatic 20.045323 37.34929 33.13509 42.30656
Telmatobius atahualpai Anura VU Semi-aquatic 19.139180 37.22972 33.00363 42.18682
Telmatobius atahualpai Anura VU Semi-aquatic 21.649656 37.56100 32.84496 41.97336
Telmatobius rimac Anura VU Semi-aquatic 18.771081 37.16657 32.13361 41.48283
Telmatobius rimac Anura VU Semi-aquatic 17.765904 37.03758 32.60732 41.92091
Telmatobius rimac Anura VU Semi-aquatic 20.470933 37.38470 32.79591 42.15209
Telmatobius yuracare Anura CR Aquatic 22.415740 37.60445 33.32225 42.54352
Telmatobius yuracare Anura CR Aquatic 21.616824 37.49610 33.23388 42.40555
Telmatobius yuracare Anura CR Aquatic 23.646629 37.77138 33.39877 42.66805
Telmatobius simonsi Anura CR Aquatic 19.853920 37.23824 32.65759 42.26374
Telmatobius simonsi Anura CR Aquatic 18.872988 37.10884 32.48728 42.02681
Telmatobius simonsi Anura CR Aquatic 21.421424 37.44503 32.63826 42.21254
Telmatobius brevipes Anura VU Semi-aquatic 19.853563 37.28437 32.78491 41.71359
Telmatobius brevipes Anura VU Semi-aquatic 18.839966 37.15321 32.58524 41.44358
Telmatobius brevipes Anura VU Semi-aquatic 21.687513 37.52167 32.95072 41.99740
Telmatobius colanensis Anura DD Stream-dwelling 24.022160 36.96643 31.98397 41.07020
Telmatobius colanensis Anura DD Stream-dwelling 23.320574 36.87117 31.91433 40.95974
Telmatobius colanensis Anura DD Stream-dwelling 25.414498 37.15547 32.51887 41.58486
Telmatobius brevirostris Anura EN Semi-aquatic 19.652437 37.33548 32.82187 42.10282
Telmatobius brevirostris Anura EN Semi-aquatic 18.682694 37.20549 32.65336 42.02176
Telmatobius brevirostris Anura EN Semi-aquatic 21.586434 37.59473 33.07605 42.39690
Telmatobius carrillae Anura VU Semi-aquatic 15.782374 36.74297 32.35075 41.46689
Telmatobius carrillae Anura VU Semi-aquatic 14.481379 36.57214 32.11483 41.18208
Telmatobius carrillae Anura VU Semi-aquatic 18.216587 37.06259 32.40627 41.59612
Telmatobius peruvianus Anura VU Semi-aquatic 14.075589 36.52518 32.02240 41.13452
Telmatobius peruvianus Anura VU Semi-aquatic 12.608172 36.32893 31.74732 40.90648
Telmatobius peruvianus Anura VU Semi-aquatic 16.965293 36.91164 32.32897 41.39697
Telmatobius hockingi Anura DD Stream-dwelling 16.959671 36.05219 31.82969 40.36236
Telmatobius hockingi Anura DD Stream-dwelling 15.614832 35.87371 31.66360 40.23758
Telmatobius hockingi Anura DD Stream-dwelling 19.680108 36.41323 32.23355 40.82085
Telmatobius chusmisensis Anura EN Stream-dwelling 15.196790 35.85938 31.18952 40.23011
Telmatobius chusmisensis Anura EN Stream-dwelling 13.900594 35.68812 31.06813 40.14789
Telmatobius chusmisensis Anura EN Stream-dwelling 17.990400 36.22848 31.45114 40.42196
Telmatobius intermedius Anura EN Semi-aquatic 15.030051 36.67614 32.46292 41.50750
Telmatobius intermedius Anura EN Semi-aquatic 13.966453 36.53615 32.34220 41.40759
Telmatobius intermedius Anura EN Semi-aquatic 16.659162 36.89056 32.73752 41.76536
Telmatobius scrocchii Anura CR Aquatic 20.449819 37.34171 32.94290 42.28887
Telmatobius scrocchii Anura CR Aquatic 18.766404 37.11844 32.86866 42.17252
Telmatobius scrocchii Anura CR Aquatic 23.515187 37.74827 33.25754 42.63713
Telmatobius contrerasi Anura EN Stream-dwelling 20.270425 36.56698 31.89897 40.92427
Telmatobius contrerasi Anura EN Stream-dwelling 18.349399 36.31333 31.74695 40.75535
Telmatobius contrerasi Anura EN Stream-dwelling 24.312645 37.10073 32.38215 41.37160
Telmatobius philippii Anura CR Aquatic 9.961225 35.99503 30.76698 40.49499
Telmatobius philippii Anura CR Aquatic 7.130359 35.62496 30.67493 40.41389
Telmatobius philippii Anura CR Aquatic 12.835139 36.37073 31.22702 40.70760
Telmatobius culeus Anura EN Aquatic 15.986860 36.65348 32.35237 41.39899
Telmatobius culeus Anura EN Aquatic 14.644014 36.47614 32.22462 41.22613
Telmatobius culeus Anura EN Aquatic 18.014112 36.92121 32.51553 41.57780
Telmatobius gigas Anura EN Stream-dwelling 15.285734 35.83752 31.38277 40.14594
Telmatobius gigas Anura EN Stream-dwelling 14.176779 35.68960 31.21796 39.96077
Telmatobius gigas Anura EN Stream-dwelling 17.645707 36.15231 31.76099 40.55746
Telmatobius hintoni Anura VU Aquatic 18.054970 36.99024 32.64899 41.97497
Telmatobius hintoni Anura VU Aquatic 17.011046 36.85085 32.51169 41.81031
Telmatobius hintoni Anura VU Aquatic 19.791575 37.22211 32.70192 42.04104
Telmatobius huayra Anura VU Aquatic 14.670745 36.52645 32.00361 40.76882
Telmatobius huayra Anura VU Aquatic 12.632379 36.25668 31.60377 40.41219
Telmatobius huayra Anura VU Aquatic 16.926552 36.82501 32.27021 41.06467
Telmatobius zapahuirensis Anura EN Semi-aquatic 15.686612 36.71382 32.44070 41.21753
Telmatobius zapahuirensis Anura EN Semi-aquatic 14.375149 36.54054 32.09372 40.89952
Telmatobius zapahuirensis Anura EN Semi-aquatic 19.970399 37.27983 32.81524 41.46537
Telmatobius dankoi Anura CR Aquatic 14.290307 36.48186 32.05909 40.91633
Telmatobius dankoi Anura CR Aquatic 13.096087 36.32346 31.86669 40.77406
Telmatobius dankoi Anura CR Aquatic 16.515169 36.77695 32.39033 41.27147
Telmatobius vilamensis Anura CR Semi-aquatic 14.290307 36.59153 32.15219 40.77352
Telmatobius vilamensis Anura CR Semi-aquatic 13.096087 36.43337 32.09329 40.74231
Telmatobius vilamensis Anura CR Semi-aquatic 16.515169 36.88619 32.55698 41.17988
Telmatobius degener Anura DD Semi-aquatic 22.355543 37.55647 32.88079 41.79309
Telmatobius degener Anura DD Semi-aquatic 21.452041 37.43570 32.65797 41.57281
Telmatobius degener Anura DD Semi-aquatic 23.805729 37.75033 33.12863 42.02051
Telmatobius fronteriensis Anura CR Stream-dwelling 11.652388 35.31001 30.81920 39.63066
Telmatobius fronteriensis Anura CR Stream-dwelling 9.743338 35.05904 30.51537 39.40457
Telmatobius fronteriensis Anura CR Stream-dwelling 14.394633 35.67052 31.24471 40.07397
Telmatobius schreiteri Anura EN Aquatic 19.940675 37.18768 32.22616 41.42327
Telmatobius schreiteri Anura EN Aquatic 18.243868 36.96054 32.02264 41.15716
Telmatobius schreiteri Anura EN Aquatic 22.839281 37.57571 32.45120 41.83656
Telmatobius halli Anura DD Semi-aquatic 9.961225 36.04569 31.68110 40.59236
Telmatobius halli Anura DD Semi-aquatic 7.130359 35.67545 31.24956 40.14571
Telmatobius halli Anura DD Semi-aquatic 12.835139 36.42157 31.92455 40.84113
Telmatobius jelskii Anura NT Semi-aquatic 16.647075 36.86423 32.55224 41.25004
Telmatobius jelskii Anura NT Semi-aquatic 14.606689 36.59503 32.20584 40.88968
Telmatobius jelskii Anura NT Semi-aquatic 18.543168 37.11440 32.67272 41.41995
Telmatobius hauthali Anura EN Aquatic 11.675438 36.22020 31.35991 40.65597
Telmatobius hauthali Anura EN Aquatic 9.273400 35.89793 31.02244 40.45853
Telmatobius hauthali Anura EN Aquatic 16.347204 36.84700 32.37982 41.57654
Telmatobius necopinus Anura DD Stream-dwelling 20.305860 36.58888 31.97675 41.00868
Telmatobius necopinus Anura DD Stream-dwelling 19.198666 36.44230 31.80656 40.86366
Telmatobius necopinus Anura DD Stream-dwelling 22.523955 36.88254 32.12674 41.11372
Telmatobius hypselocephalus Anura EN Aquatic 14.284302 36.49755 32.21021 41.14865
Telmatobius hypselocephalus Anura EN Aquatic 12.509623 36.26521 31.68270 40.61802
Telmatobius hypselocephalus Anura EN Aquatic 16.526495 36.79109 32.36444 41.24121
Telmatobius mayoloi Anura EN Aquatic 21.579756 37.50409 32.54525 41.86552
Telmatobius mayoloi Anura EN Aquatic 20.599594 37.37097 32.35283 41.63721
Telmatobius mayoloi Anura EN Aquatic 23.711532 37.79362 32.67995 42.10434
Telmatobius platycephalus Anura EN Aquatic 15.292144 36.53612 32.27934 41.33460
Telmatobius platycephalus Anura EN Aquatic 13.819084 36.33953 32.06598 41.10572
Telmatobius platycephalus Anura EN Aquatic 17.481591 36.82833 32.36084 41.34000
Telmatobius latirostris Anura EN Semi-aquatic 22.730668 37.64105 33.34913 42.07805
Telmatobius latirostris Anura EN Semi-aquatic 22.059360 37.55320 33.21743 41.95152
Telmatobius latirostris Anura EN Semi-aquatic 23.880819 37.79155 33.45594 42.18283
Telmatobius timens Anura CR Semi-aquatic 16.478668 36.82584 32.03917 40.87240
Telmatobius timens Anura CR Semi-aquatic 14.927917 36.62238 31.83092 40.66628
Telmatobius timens Anura CR Semi-aquatic 17.970679 37.02159 32.34479 41.19377
Telmatobius marmoratus Anura EN Semi-aquatic 15.639570 36.73350 31.88228 40.93930
Telmatobius marmoratus Anura EN Semi-aquatic 13.858206 36.49728 31.70512 40.71169
Telmatobius marmoratus Anura EN Semi-aquatic 17.952909 37.04027 32.55722 41.57864
Telmatobius stephani Anura EN Aquatic 20.569543 37.28538 32.95766 42.30938
Telmatobius stephani Anura EN Aquatic 18.878943 37.06397 32.77982 42.05804
Telmatobius stephani Anura EN Aquatic 23.553602 37.67618 33.44411 42.89638
Telmatobius niger Anura CR Semi-aquatic 23.257081 37.75249 32.67504 42.32632
Telmatobius niger Anura CR Semi-aquatic 21.670766 37.53631 32.38381 41.94037
Telmatobius niger Anura CR Semi-aquatic 25.510048 38.05952 32.93721 42.64908
Telmatobius pefauri Anura CR Stream-dwelling 15.686612 35.77395 31.26446 40.20089
Telmatobius pefauri Anura CR Stream-dwelling 14.375149 35.59838 30.68769 39.61981
Telmatobius pefauri Anura CR Stream-dwelling 19.970399 36.34745 31.76156 40.72440
Telmatobius punctatus Anura EN Semi-aquatic 19.199032 37.14159 32.80724 42.13016
Telmatobius punctatus Anura EN Semi-aquatic 18.184274 37.00430 32.04797 41.39135
Telmatobius punctatus Anura EN Semi-aquatic 21.218805 37.41484 33.02403 42.16945
Telmatobius pinguiculus Anura EN Aquatic 19.070819 37.07256 32.52056 41.67885
Telmatobius pinguiculus Anura EN Aquatic 17.326470 36.84181 31.93044 41.03618
Telmatobius pinguiculus Anura EN Aquatic 22.223454 37.48961 32.61639 41.83340
Telmatobius pisanoi Anura EN Aquatic 13.616642 36.34893 31.52444 40.79732
Telmatobius pisanoi Anura EN Aquatic 11.122906 36.02159 31.18080 40.52454
Telmatobius pisanoi Anura EN Aquatic 18.731234 37.02030 32.35699 41.57563
Telmatobius thompsoni Anura DD Semi-aquatic 22.355543 37.65492 32.23154 41.63945
Telmatobius thompsoni Anura DD Semi-aquatic 21.452041 37.53423 32.94506 42.35988
Telmatobius thompsoni Anura DD Semi-aquatic 23.805729 37.84863 32.73699 42.17760
Telmatobius truebae Anura VU Semi-aquatic 21.563883 37.50832 33.07346 42.20151
Telmatobius truebae Anura VU Semi-aquatic 20.789279 37.40536 32.97756 42.13175
Telmatobius truebae Anura VU Semi-aquatic 22.846839 37.67885 33.23230 42.44657
Cycloramphus acangatan Anura VU Ground-dwelling 25.870686 37.57864 33.22260 42.26001
Cycloramphus acangatan Anura VU Ground-dwelling 24.316403 37.37103 33.37151 42.34540
Cycloramphus acangatan Anura VU Ground-dwelling 28.503224 37.93028 33.54066 42.64059
Cycloramphus valae Anura DD Stream-dwelling 24.552864 36.74066 32.37220 41.33180
Cycloramphus valae Anura DD Stream-dwelling 22.689759 36.49510 31.67398 40.61798
Cycloramphus valae Anura DD Stream-dwelling 27.254547 37.09674 32.70374 41.64326
Cycloramphus eleutherodactylus Anura DD Ground-dwelling 25.752671 37.49341 33.07930 41.65519
Cycloramphus eleutherodactylus Anura DD Ground-dwelling 24.417708 37.31427 32.89549 41.51258
Cycloramphus eleutherodactylus Anura DD Ground-dwelling 28.131597 37.81263 33.45295 42.09378
Cycloramphus juimirim Anura DD Stream-dwelling 26.156402 36.96587 32.82419 41.44348
Cycloramphus juimirim Anura DD Stream-dwelling 24.610234 36.75874 32.64141 41.25312
Cycloramphus juimirim Anura DD Stream-dwelling 28.684670 37.30456 33.15241 41.91831
Cycloramphus asper Anura DD Stream-dwelling 24.385299 36.86822 32.45574 41.18890
Cycloramphus asper Anura DD Stream-dwelling 22.768352 36.65003 31.83645 40.53655
Cycloramphus asper Anura DD Stream-dwelling 26.844732 37.20009 32.73788 41.50384
Cycloramphus izecksohni Anura DD Stream-dwelling 24.533362 36.86343 32.56902 41.32835
Cycloramphus izecksohni Anura DD Stream-dwelling 22.822049 36.63156 32.29171 40.94022
Cycloramphus izecksohni Anura DD Stream-dwelling 27.115138 37.21325 32.93762 41.82079
Cycloramphus bolitoglossus Anura DD Ground-dwelling 24.663094 37.48319 32.63968 41.66320
Cycloramphus bolitoglossus Anura DD Ground-dwelling 22.984008 37.25504 32.79871 41.79707
Cycloramphus bolitoglossus Anura DD Ground-dwelling 27.257925 37.83578 32.94899 42.01328
Cycloramphus granulosus Anura DD Stream-dwelling 25.352651 36.91001 32.45512 41.31123
Cycloramphus granulosus Anura DD Stream-dwelling 24.149127 36.74824 32.32398 41.07395
Cycloramphus granulosus Anura DD Stream-dwelling 27.465932 37.19407 32.64093 41.68100
Cycloramphus boraceiensis Anura LC Stream-dwelling 25.631020 37.01670 32.82649 41.72760
Cycloramphus boraceiensis Anura LC Stream-dwelling 24.460049 36.85884 32.68852 41.54084
Cycloramphus boraceiensis Anura LC Stream-dwelling 27.574008 37.27863 32.87103 41.87820
Cycloramphus brasiliensis Anura NT Stream-dwelling 26.344369 37.11469 33.02700 41.85872
Cycloramphus brasiliensis Anura NT Stream-dwelling 25.139713 36.95239 32.58565 41.34379
Cycloramphus brasiliensis Anura NT Stream-dwelling 28.353257 37.38535 33.33459 42.16965
Cycloramphus diringshofeni Anura DD Ground-dwelling 24.642605 37.53535 33.42039 41.94085
Cycloramphus diringshofeni Anura DD Ground-dwelling 22.960699 37.30789 33.29546 41.76530
Cycloramphus diringshofeni Anura DD Ground-dwelling 27.166853 37.87672 33.56282 42.21003
Cycloramphus organensis Anura DD Ground-dwelling 26.021599 37.61220 32.94601 41.67064
Cycloramphus organensis Anura DD Ground-dwelling 24.831798 37.45361 32.91930 41.56314
Cycloramphus organensis Anura DD Ground-dwelling 27.814199 37.85112 33.08805 41.86387
Zachaenus carvalhoi Anura DD Ground-dwelling 25.507727 37.60580 33.29313 42.35241
Zachaenus carvalhoi Anura DD Ground-dwelling 24.733105 37.50051 33.18783 42.20521
Zachaenus carvalhoi Anura DD Ground-dwelling 27.100258 37.82228 33.41043 42.51577
Zachaenus parvulus Anura LC Ground-dwelling 25.526126 37.51316 33.30526 42.10706
Zachaenus parvulus Anura LC Ground-dwelling 24.521739 37.37876 33.24498 42.02961
Zachaenus parvulus Anura LC Ground-dwelling 27.241002 37.74264 33.44973 42.27427
Cycloramphus carvalhoi Anura DD Ground-dwelling 26.367176 37.69988 33.55864 42.37435
Cycloramphus carvalhoi Anura DD Ground-dwelling 25.114381 37.53149 33.51811 42.26062
Cycloramphus carvalhoi Anura DD Ground-dwelling 28.661754 38.00828 33.81170 42.72473
Cycloramphus stejnegeri Anura DD Ground-dwelling 26.332966 37.68033 33.05405 41.68841
Cycloramphus stejnegeri Anura DD Ground-dwelling 25.152380 37.52460 32.92322 41.54468
Cycloramphus stejnegeri Anura DD Ground-dwelling 28.199008 37.92646 33.20766 41.92822
Cycloramphus catarinensis Anura DD Ground-dwelling 24.562331 37.39562 32.94342 41.76600
Cycloramphus catarinensis Anura DD Ground-dwelling 23.032979 37.19145 32.62341 41.43177
Cycloramphus catarinensis Anura DD Ground-dwelling 27.077593 37.73140 33.27813 42.24130
Cycloramphus faustoi Anura CR Stream-dwelling 24.282093 36.78027 32.21960 41.26160
Cycloramphus faustoi Anura CR Stream-dwelling 23.148617 36.62768 31.83404 40.76727
Cycloramphus faustoi Anura CR Stream-dwelling 26.194774 37.03774 32.29556 41.42035
Cycloramphus cedrensis Anura DD Stream-dwelling 24.642605 36.87554 32.28489 41.18587
Cycloramphus cedrensis Anura DD Stream-dwelling 22.960699 36.64919 32.10741 41.01516
Cycloramphus cedrensis Anura DD Stream-dwelling 27.166853 37.21525 32.42849 41.51293
Cycloramphus lutzorum Anura DD Stream-dwelling 25.409240 36.91312 32.25544 40.96722
Cycloramphus lutzorum Anura DD Stream-dwelling 23.950789 36.71870 32.02960 40.69079
Cycloramphus lutzorum Anura DD Stream-dwelling 27.766121 37.22730 32.49554 41.31451
Cycloramphus semipalmatus Anura NT Stream-dwelling 25.524695 36.94662 32.67534 41.54230
Cycloramphus semipalmatus Anura NT Stream-dwelling 24.056721 36.74914 32.05140 40.93120
Cycloramphus semipalmatus Anura NT Stream-dwelling 27.945969 37.27234 32.80923 41.80087
Cycloramphus dubius Anura LC Stream-dwelling 25.767088 36.94137 32.69589 41.23281
Cycloramphus dubius Anura LC Stream-dwelling 24.218770 36.73347 32.34058 40.79620
Cycloramphus dubius Anura LC Stream-dwelling 28.316567 37.28372 32.94361 41.62668
Cycloramphus duseni Anura DD Stream-dwelling 23.988291 36.74882 32.49668 41.12369
Cycloramphus duseni Anura DD Stream-dwelling 22.173760 36.50612 32.41688 40.95549
Cycloramphus duseni Anura DD Stream-dwelling 26.632199 37.10245 32.72109 41.44637
Cycloramphus migueli Anura DD Ground-dwelling 25.192998 37.50521 32.67976 41.69661
Cycloramphus migueli Anura DD Ground-dwelling 24.420885 37.40240 32.53340 41.53644
Cycloramphus migueli Anura DD Ground-dwelling 26.685840 37.70400 32.96730 42.04390
Cycloramphus rhyakonastes Anura LC Stream-dwelling 23.988291 36.66006 31.59254 40.72622
Cycloramphus rhyakonastes Anura LC Stream-dwelling 22.173760 36.41732 32.02103 41.05782
Cycloramphus rhyakonastes Anura LC Stream-dwelling 26.632199 37.01376 31.93540 41.09714
Cycloramphus mirandaribeiroi Anura DD Stream-dwelling 23.836674 36.73189 32.42489 41.08247
Cycloramphus mirandaribeiroi Anura DD Stream-dwelling 21.947547 36.47966 32.11129 40.84375
Cycloramphus mirandaribeiroi Anura DD Stream-dwelling 26.445416 37.08021 32.72901 41.63390
Cycloramphus ohausi Anura DD Stream-dwelling 26.332966 37.10121 32.47328 41.48609
Cycloramphus ohausi Anura DD Stream-dwelling 25.152380 36.94168 31.92056 40.89542
Cycloramphus ohausi Anura DD Stream-dwelling 28.199008 37.35335 32.42302 41.41334
Cycloramphus bandeirensis Anura DD Stream-dwelling 25.556465 37.01507 32.40901 41.09319
Cycloramphus bandeirensis Anura DD Stream-dwelling 24.708649 36.90342 32.33151 41.02570
Cycloramphus bandeirensis Anura DD Stream-dwelling 27.149076 37.22481 32.68632 41.34704
Cycloramphus fuliginosus Anura LC Stream-dwelling 25.413467 36.87536 32.70359 41.51762
Cycloramphus fuliginosus Anura LC Stream-dwelling 24.543282 36.76160 32.62653 41.45518
Cycloramphus fuliginosus Anura LC Stream-dwelling 27.002577 37.08311 32.73791 41.63983
Thoropa lutzi Anura EN Stream-dwelling 25.770745 37.06701 32.86424 41.92015
Thoropa lutzi Anura EN Stream-dwelling 24.789542 36.93698 32.82375 41.83654
Thoropa lutzi Anura EN Stream-dwelling 27.491832 37.29508 33.06145 42.24076
Thoropa megatympanum Anura LC Stream-dwelling 24.943914 36.90395 32.47509 41.59704
Thoropa megatympanum Anura LC Stream-dwelling 23.717986 36.74288 32.11817 41.23204
Thoropa megatympanum Anura LC Stream-dwelling 27.586350 37.25113 32.76704 41.96854
Thoropa miliaris Anura LC Stream-dwelling 25.286156 36.96781 32.13413 41.60063
Thoropa miliaris Anura LC Stream-dwelling 24.218295 36.82634 31.99567 41.40677
Thoropa miliaris Anura LC Stream-dwelling 27.356202 37.24203 32.35514 41.90440
Thoropa petropolitana Anura VU Stream-dwelling 25.503070 37.04978 32.68335 41.82336
Thoropa petropolitana Anura VU Stream-dwelling 24.375431 36.89823 32.55936 41.67430
Thoropa petropolitana Anura VU Stream-dwelling 27.451605 37.31166 32.82680 42.08833
Thoropa saxatilis Anura NT Stream-dwelling 24.552864 36.86619 32.34348 41.21298
Thoropa saxatilis Anura NT Stream-dwelling 22.689759 36.62344 32.29718 41.09830
Thoropa saxatilis Anura NT Stream-dwelling 27.254547 37.21819 32.50642 41.47741
Atelognathus ceii Anura DD Semi-aquatic 11.222384 35.27751 31.80433 39.09572
Atelognathus ceii Anura DD Semi-aquatic 8.425566 34.90704 31.37298 38.73961
Atelognathus ceii Anura DD Semi-aquatic 16.385938 35.96147 32.34817 39.78666
Atelognathus solitarius Anura DD Ground-dwelling 14.501408 35.56340 31.97568 39.25667
Atelognathus solitarius Anura DD Ground-dwelling 12.124979 35.24293 31.50891 38.76527
Atelognathus solitarius Anura DD Ground-dwelling 19.587023 36.24920 32.63285 40.04405
Atelognathus patagonicus Anura CR Semi-aquatic 16.604413 36.10567 32.03718 39.84986
Atelognathus patagonicus Anura CR Semi-aquatic 14.134320 35.77827 31.68778 39.53575
Atelognathus patagonicus Anura CR Semi-aquatic 21.672151 36.77737 32.72086 40.60177
Atelognathus nitoi Anura VU Semi-aquatic 14.880647 35.89949 32.54062 40.04295
Atelognathus nitoi Anura VU Semi-aquatic 12.461660 35.58066 32.20235 39.79673
Atelognathus nitoi Anura VU Semi-aquatic 20.141416 36.59287 33.11122 40.79366
Atelognathus praebasalticus Anura EN Ground-dwelling 17.087758 35.98420 32.12073 39.68755
Atelognathus praebasalticus Anura EN Ground-dwelling 14.608618 35.64836 31.76769 39.37377
Atelognathus praebasalticus Anura EN Ground-dwelling 21.677408 36.60595 32.82034 40.68179
Atelognathus salai Anura LC Semi-aquatic 10.850744 35.35361 31.22170 39.06609
Atelognathus salai Anura LC Semi-aquatic 8.495264 35.03989 31.08575 38.95226
Atelognathus salai Anura LC Semi-aquatic 16.186460 36.06425 31.55347 39.36630
Atelognathus reverberii Anura VU Semi-aquatic 15.682549 36.04866 32.52745 40.38524
Atelognathus reverberii Anura VU Semi-aquatic 13.183936 35.71472 32.17548 40.00553
Atelognathus reverberii Anura VU Semi-aquatic 20.126926 36.64267 32.97767 40.89173
Batrachyla antartandica Anura LC Ground-dwelling 12.677106 35.28408 32.57641 37.66293
Batrachyla antartandica Anura LC Ground-dwelling 10.862075 35.04279 32.53416 37.64865
Batrachyla antartandica Anura LC Ground-dwelling 16.640417 35.81094 32.94710 38.02179
Batrachyla nibaldoi Anura LC Ground-dwelling 8.346920 34.65732 32.08548 37.62808
Batrachyla nibaldoi Anura LC Ground-dwelling 6.207373 34.37321 31.76937 37.50656
Batrachyla nibaldoi Anura LC Ground-dwelling 13.779818 35.37877 32.81656 38.14254
Batrachyla fitzroya Anura VU Ground-dwelling 14.997248 35.59286 32.52591 38.38383
Batrachyla fitzroya Anura VU Ground-dwelling 12.953649 35.31704 32.14802 37.91645
Batrachyla fitzroya Anura VU Ground-dwelling 19.592119 36.21300 33.10668 39.12065
Batrachyla leptopus Anura LC Ground-dwelling 13.877476 35.39866 32.63467 39.00961
Batrachyla leptopus Anura LC Ground-dwelling 11.934311 35.13226 32.17344 38.53033
Batrachyla leptopus Anura LC Ground-dwelling 17.975538 35.96047 33.03551 39.41284
Chaltenobatrachus grandisonae Anura LC Ground-dwelling 8.356661 34.20326 31.36386 37.36161
Chaltenobatrachus grandisonae Anura LC Ground-dwelling 6.647042 33.97510 30.92140 37.03748
Chaltenobatrachus grandisonae Anura LC Ground-dwelling 12.902482 34.80992 31.84852 37.71157
Crossodactylus aeneus Anura DD Stream-dwelling 25.674941 36.44271 32.59125 39.94240
Crossodactylus aeneus Anura DD Stream-dwelling 24.420123 36.27638 32.47608 39.75906
Crossodactylus aeneus Anura DD Stream-dwelling 27.820343 36.72710 32.87971 40.34448
Crossodactylus dantei Anura DD Stream-dwelling 25.650081 36.44274 32.72131 40.10688
Crossodactylus dantei Anura DD Stream-dwelling 24.850918 36.33783 32.60152 39.92124
Crossodactylus dantei Anura DD Stream-dwelling 26.651856 36.57424 32.70419 40.09127
Crossodactylus gaudichaudii Anura LC Stream-dwelling 25.548146 36.43960 32.55936 39.93193
Crossodactylus gaudichaudii Anura LC Stream-dwelling 24.407231 36.28610 32.58472 39.93530
Crossodactylus gaudichaudii Anura LC Stream-dwelling 27.499490 36.70214 32.73164 40.18306
Crossodactylus grandis Anura DD Stream-dwelling 26.367176 36.53954 32.76931 40.53417
Crossodactylus grandis Anura DD Stream-dwelling 25.114381 36.37105 32.76373 40.40639
Crossodactylus grandis Anura DD Stream-dwelling 28.661754 36.84814 32.87202 40.71056
Crossodactylus bokermanni Anura DD Stream-dwelling 24.239549 36.21512 32.90374 39.84505
Crossodactylus bokermanni Anura DD Stream-dwelling 22.780848 36.02137 32.79645 39.74860
Crossodactylus bokermanni Anura DD Stream-dwelling 26.761978 36.55017 33.14240 40.14830
Crossodactylus lutzorum Anura DD Stream-dwelling 24.710838 36.27937 33.00430 40.05494
Crossodactylus lutzorum Anura DD Stream-dwelling 23.676324 36.14212 32.80546 39.76604
Crossodactylus lutzorum Anura DD Stream-dwelling 26.338296 36.49528 33.22569 40.36434
Crossodactylus caramaschii Anura LC Stream-dwelling 25.870672 36.39999 33.07167 40.08460
Crossodactylus caramaschii Anura LC Stream-dwelling 24.265672 36.18692 32.88899 39.85231
Crossodactylus caramaschii Anura LC Stream-dwelling 28.537490 36.75402 33.27420 40.46241
Crossodactylus cyclospinus Anura DD Ground-dwelling 25.184561 37.01676 33.01725 41.03654
Crossodactylus cyclospinus Anura DD Ground-dwelling 24.168753 36.88019 32.86543 40.82096
Crossodactylus cyclospinus Anura DD Ground-dwelling 27.359020 37.30911 33.47226 41.63329
Crossodactylus trachystomus Anura DD Stream-dwelling 24.826713 36.36452 32.19321 40.16836
Crossodactylus trachystomus Anura DD Stream-dwelling 23.454470 36.17845 31.83368 39.75796
Crossodactylus trachystomus Anura DD Stream-dwelling 27.381718 36.71097 32.53772 40.58228
Crossodactylus dispar Anura DD Stream-dwelling 25.533875 36.51505 32.61767 40.50607
Crossodactylus dispar Anura DD Stream-dwelling 24.250889 36.34209 32.18451 39.99079
Crossodactylus dispar Anura DD Stream-dwelling 27.869936 36.82996 32.87764 40.92461
Hylodes amnicola Anura DD Stream-dwelling 26.021599 36.72094 32.19567 40.81758
Hylodes amnicola Anura DD Stream-dwelling 24.831798 36.56272 32.03297 40.55231
Hylodes amnicola Anura DD Stream-dwelling 27.814199 36.95932 32.23926 40.95451
Hylodes mertensi Anura DD Stream-dwelling 25.405019 36.54235 32.35264 41.32592
Hylodes mertensi Anura DD Stream-dwelling 23.841325 36.33258 32.09989 41.01819
Hylodes mertensi Anura DD Stream-dwelling 27.977586 36.88745 32.48295 41.53663
Hylodes asper Anura LC Stream-dwelling 25.453011 36.62641 32.68444 40.81995
Hylodes asper Anura LC Stream-dwelling 24.100439 36.44339 32.40742 40.52634
Hylodes asper Anura LC Stream-dwelling 27.670875 36.92652 32.90015 41.11320
Hylodes meridionalis Anura LC Stream-dwelling 24.069966 36.44475 32.66389 40.55471
Hylodes meridionalis Anura LC Stream-dwelling 22.280358 36.20474 32.45223 40.29279
Hylodes meridionalis Anura LC Stream-dwelling 26.741763 36.80308 32.99028 40.94573
Hylodes babax Anura DD Stream-dwelling 25.556465 36.75895 32.56013 40.86222
Hylodes babax Anura DD Stream-dwelling 24.708649 36.64202 32.67933 40.93241
Hylodes babax Anura DD Stream-dwelling 27.149076 36.97859 32.78323 41.11382
Hylodes vanzolinii Anura DD Stream-dwelling 25.556465 36.66108 32.36183 40.94310
Hylodes vanzolinii Anura DD Stream-dwelling 24.708649 36.54807 32.27442 40.82331
Hylodes vanzolinii Anura DD Stream-dwelling 27.149076 36.87337 32.49695 41.12832
Hylodes cardosoi Anura LC Stream-dwelling 25.203906 36.62160 32.24578 40.77783
Hylodes cardosoi Anura LC Stream-dwelling 23.507481 36.39317 32.11357 40.61307
Hylodes cardosoi Anura LC Stream-dwelling 27.815633 36.97328 32.53550 41.16970
Hylodes charadranaetes Anura DD Stream-dwelling 26.332966 36.79587 32.82244 41.14696
Hylodes charadranaetes Anura DD Stream-dwelling 25.152380 36.63688 32.70259 41.01466
Hylodes charadranaetes Anura DD Stream-dwelling 28.199008 37.04716 32.66336 41.14172
Hylodes dactylocinus Anura DD Stream-dwelling 26.156402 36.61053 32.57500 41.22279
Hylodes dactylocinus Anura DD Stream-dwelling 24.610234 36.40448 32.44084 40.97581
Hylodes dactylocinus Anura DD Stream-dwelling 28.684670 36.94745 32.19251 40.90325
Hylodes perplicatus Anura LC Stream-dwelling 24.373962 36.37507 32.20010 40.68975
Hylodes perplicatus Anura LC Stream-dwelling 22.622982 36.14359 31.91269 40.34703
Hylodes perplicatus Anura LC Stream-dwelling 26.926374 36.71251 32.49712 41.08040
Hylodes fredi Anura DD Stream-dwelling 24.941675 36.56209 32.08382 40.44568
Hylodes fredi Anura DD Stream-dwelling 23.813964 36.41499 31.93368 40.20831
Hylodes fredi Anura DD Stream-dwelling 26.771280 36.80074 32.63642 41.03098
Hylodes pipilans Anura DD Stream-dwelling 26.644333 36.83476 32.20891 41.05926
Hylodes pipilans Anura DD Stream-dwelling 25.472962 36.67717 31.86161 40.66133
Hylodes pipilans Anura DD Stream-dwelling 28.583817 37.09569 32.66669 41.64321
Hylodes glaber Anura DD Stream-dwelling 26.367176 36.70979 32.80966 41.38422
Hylodes glaber Anura DD Stream-dwelling 25.114381 36.54174 32.44564 40.96520
Hylodes glaber Anura DD Stream-dwelling 28.661754 37.01760 32.91238 41.60038
Hylodes lateristrigatus Anura LC Stream-dwelling 25.534821 36.67130 32.26052 40.57891
Hylodes lateristrigatus Anura LC Stream-dwelling 24.485549 36.52860 32.13027 40.49109
Hylodes lateristrigatus Anura LC Stream-dwelling 27.377067 36.92185 32.74510 41.12928
Hylodes heyeri Anura DD Stream-dwelling 25.318625 36.58552 32.39533 40.86552
Hylodes heyeri Anura DD Stream-dwelling 23.681928 36.36359 32.18598 40.59737
Hylodes heyeri Anura DD Stream-dwelling 27.888597 36.93401 32.60056 41.18846
Hylodes regius Anura DD Stream-dwelling 26.093418 36.67016 32.66093 40.76130
Hylodes regius Anura DD Stream-dwelling 24.816963 36.49702 32.47728 40.51304
Hylodes regius Anura DD Stream-dwelling 28.448837 36.98964 32.79806 41.04588
Hylodes magalhaesi Anura DD Stream-dwelling 25.922392 36.73252 32.06272 40.80583
Hylodes magalhaesi Anura DD Stream-dwelling 24.625678 36.55582 31.79567 40.47079
Hylodes magalhaesi Anura DD Stream-dwelling 28.357659 37.06437 32.71043 41.56039
Hylodes ornatus Anura LC Stream-dwelling 25.579814 36.60082 32.30140 40.94311
Hylodes ornatus Anura LC Stream-dwelling 24.271136 36.42508 32.07004 40.71752
Hylodes ornatus Anura LC Stream-dwelling 27.909886 36.91372 32.70858 41.43400
Hylodes sazimai Anura DD Stream-dwelling 25.579814 36.55338 32.68752 41.15144
Hylodes sazimai Anura DD Stream-dwelling 24.271136 36.37997 32.52783 40.97425
Hylodes sazimai Anura DD Stream-dwelling 27.909886 36.86214 32.79820 41.34289
Hylodes uai Anura DD Stream-dwelling 24.826713 36.44863 32.13759 40.67118
Hylodes uai Anura DD Stream-dwelling 23.454470 36.26384 31.96153 40.39405
Hylodes uai Anura DD Stream-dwelling 27.381718 36.79269 32.12541 40.77481
Hylodes otavioi Anura DD Stream-dwelling 24.239549 36.55364 32.16111 40.69128
Hylodes otavioi Anura DD Stream-dwelling 22.780848 36.35483 31.97998 40.46431
Hylodes otavioi Anura DD Stream-dwelling 26.761978 36.89741 32.72543 41.38941
Hylodes phyllodes Anura LC Stream-dwelling 25.641510 36.67000 32.20000 41.01588
Hylodes phyllodes Anura LC Stream-dwelling 24.284811 36.48830 32.11392 40.86998
Hylodes phyllodes Anura LC Stream-dwelling 27.912555 36.97417 32.46144 41.38943
Hylodes nasus Anura LC Stream-dwelling 25.428903 36.68914 32.16791 41.22220
Hylodes nasus Anura LC Stream-dwelling 24.074573 36.50875 32.39054 41.37467
Hylodes nasus Anura LC Stream-dwelling 27.664363 36.98691 32.43152 41.63252
Megaelosia apuana Anura DD Stream-dwelling 25.625862 36.63040 32.38642 41.30009
Megaelosia apuana Anura DD Stream-dwelling 24.800864 36.52103 32.34435 41.19020
Megaelosia apuana Anura DD Stream-dwelling 27.220602 36.84182 32.52327 41.52963
Megaelosia boticariana Anura DD Stream-dwelling 25.405019 36.64326 32.40240 40.91645
Megaelosia boticariana Anura DD Stream-dwelling 23.841325 36.43114 32.05251 40.49064
Megaelosia boticariana Anura DD Stream-dwelling 27.977586 36.99222 32.70417 41.23818
Megaelosia bocainensis Anura DD Stream-dwelling 26.367176 36.75671 32.55996 41.41511
Megaelosia bocainensis Anura DD Stream-dwelling 25.114381 36.58840 32.39269 41.22578
Megaelosia bocainensis Anura DD Stream-dwelling 28.661754 37.06498 32.83783 41.76189
Megaelosia lutzae Anura DD Stream-dwelling 26.367176 36.75872 32.19616 41.10678
Megaelosia lutzae Anura DD Stream-dwelling 25.114381 36.59237 32.07303 40.91757
Megaelosia lutzae Anura DD Stream-dwelling 28.661754 37.06339 32.59870 41.51152
Megaelosia goeldii Anura LC Stream-dwelling 25.806811 36.63551 32.82662 41.76391
Megaelosia goeldii Anura LC Stream-dwelling 24.566955 36.46953 32.39193 41.24354
Megaelosia goeldii Anura LC Stream-dwelling 27.921085 36.91854 32.96556 41.99901
Megaelosia jordanensis Anura DD Ground-dwelling 25.819660 37.23291 32.44108 41.30268
Megaelosia jordanensis Anura DD Ground-dwelling 24.519545 37.05973 32.49924 41.23675
Megaelosia jordanensis Anura DD Ground-dwelling 28.235919 37.55476 32.97648 41.94243
Megaelosia massarti Anura DD Stream-dwelling 24.843556 36.57771 32.49641 40.90825
Megaelosia massarti Anura DD Stream-dwelling 23.494971 36.39564 32.40710 40.71837
Megaelosia massarti Anura DD Stream-dwelling 27.086180 36.88049 32.55447 41.17825
Alsodes australis Anura DD Stream-dwelling 9.709187 32.71135 29.76915 36.07006
Alsodes australis Anura DD Stream-dwelling 7.989396 32.47821 29.61017 36.00503
Alsodes australis Anura DD Stream-dwelling 14.034646 33.29772 30.31475 36.38267
Alsodes verrucosus Anura EN Semi-aquatic 15.639376 34.32259 31.36236 37.49310
Alsodes verrucosus Anura EN Semi-aquatic 13.378516 34.01544 31.10247 37.22807
Alsodes verrucosus Anura EN Semi-aquatic 20.126996 34.93228 32.08126 38.23012
Alsodes monticola Anura DD Stream-dwelling 10.841345 32.83425 29.57019 36.01178
Alsodes monticola Anura DD Stream-dwelling 9.604596 32.66641 29.37183 35.84528
Alsodes monticola Anura DD Stream-dwelling 14.101632 33.27672 30.26869 36.61720
Alsodes valdiviensis Anura EN Semi-aquatic 16.564311 34.47307 31.62439 37.49814
Alsodes valdiviensis Anura EN Semi-aquatic 14.659050 34.21052 31.56956 37.44358
Alsodes valdiviensis Anura EN Semi-aquatic 20.354248 34.99534 32.15874 38.07906
Alsodes barrioi Anura EN Stream-dwelling 17.482959 33.47251 30.48158 35.95798
Alsodes barrioi Anura EN Stream-dwelling 15.652372 33.22469 30.30929 35.70360
Alsodes barrioi Anura EN Stream-dwelling 21.141548 33.96782 31.14219 36.68346
Alsodes norae Anura EN Semi-aquatic 17.421316 34.31834 31.63050 36.95242
Alsodes norae Anura EN Semi-aquatic 15.411264 34.04268 31.42453 36.67750
Alsodes norae Anura EN Semi-aquatic 21.387021 34.86222 32.38905 37.73370
Alsodes kaweshkari Anura DD Semi-aquatic 6.324433 32.84067 30.09648 35.90056
Alsodes kaweshkari Anura DD Semi-aquatic 4.875182 32.64227 29.79549 35.67090
Alsodes kaweshkari Anura DD Semi-aquatic 10.809819 33.45473 30.66589 36.31057
Alsodes igneus Anura VU Stream-dwelling 16.677714 33.40201 30.43582 36.45003
Alsodes igneus Anura VU Stream-dwelling 14.420214 33.09359 30.09199 36.01541
Alsodes igneus Anura VU Stream-dwelling 21.006551 33.99341 30.93505 36.96281
Alsodes pehuenche Anura CR Stream-dwelling 10.597426 32.49998 29.67927 35.70954
Alsodes pehuenche Anura CR Stream-dwelling 9.021373 32.28829 29.29846 35.37532
Alsodes pehuenche Anura CR Stream-dwelling 18.582843 33.57257 30.61845 36.51406
Alsodes hugoi Anura VU Stream-dwelling 12.440270 32.94216 29.86405 35.85536
Alsodes hugoi Anura VU Stream-dwelling 11.184807 32.77017 29.71856 35.72369
Alsodes hugoi Anura VU Stream-dwelling 19.987145 33.97606 30.67537 36.83526
Alsodes tumultuosus Anura VU Stream-dwelling 18.143251 33.72051 30.64086 36.77001
Alsodes tumultuosus Anura VU Stream-dwelling 16.084502 33.43906 30.38746 36.49719
Alsodes tumultuosus Anura VU Stream-dwelling 21.760292 34.21499 30.95784 37.17693
Alsodes montanus Anura VU Stream-dwelling 16.612901 33.52306 30.55406 36.79840
Alsodes montanus Anura VU Stream-dwelling 14.173729 33.18667 30.14366 36.34039
Alsodes montanus Anura VU Stream-dwelling 20.471290 34.05518 30.78445 37.10261
Alsodes vittatus Anura DD Stream-dwelling 15.713211 33.50495 30.46920 36.81377
Alsodes vittatus Anura DD Stream-dwelling 12.986350 33.13256 30.03646 36.30875
Alsodes vittatus Anura DD Stream-dwelling 20.971815 34.22308 31.00800 37.54295
Alsodes nodosus Anura NT Stream-dwelling 18.521195 34.22479 30.69875 37.45975
Alsodes nodosus Anura NT Stream-dwelling 16.542113 33.96168 30.72376 37.42820
Alsodes nodosus Anura NT Stream-dwelling 21.880400 34.67140 31.12547 37.93101
Alsodes vanzolinii Anura EN Stream-dwelling 17.283153 34.09332 30.56526 37.49419
Alsodes vanzolinii Anura EN Stream-dwelling 15.746344 33.88419 30.63588 37.60437
Alsodes vanzolinii Anura EN Stream-dwelling 20.370244 34.51342 31.13350 38.08661
Eupsophus insularis Anura CR Ground-dwelling 16.954856 35.09980 31.41961 38.78510
Eupsophus insularis Anura CR Ground-dwelling 14.970376 34.82981 31.11884 38.50358
Eupsophus insularis Anura CR Ground-dwelling 20.876711 35.63338 31.85612 39.25967
Eupsophus roseus Anura LC Ground-dwelling 16.925305 34.99541 31.55785 38.58006
Eupsophus roseus Anura LC Ground-dwelling 14.935578 34.72700 31.23343 38.29396
Eupsophus roseus Anura LC Ground-dwelling 20.773333 35.51450 31.96742 39.01213
Eupsophus calcaratus Anura LC Ground-dwelling 11.864670 34.31668 30.85086 37.98669
Eupsophus calcaratus Anura LC Ground-dwelling 10.011536 34.07055 30.62512 37.75491
Eupsophus calcaratus Anura LC Ground-dwelling 16.050931 34.87269 31.46383 38.48940
Eupsophus emiliopugini Anura LC Stream-dwelling 13.193105 33.88673 29.96495 37.34403
Eupsophus emiliopugini Anura LC Stream-dwelling 11.218029 33.62489 30.11713 37.51108
Eupsophus emiliopugini Anura LC Stream-dwelling 17.468451 34.45352 30.69246 38.08364
Eupsophus vertebralis Anura LC Stream-dwelling 16.258042 34.32807 30.60506 38.02348
Eupsophus vertebralis Anura LC Stream-dwelling 14.108474 34.03573 30.34195 37.77258
Eupsophus vertebralis Anura LC Stream-dwelling 20.480590 34.90235 31.04214 38.50973
Agalychnis annae Anura VU Arboreal 25.115515 38.93674 35.81129 41.72969
Agalychnis annae Anura VU Arboreal 24.332976 38.82891 35.77913 41.65564
Agalychnis annae Anura VU Arboreal 26.618399 39.14383 35.85797 41.84763
Agalychnis moreletii Anura LC Arboreal 26.112054 39.12302 36.20523 42.38767
Agalychnis moreletii Anura LC Arboreal 25.180432 38.99351 35.58581 41.70160
Agalychnis moreletii Anura LC Arboreal 28.032555 39.39001 36.01456 42.30256
Agalychnis callidryas Anura LC Arboreal 26.753416 39.15479 36.21908 42.28287
Agalychnis callidryas Anura LC Arboreal 25.964398 39.04601 36.02834 42.02574
Agalychnis callidryas Anura LC Arboreal 28.364579 39.37692 36.39841 42.54960
Agalychnis saltator Anura LC Arboreal 25.702040 39.11422 35.99521 41.97359
Agalychnis saltator Anura LC Arboreal 24.975570 39.01308 36.03206 41.95888
Agalychnis saltator Anura LC Arboreal 27.140744 39.31452 36.21141 42.24766
Agalychnis lemur Anura CR Arboreal 26.273828 39.05197 35.79413 42.84027
Agalychnis lemur Anura CR Arboreal 25.589151 38.95740 35.65989 42.66024
Agalychnis lemur Anura CR Arboreal 27.553991 39.22879 35.90102 43.03591
Hylomantis granulosa Anura LC Arboreal 25.270950 38.89854 35.45072 41.98029
Hylomantis granulosa Anura LC Arboreal 24.303247 38.76903 35.40601 41.85895
Hylomantis granulosa Anura LC Arboreal 26.902370 39.11687 35.72890 42.24326
Phasmahyla cochranae Anura LC Arboreal 25.695014 38.86671 35.80116 42.04729
Phasmahyla cochranae Anura LC Arboreal 24.390130 38.68395 35.65850 41.81147
Phasmahyla cochranae Anura LC Arboreal 28.033172 39.19419 36.01660 42.43179
Phasmahyla exilis Anura LC Arboreal 25.354840 38.74064 35.87702 42.11577
Phasmahyla exilis Anura LC Arboreal 24.563063 38.63168 35.79438 41.96782
Phasmahyla exilis Anura LC Arboreal 26.870334 38.94919 35.89289 42.13211
Phasmahyla timbo Anura DD Stream-dwelling 24.710838 38.28313 35.34873 41.43768
Phasmahyla timbo Anura DD Stream-dwelling 23.676324 38.13961 35.02402 41.05690
Phasmahyla timbo Anura DD Stream-dwelling 26.338296 38.50892 35.52118 41.66924
Phasmahyla guttata Anura LC Arboreal 25.558232 38.77202 35.39248 41.41608
Phasmahyla guttata Anura LC Arboreal 24.252632 38.59208 35.72673 41.71426
Phasmahyla guttata Anura LC Arboreal 27.730262 39.07137 36.08925 42.29809
Phasmahyla jandaia Anura LC Stream-dwelling 25.102654 38.17915 35.27607 41.37073
Phasmahyla jandaia Anura LC Stream-dwelling 23.861637 38.01174 35.07754 41.12101
Phasmahyla jandaia Anura LC Stream-dwelling 27.729649 38.53352 35.60159 41.87868
Phyllomedusa araguari Anura DD Arboreal 25.820310 40.25883 37.03199 43.08055
Phyllomedusa araguari Anura DD Arboreal 24.664943 40.10332 37.05007 42.98900
Phyllomedusa araguari Anura DD Arboreal 28.197867 40.57884 37.61605 43.86806
Phyllomedusa venusta Anura LC Arboreal 26.260654 40.16408 36.79160 43.27258
Phyllomedusa venusta Anura LC Arboreal 25.469369 40.05896 36.73000 43.19599
Phyllomedusa venusta Anura LC Arboreal 27.944861 40.38785 36.97750 43.58409
Phyllomedusa bahiana Anura LC Arboreal 24.932457 40.76655 38.33906 43.24188
Phyllomedusa bahiana Anura LC Arboreal 23.893186 40.62898 38.23993 43.13277
Phyllomedusa bahiana Anura LC Arboreal 26.962639 41.03529 38.68952 43.84212
Phyllomedusa distincta Anura LC Arboreal 25.067966 40.84802 38.71220 43.54248
Phyllomedusa distincta Anura LC Arboreal 23.470733 40.63211 38.39615 43.09247
Phyllomedusa distincta Anura LC Arboreal 27.615004 41.19232 38.64584 43.74677
Phyllomedusa boliviana Anura LC Arboreal 26.408744 40.81031 37.83216 43.96239
Phyllomedusa boliviana Anura LC Arboreal 25.509948 40.68885 37.73925 43.80836
Phyllomedusa boliviana Anura LC Arboreal 28.308086 41.06700 37.96304 44.26474
Phyllomedusa neildi Anura DD Arboreal 26.326467 40.90508 38.03701 43.52440
Phyllomedusa neildi Anura DD Arboreal 25.864250 40.84246 37.95873 43.45164
Phyllomedusa neildi Anura DD Arboreal 27.203251 41.02387 38.10982 43.67435
Phyllomedusa trinitatis Anura LC Arboreal 26.521796 40.95576 37.80406 43.76897
Phyllomedusa trinitatis Anura LC Arboreal 25.725709 40.84894 37.65022 43.54232
Phyllomedusa trinitatis Anura LC Arboreal 28.052076 41.16108 38.03408 44.09121
Phyllomedusa tarsius Anura LC Arboreal 27.350077 41.11548 38.31643 44.22184
Phyllomedusa tarsius Anura LC Arboreal 26.588945 41.01144 38.21771 44.06460
Phyllomedusa tarsius Anura LC Arboreal 28.908976 41.32858 38.31520 44.29450
Phyllomedusa bicolor Anura LC Arboreal 27.587699 40.55119 37.59770 43.60045
Phyllomedusa bicolor Anura LC Arboreal 26.883355 40.45536 37.66443 43.58122
Phyllomedusa bicolor Anura LC Arboreal 29.109259 40.75822 37.72391 43.84985
Cruziohyla craspedopus Anura LC Arboreal 27.598318 39.71602 36.23156 42.73120
Cruziohyla craspedopus Anura LC Arboreal 26.846182 39.61585 36.11801 42.57137
Cruziohyla craspedopus Anura LC Arboreal 29.117114 39.91828 36.33815 42.96006
Phrynomedusa appendiculata Anura NT Arboreal 24.441389 39.13175 35.55097 42.89652
Phrynomedusa appendiculata Anura NT Arboreal 22.652986 38.88597 35.26021 42.60616
Phrynomedusa appendiculata Anura NT Arboreal 27.067197 39.49262 35.82247 43.25344
Phrynomedusa bokermanni Anura DD Stream-dwelling 25.767088 38.71252 35.28889 42.31465
Phrynomedusa bokermanni Anura DD Stream-dwelling 24.218770 38.50363 35.02597 41.99277
Phrynomedusa bokermanni Anura DD Stream-dwelling 28.316567 39.05648 35.72188 42.86669
Phrynomedusa marginata Anura LC Arboreal 25.601723 39.21963 35.78168 43.09243
Phrynomedusa marginata Anura LC Arboreal 24.624627 39.08951 35.64829 42.91828
Phrynomedusa marginata Anura LC Arboreal 27.287469 39.44412 35.98374 43.33329
Phrynomedusa vanzolinii Anura DD Stream-dwelling 25.641510 38.76993 35.08337 42.81430
Phrynomedusa vanzolinii Anura DD Stream-dwelling 24.284811 38.58381 35.15399 42.81075
Phrynomedusa vanzolinii Anura DD Stream-dwelling 27.912555 39.08150 35.57588 43.34474
Cyclorana novaehollandiae Anura LC Fossorial 24.909006 40.02273 37.03820 42.51386
Cyclorana novaehollandiae Anura LC Fossorial 23.491516 39.82946 36.94079 42.25232
Cyclorana novaehollandiae Anura LC Fossorial 27.389116 40.36090 37.30320 42.97037
Cyclorana cryptotis Anura LC Fossorial 27.287575 40.15430 37.00324 43.18915
Cyclorana cryptotis Anura LC Fossorial 26.200182 40.00475 36.88668 42.96899
Cyclorana cryptotis Anura LC Fossorial 29.404718 40.44547 37.07715 43.38074
Cyclorana cultripes Anura LC Fossorial 24.888140 39.93348 36.77419 42.80540
Cyclorana cultripes Anura LC Fossorial 23.305954 39.71596 36.54968 42.46299
Cyclorana cultripes Anura LC Fossorial 27.438477 40.28410 36.88595 43.14838
Cyclorana vagitus Anura LC Ground-dwelling 27.562483 39.30884 36.21305 42.27084
Cyclorana vagitus Anura LC Ground-dwelling 26.599860 39.17661 36.10898 42.06201
Cyclorana vagitus Anura LC Ground-dwelling 29.574898 39.58528 36.59518 42.81283
Cyclorana longipes Anura LC Fossorial 27.452535 40.17625 37.13194 43.18344
Cyclorana longipes Anura LC Fossorial 26.386396 40.02829 36.89966 42.92354
Cyclorana longipes Anura LC Fossorial 29.434273 40.45127 37.31805 43.55620
Cyclorana maculosa Anura LC Fossorial 26.811680 40.08447 36.78635 42.90211
Cyclorana maculosa Anura LC Fossorial 25.474589 39.90388 36.57947 42.61478
Cyclorana maculosa Anura LC Fossorial 28.973068 40.37639 37.22016 43.42453
Cyclorana maini Anura LC Fossorial 23.791571 39.67172 36.71437 42.56125
Cyclorana maini Anura LC Fossorial 22.050940 39.43736 36.59593 42.30650
Cyclorana maini Anura LC Fossorial 26.575643 40.04658 37.11976 43.19339
Cyclorana manya Anura LC Ground-dwelling 27.112114 39.21502 36.27442 42.63283
Cyclorana manya Anura LC Ground-dwelling 26.006404 39.06374 36.15388 42.43070
Cyclorana manya Anura LC Ground-dwelling 29.291925 39.51325 36.32068 42.83202
Cyclorana verrucosa Anura LC Ground-dwelling 23.609954 38.65760 35.81606 41.78533
Cyclorana verrucosa Anura LC Ground-dwelling 22.001141 38.44307 35.65034 41.55142
Cyclorana verrucosa Anura LC Ground-dwelling 26.375075 39.02632 36.11965 42.23005
Cyclorana platycephala Anura LC Fossorial 23.731294 39.61063 36.73336 42.67705
Cyclorana platycephala Anura LC Fossorial 21.992498 39.37956 36.55489 42.44222
Cyclorana platycephala Anura LC Fossorial 26.595725 39.99128 37.09857 43.18595
Litoria dahlii Anura LC Semi-aquatic 27.624838 39.42887 36.02824 42.88721
Litoria dahlii Anura LC Semi-aquatic 26.583707 39.28598 35.92947 42.63727
Litoria dahlii Anura LC Semi-aquatic 29.639722 39.70540 35.95349 43.09446
Litoria adelaidensis Anura LC Arboreal 20.116057 37.26771 33.46470 41.24502
Litoria adelaidensis Anura LC Arboreal 18.618737 37.06682 33.22196 40.97217
Litoria adelaidensis Anura LC Arboreal 23.138976 37.67330 33.85451 41.74652
Litoria chloronota Anura LC Semi-aquatic 27.603582 38.70032 34.80986 42.96517
Litoria chloronota Anura LC Semi-aquatic 26.950469 38.60999 34.80359 42.92252
Litoria chloronota Anura LC Semi-aquatic 28.802742 38.86615 35.00785 43.17707
Litoria albolabris Anura DD Arboreal 25.756987 39.43291 36.14109 42.20540
Litoria albolabris Anura DD Arboreal 25.175346 39.35251 36.11823 42.14761
Litoria albolabris Anura DD Arboreal 26.846334 39.58348 36.25975 42.36725
Litoria amboinensis Anura LC Arboreal 27.000279 38.05187 34.83015 40.55553
Litoria amboinensis Anura LC Arboreal 26.361203 37.96262 34.79736 40.43708
Litoria amboinensis Anura LC Arboreal 28.264158 38.22838 34.85102 40.74991
Litoria darlingtoni Anura LC Arboreal 25.815190 37.94712 35.21889 40.38968
Litoria darlingtoni Anura LC Arboreal 24.942316 37.82511 35.08369 40.18036
Litoria darlingtoni Anura LC Arboreal 27.295085 38.15398 35.32686 40.61089
Litoria tyleri Anura LC Arboreal 21.844695 37.50022 34.89809 40.34361
Litoria tyleri Anura LC Arboreal 20.335698 37.28941 34.72632 40.05527
Litoria tyleri Anura LC Arboreal 24.263891 37.83820 35.22724 40.78622
Litoria andiirrmalin Anura VU Stream-dwelling 27.215800 36.91696 33.13136 40.40904
Litoria andiirrmalin Anura VU Stream-dwelling 26.261522 36.78196 33.00862 40.24641
Litoria andiirrmalin Anura VU Stream-dwelling 29.209068 37.19895 33.56216 40.98197
Litoria booroolongensis Anura CR Stream-dwelling 21.353965 35.56407 32.67162 38.30875
Litoria booroolongensis Anura CR Stream-dwelling 19.677450 35.32706 32.46352 38.08416
Litoria booroolongensis Anura CR Stream-dwelling 24.105150 35.95300 32.91395 38.60082
Litoria jungguy Anura LC Stream-dwelling 26.039683 36.14435 33.47587 39.04278
Litoria jungguy Anura LC Stream-dwelling 24.944620 35.99215 33.34322 38.82066
Litoria jungguy Anura LC Stream-dwelling 28.060802 36.42527 33.54011 39.30851
Litoria wilcoxii Anura LC Stream-dwelling 23.694389 35.75520 32.87717 38.42452
Litoria wilcoxii Anura LC Stream-dwelling 22.345567 35.56527 32.67952 38.14874
Litoria wilcoxii Anura LC Stream-dwelling 26.076068 36.09057 33.15589 38.89115
Litoria angiana Anura LC Stream-dwelling 26.464332 37.48020 33.37541 41.08581
Litoria angiana Anura LC Stream-dwelling 25.657160 37.37087 33.32399 41.00009
Litoria angiana Anura LC Stream-dwelling 27.868348 37.67039 33.45640 41.20118
Litoria modica Anura LC Stream-dwelling 26.675280 37.61599 33.83573 41.39242
Litoria modica Anura LC Stream-dwelling 25.857189 37.50258 33.66281 41.22285
Litoria modica Anura LC Stream-dwelling 28.092338 37.81244 33.96787 41.60465
Litoria micromembrana Anura LC Stream-dwelling 26.534888 37.52601 33.38889 41.46352
Litoria micromembrana Anura LC Stream-dwelling 25.649448 37.40598 33.30267 41.30219
Litoria micromembrana Anura LC Stream-dwelling 27.958990 37.71907 33.65971 41.76655
Litoria arfakiana Anura LC Arboreal 26.686366 38.02846 34.40023 41.92825
Litoria arfakiana Anura LC Arboreal 25.897061 37.91919 34.26970 41.77402
Litoria arfakiana Anura LC Arboreal 28.073212 38.22046 34.42330 41.98979
Litoria wollastoni Anura LC Arboreal 26.490660 38.03407 34.25586 41.83056
Litoria wollastoni Anura LC Arboreal 25.677977 37.92314 34.10235 41.61313
Litoria wollastoni Anura LC Arboreal 27.887788 38.22477 34.34924 42.00374
Litoria aruensis Anura DD Arboreal 26.642976 38.07928 34.19580 41.79179
Litoria aruensis Anura DD Arboreal 26.252276 38.02559 34.14628 41.70515
Litoria aruensis Anura DD Arboreal 27.568124 38.20640 34.22625 41.92021
Litoria auae Anura LC Arboreal 27.088377 38.19559 34.45195 41.80082
Litoria auae Anura LC Arboreal 26.221105 38.07498 34.34543 41.67561
Litoria auae Anura LC Arboreal 28.673883 38.41608 34.63839 42.02422
Litoria cyclorhyncha Anura LC Semi-aquatic 19.510214 36.57458 33.91738 39.29680
Litoria cyclorhyncha Anura LC Semi-aquatic 18.013422 36.37107 33.93108 39.27378
Litoria cyclorhyncha Anura LC Semi-aquatic 22.716455 37.01052 34.46723 39.88940
Litoria moorei Anura LC Semi-aquatic 20.243294 36.71012 33.86135 39.46200
Litoria moorei Anura LC Semi-aquatic 18.742754 36.50207 33.73175 39.25757
Litoria moorei Anura LC Semi-aquatic 23.185369 37.11806 34.49993 40.22996
Litoria raniformis Anura EN Semi-aquatic 18.134790 36.44735 33.34141 39.45247
Litoria raniformis Anura EN Semi-aquatic 16.378747 36.20784 32.86454 38.99161
Litoria raniformis Anura EN Semi-aquatic 21.006190 36.83899 33.66049 39.82832
Litoria nudidigita Anura LC Arboreal 19.394219 34.71405 32.03605 37.12512
Litoria nudidigita Anura LC Arboreal 17.544298 34.44962 31.83110 36.84299
Litoria nudidigita Anura LC Arboreal 22.314923 35.13154 32.69252 37.92467
Litoria daviesae Anura VU Stream-dwelling 21.773096 34.96470 31.89246 37.70067
Litoria daviesae Anura VU Stream-dwelling 20.252034 34.75199 31.73881 37.50123
Litoria daviesae Anura VU Stream-dwelling 24.258350 35.31225 32.09910 38.03747
Litoria subglandulosa Anura VU Stream-dwelling 22.550206 34.97809 32.02452 37.64607
Litoria subglandulosa Anura VU Stream-dwelling 21.072743 34.77012 31.96886 37.52602
Litoria subglandulosa Anura VU Stream-dwelling 25.034127 35.32774 32.43272 38.12067
Litoria spenceri Anura CR Stream-dwelling 19.291667 34.41107 31.74117 36.86167
Litoria spenceri Anura CR Stream-dwelling 17.254203 34.12538 31.42914 36.41900
Litoria spenceri Anura CR Stream-dwelling 22.663549 34.88387 32.26834 37.55351
Litoria becki Anura LC Stream-dwelling 26.444448 37.40433 33.55088 41.43537
Litoria becki Anura LC Stream-dwelling 25.432989 37.26576 33.47966 41.34951
Litoria becki Anura LC Stream-dwelling 27.586057 37.56072 33.64931 41.59225
Litoria biakensis Anura DD Arboreal 27.056076 37.99271 34.10604 41.69499
Litoria biakensis Anura DD Arboreal 26.538262 37.92237 34.05370 41.61649
Litoria biakensis Anura DD Arboreal 28.456682 38.18300 34.14070 41.84129
Litoria bibonius Anura LC Arboreal 27.178121 38.04146 34.03128 41.97518
Litoria bibonius Anura LC Arboreal 26.725102 37.97862 33.99063 41.92157
Litoria bibonius Anura LC Arboreal 28.236662 38.18831 34.10894 42.12848
Litoria brevipalmata Anura EN Ground-dwelling 22.562685 37.60855 33.99288 41.90168
Litoria brevipalmata Anura EN Ground-dwelling 21.160533 37.42019 33.79413 41.67519
Litoria brevipalmata Anura EN Ground-dwelling 24.857236 37.91679 33.94249 41.98373
Nyctimystes avocalis Anura LC Stream-dwelling 27.178121 37.60299 33.48617 41.21885
Nyctimystes avocalis Anura LC Stream-dwelling 26.725102 37.54048 33.40009 41.09222
Nyctimystes avocalis Anura LC Stream-dwelling 28.236662 37.74903 33.59587 41.39685
Nyctimystes montanus Anura DD Stream-dwelling 27.691081 37.64203 33.32069 41.30338
Nyctimystes montanus Anura DD Stream-dwelling 27.058861 37.55625 33.27438 41.22494
Nyctimystes montanus Anura DD Stream-dwelling 28.831284 37.79675 33.42104 41.53381
Nyctimystes granti Anura LC Stream-dwelling 26.811655 37.63289 33.98075 41.78617
Nyctimystes granti Anura LC Stream-dwelling 26.142383 37.54178 33.90236 41.64327
Nyctimystes granti Anura LC Stream-dwelling 28.211262 37.82342 34.14209 42.08028
Nyctimystes oktediensis Anura LC Arboreal 27.036483 38.04505 34.76744 41.80217
Nyctimystes oktediensis Anura LC Arboreal 26.372559 37.95436 34.73918 41.78034
Nyctimystes oktediensis Anura LC Arboreal 28.645698 38.26487 34.91007 42.08325
Nyctimystes cheesmani Anura LC Stream-dwelling 26.009943 37.44472 33.64086 41.37861
Nyctimystes cheesmani Anura LC Stream-dwelling 25.170632 37.33090 33.51820 41.24683
Nyctimystes cheesmani Anura LC Stream-dwelling 27.653771 37.66765 33.80054 41.67637
Nyctimystes disruptus Anura LC Stream-dwelling 25.911299 37.47277 33.75184 41.67021
Nyctimystes disruptus Anura LC Stream-dwelling 24.960118 37.34093 33.37816 41.23090
Nyctimystes disruptus Anura LC Stream-dwelling 27.290163 37.66389 33.83099 41.77832
Nyctimystes daymani Anura LC Stream-dwelling 27.445192 37.63094 33.85952 41.44295
Nyctimystes daymani Anura LC Stream-dwelling 26.825280 37.54457 33.79541 41.32520
Nyctimystes daymani Anura LC Stream-dwelling 28.763956 37.81468 33.85569 41.49897
Nyctimystes obsoletus Anura DD Stream-dwelling 26.147605 37.40402 33.80681 41.34661
Nyctimystes obsoletus Anura DD Stream-dwelling 25.217439 37.27558 33.72494 41.20317
Nyctimystes obsoletus Anura DD Stream-dwelling 27.388036 37.57531 33.91600 41.50588
Nyctimystes gularis Anura LC Stream-dwelling 27.231939 37.57635 33.79632 41.49167
Nyctimystes gularis Anura LC Stream-dwelling 26.334073 37.45497 33.74673 41.42248
Nyctimystes gularis Anura LC Stream-dwelling 28.929734 37.80587 33.89247 41.60576
Nyctimystes fluviatilis Anura LC Stream-dwelling 26.582182 37.53743 33.85475 41.54720
Nyctimystes fluviatilis Anura LC Stream-dwelling 25.916692 37.44657 33.83046 41.51012
Nyctimystes fluviatilis Anura LC Stream-dwelling 27.857058 37.71148 33.69278 41.44300
Nyctimystes foricula Anura LC Stream-dwelling 26.446444 37.53858 33.47292 41.14689
Nyctimystes foricula Anura LC Stream-dwelling 25.445586 37.39952 33.38429 40.97989
Nyctimystes foricula Anura LC Stream-dwelling 27.738100 37.71804 33.52324 41.31828
Nyctimystes semipalmatus Anura LC Stream-dwelling 26.409962 37.52984 33.91888 41.70583
Nyctimystes semipalmatus Anura LC Stream-dwelling 25.478857 37.40163 33.84689 41.49851
Nyctimystes semipalmatus Anura LC Stream-dwelling 27.999986 37.74878 33.99212 41.89583
Nyctimystes kuduki Anura DD Stream-dwelling 26.505276 37.51101 33.61710 41.14843
Nyctimystes kuduki Anura DD Stream-dwelling 25.513007 37.37632 33.48464 40.94638
Nyctimystes kuduki Anura DD Stream-dwelling 28.048503 37.72049 33.71385 41.40365
Nyctimystes humeralis Anura LC Stream-dwelling 26.448427 37.50388 34.00059 41.27818
Nyctimystes humeralis Anura LC Stream-dwelling 25.613376 37.39159 33.94462 41.16645
Nyctimystes humeralis Anura LC Stream-dwelling 27.870543 37.69512 34.00788 41.41332
Nyctimystes zweifeli Anura LC Stream-dwelling 26.588116 37.55800 33.59949 41.49079
Nyctimystes zweifeli Anura LC Stream-dwelling 25.771977 37.44571 33.89198 41.74132
Nyctimystes zweifeli Anura LC Stream-dwelling 28.130705 37.77025 33.87288 41.80745
Nyctimystes trachydermis Anura LC Stream-dwelling 26.973410 37.60478 34.02400 41.59481
Nyctimystes trachydermis Anura LC Stream-dwelling 26.114056 37.48880 33.88197 41.41450
Nyctimystes trachydermis Anura LC Stream-dwelling 28.454733 37.80471 34.12580 41.81736
Nyctimystes kubori Anura LC Stream-dwelling 26.520223 37.46843 33.77871 41.45824
Nyctimystes kubori Anura LC Stream-dwelling 25.620741 37.34591 33.58799 41.24001
Nyctimystes kubori Anura LC Stream-dwelling 27.956674 37.66409 34.04735 41.82590
Nyctimystes narinosus Anura LC Stream-dwelling 25.688679 37.41150 33.83889 41.19470
Nyctimystes narinosus Anura LC Stream-dwelling 24.739428 37.27913 33.75698 41.06210
Nyctimystes narinosus Anura LC Stream-dwelling 27.188957 37.62071 33.94803 41.34674
Nyctimystes papua Anura LC Stream-dwelling 27.066230 37.65236 33.97135 41.80995
Nyctimystes papua Anura LC Stream-dwelling 26.273353 37.54294 33.46164 41.24469
Nyctimystes papua Anura LC Stream-dwelling 28.533130 37.85479 34.15937 41.97053
Nyctimystes pulcher Anura LC Stream-dwelling 26.465922 37.58933 33.57076 41.31591
Nyctimystes pulcher Anura LC Stream-dwelling 25.635089 37.47543 33.51268 41.17608
Nyctimystes pulcher Anura LC Stream-dwelling 27.853511 37.77955 33.66171 41.47166
Nyctimystes perimetri Anura LC Stream-dwelling 27.211163 37.62996 33.96889 41.42886
Nyctimystes perimetri Anura LC Stream-dwelling 26.781256 37.57076 33.92583 41.36464
Nyctimystes perimetri Anura LC Stream-dwelling 28.187362 37.76437 33.96168 41.44406
Nyctimystes persimilis Anura LC Stream-dwelling 27.346472 37.66164 33.89934 41.64492
Nyctimystes persimilis Anura LC Stream-dwelling 26.794731 37.58511 33.87638 41.54851
Nyctimystes persimilis Anura LC Stream-dwelling 28.681968 37.84688 33.91240 41.73041
Litoria vocivincens Anura LC Ground-dwelling 27.163309 38.27084 34.09153 41.71953
Litoria vocivincens Anura LC Ground-dwelling 26.401221 38.16619 33.96155 41.61634
Litoria vocivincens Anura LC Ground-dwelling 28.598310 38.46789 34.28656 41.89685
Litoria brongersmai Anura LC Stream-dwelling 25.545808 37.41763 33.23150 41.17234
Litoria brongersmai Anura LC Stream-dwelling 24.841311 37.32108 33.27580 41.17333
Litoria brongersmai Anura LC Stream-dwelling 26.847901 37.59609 33.37744 41.37202
Litoria bulmeri Anura LC Stream-dwelling 27.073878 37.66775 33.72551 41.26146
Litoria bulmeri Anura LC Stream-dwelling 26.159464 37.54294 33.75754 41.25137
Litoria bulmeri Anura LC Stream-dwelling 28.396109 37.84821 33.82969 41.45734
Litoria burrowsi Anura NT Arboreal 15.992274 36.59594 32.75623 40.11487
Litoria burrowsi Anura NT Arboreal 14.430284 36.38176 32.50571 39.85238
Litoria burrowsi Anura NT Arboreal 18.451495 36.93314 33.23396 40.64788
Litoria rivicola Anura LC Stream-dwelling 27.117428 37.69016 33.89180 41.37352
Litoria rivicola Anura LC Stream-dwelling 26.564193 37.61474 33.81287 41.29315
Litoria rivicola Anura LC Stream-dwelling 28.292618 37.85038 33.95280 41.48190
Litoria gilleni Anura LC Arboreal 23.345479 38.51069 36.02429 41.09603
Litoria gilleni Anura LC Arboreal 21.188363 38.21394 35.76954 40.74419
Litoria gilleni Anura LC Arboreal 26.293768 38.91627 35.91035 41.31787
Litoria splendida Anura LC Arboreal 27.632432 39.09186 36.37637 41.67036
Litoria splendida Anura LC Arboreal 26.728402 38.96864 36.39058 41.60359
Litoria splendida Anura LC Arboreal 29.549262 39.35313 36.53192 41.97126
Litoria cavernicola Anura DD Arboreal 27.390362 39.01716 36.21825 41.78523
Litoria cavernicola Anura DD Arboreal 26.479370 38.89473 36.08143 41.57818
Litoria cavernicola Anura DD Arboreal 29.404664 39.28789 36.63643 42.32450
Litoria xanthomera Anura LC Arboreal 25.839243 39.20207 36.58475 41.55239
Litoria xanthomera Anura LC Arboreal 24.751165 39.05630 36.42988 41.30810
Litoria xanthomera Anura LC Arboreal 27.798001 39.46449 36.76078 41.89910
Litoria kumae Anura LC Arboreal 25.678539 38.93144 36.21951 41.90421
Litoria kumae Anura LC Arboreal 24.815076 38.81614 36.05250 41.69539
Litoria kumae Anura LC Arboreal 27.282440 39.14560 36.45601 42.20517
Litoria capitula Anura DD Arboreal 27.296984 38.13979 34.14783 41.81088
Litoria capitula Anura DD Arboreal 26.789861 38.07009 34.33203 41.97640
Litoria capitula Anura DD Arboreal 28.276008 38.27433 34.22441 41.95911
Litoria chrisdahli Anura LC Arboreal 25.985811 37.98871 34.07722 41.69190
Litoria chrisdahli Anura LC Arboreal 25.442405 37.91367 34.02958 41.63080
Litoria chrisdahli Anura LC Arboreal 26.744245 38.09345 34.14371 41.82795
Litoria christianbergmanni Anura LC Arboreal 27.130951 38.22412 34.47958 42.20337
Litoria christianbergmanni Anura LC Arboreal 26.549154 38.14356 34.44227 42.13206
Litoria christianbergmanni Anura LC Arboreal 28.263035 38.38089 34.27044 42.06637
Litoria congenita Anura LC Arboreal 27.084061 39.11730 35.88783 42.08858
Litoria congenita Anura LC Arboreal 26.410753 39.02489 35.81229 41.98077
Litoria congenita Anura LC Arboreal 28.517589 39.31403 36.03375 42.37605
Litoria dentata Anura LC Arboreal 22.305697 38.51300 35.29350 41.54138
Litoria dentata Anura LC Arboreal 20.868296 38.31267 35.17101 41.40102
Litoria dentata Anura LC Arboreal 24.637648 38.83801 35.76895 42.22166
Litoria electrica Anura LC Arboreal 25.673100 39.13670 36.22580 42.15218
Litoria electrica Anura LC Arboreal 24.213813 38.93632 35.84683 41.68810
Litoria electrica Anura LC Arboreal 28.112077 39.47160 36.37019 42.45854
Litoria contrastens Anura LC Semi-aquatic 26.517079 38.30159 34.27794 42.16703
Litoria contrastens Anura LC Semi-aquatic 25.450240 38.15430 34.14062 42.04762
Litoria contrastens Anura LC Semi-aquatic 27.863476 38.48749 34.48757 42.40720
Litoria cooloolensis Anura EN Arboreal 23.691788 37.69393 33.92635 41.38838
Litoria cooloolensis Anura EN Arboreal 22.456931 37.52400 33.78370 41.19816
Litoria cooloolensis Anura EN Arboreal 25.652452 37.96373 34.19862 41.74182
Litoria coplandi Anura LC Arboreal 27.299125 38.33684 34.50400 41.66819
Litoria coplandi Anura LC Arboreal 26.186109 38.18039 34.47681 41.63155
Litoria coplandi Anura LC Arboreal 29.309242 38.61938 34.74004 41.99472
Litoria watjulumensis Anura LC Ground-dwelling 27.396426 38.43298 34.93221 41.94519
Litoria watjulumensis Anura LC Ground-dwelling 26.387478 38.29407 34.83680 41.77660
Litoria watjulumensis Anura LC Ground-dwelling 29.411491 38.71042 35.16312 42.30493
Litoria dayi Anura EN Stream-dwelling 25.919597 37.55055 33.71085 41.20559
Litoria dayi Anura EN Stream-dwelling 24.862524 37.40389 33.55962 40.99877
Litoria dayi Anura EN Stream-dwelling 27.828630 37.81541 34.00329 41.67117
Litoria nannotis Anura LC Stream-dwelling 25.877782 37.53569 33.70810 41.48396
Litoria nannotis Anura LC Stream-dwelling 24.780826 37.38664 33.64452 41.32000
Litoria nannotis Anura LC Stream-dwelling 27.871139 37.80654 33.89654 41.78858
Litoria rheocola Anura EN Arboreal 26.052659 38.02770 34.40136 41.91439
Litoria rheocola Anura EN Arboreal 25.041473 37.88943 34.28180 41.72743
Litoria rheocola Anura EN Arboreal 27.882701 38.27794 34.47307 42.10047
Litoria dorsalis Anura LC Arboreal 27.104054 38.09080 33.75092 41.64642
Litoria dorsalis Anura LC Arboreal 26.259566 37.97678 33.66564 41.53486
Litoria dorsalis Anura LC Arboreal 28.648582 38.29933 33.99970 41.93140
Litoria microbelos Anura LC Ground-dwelling 27.608266 38.40176 34.11002 42.07100
Litoria microbelos Anura LC Ground-dwelling 26.710171 38.27825 34.00527 41.88810
Litoria microbelos Anura LC Ground-dwelling 29.403945 38.64871 34.31508 42.44366
Litoria longirostris Anura LC Arboreal 27.348775 38.10843 33.52970 41.64645
Litoria longirostris Anura LC Arboreal 26.621133 38.00937 33.47374 41.52993
Litoria longirostris Anura LC Arboreal 29.170020 38.35637 33.62877 41.83458
Litoria meiriana Anura LC Semi-aquatic 27.816916 38.60929 34.58117 42.64387
Litoria meiriana Anura LC Semi-aquatic 26.869156 38.47969 34.44692 42.48241
Litoria meiriana Anura LC Semi-aquatic 29.740484 38.87233 34.74711 42.91147
Litoria dorsivena Anura LC Stream-dwelling 26.425281 37.54959 32.99746 41.09434
Litoria dorsivena Anura LC Stream-dwelling 25.719298 37.45394 33.43277 41.51846
Litoria dorsivena Anura LC Stream-dwelling 27.851124 37.74278 33.85516 42.06898
Litoria dux Anura LC Arboreal 25.605869 37.89086 34.18867 42.01596
Litoria dux Anura LC Arboreal 24.666225 37.76091 34.11568 41.88699
Litoria dux Anura LC Arboreal 26.887969 38.06818 34.26111 42.11529
Litoria infrafrenata Anura LC Arboreal 27.137771 38.07730 34.16278 41.97496
Litoria infrafrenata Anura LC Arboreal 26.466473 37.98274 34.02155 41.83591
Litoria infrafrenata Anura LC Arboreal 28.446958 38.26171 34.37094 42.20476
Litoria elkeae Anura LC Arboreal 26.516389 37.92308 34.28716 42.31276
Litoria elkeae Anura LC Arboreal 25.849933 37.83163 34.20809 42.19477
Litoria elkeae Anura LC Arboreal 27.829352 38.10326 34.05155 42.13146
Litoria exophthalmia Anura LC Stream-dwelling 26.308480 37.40620 33.45287 41.22463
Litoria exophthalmia Anura LC Stream-dwelling 25.369937 37.27872 33.35193 41.07614
Litoria exophthalmia Anura LC Stream-dwelling 27.737291 37.60027 33.71094 41.58428
Litoria genimaculata Anura LC Arboreal 26.744536 37.43715 34.10581 41.55148
Litoria genimaculata Anura LC Arboreal 25.977376 37.32971 33.99146 41.40716
Litoria genimaculata Anura LC Arboreal 28.123263 37.63023 34.18274 41.73054
Litoria everetti Anura DD Arboreal 27.319213 38.12433 34.37277 41.94910
Litoria everetti Anura DD Arboreal 26.753456 38.04766 34.34992 41.88750
Litoria everetti Anura DD Arboreal 28.503164 38.28476 34.48504 42.17437
Litoria littlejohni Anura LC Arboreal 20.766294 34.87213 32.51506 37.58900
Litoria littlejohni Anura LC Arboreal 19.180838 34.65546 32.23701 37.20551
Litoria littlejohni Anura LC Arboreal 23.212992 35.20649 32.73813 37.94018
Litoria paraewingi Anura LC Arboreal 19.599805 34.53619 32.20810 36.97326
Litoria paraewingi Anura LC Arboreal 17.584777 34.25555 32.12253 36.80595
Litoria paraewingi Anura LC Arboreal 23.061074 35.01826 32.79510 37.69949
Litoria revelata Anura LC Arboreal 22.507060 35.05986 32.42733 37.38154
Litoria revelata Anura LC Arboreal 21.108630 34.86710 32.37989 37.32301
Litoria revelata Anura LC Arboreal 24.777939 35.37290 32.74931 37.82728
Litoria jervisiensis Anura LC Arboreal 20.294613 35.10150 32.76235 37.92291
Litoria jervisiensis Anura LC Arboreal 18.652494 34.87025 32.50012 37.56399
Litoria jervisiensis Anura LC Arboreal 22.856304 35.46224 33.03995 38.27954
Litoria olongburensis Anura VU Arboreal 23.405152 38.72577 35.74547 41.52810
Litoria olongburensis Anura VU Arboreal 22.117937 38.55660 35.63135 41.35601
Litoria olongburensis Anura VU Arboreal 25.482876 38.99884 36.23964 42.17520
Litoria flavescens Anura LC Arboreal 27.496748 38.04636 34.34445 41.65039
Litoria flavescens Anura LC Arboreal 27.054862 37.98578 34.31929 41.59625
Litoria flavescens Anura LC Arboreal 28.559885 38.19213 34.41657 41.79245
Litoria latopalmata Anura LC Ground-dwelling 24.042716 36.76841 34.25658 39.67520
Litoria latopalmata Anura LC Ground-dwelling 22.568944 36.55754 33.85997 39.18722
Litoria latopalmata Anura LC Ground-dwelling 26.633909 37.13916 34.48596 40.04925
Litoria tornieri Anura LC Ground-dwelling 27.804055 37.37954 34.14717 40.41863
Litoria tornieri Anura LC Ground-dwelling 26.857101 37.24496 34.01739 40.21452
Litoria tornieri Anura LC Ground-dwelling 29.693068 37.64801 34.15671 40.63936
Litoria inermis Anura LC Ground-dwelling 26.413601 37.15910 34.11190 40.57062
Litoria inermis Anura LC Ground-dwelling 25.234983 36.99389 33.97154 40.35814
Litoria inermis Anura LC Ground-dwelling 28.582365 37.46312 34.12584 40.69760
Litoria pallida Anura LC Ground-dwelling 27.053580 37.20744 34.16709 40.38576
Litoria pallida Anura LC Ground-dwelling 25.959883 37.05539 33.87849 40.00689
Litoria pallida Anura LC Ground-dwelling 29.119423 37.49465 34.47722 40.81732
Litoria fuscula Anura DD Stream-dwelling 23.777654 37.26833 33.52539 41.08438
Litoria fuscula Anura DD Stream-dwelling 22.879292 37.14248 33.34572 40.86753
Litoria fuscula Anura DD Stream-dwelling 25.403142 37.49602 33.72242 41.35246
Litoria graminea Anura LC Arboreal 26.950747 38.01964 33.92042 41.79960
Litoria graminea Anura LC Arboreal 25.961851 37.88585 33.77536 41.58575
Litoria graminea Anura LC Arboreal 28.437675 38.22080 33.93094 41.87668
Litoria havina Anura LC Arboreal 27.418294 38.06346 34.60721 42.37053
Litoria havina Anura LC Arboreal 26.694859 37.96389 34.55931 42.25811
Litoria havina Anura LC Arboreal 28.925106 38.27086 34.74359 42.60759
Litoria multiplica Anura LC Stream-dwelling 25.815190 37.47468 33.67472 41.27800
Litoria multiplica Anura LC Stream-dwelling 24.942316 37.35393 33.61921 41.13160
Litoria multiplica Anura LC Stream-dwelling 27.295085 37.67941 33.76882 41.52621
Litoria hilli Anura LC Arboreal 27.211163 38.24327 34.54127 42.08701
Litoria hilli Anura LC Arboreal 26.781256 38.18422 34.51563 42.03018
Litoria hilli Anura LC Arboreal 28.187362 38.37734 34.53330 42.17791
Litoria humboldtorum Anura LC Arboreal 26.688517 38.08487 34.25504 41.99693
Litoria humboldtorum Anura LC Arboreal 26.270311 38.02761 34.17214 41.90860
Litoria humboldtorum Anura LC Arboreal 27.623932 38.21294 34.36505 42.18294
Litoria hunti Anura LC Arboreal 26.722188 37.94646 33.83549 41.64186
Litoria hunti Anura LC Arboreal 26.125286 37.86413 34.20093 42.01499
Litoria hunti Anura LC Arboreal 27.862948 38.10380 33.96969 41.84143
Litoria impura Anura LC Arboreal 27.101565 38.12392 34.03950 42.13854
Litoria impura Anura LC Arboreal 26.396064 38.02608 33.96458 42.02120
Litoria impura Anura LC Arboreal 28.589923 38.33032 34.29450 42.47994
Litoria thesaurensis Anura LC Arboreal 27.159628 38.09128 34.20651 42.04659
Litoria thesaurensis Anura LC Arboreal 26.472515 37.99683 34.17019 41.99261
Litoria thesaurensis Anura LC Arboreal 28.418798 38.26438 34.33198 42.27878
Litoria iris Anura LC Arboreal 26.261570 37.98121 34.08186 41.76840
Litoria iris Anura LC Arboreal 25.438501 37.86870 33.97342 41.65658
Litoria iris Anura LC Arboreal 27.758504 38.18583 34.18951 41.98041
Litoria majikthise Anura LC Arboreal 27.502423 38.09609 34.43794 42.03699
Litoria majikthise Anura LC Arboreal 26.907733 38.01522 34.36547 41.92057
Litoria majikthise Anura LC Arboreal 29.052931 38.30694 34.62684 42.34915
Litoria pronimia Anura LC Arboreal 25.926862 37.97795 34.25761 41.62535
Litoria pronimia Anura LC Arboreal 25.098278 37.86560 34.19080 41.49240
Litoria pronimia Anura LC Arboreal 27.493739 38.19041 34.46210 41.95817
Litoria spartacus Anura DD Arboreal 26.959804 38.14499 34.18335 41.90539
Litoria spartacus Anura DD Arboreal 26.050639 38.02208 34.07888 41.76585
Litoria spartacus Anura DD Arboreal 28.642654 38.37248 34.30470 42.18371
Litoria leucova Anura LC Stream-dwelling 27.614602 37.68379 33.70693 41.44504
Litoria leucova Anura LC Stream-dwelling 26.684459 37.55808 33.59874 41.30609
Litoria leucova Anura LC Stream-dwelling 28.994251 37.87025 33.86773 41.70540
Litoria longicrus Anura DD Arboreal 27.380483 38.07072 33.97536 42.08925
Litoria longicrus Anura DD Arboreal 26.816070 37.99377 33.90607 41.95757
Litoria longicrus Anura DD Arboreal 28.404724 38.21034 34.04979 42.25503
Litoria lorica Anura CR Stream-dwelling 26.415710 37.49070 33.59735 41.52407
Litoria lorica Anura CR Stream-dwelling 25.165581 37.31420 33.19933 41.04809
Litoria lorica Anura CR Stream-dwelling 28.731015 37.81760 34.00048 41.90788
Litoria louisiadensis Anura LC Stream-dwelling 27.383830 37.61593 33.86790 41.66393
Litoria louisiadensis Anura LC Stream-dwelling 26.980179 37.56060 33.69913 41.47777
Litoria louisiadensis Anura LC Stream-dwelling 28.297311 37.74113 33.97883 41.83021
Litoria lutea Anura LC Arboreal 27.643834 38.19249 34.65627 42.14973
Litoria lutea Anura LC Arboreal 27.166766 38.12672 34.63755 42.11834
Litoria lutea Anura LC Arboreal 28.621872 38.32732 34.77843 42.29154
Litoria macki Anura LC Stream-dwelling 23.777654 37.23573 32.96972 40.90800
Litoria macki Anura LC Stream-dwelling 22.879292 37.11276 32.87631 40.78205
Litoria macki Anura LC Stream-dwelling 25.403142 37.45823 33.30910 41.27893
Litoria mareku Anura DD Arboreal 27.845401 38.19619 34.26184 42.16152
Litoria mareku Anura DD Arboreal 27.169969 38.10251 34.17583 42.01719
Litoria mareku Anura DD Arboreal 29.078135 38.36716 34.32657 42.34024
Litoria megalops Anura DD Stream-dwelling 23.777654 37.24203 33.38287 41.13894
Litoria megalops Anura DD Stream-dwelling 22.879292 37.11797 33.28457 40.92395
Litoria megalops Anura DD Stream-dwelling 25.403142 37.46650 33.37087 41.26777
Litoria mucro Anura LC Arboreal 26.823704 38.05448 34.14514 41.82863
Litoria mucro Anura LC Arboreal 26.200244 37.96907 34.10942 41.71824
Litoria mucro Anura LC Arboreal 27.962764 38.21051 34.13326 41.90204
Litoria multicolor Anura DD Arboreal 27.768241 38.21804 34.47910 42.22821
Litoria multicolor Anura DD Arboreal 27.114415 38.12906 34.38086 42.09061
Litoria multicolor Anura DD Arboreal 28.954709 38.37951 34.58712 42.35339
Litoria myola Anura CR Stream-dwelling 26.415710 37.42679 33.44921 41.15155
Litoria myola Anura CR Stream-dwelling 25.165581 37.25727 33.30799 40.95206
Litoria myola Anura CR Stream-dwelling 28.731015 37.74076 33.87720 41.78081
Litoria mystax Anura DD Arboreal 25.083099 37.93069 34.04080 41.45087
Litoria mystax Anura DD Arboreal 24.397038 37.83618 33.92008 41.30396
Litoria mystax Anura DD Arboreal 26.341138 38.10398 34.28714 41.76714
Litoria napaea Anura LC Stream-dwelling 25.656315 37.50164 33.22373 40.97655
Litoria napaea Anura LC Stream-dwelling 24.937079 37.40323 33.10520 40.84896
Litoria napaea Anura LC Stream-dwelling 26.983215 37.68320 33.42897 41.25291
Litoria nigropunctata Anura LC Arboreal 26.727601 38.12841 33.84543 41.69932
Litoria nigropunctata Anura LC Arboreal 25.999451 38.02881 33.87191 41.71101
Litoria nigropunctata Anura LC Arboreal 27.939323 38.29416 34.00419 41.87919
Litoria prora Anura LC Arboreal 27.586725 38.21264 34.58119 42.40400
Litoria prora Anura LC Arboreal 26.740677 38.09671 34.18669 41.94211
Litoria prora Anura LC Arboreal 29.191270 38.43251 34.68611 42.60655
Litoria obtusirostris Anura DD Arboreal 26.716865 38.06659 34.56735 41.91833
Litoria obtusirostris Anura DD Arboreal 26.327417 38.01250 34.50019 41.84034
Litoria obtusirostris Anura DD Arboreal 27.580709 38.18659 34.52081 41.90802
Litoria oenicolen Anura LC Stream-dwelling 26.632623 37.51041 33.94329 41.52370
Litoria oenicolen Anura LC Stream-dwelling 25.496537 37.35656 33.64265 41.14257
Litoria oenicolen Anura LC Stream-dwelling 27.846221 37.67476 34.01367 41.62689
Litoria ollauro Anura LC Arboreal 27.445192 38.19540 34.31802 42.05709
Litoria ollauro Anura LC Arboreal 26.825280 38.11154 34.22486 41.94012
Litoria ollauro Anura LC Arboreal 28.763956 38.37380 34.35324 42.28242
Litoria personata Anura LC Ground-dwelling 28.278140 38.45662 34.77033 41.91612
Litoria personata Anura LC Ground-dwelling 27.215188 38.30894 34.79469 41.87653
Litoria personata Anura LC Ground-dwelling 30.228598 38.72759 35.05414 42.26963
Litoria pratti Anura DD Stream-dwelling 27.684188 37.81520 34.07899 41.67550
Litoria pratti Anura DD Stream-dwelling 27.023635 37.72467 33.94252 41.51591
Litoria pratti Anura DD Stream-dwelling 28.894540 37.98107 34.26019 41.87851
Litoria purpureolata Anura LC Arboreal 25.988046 37.98382 34.25646 41.95173
Litoria purpureolata Anura LC Arboreal 25.252203 37.88478 34.18549 41.85825
Litoria purpureolata Anura LC Arboreal 27.260956 38.15515 34.20263 42.05004
Litoria pygmaea Anura LC Arboreal 26.958411 38.03127 34.01743 41.86862
Litoria pygmaea Anura LC Arboreal 26.234908 37.93313 33.89233 41.68217
Litoria pygmaea Anura LC Arboreal 28.352211 38.22033 34.20418 42.07956
Litoria quadrilineata Anura DD Arboreal 27.151257 38.21235 34.43386 42.31437
Litoria quadrilineata Anura DD Arboreal 26.630080 38.14045 34.36518 42.24890
Litoria quadrilineata Anura DD Arboreal 28.550003 38.40531 34.61066 42.55939
Litoria rara Anura DD Arboreal 26.358868 38.07072 34.50333 42.23835
Litoria rara Anura DD Arboreal 25.887808 38.00555 34.45363 42.16542
Litoria rara Anura DD Arboreal 27.535294 38.23347 34.63929 42.43089
Litoria richardsi Anura LC Arboreal 26.003827 37.88705 34.13606 41.67584
Litoria richardsi Anura LC Arboreal 25.058996 37.76036 34.07715 41.56323
Litoria richardsi Anura LC Arboreal 27.556283 38.09522 34.45311 42.02919
Litoria rubrops Anura LC Arboreal 27.431321 38.20656 34.84367 42.25103
Litoria rubrops Anura LC Arboreal 26.992459 38.14690 34.80789 42.19552
Litoria rubrops Anura LC Arboreal 28.476924 38.34871 34.91377 42.38755
Litoria sanguinolenta Anura LC Arboreal 27.395970 38.10820 34.15015 42.01652
Litoria sanguinolenta Anura LC Arboreal 26.793663 38.02550 34.07490 41.91926
Litoria sanguinolenta Anura LC Arboreal 28.896107 38.31420 34.41822 42.34188
Litoria scabra Anura LC Stream-dwelling 23.777654 37.21255 32.84754 41.18230
Litoria scabra Anura LC Stream-dwelling 22.879292 37.08884 32.71089 40.96915
Litoria scabra Anura LC Stream-dwelling 25.403142 37.43638 33.14446 41.60243
Litoria singadanae Anura LC Arboreal 25.605869 37.84493 33.99140 42.19429
Litoria singadanae Anura LC Arboreal 24.666225 37.71670 33.88009 42.06231
Litoria singadanae Anura LC Arboreal 26.887969 38.01990 34.11226 42.45030
Litoria spinifera Anura LC Stream-dwelling 25.635729 37.56288 33.56111 41.30049
Litoria spinifera Anura LC Stream-dwelling 24.759954 37.44094 33.45657 41.18374
Litoria spinifera Anura LC Stream-dwelling 27.136743 37.77187 33.74030 41.52179
Litoria staccato Anura LC Ground-dwelling 27.783079 38.40461 34.33535 42.06646
Litoria staccato Anura LC Ground-dwelling 27.002454 38.29834 34.22634 41.91494
Litoria staccato Anura LC Ground-dwelling 29.459716 38.63284 34.42884 42.26601
Litoria timida Anura LC Arboreal 27.607964 38.25431 34.54304 41.90728
Litoria timida Anura LC Arboreal 26.937509 38.16203 34.47464 41.80572
Litoria timida Anura LC Arboreal 29.202071 38.47373 34.68267 42.13130
Litoria umarensis Anura DD Arboreal 27.845401 38.11438 34.26971 42.15314
Litoria umarensis Anura DD Arboreal 27.169969 38.01956 34.19000 42.03498
Litoria umarensis Anura DD Arboreal 29.078135 38.28744 34.71006 42.65841
Litoria umbonata Anura DD Arboreal 25.572774 37.88215 34.09755 41.69444
Litoria umbonata Anura DD Arboreal 24.852902 37.78590 34.07816 41.62136
Litoria umbonata Anura DD Arboreal 27.035614 38.07774 34.27221 41.91606
Litoria vagabunda Anura DD Arboreal 27.136714 38.08821 34.37394 42.06948
Litoria vagabunda Anura DD Arboreal 26.717894 38.03018 34.17118 41.82638
Litoria vagabunda Anura DD Arboreal 28.108791 38.22287 34.34736 42.02740
Litoria verae Anura DD Arboreal 27.845401 38.23940 34.14057 41.69345
Litoria verae Anura DD Arboreal 27.169969 38.14564 34.15883 41.65514
Litoria verae Anura DD Arboreal 29.078135 38.41051 34.37771 42.05531
Litoria wapogaensis Anura DD Stream-dwelling 23.777654 37.18110 33.39310 41.15804
Litoria wapogaensis Anura DD Stream-dwelling 22.879292 37.05915 33.39397 41.08641
Litoria wapogaensis Anura DD Stream-dwelling 25.403142 37.40174 33.53798 41.33794
Litoria wisselensis Anura DD Semi-aquatic 25.590812 38.34202 34.81308 42.38390
Litoria wisselensis Anura DD Semi-aquatic 24.777979 38.23034 34.63216 42.13410
Litoria wisselensis Anura DD Semi-aquatic 27.055270 38.54323 35.08052 42.80733
Aplastodiscus albofrenatus Anura LC Arboreal 25.763710 38.70164 35.46555 41.83477
Aplastodiscus albofrenatus Anura LC Arboreal 24.738476 38.56756 35.44439 41.69268
Aplastodiscus albofrenatus Anura LC Arboreal 27.556081 38.93603 35.48946 41.98602
Aplastodiscus arildae Anura LC Arboreal 25.578171 38.52163 35.62058 41.32035
Aplastodiscus arildae Anura LC Arboreal 24.378783 38.36535 35.57111 41.25063
Aplastodiscus arildae Anura LC Arboreal 27.734221 38.80256 35.99097 41.83438
Aplastodiscus eugenioi Anura NT Arboreal 25.403136 38.67493 35.39537 41.67729
Aplastodiscus eugenioi Anura NT Arboreal 24.227190 38.51758 35.29496 41.55636
Aplastodiscus eugenioi Anura NT Arboreal 27.360502 38.93684 35.57132 42.03311
Aplastodiscus albosignatus Anura LC Arboreal 25.173935 39.05832 35.46721 42.71623
Aplastodiscus albosignatus Anura LC Arboreal 23.776046 38.87676 35.38710 42.57696
Aplastodiscus albosignatus Anura LC Arboreal 27.436008 39.35211 35.76468 43.12178
Aplastodiscus callipygius Anura LC Arboreal 25.473458 39.04203 35.29725 42.47903
Aplastodiscus callipygius Anura LC Arboreal 24.194941 38.87322 35.28509 42.37090
Aplastodiscus callipygius Anura LC Arboreal 27.720119 39.33867 35.51090 42.82013
Aplastodiscus cavicola Anura NT Arboreal 25.457410 39.06506 35.69624 42.62154
Aplastodiscus cavicola Anura NT Arboreal 24.490250 38.93959 35.60637 42.47110
Aplastodiscus cavicola Anura NT Arboreal 27.263337 39.29936 35.81529 42.77756
Aplastodiscus leucopygius Anura LC Arboreal 25.702635 39.04420 35.74385 42.97330
Aplastodiscus leucopygius Anura LC Arboreal 24.386884 38.87682 35.58567 42.76504
Aplastodiscus leucopygius Anura LC Arboreal 27.973238 39.33305 35.76376 43.12238
Aplastodiscus cochranae Anura LC Arboreal 24.385299 38.86923 35.30958 42.15455
Aplastodiscus cochranae Anura LC Arboreal 22.768352 38.65390 35.27770 42.09800
Aplastodiscus cochranae Anura LC Arboreal 26.844732 39.19674 35.77929 42.69847
Aplastodiscus perviridis Anura LC Arboreal 25.846373 39.05341 35.53267 42.84337
Aplastodiscus perviridis Anura LC Arboreal 24.458305 38.87439 35.21812 42.48413
Aplastodiscus perviridis Anura LC Arboreal 28.243524 39.36257 35.65620 43.06169
Aplastodiscus flumineus Anura DD Arboreal 26.332966 39.06284 35.30764 42.72535
Aplastodiscus flumineus Anura DD Arboreal 25.152380 38.91089 35.43645 42.81578
Aplastodiscus flumineus Anura DD Arboreal 28.199008 39.30301 35.79794 43.28034
Aplastodiscus ehrhardti Anura LC Arboreal 24.286047 38.85126 35.34511 42.33474
Aplastodiscus ehrhardti Anura LC Arboreal 22.619704 38.63312 35.15149 42.15184
Aplastodiscus ehrhardti Anura LC Arboreal 26.791598 39.17926 35.66876 42.77871
Aplastodiscus musicus Anura DD Arboreal 26.332966 39.06134 35.44385 42.34242
Aplastodiscus musicus Anura DD Arboreal 25.152380 38.90995 35.19773 42.06792
Aplastodiscus musicus Anura DD Arboreal 28.199008 39.30062 35.67054 42.60991
Bokermannohyla ahenea Anura DD Arboreal 26.367176 39.37535 35.62022 43.48738
Bokermannohyla ahenea Anura DD Arboreal 25.114381 39.21837 35.53574 43.27864
Bokermannohyla ahenea Anura DD Arboreal 28.661754 39.66287 35.88833 43.93015
Bokermannohyla alvarengai Anura LC Stream-dwelling 25.153496 38.80725 35.09923 43.14506
Bokermannohyla alvarengai Anura LC Stream-dwelling 23.897283 38.64286 34.68231 42.65313
Bokermannohyla alvarengai Anura LC Stream-dwelling 27.746348 39.14656 35.31046 43.41849
Bokermannohyla astartea Anura LC Arboreal 25.680928 39.25107 35.06631 43.08230
Bokermannohyla astartea Anura LC Arboreal 24.408234 39.08707 34.92475 42.88007
Bokermannohyla astartea Anura LC Arboreal 27.862758 39.53223 35.35456 43.35078
Bokermannohyla circumdata Anura LC Arboreal 25.444804 39.17340 34.86662 43.04903
Bokermannohyla circumdata Anura LC Arboreal 24.193739 39.01259 34.74452 42.87155
Bokermannohyla circumdata Anura LC Arboreal 27.800561 39.47621 35.35814 43.64016
Bokermannohyla hylax Anura LC Stream-dwelling 24.960018 38.68762 34.67072 42.89455
Bokermannohyla hylax Anura LC Stream-dwelling 23.377389 38.47979 34.70154 42.78892
Bokermannohyla hylax Anura LC Stream-dwelling 27.441473 39.01349 35.19986 43.59030
Bokermannohyla caramaschii Anura LC Arboreal 25.423201 39.33979 35.47618 43.03284
Bokermannohyla caramaschii Anura LC Arboreal 24.464023 39.21617 35.47038 42.98544
Bokermannohyla caramaschii Anura LC Arboreal 27.310470 39.58303 35.49210 43.23564
Bokermannohyla carvalhoi Anura LC Stream-dwelling 25.643016 38.93941 34.93218 42.70153
Bokermannohyla carvalhoi Anura LC Stream-dwelling 24.663294 38.81158 34.75810 42.49819
Bokermannohyla carvalhoi Anura LC Stream-dwelling 27.334947 39.16015 35.05683 42.96094
Bokermannohyla diamantina Anura LC Stream-dwelling 25.061238 38.76325 34.67806 42.64000
Bokermannohyla diamantina Anura LC Stream-dwelling 23.748489 38.59570 34.61010 42.51490
Bokermannohyla diamantina Anura LC Stream-dwelling 27.599603 39.08722 35.07428 43.08234
Bokermannohyla feioi Anura DD Arboreal 25.729467 39.37483 35.22605 43.31243
Bokermannohyla feioi Anura DD Arboreal 24.488809 39.21512 35.02508 43.02360
Bokermannohyla feioi Anura DD Arboreal 27.741619 39.63386 35.56535 43.78875
Bokermannohyla gouveai Anura DD Arboreal 26.367176 39.42990 35.38869 43.75351
Bokermannohyla gouveai Anura DD Arboreal 25.114381 39.26840 35.37269 43.64648
Bokermannohyla gouveai Anura DD Arboreal 28.661754 39.72568 35.79791 44.33155
Bokermannohyla ibitiguara Anura DD Stream-dwelling 25.516162 38.87431 34.73591 42.61138
Bokermannohyla ibitiguara Anura DD Stream-dwelling 24.345698 38.72462 34.61923 42.45922
Bokermannohyla ibitiguara Anura DD Stream-dwelling 27.818301 39.16874 34.89838 43.00565
Bokermannohyla ibitipoca Anura DD Ground-dwelling 25.729467 39.43393 35.82099 43.63673
Bokermannohyla ibitipoca Anura DD Ground-dwelling 24.488809 39.27464 35.83019 43.55668
Bokermannohyla ibitipoca Anura DD Ground-dwelling 27.741619 39.69227 35.83727 43.76169
Bokermannohyla itapoty Anura LC Stream-dwelling 24.722372 38.81329 35.06516 42.90034
Bokermannohyla itapoty Anura LC Stream-dwelling 23.532551 38.66091 35.03222 42.83625
Bokermannohyla itapoty Anura LC Stream-dwelling 27.169152 39.12665 35.19465 43.16729
Bokermannohyla izecksohni Anura CR Stream-dwelling 26.272616 38.97597 35.18744 42.98765
Bokermannohyla izecksohni Anura CR Stream-dwelling 25.009737 38.81252 35.22985 42.99510
Bokermannohyla izecksohni Anura CR Stream-dwelling 28.773414 39.29964 35.66999 43.66771
Bokermannohyla langei Anura DD Stream-dwelling 23.836674 38.65126 34.96668 42.77666
Bokermannohyla langei Anura DD Stream-dwelling 21.947547 38.40587 34.61562 42.31204
Bokermannohyla langei Anura DD Stream-dwelling 26.445416 38.99013 34.80448 42.75314
Bokermannohyla lucianae Anura DD Arboreal 25.361645 39.30237 35.62163 43.19219
Bokermannohyla lucianae Anura DD Arboreal 24.597670 39.20287 35.53949 43.08838
Bokermannohyla lucianae Anura DD Arboreal 26.767371 39.48545 35.77642 43.42515
Bokermannohyla luctuosa Anura LC Stream-dwelling 25.784677 38.92515 35.07469 42.76948
Bokermannohyla luctuosa Anura LC Stream-dwelling 24.390068 38.74600 34.95106 42.60738
Bokermannohyla luctuosa Anura LC Stream-dwelling 28.204652 39.23601 35.24129 42.84598
Bokermannohyla martinsi Anura LC Stream-dwelling 24.943914 38.84343 35.14889 42.99170
Bokermannohyla martinsi Anura LC Stream-dwelling 23.717986 38.68643 35.00266 42.87343
Bokermannohyla martinsi Anura LC Stream-dwelling 27.586350 39.18183 35.50645 43.46973
Bokermannohyla nanuzae Anura LC Stream-dwelling 24.826713 38.65781 34.84756 43.01124
Bokermannohyla nanuzae Anura LC Stream-dwelling 23.454470 38.48172 34.19755 42.29386
Bokermannohyla nanuzae Anura LC Stream-dwelling 27.381718 38.98567 35.02621 43.29653
Bokermannohyla oxente Anura LC Stream-dwelling 24.600450 38.74672 35.08128 42.87459
Bokermannohyla oxente Anura LC Stream-dwelling 23.434797 38.59716 34.96011 42.74385
Bokermannohyla oxente Anura LC Stream-dwelling 27.098415 39.06723 35.34653 43.18644
Bokermannohyla pseudopseudis Anura LC Stream-dwelling 26.826800 39.01119 34.68905 42.77100
Bokermannohyla pseudopseudis Anura LC Stream-dwelling 25.670195 38.86423 34.51595 42.56241
Bokermannohyla pseudopseudis Anura LC Stream-dwelling 28.949802 39.28094 35.31602 43.49048
Bokermannohyla ravida Anura CR Stream-dwelling 25.577625 38.81467 34.88721 42.63210
Bokermannohyla ravida Anura CR Stream-dwelling 24.411268 38.66702 34.72955 42.42651
Bokermannohyla ravida Anura CR Stream-dwelling 27.700990 39.08348 35.32062 43.09270
Bokermannohyla sagarana Anura NT Stream-dwelling 25.032695 38.68228 34.54463 42.49332
Bokermannohyla sagarana Anura NT Stream-dwelling 23.845628 38.52974 34.55945 42.46700
Bokermannohyla sagarana Anura NT Stream-dwelling 27.468231 38.99526 35.05260 43.17553
Bokermannohyla saxicola Anura LC Stream-dwelling 25.199175 38.82416 34.97513 42.81179
Bokermannohyla saxicola Anura LC Stream-dwelling 24.003904 38.66754 34.93724 42.73295
Bokermannohyla saxicola Anura LC Stream-dwelling 27.739380 39.15701 34.84640 42.76908
Bokermannohyla sazimai Anura DD Stream-dwelling 25.649306 38.88013 34.73712 43.03062
Bokermannohyla sazimai Anura DD Stream-dwelling 24.489485 38.73041 34.55509 42.84434
Bokermannohyla sazimai Anura DD Stream-dwelling 28.015513 39.18558 34.97215 43.40490
Bokermannohyla vulcaniae Anura VU Stream-dwelling 25.780397 38.90652 34.85430 43.02875
Bokermannohyla vulcaniae Anura VU Stream-dwelling 24.408242 38.73055 34.71055 42.82245
Bokermannohyla vulcaniae Anura VU Stream-dwelling 28.499830 39.25528 35.13585 43.50935
Hyloscirtus albopunctulatus Anura LC Arboreal 26.540933 38.55369 34.42486 42.27885
Hyloscirtus albopunctulatus Anura LC Arboreal 25.719502 38.44749 34.38353 42.27686
Hyloscirtus albopunctulatus Anura LC Arboreal 28.071082 38.75152 34.26164 42.30135
Hyloscirtus simmonsi Anura VU Stream-dwelling 24.339054 37.17622 34.14943 40.31884
Hyloscirtus simmonsi Anura VU Stream-dwelling 23.604569 37.08036 34.07529 40.20190
Hyloscirtus simmonsi Anura VU Stream-dwelling 25.715244 37.35584 34.19270 40.42447
Hyloscirtus armatus Anura NT Stream-dwelling 19.152462 37.17809 33.24099 41.49185
Hyloscirtus armatus Anura NT Stream-dwelling 18.108728 37.03988 33.09007 41.33204
Hyloscirtus armatus Anura NT Stream-dwelling 20.450076 37.34992 33.29579 41.57697
Hyloscirtus charazani Anura CR Stream-dwelling 16.937574 36.89759 33.25334 40.77391
Hyloscirtus charazani Anura CR Stream-dwelling 15.844970 36.75631 33.12864 40.66229
Hyloscirtus charazani Anura CR Stream-dwelling 18.635109 37.11710 33.34316 40.80996
Hyloscirtus bogotensis Anura NT Stream-dwelling 23.566380 37.79821 34.02813 42.02701
Hyloscirtus bogotensis Anura NT Stream-dwelling 22.796902 37.69729 33.71401 41.63910
Hyloscirtus bogotensis Anura NT Stream-dwelling 25.185642 38.01058 34.22402 42.34917
Hyloscirtus callipeza Anura VU Stream-dwelling 23.966024 37.95136 33.93615 41.73211
Hyloscirtus callipeza Anura VU Stream-dwelling 23.110664 37.83946 33.85622 41.66824
Hyloscirtus callipeza Anura VU Stream-dwelling 25.620181 38.16775 34.03369 41.79014
Hyloscirtus caucanus Anura EN Stream-dwelling 23.994788 37.89944 33.80368 41.81338
Hyloscirtus caucanus Anura EN Stream-dwelling 22.974522 37.76536 33.68013 41.67985
Hyloscirtus caucanus Anura EN Stream-dwelling 25.597923 38.11012 34.08615 42.05625
Hyloscirtus colymba Anura EN Stream-dwelling 27.158369 38.33517 34.62783 42.64502
Hyloscirtus colymba Anura EN Stream-dwelling 26.555580 38.25616 34.35206 42.32603
Hyloscirtus colymba Anura EN Stream-dwelling 28.385964 38.49609 34.75983 42.80562
Hyloscirtus pacha Anura EN Stream-dwelling 23.049225 37.70564 33.88762 41.91493
Hyloscirtus pacha Anura EN Stream-dwelling 21.493692 37.50231 33.61650 41.62048
Hyloscirtus pacha Anura EN Stream-dwelling 25.325715 38.00321 33.86537 41.95363
Hyloscirtus staufferorum Anura EN Stream-dwelling 23.762118 37.68595 34.06079 41.69922
Hyloscirtus staufferorum Anura EN Stream-dwelling 22.512604 37.52381 33.88415 41.50313
Hyloscirtus staufferorum Anura EN Stream-dwelling 25.638054 37.92938 34.11517 41.83135
Hyloscirtus psarolaimus Anura VU Stream-dwelling 21.643573 37.53901 33.65985 41.50117
Hyloscirtus psarolaimus Anura VU Stream-dwelling 19.874957 37.30359 33.27839 41.05841
Hyloscirtus psarolaimus Anura VU Stream-dwelling 23.939919 37.84467 33.94667 41.81364
Hyloscirtus ptychodactylus Anura EN Stream-dwelling 23.033729 37.71097 34.17692 41.69920
Hyloscirtus ptychodactylus Anura EN Stream-dwelling 21.190651 37.47043 33.69981 41.17712
Hyloscirtus ptychodactylus Anura EN Stream-dwelling 25.447074 38.02593 34.44738 41.98265
Hyloscirtus larinopygion Anura LC Arboreal 22.347642 38.02383 34.13410 41.76726
Hyloscirtus larinopygion Anura LC Arboreal 21.262332 37.88429 34.12671 41.73602
Hyloscirtus larinopygion Anura LC Arboreal 24.058248 38.24378 34.25804 42.01481
Hyloscirtus denticulentus Anura VU Stream-dwelling 22.690442 37.72939 33.81625 41.45988
Hyloscirtus denticulentus Anura VU Stream-dwelling 21.814015 37.61446 33.78547 41.37596
Hyloscirtus denticulentus Anura VU Stream-dwelling 24.424039 37.95672 34.05510 41.81414
Hyloscirtus jahni Anura VU Stream-dwelling 26.263875 38.19525 33.82193 42.08307
Hyloscirtus jahni Anura VU Stream-dwelling 25.397043 38.08005 33.74160 41.95235
Hyloscirtus jahni Anura VU Stream-dwelling 27.823709 38.40255 33.94124 42.31092
Hyloscirtus lascinius Anura LC Arboreal 25.530798 38.54835 34.62074 42.42824
Hyloscirtus lascinius Anura LC Arboreal 24.554387 38.42370 34.59250 42.32463
Hyloscirtus lascinius Anura LC Arboreal 27.216719 38.76357 34.90799 42.78400
Hyloscirtus palmeri Anura LC Stream-dwelling 25.070350 37.95929 33.85086 41.95489
Hyloscirtus palmeri Anura LC Stream-dwelling 24.253465 37.85437 33.71667 41.78508
Hyloscirtus palmeri Anura LC Stream-dwelling 26.531177 38.14691 33.81965 41.94970
Hyloscirtus lynchi Anura CR Stream-dwelling 21.907187 37.45390 33.59075 41.29630
Hyloscirtus lynchi Anura CR Stream-dwelling 20.925594 37.32674 33.54763 41.23131
Hyloscirtus lynchi Anura CR Stream-dwelling 23.573899 37.66983 33.98623 41.79855
Hyloscirtus pantostictus Anura CR Stream-dwelling 22.043563 37.61975 33.35098 40.95499
Hyloscirtus pantostictus Anura CR Stream-dwelling 20.823650 37.45830 33.32073 40.98058
Hyloscirtus pantostictus Anura CR Stream-dwelling 23.766620 37.84778 33.57537 41.23351
Hyloscirtus piceigularis Anura EN Stream-dwelling 24.590506 37.84425 34.28636 41.92890
Hyloscirtus piceigularis Anura EN Stream-dwelling 23.939511 37.75932 34.27585 41.87424
Hyloscirtus piceigularis Anura EN Stream-dwelling 25.994560 38.02741 34.20437 41.96318
Hyloscirtus platydactylus Anura VU Stream-dwelling 26.081594 38.10045 34.29461 42.23568
Hyloscirtus platydactylus Anura VU Stream-dwelling 25.212821 37.98718 34.19794 42.08726
Hyloscirtus platydactylus Anura VU Stream-dwelling 27.650603 38.30502 34.32586 42.25620
Hyloscirtus sarampiona Anura EN Stream-dwelling 22.833468 37.59730 33.55831 41.23885
Hyloscirtus sarampiona Anura EN Stream-dwelling 21.394430 37.40985 33.40779 41.08121
Hyloscirtus sarampiona Anura EN Stream-dwelling 24.669687 37.83649 33.86880 41.67217
Hyloscirtus tapichalaca Anura EN Stream-dwelling 23.756449 37.78486 33.59824 41.65986
Hyloscirtus tapichalaca Anura EN Stream-dwelling 23.027238 37.68894 33.88647 41.95248
Hyloscirtus tapichalaca Anura EN Stream-dwelling 25.254968 37.98198 33.80647 41.86770
Hyloscirtus torrenticola Anura VU Stream-dwelling 24.092767 37.95582 34.30868 41.81382
Hyloscirtus torrenticola Anura VU Stream-dwelling 23.030583 37.81564 34.16764 41.64920
Hyloscirtus torrenticola Anura VU Stream-dwelling 25.752264 38.17482 34.46527 42.05089
Myersiohyla inparquesi Anura NT Arboreal 25.661020 39.16612 35.59590 43.84327
Myersiohyla inparquesi Anura NT Arboreal 25.001401 39.08134 35.56392 43.84230
Myersiohyla inparquesi Anura NT Arboreal 27.238038 39.36882 35.56455 43.92466
Myersiohyla loveridgei Anura NT Ground-dwelling 25.661020 39.23283 35.22109 43.79291
Myersiohyla loveridgei Anura NT Ground-dwelling 25.001401 39.14779 35.15957 43.71758
Myersiohyla loveridgei Anura NT Ground-dwelling 27.238038 39.43613 35.15864 43.78224
Myersiohyla aromatica Anura VU Arboreal 25.661020 39.12910 34.59207 43.25966
Myersiohyla aromatica Anura VU Arboreal 25.001401 39.04498 34.52231 43.18247
Myersiohyla aromatica Anura VU Arboreal 27.238038 39.33020 34.83180 43.61665
Dendropsophus acreanus Anura LC Arboreal 27.154042 39.56380 35.60944 43.12050
Dendropsophus acreanus Anura LC Arboreal 26.392480 39.46913 35.61472 43.10233
Dendropsophus acreanus Anura LC Arboreal 28.767243 39.76432 36.28000 43.91405
Dendropsophus amicorum Anura CR Arboreal 26.357961 39.32360 35.70623 42.85711
Dendropsophus amicorum Anura CR Arboreal 25.399787 39.20566 35.47902 42.55427
Dendropsophus amicorum Anura CR Arboreal 27.780686 39.49872 35.72868 42.98787
Dendropsophus anataliasiasi Anura LC Arboreal 27.723005 39.55093 36.11624 43.15900
Dendropsophus anataliasiasi Anura LC Arboreal 26.774259 39.43343 36.05446 43.03076
Dendropsophus anataliasiasi Anura LC Arboreal 29.619825 39.78585 36.00782 43.21001
Dendropsophus aperomeus Anura LC Arboreal 21.934714 38.77063 35.00816 42.05297
Dendropsophus aperomeus Anura LC Arboreal 21.068152 38.66195 34.90209 41.92900
Dendropsophus aperomeus Anura LC Arboreal 23.643404 38.98493 35.22901 42.33884
Dendropsophus haraldschultzi Anura LC Arboreal 27.977919 39.53948 35.95546 43.19627
Dendropsophus haraldschultzi Anura LC Arboreal 27.206173 39.44334 35.87968 43.11512
Dendropsophus haraldschultzi Anura LC Arboreal 29.479270 39.72649 36.13403 43.44140
Dendropsophus araguaya Anura DD Arboreal 27.685153 39.57930 35.92891 43.16720
Dendropsophus araguaya Anura DD Arboreal 26.531936 39.43652 35.83154 42.96503
Dendropsophus araguaya Anura DD Arboreal 30.045751 39.87158 36.11359 43.50837
Dendropsophus battersbyi Anura DD Arboreal 25.952445 39.31934 35.81667 42.63610
Dendropsophus battersbyi Anura DD Arboreal 25.162227 39.22180 35.73106 42.50476
Dendropsophus battersbyi Anura DD Arboreal 27.063043 39.45641 35.97316 42.91729
Dendropsophus berthalutzae Anura LC Arboreal 25.452132 39.18983 35.70030 42.89207
Dendropsophus berthalutzae Anura LC Arboreal 24.249248 39.04266 35.70163 42.83372
Dendropsophus berthalutzae Anura LC Arboreal 27.473527 39.43713 35.81338 43.13561
Dendropsophus bipunctatus Anura LC Arboreal 25.342602 39.15228 35.82716 42.82415
Dendropsophus bipunctatus Anura LC Arboreal 24.476814 39.04570 35.74844 42.71575
Dendropsophus bipunctatus Anura LC Arboreal 26.857924 39.33882 35.99210 43.08988
Dendropsophus bogerti Anura LC Arboreal 24.478155 39.07124 35.29557 42.25989
Dendropsophus bogerti Anura LC Arboreal 23.562164 38.95839 35.18132 42.08438
Dendropsophus bogerti Anura LC Arboreal 25.961089 39.25393 35.45154 42.54403
Dendropsophus timbeba Anura LC Arboreal 27.863680 39.55632 36.13361 43.47816
Dendropsophus timbeba Anura LC Arboreal 27.029240 39.45400 36.06334 43.36957
Dendropsophus timbeba Anura LC Arboreal 29.437505 39.74929 36.41849 43.87855
Dendropsophus yaracuyanus Anura EN Arboreal 26.384918 39.34510 36.92292 42.43852
Dendropsophus yaracuyanus Anura EN Arboreal 25.623372 39.25247 36.81161 42.25894
Dendropsophus yaracuyanus Anura EN Arboreal 27.795946 39.51672 36.96815 42.54527
Dendropsophus cachimbo Anura DD Arboreal 27.370879 39.40662 35.82062 43.01210
Dendropsophus cachimbo Anura DD Arboreal 26.520654 39.30136 35.74631 42.90614
Dendropsophus cachimbo Anura DD Arboreal 28.989594 39.60701 35.86376 43.21383
Dendropsophus meridensis Anura EN Arboreal 26.081594 39.20299 36.35814 41.69288
Dendropsophus meridensis Anura EN Arboreal 25.212821 39.09543 36.27254 41.59619
Dendropsophus meridensis Anura EN Arboreal 27.650603 39.39723 36.45752 41.89100
Dendropsophus cerradensis Anura DD Arboreal 28.029809 39.54083 36.14973 43.13928
Dendropsophus cerradensis Anura DD Arboreal 26.982535 39.40949 36.02111 42.97624
Dendropsophus cerradensis Anura DD Arboreal 30.475230 39.84751 36.55585 43.81188
Dendropsophus columbianus Anura LC Arboreal 23.220839 38.85612 35.50263 42.41426
Dendropsophus columbianus Anura LC Arboreal 22.300895 38.74249 35.33650 42.21332
Dendropsophus columbianus Anura LC Arboreal 24.750633 39.04509 35.64634 42.54916
Dendropsophus gaucheri Anura LC Arboreal 27.054425 39.41166 36.06682 43.20638
Dendropsophus gaucheri Anura LC Arboreal 26.475473 39.33949 36.01952 43.14434
Dendropsophus gaucheri Anura LC Arboreal 28.401811 39.57964 36.16898 43.35768
Dendropsophus cruzi Anura LC Arboreal 27.168726 39.36161 35.82295 42.85610
Dendropsophus cruzi Anura LC Arboreal 26.046570 39.22371 35.72707 42.71506
Dendropsophus cruzi Anura LC Arboreal 29.236060 39.61564 35.97131 43.17070
Dendropsophus miyatai Anura LC Arboreal 27.910705 39.54589 36.03476 43.13631
Dendropsophus miyatai Anura LC Arboreal 27.162747 39.45316 36.00816 43.06809
Dendropsophus miyatai Anura LC Arboreal 29.450896 39.73684 36.16997 43.34490
Dendropsophus delarivai Anura LC Arboreal 21.227541 38.73708 35.00141 42.16227
Dendropsophus delarivai Anura LC Arboreal 20.462274 38.64165 35.32559 42.44670
Dendropsophus delarivai Anura LC Arboreal 22.433263 38.88744 35.13785 42.31813
Dendropsophus robertmertensi Anura LC Arboreal 26.882564 39.42869 36.04052 43.45983
Dendropsophus robertmertensi Anura LC Arboreal 26.036186 39.32152 35.93607 43.31186
Dendropsophus robertmertensi Anura LC Arboreal 28.822655 39.67434 35.89480 43.46953
Dendropsophus sartori Anura LC Arboreal 25.792224 39.30652 35.71308 42.75281
Dendropsophus sartori Anura LC Arboreal 24.800613 39.18236 35.64237 42.62384
Dendropsophus sartori Anura LC Arboreal 27.485681 39.51857 35.89038 43.05227
Dendropsophus dutrai Anura DD Arboreal 25.397284 39.19875 35.62924 42.75589
Dendropsophus dutrai Anura DD Arboreal 24.506245 39.08897 35.64860 42.73376
Dendropsophus dutrai Anura DD Arboreal 26.802681 39.37190 35.75618 42.96181
Dendropsophus elianeae Anura LC Arboreal 27.232573 39.41508 36.00743 43.32597
Dendropsophus elianeae Anura LC Arboreal 25.999477 39.26230 35.80983 43.04640
Dendropsophus elianeae Anura LC Arboreal 29.611402 39.70981 36.07714 43.59447
Dendropsophus garagoensis Anura LC Arboreal 21.285496 38.77298 35.30966 42.14799
Dendropsophus garagoensis Anura LC Arboreal 20.259522 38.64366 35.01404 41.82678
Dendropsophus garagoensis Anura LC Arboreal 23.361469 39.03465 35.53526 42.41439
Dendropsophus giesleri Anura LC Arboreal 25.684440 39.32745 35.62837 42.50553
Dendropsophus giesleri Anura LC Arboreal 24.747097 39.21017 35.59586 42.42353
Dendropsophus giesleri Anura LC Arboreal 27.373483 39.53879 35.92780 42.89363
Dendropsophus oliveirai Anura LC Arboreal 25.168047 39.21295 35.57663 42.68785
Dendropsophus oliveirai Anura LC Arboreal 24.140758 39.08343 35.66325 42.69908
Dendropsophus oliveirai Anura LC Arboreal 26.979276 39.44132 35.74114 42.97696
Dendropsophus gryllatus Anura EN Arboreal 26.262132 39.35196 36.12992 43.18993
Dendropsophus gryllatus Anura EN Arboreal 25.183072 39.21701 35.96966 42.94849
Dendropsophus gryllatus Anura EN Arboreal 28.032647 39.57338 36.20488 43.33632
Dendropsophus jimi Anura LC Arboreal 25.808922 39.24502 35.90548 42.93682
Dendropsophus jimi Anura LC Arboreal 24.486048 39.08430 35.56761 42.53415
Dendropsophus jimi Anura LC Arboreal 28.317648 39.54980 35.58456 42.87306
Dendropsophus joannae Anura DD Arboreal 25.908143 39.31947 35.90662 42.85861
Dendropsophus joannae Anura DD Arboreal 25.047183 39.21249 35.84042 42.75835
Dendropsophus joannae Anura DD Arboreal 27.323879 39.49540 36.13880 43.07899
Dendropsophus juliani Anura LC Arboreal 28.033117 39.24856 36.15891 42.50760
Dendropsophus juliani Anura LC Arboreal 27.193732 39.14130 36.03020 42.38842
Dendropsophus juliani Anura LC Arboreal 29.732139 39.46567 36.33379 42.78004
Dendropsophus minusculus Anura LC Arboreal 26.572470 38.98711 35.85040 42.20566
Dendropsophus minusculus Anura LC Arboreal 25.778111 38.88975 35.81129 42.10508
Dendropsophus minusculus Anura LC Arboreal 28.153644 39.18091 35.96823 42.46284
Dendropsophus rubicundulus Anura LC Arboreal 27.461768 39.10185 35.50785 41.85620
Dendropsophus rubicundulus Anura LC Arboreal 26.433145 38.97447 35.43078 41.72000
Dendropsophus rubicundulus Anura LC Arboreal 29.529286 39.35788 36.23487 42.74956
Dendropsophus tritaeniatus Anura LC Arboreal 27.202914 39.06649 35.91114 42.72983
Dendropsophus tritaeniatus Anura LC Arboreal 26.318438 38.95522 35.82967 42.54774
Dendropsophus tritaeniatus Anura LC Arboreal 29.127163 39.30858 36.01891 43.04875
Dendropsophus leali Anura LC Arboreal 27.381255 39.44121 35.91702 43.25796
Dendropsophus leali Anura LC Arboreal 26.626453 39.34764 35.88652 43.15325
Dendropsophus leali Anura LC Arboreal 28.936238 39.63397 35.88393 43.31877
Dendropsophus minimus Anura DD Arboreal 27.447446 39.54269 36.07051 43.40495
Dendropsophus minimus Anura DD Arboreal 26.781553 39.45883 36.00107 43.31299
Dendropsophus minimus Anura DD Arboreal 28.912180 39.72714 36.15742 43.56974
Dendropsophus meridianus Anura LC Arboreal 25.911811 40.02688 36.99036 42.95142
Dendropsophus meridianus Anura LC Arboreal 24.894809 39.90227 36.93821 42.78719
Dendropsophus meridianus Anura LC Arboreal 27.611345 40.23510 37.06379 43.14025
Dendropsophus limai Anura DD Arboreal 25.767088 39.25079 35.56505 42.61789
Dendropsophus limai Anura DD Arboreal 24.218770 39.06039 35.36563 42.37192
Dendropsophus limai Anura DD Arboreal 28.316567 39.56430 35.84664 43.09247
Dendropsophus luteoocellatus Anura LC Arboreal 26.480028 39.34718 35.71812 42.57328
Dendropsophus luteoocellatus Anura LC Arboreal 25.613636 39.23871 35.72109 42.55323
Dendropsophus luteoocellatus Anura LC Arboreal 28.025053 39.54061 35.81671 42.80305
Dendropsophus melanargyreus Anura LC Arboreal 27.716519 40.30085 36.66261 43.30258
Dendropsophus melanargyreus Anura LC Arboreal 26.904085 40.20106 36.54322 43.13337
Dendropsophus melanargyreus Anura LC Arboreal 29.493960 40.51917 36.84558 43.61925
Dendropsophus seniculus Anura LC Arboreal 25.511861 39.84440 36.36251 42.97343
Dendropsophus seniculus Anura LC Arboreal 24.427434 39.71119 36.29061 42.78996
Dendropsophus seniculus Anura LC Arboreal 27.495824 40.08811 36.56691 43.31299
Dendropsophus mathiassoni Anura LC Arboreal 25.622458 39.19075 35.69415 42.44108
Dendropsophus mathiassoni Anura LC Arboreal 24.900616 39.10286 35.62993 42.34274
Dendropsophus mathiassoni Anura LC Arboreal 27.185243 39.38104 35.85816 42.76656
Dendropsophus microcephalus Anura LC Arboreal 27.535000 39.49141 35.61948 43.25453
Dendropsophus microcephalus Anura LC Arboreal 26.789040 39.39728 35.52601 43.11523
Dendropsophus microcephalus Anura LC Arboreal 29.128728 39.69251 35.94614 43.71453
Dendropsophus phlebodes Anura LC Arboreal 26.712305 39.32648 35.94842 43.16238
Dendropsophus phlebodes Anura LC Arboreal 26.022590 39.24163 35.90392 43.05754
Dendropsophus phlebodes Anura LC Arboreal 28.066451 39.49307 36.08112 43.36820
Dendropsophus rhodopeplus Anura LC Arboreal 26.324317 39.30239 35.75710 42.98109
Dendropsophus rhodopeplus Anura LC Arboreal 25.564329 39.20567 35.73490 42.86221
Dendropsophus rhodopeplus Anura LC Arboreal 27.791294 39.48909 35.76572 43.11661
Dendropsophus microps Anura LC Arboreal 25.231670 39.21400 35.99770 43.27057
Dendropsophus microps Anura LC Arboreal 23.909437 39.05034 35.88604 43.03344
Dendropsophus microps Anura LC Arboreal 27.397552 39.48208 36.34519 43.80591
Dendropsophus nahdereri Anura LC Arboreal 24.384731 39.03936 35.33039 42.33648
Dendropsophus nahdereri Anura LC Arboreal 22.684062 38.83060 35.20938 42.18898
Dendropsophus nahdereri Anura LC Arboreal 26.960828 39.35557 35.43174 42.64854
Dendropsophus nanus Anura LC Arboreal 27.035192 39.46591 35.91252 43.17187
Dendropsophus nanus Anura LC Arboreal 25.994476 39.33520 35.82656 43.03561
Dendropsophus nanus Anura LC Arboreal 29.050383 39.71902 36.16365 43.48940
Dendropsophus walfordi Anura LC Arboreal 28.109779 39.61217 36.02991 43.29067
Dendropsophus walfordi Anura LC Arboreal 27.388452 39.52264 35.86721 43.08948
Dendropsophus walfordi Anura LC Arboreal 29.741464 39.81469 36.07893 43.41673
Dendropsophus riveroi Anura LC Arboreal 27.317702 39.50691 35.90889 42.88099
Dendropsophus riveroi Anura LC Arboreal 26.567956 39.41300 35.86376 42.84212
Dendropsophus riveroi Anura LC Arboreal 28.848536 39.69867 36.06695 43.05730
Dendropsophus reichlei Anura LC Arboreal 24.081432 39.15452 35.78137 42.92709
Dendropsophus reichlei Anura LC Arboreal 23.283750 39.05607 35.21490 42.35050
Dendropsophus reichlei Anura LC Arboreal 25.348184 39.31088 35.87833 43.04992
Dendropsophus padreluna Anura LC Arboreal 25.022654 39.24114 35.65909 42.75891
Dendropsophus padreluna Anura LC Arboreal 24.422681 39.16715 35.60795 42.66834
Dendropsophus padreluna Anura LC Arboreal 26.346708 39.40443 35.61454 42.79695
Dendropsophus pauiniensis Anura LC Arboreal 29.033331 39.61822 35.51518 42.86449
Dendropsophus pauiniensis Anura LC Arboreal 28.257878 39.52203 35.41272 42.70984
Dendropsophus pauiniensis Anura LC Arboreal 30.649345 39.81866 36.27730 43.75186
Dendropsophus praestans Anura LC Arboreal 23.388481 38.89708 35.36550 42.13288
Dendropsophus praestans Anura LC Arboreal 22.123542 38.74133 35.23982 41.93820
Dendropsophus praestans Anura LC Arboreal 25.086389 39.10613 35.47449 42.39419
Dendropsophus pseudomeridianus Anura LC Arboreal 26.025652 39.26894 35.48924 42.63289
Dendropsophus pseudomeridianus Anura LC Arboreal 24.949702 39.13575 35.46779 42.58296
Dendropsophus pseudomeridianus Anura LC Arboreal 27.873947 39.49775 35.74873 43.02244
Dendropsophus rhea Anura DD Arboreal 25.873309 39.29773 36.00889 43.20599
Dendropsophus rhea Anura DD Arboreal 24.572369 39.13965 35.85121 43.01133
Dendropsophus rhea Anura DD Arboreal 28.321186 39.59518 36.04270 43.26790
Dendropsophus rossalleni Anura LC Arboreal 27.285758 39.44423 35.72640 43.29686
Dendropsophus rossalleni Anura LC Arboreal 26.534979 39.34926 35.66132 43.21497
Dendropsophus rossalleni Anura LC Arboreal 28.789369 39.63442 35.93142 43.57822
Dendropsophus ruschii Anura DD Stream-dwelling 25.695258 38.79598 35.35875 42.37238
Dendropsophus ruschii Anura DD Stream-dwelling 24.893080 38.69557 35.23011 42.24949
Dendropsophus ruschii Anura DD Stream-dwelling 27.292128 38.99585 35.50196 42.56738
Dendropsophus soaresi Anura LC Arboreal 26.385084 39.25796 35.50504 42.70426
Dendropsophus soaresi Anura LC Arboreal 25.392915 39.13413 35.64220 42.77845
Dendropsophus soaresi Anura LC Arboreal 28.185779 39.48271 35.72090 42.95543
Dendropsophus stingi Anura LC Arboreal 22.392831 38.75296 35.39386 42.42067
Dendropsophus stingi Anura LC Arboreal 21.447444 38.63590 35.17323 42.19961
Dendropsophus stingi Anura LC Arboreal 24.281794 38.98686 35.53019 42.66860
Dendropsophus studerae Anura DD Arboreal 25.495986 39.26463 35.45896 42.64043
Dendropsophus studerae Anura DD Arboreal 24.515272 39.14194 35.25685 42.36046
Dendropsophus studerae Anura DD Arboreal 26.927491 39.44372 35.73546 42.98872
Dendropsophus subocularis Anura LC Arboreal 25.930119 39.28233 35.43516 42.76242
Dendropsophus subocularis Anura LC Arboreal 25.253064 39.19848 35.36838 42.64465
Dendropsophus subocularis Anura LC Arboreal 27.309492 39.45317 35.79533 43.14557
Dendropsophus tintinnabulum Anura DD Arboreal 28.425537 39.51916 35.99120 43.04842
Dendropsophus tintinnabulum Anura DD Arboreal 27.721254 39.43345 35.59718 42.63321
Dendropsophus tintinnabulum Anura DD Arboreal 29.961424 39.70607 35.92876 43.04467
Dendropsophus virolinensis Anura LC Arboreal 22.013728 38.78092 35.34232 42.28303
Dendropsophus virolinensis Anura LC Arboreal 21.137557 38.67287 35.20217 42.12006
Dendropsophus virolinensis Anura LC Arboreal 23.830870 39.00500 35.58320 42.59204
Dendropsophus werneri Anura LC Arboreal 25.122442 39.15658 35.73253 42.53342
Dendropsophus werneri Anura LC Arboreal 23.521172 38.95806 35.52267 42.29997
Dendropsophus werneri Anura LC Arboreal 27.682518 39.47398 36.05732 43.00988
Dendropsophus xapuriensis Anura LC Arboreal 27.863680 39.46477 36.09693 43.52974
Dendropsophus xapuriensis Anura LC Arboreal 27.029240 39.36105 35.95291 43.33432
Dendropsophus xapuriensis Anura LC Arboreal 29.437505 39.66040 36.29474 43.85281
Xenohyla eugenioi Anura DD Arboreal 24.991418 39.15375 35.30338 42.66994
Xenohyla eugenioi Anura DD Arboreal 24.018638 39.03456 35.20574 42.48252
Xenohyla eugenioi Anura DD Arboreal 27.090554 39.41096 35.47382 43.02109
Xenohyla truncata Anura NT Arboreal 25.570177 39.33114 35.36153 42.81372
Xenohyla truncata Anura NT Arboreal 24.648289 39.21658 35.44503 42.89760
Xenohyla truncata Anura NT Arboreal 27.102028 39.52149 35.65361 43.08536
Lysapsus caraya Anura LC Aquatic 27.868452 40.92606 37.52042 43.60388
Lysapsus caraya Anura LC Aquatic 26.972258 40.81578 37.50856 43.54752
Lysapsus caraya Anura LC Aquatic 29.725257 41.15455 37.69830 44.01194
Lysapsus laevis Anura LC Aquatic 25.633065 40.40420 37.30204 43.67644
Lysapsus laevis Anura LC Aquatic 24.932525 40.31486 37.26242 43.63634
Lysapsus laevis Anura LC Aquatic 27.051238 40.58506 37.37633 43.84157
Pseudis bolbodactyla Anura LC Aquatic 26.061632 40.63678 37.76433 43.79584
Pseudis bolbodactyla Anura LC Aquatic 24.882316 40.48989 37.71837 43.67797
Pseudis bolbodactyla Anura LC Aquatic 28.265053 40.91122 37.93293 44.14836
Pseudis fusca Anura LC Aquatic 25.314138 40.53000 37.37106 43.61549
Pseudis fusca Anura LC Aquatic 24.142994 40.38148 37.13201 43.29512
Pseudis fusca Anura LC Aquatic 27.807546 40.84621 37.82845 44.29167
Pseudis tocantins Anura LC Aquatic 27.590903 40.85035 37.76741 43.66405
Pseudis tocantins Anura LC Aquatic 26.553967 40.72057 37.62579 43.47843
Pseudis tocantins Anura LC Aquatic 29.606961 41.10269 37.96083 43.99778
Pseudis cardosoi Anura LC Aquatic 24.587941 39.59352 37.03246 42.27131
Pseudis cardosoi Anura LC Aquatic 22.712210 39.35654 36.95493 42.07496
Pseudis cardosoi Anura LC Aquatic 27.412149 39.95034 37.16890 42.67423
Scarthyla vigilans Anura LC Ground-dwelling 26.518318 38.97460 35.75598 42.43300
Scarthyla vigilans Anura LC Ground-dwelling 25.715461 38.87108 35.56027 42.15835
Scarthyla vigilans Anura LC Ground-dwelling 28.139783 39.18368 35.89416 42.72583
Scinax altae Anura LC Arboreal 27.323285 40.75562 37.28677 45.38047
Scinax altae Anura LC Arboreal 26.754798 40.68337 37.24231 45.31250
Scinax altae Anura LC Arboreal 28.402604 40.89279 36.76212 44.87344
Scinax auratus Anura LC Arboreal 25.270071 40.37070 36.90452 44.66510
Scinax auratus Anura LC Arboreal 24.304759 40.25095 36.98421 44.70200
Scinax auratus Anura LC Arboreal 26.880127 40.57043 37.03273 44.90733
Scinax baumgardneri Anura DD Arboreal 26.795820 40.62830 36.79209 44.50946
Scinax baumgardneri Anura DD Arboreal 26.143157 40.54655 36.63078 44.30421
Scinax baumgardneri Anura DD Arboreal 28.273473 40.81339 37.04991 44.85620
Scinax blairi Anura LC Ground-dwelling 26.196840 40.72922 37.04571 44.57824
Scinax blairi Anura LC Ground-dwelling 25.462653 40.63843 36.95021 44.46688
Scinax blairi Anura LC Ground-dwelling 27.807954 40.92846 37.09394 44.77999
Scinax boesemani Anura LC Arboreal 27.826474 40.84952 36.87612 45.04912
Scinax boesemani Anura LC Arboreal 27.110097 40.75855 36.86200 44.95919
Scinax boesemani Anura LC Arboreal 29.393432 41.04850 37.36488 45.65367
Scinax parkeri Anura LC Ground-dwelling 26.960894 40.88505 37.17083 45.01491
Scinax parkeri Anura LC Ground-dwelling 26.151978 40.78423 37.08057 44.90264
Scinax parkeri Anura LC Ground-dwelling 28.842948 41.11962 37.32007 45.26249
Scinax boulengeri Anura LC Arboreal 26.801025 40.71902 36.66195 44.37870
Scinax boulengeri Anura LC Arboreal 26.076798 40.62964 36.61420 44.28107
Scinax boulengeri Anura LC Arboreal 28.244242 40.89714 36.85899 44.65681
Scinax sugillatus Anura LC Arboreal 24.758841 40.46912 36.79194 44.32414
Scinax sugillatus Anura LC Arboreal 23.782144 40.34831 36.61779 44.07371
Scinax sugillatus Anura LC Arboreal 26.399504 40.67205 36.84843 44.51418
Scinax cabralensis Anura DD Arboreal 25.007399 40.34551 36.00776 43.88148
Scinax cabralensis Anura DD Arboreal 23.869536 40.20203 36.04322 43.83893
Scinax cabralensis Anura DD Arboreal 27.676029 40.68203 36.35297 44.39116
Scinax caldarum Anura LC Arboreal 25.529406 40.59153 36.30934 44.62912
Scinax caldarum Anura LC Arboreal 24.251037 40.43115 36.63399 44.93460
Scinax caldarum Anura LC Arboreal 28.016402 40.90356 36.55736 44.94431
Scinax crospedospilus Anura LC Arboreal 25.624535 40.50875 36.65174 44.68042
Scinax crospedospilus Anura LC Arboreal 24.437348 40.35974 36.39899 44.36978
Scinax crospedospilus Anura LC Arboreal 27.681921 40.76697 36.88372 45.00879
Scinax camposseabrai Anura DD Arboreal 24.877748 40.47113 36.07813 44.32691
Scinax camposseabrai Anura DD Arboreal 23.605446 40.30821 35.93076 44.13483
Scinax camposseabrai Anura DD Arboreal 27.467182 40.80270 36.94167 45.37805
Scinax cardosoi Anura LC Arboreal 25.689804 40.52931 36.86935 44.76685
Scinax cardosoi Anura LC Arboreal 24.655727 40.40042 36.61697 44.47295
Scinax cardosoi Anura LC Arboreal 27.533108 40.75908 36.71872 44.66310
Scinax castroviejoi Anura LC Arboreal 20.930088 39.19847 36.59196 41.75288
Scinax castroviejoi Anura LC Arboreal 19.881937 39.06564 36.58144 41.74213
Scinax castroviejoi Anura LC Arboreal 22.563740 39.40548 36.82824 41.97365
Scinax chiquitanus Anura LC Arboreal 25.395604 40.39305 36.89026 43.87140
Scinax chiquitanus Anura LC Arboreal 24.594089 40.29208 36.78515 43.74572
Scinax chiquitanus Anura LC Arboreal 26.988819 40.59376 37.01051 44.07146
Scinax funereus Anura LC Arboreal 26.199741 40.56370 37.07930 44.19498
Scinax funereus Anura LC Arboreal 25.420058 40.46512 37.06832 44.07947
Scinax funereus Anura LC Arboreal 27.688834 40.75196 37.05678 44.29895
Scinax oreites Anura LC Arboreal 21.510119 39.95136 36.25643 42.95469
Scinax oreites Anura LC Arboreal 20.661695 39.84468 36.34361 43.02629
Scinax oreites Anura LC Arboreal 23.195818 40.16331 36.45357 43.24339
Scinax constrictus Anura LC Arboreal 27.082874 40.81443 36.87797 44.64940
Scinax constrictus Anura LC Arboreal 25.837604 40.65657 36.63717 44.31117
Scinax constrictus Anura LC Arboreal 29.289322 41.09412 37.14961 45.03908
Scinax cretatus Anura LC Arboreal 25.421569 40.44513 35.98368 44.07601
Scinax cretatus Anura LC Arboreal 24.504322 40.32688 35.92830 43.99470
Scinax cretatus Anura LC Arboreal 26.865247 40.63126 36.09855 44.28962
Scinax cruentommus Anura LC Arboreal 27.497200 40.66293 36.58153 44.74100
Scinax cruentommus Anura LC Arboreal 26.784539 40.57375 36.46179 44.60022
Scinax cruentommus Anura LC Arboreal 29.004672 40.85157 36.61871 44.85688
Scinax staufferi Anura LC Arboreal 26.387624 40.67594 36.55304 44.55283
Scinax staufferi Anura LC Arboreal 25.514323 40.56576 36.37521 44.29823
Scinax staufferi Anura LC Arboreal 28.214604 40.90644 36.95186 45.02878
Scinax curicica Anura DD Arboreal 24.826713 40.39987 36.79323 44.34942
Scinax curicica Anura DD Arboreal 23.454470 40.22378 36.54485 44.07670
Scinax curicica Anura DD Arboreal 27.381718 40.72773 37.22412 44.83650
Scinax cuspidatus Anura LC Arboreal 25.363216 40.37262 36.70422 44.82541
Scinax cuspidatus Anura LC Arboreal 24.394855 40.25056 36.55334 44.63864
Scinax cuspidatus Anura LC Arboreal 27.143046 40.59695 36.82626 45.09826
Scinax danae Anura DD Arboreal 25.643111 40.51982 36.61872 44.27210
Scinax danae Anura DD Arboreal 24.863388 40.42130 36.48264 44.11289
Scinax danae Anura DD Arboreal 27.425356 40.74503 36.70433 44.47996
Scinax duartei Anura LC Ground-dwelling 25.517709 40.58180 36.70072 44.82139
Scinax duartei Anura LC Ground-dwelling 24.229967 40.42306 36.35597 44.38767
Scinax duartei Anura LC Ground-dwelling 27.798797 40.86298 36.33707 44.59116
Scinax similis Anura LC Arboreal 25.438664 40.52838 36.66929 44.55272
Scinax similis Anura LC Arboreal 24.407677 40.39696 36.21385 44.08120
Scinax similis Anura LC Arboreal 27.172887 40.74944 36.85049 44.82668
Scinax hayii Anura LC Arboreal 25.470204 40.57305 36.76339 44.68972
Scinax hayii Anura LC Arboreal 24.193442 40.41441 36.59906 44.51089
Scinax hayii Anura LC Arboreal 27.651217 40.84404 37.07180 45.07266
Scinax exiguus Anura LC Arboreal 25.846398 40.50697 36.12609 44.39069
Scinax exiguus Anura LC Arboreal 25.081505 40.41188 36.36976 44.61515
Scinax exiguus Anura LC Arboreal 27.582190 40.72276 36.17494 44.54253
Scinax karenanneae Anura LC Arboreal 27.957191 40.81179 36.57691 44.66579
Scinax karenanneae Anura LC Arboreal 27.238391 40.72042 36.74942 44.81889
Scinax karenanneae Anura LC Arboreal 29.465045 41.00345 36.84870 44.98341
Scinax lindsayi Anura LC Arboreal 28.482550 40.87933 36.74099 45.26958
Scinax lindsayi Anura LC Arboreal 27.781922 40.79058 36.72568 45.14229
Scinax lindsayi Anura LC Arboreal 30.005927 41.07232 36.39605 45.02703
Scinax fuscomarginatus Anura LC Arboreal 26.821498 40.68025 36.84528 44.61338
Scinax fuscomarginatus Anura LC Arboreal 25.754992 40.54690 36.77959 44.50672
Scinax fuscomarginatus Anura LC Arboreal 28.859240 40.93504 36.96715 44.85447
Scinax proboscideus Anura LC Arboreal 27.307538 40.24343 37.02473 43.42818
Scinax proboscideus Anura LC Arboreal 26.668950 40.16021 36.85065 43.21558
Scinax proboscideus Anura LC Arboreal 28.846241 40.44396 37.11722 43.59292
Scinax jolyi Anura DD Arboreal 26.884525 40.13004 36.99476 43.77200
Scinax jolyi Anura DD Arboreal 26.289988 40.05411 36.91190 43.63752
Scinax jolyi Anura DD Arboreal 28.091508 40.28420 37.02630 43.88433
Scinax rostratus Anura LC Arboreal 26.594698 40.23710 36.61130 43.71264
Scinax rostratus Anura LC Arboreal 25.826143 40.13659 36.55589 43.58580
Scinax rostratus Anura LC Arboreal 28.161673 40.44204 36.95423 44.15356
Scinax iquitorum Anura LC Arboreal 27.373447 40.64602 36.61979 44.52489
Scinax iquitorum Anura LC Arboreal 26.639792 40.55528 36.53104 44.36477
Scinax iquitorum Anura LC Arboreal 28.768199 40.81852 36.79456 44.81757
Scinax kennedyi Anura LC Arboreal 27.495267 40.76342 37.22278 44.94412
Scinax kennedyi Anura LC Arboreal 26.742151 40.66861 37.24858 44.97550
Scinax kennedyi Anura LC Arboreal 29.152088 40.97198 37.37694 45.15895
Scinax manriquei Anura NT Arboreal 25.125663 40.41170 36.50611 44.04000
Scinax manriquei Anura NT Arboreal 24.233429 40.29793 36.49894 43.95316
Scinax manriquei Anura NT Arboreal 26.711947 40.61396 36.89455 44.56872
Scinax maracaya Anura DD Arboreal 25.516162 40.50193 36.58222 44.42541
Scinax maracaya Anura DD Arboreal 24.345698 40.35304 36.53114 44.36229
Scinax maracaya Anura DD Arboreal 27.818301 40.79478 36.94810 44.87351
Scinax nebulosus Anura LC Arboreal 27.829638 41.23319 37.95333 45.24821
Scinax nebulosus Anura LC Arboreal 27.113453 41.14457 37.28758 44.60900
Scinax nebulosus Anura LC Arboreal 29.432738 41.43155 38.15770 45.47367
Scinax pedromedinae Anura LC Arboreal 23.705616 40.29428 36.43388 44.01710
Scinax pedromedinae Anura LC Arboreal 23.021845 40.20806 36.37688 43.96831
Scinax pedromedinae Anura LC Arboreal 24.884268 40.44290 36.60881 44.25442
Scinax perereca Anura LC Arboreal 25.331072 40.50998 36.41985 44.39239
Scinax perereca Anura LC Arboreal 23.687672 40.30347 36.22314 44.20684
Scinax perereca Anura LC Arboreal 27.872844 40.82937 36.78293 44.80578
Scinax tigrinus Anura LC Semi-aquatic 26.554508 41.07790 36.86883 44.78721
Scinax tigrinus Anura LC Semi-aquatic 25.292468 40.91513 36.65741 44.51628
Scinax tigrinus Anura LC Semi-aquatic 28.809494 41.36872 37.07925 45.19647
Scinax trilineatus Anura LC Arboreal 26.441258 40.62602 36.51525 44.92917
Scinax trilineatus Anura LC Arboreal 25.678442 40.52973 36.48645 44.83534
Scinax trilineatus Anura LC Arboreal 28.092106 40.83440 36.70430 45.18254
Scinax wandae Anura LC Ground-dwelling 26.669967 40.72892 36.28551 44.17843
Scinax wandae Anura LC Ground-dwelling 25.934831 40.63691 36.24663 44.09753
Scinax wandae Anura LC Ground-dwelling 28.270367 40.92922 36.48766 44.46651
Sphaenorhynchus bromelicola Anura DD Arboreal 24.496308 40.30066 37.17253 43.44984
Sphaenorhynchus bromelicola Anura DD Arboreal 23.287138 40.14780 37.03048 43.23601
Sphaenorhynchus bromelicola Anura DD Arboreal 27.094613 40.62915 37.31327 43.78669
Sphaenorhynchus caramaschii Anura LC Semi-aquatic 25.301274 40.68208 37.19113 44.26685
Sphaenorhynchus caramaschii Anura LC Semi-aquatic 23.646182 40.47505 36.81147 43.78881
Sphaenorhynchus caramaschii Anura LC Semi-aquatic 27.934375 41.01144 37.42636 44.67674
Sphaenorhynchus palustris Anura LC Aquatic 25.221832 40.53744 36.77645 44.11111
Sphaenorhynchus palustris Anura LC Aquatic 24.400483 40.43249 36.71030 43.98121
Sphaenorhynchus palustris Anura LC Aquatic 26.791552 40.73801 36.96631 44.36342
Sphaenorhynchus carneus Anura LC Semi-aquatic 27.409577 40.98307 36.94536 44.54691
Sphaenorhynchus carneus Anura LC Semi-aquatic 26.655061 40.88630 37.20343 44.79308
Sphaenorhynchus carneus Anura LC Semi-aquatic 28.908434 41.17530 37.23916 44.88174
Sphaenorhynchus dorisae Anura LC Semi-aquatic 27.572225 40.96760 37.52475 45.37279
Sphaenorhynchus dorisae Anura LC Semi-aquatic 26.823914 40.87159 37.40278 45.20775
Sphaenorhynchus dorisae Anura LC Semi-aquatic 29.071046 41.15991 37.16866 45.13541
Sphaenorhynchus planicola Anura LC Aquatic 25.448172 40.87798 37.66412 43.97778
Sphaenorhynchus planicola Anura LC Aquatic 24.603904 40.77153 37.58376 43.84696
Sphaenorhynchus planicola Anura LC Aquatic 26.934241 41.06535 37.92088 44.26887
Sphaenorhynchus mirim Anura DD Arboreal 25.378291 40.31111 36.85806 43.77068
Sphaenorhynchus mirim Anura DD Arboreal 24.482385 40.19980 36.85112 43.73517
Sphaenorhynchus mirim Anura DD Arboreal 27.216161 40.53947 37.08382 44.08577
Sphaenorhynchus surdus Anura LC Arboreal 24.680464 40.29497 36.77819 43.75491
Sphaenorhynchus surdus Anura LC Arboreal 22.925413 40.07315 36.41622 43.38426
Sphaenorhynchus surdus Anura LC Arboreal 27.323512 40.62902 37.12119 44.18401
Sphaenorhynchus orophilus Anura LC Arboreal 25.568402 40.41690 37.50341 43.54781
Sphaenorhynchus orophilus Anura LC Arboreal 24.372549 40.26794 37.34758 43.30129
Sphaenorhynchus orophilus Anura LC Arboreal 27.627681 40.67342 37.72243 43.94186
Nyctimantis rugiceps Anura LC Arboreal 25.624975 39.85137 36.38527 43.01775
Nyctimantis rugiceps Anura LC Arboreal 24.692524 39.73186 36.55109 43.20538
Nyctimantis rugiceps Anura LC Arboreal 27.224510 40.05638 36.49408 43.18588
Corythomantis greeningi Anura LC Arboreal 25.750493 40.06078 36.96957 43.73829
Corythomantis greeningi Anura LC Arboreal 24.671201 39.92053 36.80597 43.51340
Corythomantis greeningi Anura LC Arboreal 27.679830 40.31149 36.95816 43.84293
Trachycephalus coriaceus Anura LC Arboreal 27.503048 40.52078 37.56729 43.85502
Trachycephalus coriaceus Anura LC Arboreal 26.773675 40.42918 37.41164 43.63771
Trachycephalus coriaceus Anura LC Arboreal 29.029418 40.71248 37.66230 44.03223
Trachycephalus dibernardoi Anura LC Arboreal 25.381081 40.31439 37.12750 43.43305
Trachycephalus dibernardoi Anura LC Arboreal 23.624277 40.08866 37.15363 43.46072
Trachycephalus dibernardoi Anura LC Arboreal 27.892585 40.63708 37.42581 43.92427
Trachycephalus hadroceps Anura LC Arboreal 27.299663 40.46827 37.48768 43.71123
Trachycephalus hadroceps Anura LC Arboreal 26.662826 40.38766 37.27132 43.45050
Trachycephalus hadroceps Anura LC Arboreal 28.829520 40.66192 37.80794 44.11189
Trachycephalus resinifictrix Anura LC Arboreal 27.604838 40.50795 37.40197 43.70056
Trachycephalus resinifictrix Anura LC Arboreal 26.894585 40.41867 37.35411 43.61153
Trachycephalus resinifictrix Anura LC Arboreal 29.134294 40.70020 37.58484 43.90055
Trachycephalus imitatrix Anura LC Arboreal 25.405860 40.25355 37.65080 43.20517
Trachycephalus imitatrix Anura LC Arboreal 23.805423 40.04695 37.52410 43.00694
Trachycephalus imitatrix Anura LC Arboreal 27.954451 40.58254 37.97040 43.65875
Trachycephalus nigromaculatus Anura LC Arboreal 25.588259 40.28082 37.16733 43.44194
Trachycephalus nigromaculatus Anura LC Arboreal 24.421000 40.13328 37.18167 43.39342
Trachycephalus nigromaculatus Anura LC Arboreal 27.823106 40.56329 37.42419 43.80512
Trachycephalus lepidus Anura DD Arboreal 26.363769 40.42487 36.79069 43.49543
Trachycephalus lepidus Anura DD Arboreal 24.838825 40.23133 36.78391 43.34702
Trachycephalus lepidus Anura DD Arboreal 28.935260 40.75124 36.85369 43.78125
Trachycephalus jordani Anura LC Arboreal 24.599534 40.05919 36.67789 43.26739
Trachycephalus jordani Anura LC Arboreal 23.584041 39.93248 36.41770 42.93057
Trachycephalus jordani Anura LC Arboreal 26.381232 40.28151 36.93502 43.59181
Dryaderces pearsoni Anura LC Arboreal 24.223652 39.74616 36.51813 43.85495
Dryaderces pearsoni Anura LC Arboreal 23.443434 39.64826 36.25025 43.53524
Dryaderces pearsoni Anura LC Arboreal 25.599945 39.91885 36.39147 43.78943
Itapotihyla langsdorffii Anura LC Arboreal 25.497839 39.77981 36.02274 43.27773
Itapotihyla langsdorffii Anura LC Arboreal 24.283430 39.62480 36.24835 43.41183
Itapotihyla langsdorffii Anura LC Arboreal 27.612430 40.04973 36.26171 43.58209
Osteocephalus alboguttatus Anura LC Arboreal 24.485261 39.45344 36.46161 42.71984
Osteocephalus alboguttatus Anura LC Arboreal 23.595911 39.34068 36.34364 42.56480
Osteocephalus alboguttatus Anura LC Arboreal 26.051694 39.65204 36.68679 43.01371
Osteocephalus heyeri Anura LC Arboreal 29.084321 40.06166 36.80183 43.33775
Osteocephalus heyeri Anura LC Arboreal 28.315268 39.96292 36.73883 43.17050
Osteocephalus heyeri Anura LC Arboreal 30.600623 40.25635 36.85739 43.51700
Osteocephalus subtilis Anura LC Ground-dwelling 28.432892 40.10008 36.96281 43.48051
Osteocephalus subtilis Anura LC Ground-dwelling 27.679307 40.00291 37.07310 43.55037
Osteocephalus subtilis Anura LC Ground-dwelling 29.937294 40.29406 36.99748 43.70456
Osteocephalus verruciger Anura LC Stream-dwelling 24.678229 39.02056 35.85452 41.70792
Osteocephalus verruciger Anura LC Stream-dwelling 23.843224 38.91610 35.80301 41.61204
Osteocephalus verruciger Anura LC Stream-dwelling 26.209826 39.21215 35.95954 41.96552
Osteocephalus cabrerai Anura LC Arboreal 27.235977 39.77659 36.84527 42.64035
Osteocephalus cabrerai Anura LC Arboreal 26.552105 39.69074 36.78458 42.57581
Osteocephalus cabrerai Anura LC Arboreal 28.713240 39.96203 36.94835 42.88171
Osteocephalus castaneicola Anura LC Arboreal 22.226696 39.12456 36.24647 42.44659
Osteocephalus castaneicola Anura LC Arboreal 21.534763 39.03682 36.17683 42.31936
Osteocephalus castaneicola Anura LC Arboreal 23.324470 39.26376 36.06322 42.27991
Osteocephalus deridens Anura LC Arboreal 26.884342 39.72306 36.50103 43.01387
Osteocephalus deridens Anura LC Arboreal 26.086579 39.62061 36.09449 42.56174
Osteocephalus deridens Anura LC Arboreal 28.407911 39.91872 36.51397 43.13307
Osteocephalus fuscifacies Anura LC Arboreal 26.483739 39.64042 36.50179 42.85420
Osteocephalus fuscifacies Anura LC Arboreal 25.683319 39.53874 36.57283 42.85754
Osteocephalus fuscifacies Anura LC Arboreal 28.039659 39.83807 36.84558 43.32325
Osteocephalus leoniae Anura LC Arboreal 21.721081 39.06244 36.37453 42.05266
Osteocephalus leoniae Anura LC Arboreal 20.919871 38.96051 36.28026 41.91966
Osteocephalus leoniae Anura LC Arboreal 23.314160 39.26510 36.54298 42.28109
Osteocephalus planiceps Anura LC Arboreal 26.304971 39.68493 36.55141 42.76074
Osteocephalus planiceps Anura LC Arboreal 25.537632 39.58485 36.46218 42.65739
Osteocephalus planiceps Anura LC Arboreal 27.805994 39.88071 36.70274 43.00224
Osteocephalus leprieurii Anura LC Arboreal 27.587107 39.84274 36.56309 42.92892
Osteocephalus leprieurii Anura LC Arboreal 26.874646 39.75049 36.49090 42.80796
Osteocephalus leprieurii Anura LC Arboreal 29.126029 40.04199 36.68941 43.24538
Osteocephalus yasuni Anura LC Arboreal 28.070387 39.92559 37.09715 43.46289
Osteocephalus yasuni Anura LC Arboreal 27.287926 39.82516 36.99063 43.29392
Osteocephalus yasuni Anura LC Arboreal 29.608148 40.12295 37.29003 43.79864
Osteocephalus oophagus Anura LC Arboreal 27.946186 39.90502 36.75958 43.11416
Osteocephalus oophagus Anura LC Arboreal 27.297826 39.82286 36.64401 42.93030
Osteocephalus oophagus Anura LC Arboreal 29.469635 40.09807 36.80707 43.26132
Osteocephalus taurinus Anura LC Arboreal 27.498105 39.86157 36.83328 43.08435
Osteocephalus taurinus Anura LC Arboreal 26.776425 39.77066 36.77307 42.98248
Osteocephalus taurinus Anura LC Arboreal 29.046931 40.05667 37.01684 43.35164
Tepuihyla aecii Anura NT Arboreal 25.661020 39.67583 36.56197 43.38402
Tepuihyla aecii Anura NT Arboreal 25.001401 39.59174 36.48268 43.24582
Tepuihyla aecii Anura NT Arboreal 27.238038 39.87685 36.54626 43.46752
Tepuihyla edelcae Anura LC Arboreal 25.349143 39.55901 36.25762 43.10289
Tepuihyla edelcae Anura LC Arboreal 24.533076 39.45438 36.20071 43.00348
Tepuihyla edelcae Anura LC Arboreal 27.207084 39.79722 36.38509 43.42783
Tepuihyla rodriguezi Anura NT Arboreal 26.161996 39.66974 36.17494 43.32292
Tepuihyla rodriguezi Anura NT Arboreal 25.441096 39.57921 35.82958 42.94400
Tepuihyla rodriguezi Anura NT Arboreal 27.774258 39.87221 36.28515 43.54457
Tepuihyla exophthalma Anura LC Arboreal 26.053119 39.68143 36.46097 43.13564
Tepuihyla exophthalma Anura LC Arboreal 25.351363 39.59307 36.37252 43.04823
Tepuihyla exophthalma Anura LC Arboreal 27.681819 39.88651 36.58517 43.43913
Tepuihyla luteolabris Anura VU Arboreal 25.661020 39.65000 36.25609 43.01186
Tepuihyla luteolabris Anura VU Arboreal 25.001401 39.56561 36.18310 42.91721
Tepuihyla luteolabris Anura VU Arboreal 27.238038 39.85175 36.43719 43.28274
Osteopilus crucialis Anura VU Arboreal 27.442930 39.82495 36.35062 43.18374
Osteopilus crucialis Anura VU Arboreal 27.078442 39.77822 36.30479 43.12164
Osteopilus crucialis Anura VU Arboreal 28.015842 39.89840 36.41889 43.28133
Osteopilus marianae Anura EN Arboreal 27.386647 39.84623 36.45101 43.10615
Osteopilus marianae Anura EN Arboreal 27.038864 39.80188 36.43290 43.05215
Osteopilus marianae Anura EN Arboreal 27.934792 39.91613 36.67468 43.40332
Osteopilus wilderi Anura VU Arboreal 27.495925 39.82620 36.27319 42.80362
Osteopilus wilderi Anura VU Arboreal 27.126705 39.77877 36.32349 42.82758
Osteopilus wilderi Anura VU Arboreal 28.083133 39.90164 36.52525 43.09953
Osteopilus ocellatus Anura NT Arboreal 27.473430 39.83346 36.40605 43.34565
Osteopilus ocellatus Anura NT Arboreal 27.097639 39.78535 36.36005 43.28309
Osteopilus ocellatus Anura NT Arboreal 28.066481 39.90938 36.47489 43.44804
Osteopilus dominicensis Anura LC Arboreal 27.400690 39.88585 36.38354 43.25415
Osteopilus dominicensis Anura LC Arboreal 26.987801 39.83312 36.29293 43.14309
Osteopilus dominicensis Anura LC Arboreal 28.104848 39.97577 36.38109 43.36090
Osteopilus pulchrilineatus Anura VU Arboreal 27.241942 39.90443 36.56695 43.40723
Osteopilus pulchrilineatus Anura VU Arboreal 26.839520 39.85245 36.51786 43.33439
Osteopilus pulchrilineatus Anura VU Arboreal 27.927510 39.99300 36.63887 43.53132
Osteopilus vastus Anura VU Stream-dwelling 27.165433 39.43831 35.70478 42.48981
Osteopilus vastus Anura VU Stream-dwelling 26.760456 39.38534 35.71422 42.46964
Osteopilus vastus Anura VU Stream-dwelling 27.853525 39.52831 35.82595 42.66396
Phyllodytes acuminatus Anura LC Arboreal 25.293379 39.78265 36.31148 43.19068
Phyllodytes acuminatus Anura LC Arboreal 24.381642 39.66659 36.24111 43.10862
Phyllodytes acuminatus Anura LC Arboreal 26.772353 39.97093 36.49758 43.47598
Phyllodytes brevirostris Anura DD Arboreal 25.709735 39.84857 36.64858 43.78074
Phyllodytes brevirostris Anura DD Arboreal 24.760959 39.72832 36.58329 43.64532
Phyllodytes brevirostris Anura DD Arboreal 27.080743 40.02233 36.88331 44.10909
Phyllodytes edelmoi Anura DD Arboreal 25.590024 39.87524 36.24549 43.05889
Phyllodytes edelmoi Anura DD Arboreal 24.630498 39.75112 36.42162 43.17515
Phyllodytes edelmoi Anura DD Arboreal 26.888025 40.04314 36.45413 43.32725
Phyllodytes gyrinaethes Anura DD Arboreal 25.590024 39.88085 36.34859 43.16083
Phyllodytes gyrinaethes Anura DD Arboreal 24.630498 39.75964 36.66313 43.44496
Phyllodytes gyrinaethes Anura DD Arboreal 26.888025 40.04482 36.56795 43.40611
Phyllodytes kautskyi Anura LC Arboreal 25.306808 39.74392 36.39659 43.17244
Phyllodytes kautskyi Anura LC Arboreal 24.547895 39.64929 36.56941 43.30192
Phyllodytes kautskyi Anura LC Arboreal 26.750661 39.92395 36.62869 43.43474
Phyllodytes maculosus Anura DD Arboreal 25.273103 39.79800 36.47316 43.33064
Phyllodytes maculosus Anura DD Arboreal 24.383211 39.68441 36.43240 43.24313
Phyllodytes maculosus Anura DD Arboreal 27.063195 40.02649 36.73185 43.70788
Phyllodytes punctatus Anura DD Arboreal 25.477900 39.80118 36.49037 43.28738
Phyllodytes punctatus Anura DD Arboreal 24.720327 39.70571 36.52468 43.31085
Phyllodytes punctatus Anura DD Arboreal 26.444056 39.92294 36.63026 43.41891
Phyllodytes tuberculosus Anura DD Arboreal 24.496308 39.68490 36.36582 42.94670
Phyllodytes tuberculosus Anura DD Arboreal 23.287138 39.52871 36.54136 43.02997
Phyllodytes tuberculosus Anura DD Arboreal 27.094613 40.02053 36.69912 43.50536
Phyllodytes wuchereri Anura DD Arboreal 25.160197 39.77010 36.50299 43.17608
Phyllodytes wuchereri Anura DD Arboreal 24.364692 39.66934 36.50176 43.08925
Phyllodytes wuchereri Anura DD Arboreal 26.612721 39.95407 36.63474 43.33463
Phytotriades auratus Anura EN Arboreal 26.479711 39.87614 36.14846 43.71724
Phytotriades auratus Anura EN Arboreal 25.877888 39.79802 36.11482 43.67503
Phytotriades auratus Anura EN Arboreal 27.645281 40.02745 36.18802 43.84575
Pseudacris brachyphona Anura LC Ground-dwelling 24.735572 38.51586 35.74807 41.73694
Pseudacris brachyphona Anura LC Ground-dwelling 22.380515 38.21775 35.24542 41.08134
Pseudacris brachyphona Anura LC Ground-dwelling 28.256119 38.96151 35.88497 42.17122
Pseudacris brimleyi Anura LC Ground-dwelling 25.600959 38.58328 35.54876 41.15349
Pseudacris brimleyi Anura LC Ground-dwelling 21.612989 38.07971 35.06766 40.52951
Pseudacris brimleyi Anura LC Ground-dwelling 28.970545 39.00877 35.97359 41.78891
Pseudacris clarkii Anura LC Ground-dwelling 25.042552 38.57378 36.10387 41.00209
Pseudacris clarkii Anura LC Ground-dwelling 23.492369 38.37970 35.89200 40.65680
Pseudacris clarkii Anura LC Ground-dwelling 27.507216 38.88235 36.33770 41.43748
Pseudacris maculata Anura LC Semi-aquatic 18.768341 38.01912 35.73105 40.48318
Pseudacris maculata Anura LC Semi-aquatic 15.533456 37.61617 35.29817 40.05176
Pseudacris maculata Anura LC Semi-aquatic 23.266346 38.57941 36.05688 41.10112
Pseudacris kalmi Anura LC Ground-dwelling 24.270426 38.43093 35.70886 40.92948
Pseudacris kalmi Anura LC Ground-dwelling 18.365676 37.68760 35.26737 40.17786
Pseudacris kalmi Anura LC Ground-dwelling 27.499602 38.83744 36.02599 41.47003
Pseudacris nigrita Anura LC Ground-dwelling 26.835810 38.78385 36.24222 41.57060
Pseudacris nigrita Anura LC Ground-dwelling 24.289926 38.46551 35.98798 41.13102
Pseudacris nigrita Anura LC Ground-dwelling 29.546241 39.12276 36.38553 41.89744
Pseudacris fouquettei Anura LC Ground-dwelling 26.831948 38.82883 36.00937 41.55808
Pseudacris fouquettei Anura LC Ground-dwelling 25.210418 38.62331 35.82379 41.19660
Pseudacris fouquettei Anura LC Ground-dwelling 29.506902 39.16787 36.02845 41.78008
Pseudacris streckeri Anura LC Ground-dwelling 26.023546 38.70502 35.48710 41.89761
Pseudacris streckeri Anura LC Ground-dwelling 23.785909 38.41636 34.98908 41.28300
Pseudacris streckeri Anura LC Ground-dwelling 28.679987 39.04771 35.91405 42.34140
Pseudacris ornata Anura LC Ground-dwelling 27.236634 38.87147 35.74138 42.40480
Pseudacris ornata Anura LC Ground-dwelling 24.540611 38.52719 35.40931 41.95199
Pseudacris ornata Anura LC Ground-dwelling 29.755953 39.19317 35.90392 42.70297
Pseudacris ocularis Anura LC Ground-dwelling 26.651224 38.59399 35.32566 41.87481
Pseudacris ocularis Anura LC Ground-dwelling 24.010739 38.25691 34.93510 41.31856
Pseudacris ocularis Anura LC Ground-dwelling 29.373589 38.94152 35.44051 42.21912
Triprion petasatus Anura LC Arboreal 27.347131 39.83864 36.52385 43.62085
Triprion petasatus Anura LC Arboreal 26.638233 39.74693 36.50242 43.52159
Triprion petasatus Anura LC Arboreal 28.946786 40.04557 36.42311 43.61281
Smilisca cyanosticta Anura LC Arboreal 26.635780 39.90749 36.63827 42.56099
Smilisca cyanosticta Anura LC Arboreal 25.678964 39.78088 36.79886 42.62953
Smilisca cyanosticta Anura LC Arboreal 28.565972 40.16292 36.84887 42.94779
Smilisca puma Anura LC Ground-dwelling 25.772847 40.18738 37.25730 43.00613
Smilisca puma Anura LC Ground-dwelling 24.972166 40.07735 37.03772 42.73927
Smilisca puma Anura LC Ground-dwelling 27.331227 40.40151 37.30318 43.14035
Smilisca dentata Anura EN Ground-dwelling 23.254710 39.41166 36.34074 42.44031
Smilisca dentata Anura EN Ground-dwelling 22.005085 39.24436 36.33775 42.32583
Smilisca dentata Anura EN Ground-dwelling 25.619257 39.72823 36.56558 42.78519
Smilisca sila Anura LC Arboreal 26.560514 39.81326 36.74704 43.25794
Smilisca sila Anura LC Arboreal 25.889403 39.72383 36.67722 43.13541
Smilisca sila Anura LC Arboreal 27.982139 40.00270 36.81703 43.40833
Smilisca sordida Anura LC Stream-dwelling 26.320615 39.25920 35.97475 42.44229
Smilisca sordida Anura LC Stream-dwelling 25.577891 39.16006 35.86203 42.26965
Smilisca sordida Anura LC Stream-dwelling 27.806416 39.45754 35.89823 42.43940
Isthmohyla angustilineata Anura CR Arboreal 27.673451 40.01690 36.44738 43.86406
Isthmohyla angustilineata Anura CR Arboreal 27.016765 39.93101 36.39720 43.73986
Isthmohyla angustilineata Anura CR Arboreal 28.975240 40.18716 36.56920 44.13749
Isthmohyla debilis Anura CR Arboreal 27.166722 39.93494 36.48557 43.45175
Isthmohyla debilis Anura CR Arboreal 26.545537 39.85185 36.41767 43.32784
Isthmohyla debilis Anura CR Arboreal 28.366971 40.09550 36.57070 43.55571
Isthmohyla graceae Anura CR Arboreal 25.835235 39.91134 36.34868 43.45139
Isthmohyla graceae Anura CR Arboreal 25.157590 39.82096 36.27958 43.37590
Isthmohyla graceae Anura CR Arboreal 27.278156 40.10381 36.52086 43.75174
Isthmohyla infucata Anura EN Arboreal 27.753723 39.94996 36.55093 44.00488
Isthmohyla infucata Anura EN Arboreal 27.190251 39.87699 36.21717 43.61564
Isthmohyla infucata Anura EN Arboreal 28.885900 40.09659 36.40667 43.92824
Isthmohyla insolita Anura EN Stream-dwelling 26.157984 39.37499 35.82154 42.59521
Isthmohyla insolita Anura EN Stream-dwelling 25.537721 39.29346 35.72651 42.46113
Isthmohyla insolita Anura EN Stream-dwelling 27.383776 39.53611 35.98000 42.83181
Isthmohyla lancasteri Anura LC Arboreal 25.076587 39.73816 36.48686 43.13929
Isthmohyla lancasteri Anura LC Arboreal 24.327003 39.64086 36.48314 43.09540
Isthmohyla lancasteri Anura LC Arboreal 26.333094 39.90127 36.60972 43.38331
Isthmohyla picadoi Anura LC Arboreal 25.596213 39.79313 36.20082 43.14161
Isthmohyla picadoi Anura LC Arboreal 24.868393 39.69652 35.99791 42.95172
Isthmohyla picadoi Anura LC Arboreal 26.937359 39.97116 36.41810 43.40441
Isthmohyla pictipes Anura CR Stream-dwelling 25.548408 39.23861 35.92349 42.83773
Isthmohyla pictipes Anura CR Stream-dwelling 24.810554 39.13990 35.78884 42.65313
Isthmohyla pictipes Anura CR Stream-dwelling 26.869200 39.41531 36.09681 43.06547
Isthmohyla pseudopuma Anura LC Arboreal 25.530710 39.73425 36.34907 43.60513
Isthmohyla pseudopuma Anura LC Arboreal 24.759212 39.63500 36.23484 43.46324
Isthmohyla pseudopuma Anura LC Arboreal 26.950139 39.91686 36.34386 43.63547
Isthmohyla rivularis Anura EN Stream-dwelling 27.673451 39.59365 36.12766 43.24204
Isthmohyla rivularis Anura EN Stream-dwelling 27.016765 39.50738 36.05406 43.11392
Isthmohyla rivularis Anura EN Stream-dwelling 28.975240 39.76467 36.26661 43.49602
Isthmohyla tica Anura CR Stream-dwelling 27.673451 39.44738 36.00702 43.45231
Isthmohyla tica Anura CR Stream-dwelling 27.016765 39.36166 35.85869 43.26275
Isthmohyla tica Anura CR Stream-dwelling 28.975240 39.61732 36.13857 43.62857
Isthmohyla xanthosticta Anura DD Arboreal 27.435694 39.97670 36.42387 43.53990
Isthmohyla xanthosticta Anura DD Arboreal 26.744760 39.88766 36.32326 43.40345
Isthmohyla xanthosticta Anura DD Arboreal 29.013624 40.18007 36.58481 43.77911
Isthmohyla zeteki Anura VU Arboreal 25.548408 39.70481 36.16066 43.30333
Isthmohyla zeteki Anura VU Arboreal 24.810554 39.60820 36.12159 43.23603
Isthmohyla zeteki Anura VU Arboreal 26.869200 39.87774 36.32237 43.55211
Tlalocohyla godmani Anura VU Stream-dwelling 24.716524 39.33791 35.91675 42.88994
Tlalocohyla godmani Anura VU Stream-dwelling 23.740053 39.21052 35.74990 42.67290
Tlalocohyla godmani Anura VU Stream-dwelling 27.024465 39.63898 35.92373 43.02902
Tlalocohyla loquax Anura LC Aquatic 26.794176 40.42103 36.74830 43.87519
Tlalocohyla loquax Anura LC Aquatic 25.981168 40.31494 36.84993 43.92748
Tlalocohyla loquax Anura LC Aquatic 28.467889 40.63944 36.85693 44.10775
Tlalocohyla picta Anura LC Arboreal 26.252436 40.12830 36.59050 43.50694
Tlalocohyla picta Anura LC Arboreal 25.437962 40.02042 36.40775 43.28072
Tlalocohyla picta Anura LC Arboreal 27.971030 40.35593 36.46222 43.54689
Hyla annectans Anura LC Arboreal 23.637071 39.39360 36.10638 42.72288
Hyla annectans Anura LC Arboreal 22.332033 39.22290 35.92887 42.54322
Hyla annectans Anura LC Arboreal 25.730762 39.66746 36.35976 42.99031
Hyla tsinlingensis Anura LC Arboreal 23.124878 39.31032 35.65404 42.38776
Hyla tsinlingensis Anura LC Arboreal 20.453457 38.96018 35.37725 41.98107
Hyla tsinlingensis Anura LC Arboreal 26.324714 39.72971 36.03775 42.94093
Hyla chinensis Anura LC Arboreal 27.144602 40.05676 36.65781 43.81092
Hyla chinensis Anura LC Arboreal 25.329203 39.81419 36.12130 43.06783
Hyla chinensis Anura LC Arboreal 29.632296 40.38916 36.94713 44.16692
Hyla savignyi Anura LC Arboreal 21.859236 39.15326 35.51238 42.10720
Hyla savignyi Anura LC Arboreal 20.174568 38.93678 35.26444 41.82882
Hyla savignyi Anura LC Arboreal 24.392003 39.47873 35.68116 42.45447
Hyla hallowellii Anura LC Arboreal 27.367725 39.97339 36.69457 43.81840
Hyla hallowellii Anura LC Arboreal 26.559688 39.86658 36.43497 43.50879
Hyla hallowellii Anura LC Arboreal 28.353332 40.10368 36.80458 43.99697
Hyla intermedia Anura LC Arboreal 23.281004 39.43086 36.07871 42.86628
Hyla intermedia Anura LC Arboreal 20.778414 39.10021 35.83173 42.47488
Hyla intermedia Anura LC Arboreal 26.673232 39.87905 36.28634 43.27629
Hyla sanchiangensis Anura LC Arboreal 27.309582 39.91869 36.27525 43.39222
Hyla sanchiangensis Anura LC Arboreal 25.688473 39.70924 36.24458 43.23776
Hyla sanchiangensis Anura LC Arboreal 29.851650 40.24713 36.66472 43.87164
Hyla sarda Anura LC Arboreal 23.602973 39.48707 36.06406 42.97001
Hyla sarda Anura LC Arboreal 21.633515 39.22515 35.92188 42.73973
Hyla sarda Anura LC Arboreal 26.664836 39.89427 36.36924 43.55069
Hyla simplex Anura LC Arboreal 27.687638 39.91840 36.26419 43.36475
Hyla simplex Anura LC Arboreal 26.645646 39.78265 36.10250 43.21142
Hyla simplex Anura LC Arboreal 29.538496 40.15955 36.45763 43.59299
Hyla zhaopingensis Anura DD Arboreal 27.803837 40.00226 36.79123 43.83294
Hyla zhaopingensis Anura DD Arboreal 26.528569 39.83483 36.67720 43.57280
Hyla zhaopingensis Anura DD Arboreal 30.320630 40.33269 36.91463 44.16858
Charadrahyla altipotens Anura EN Stream-dwelling 26.540611 39.29791 35.31194 43.11152
Charadrahyla altipotens Anura EN Stream-dwelling 25.413707 39.15279 35.28407 43.01610
Charadrahyla altipotens Anura EN Stream-dwelling 28.296903 39.52408 35.46362 43.37425
Charadrahyla chaneque Anura VU Stream-dwelling 27.629499 39.49359 35.67273 43.64565
Charadrahyla chaneque Anura VU Stream-dwelling 26.672663 39.36879 35.16815 43.05846
Charadrahyla chaneque Anura VU Stream-dwelling 29.448578 39.73086 35.42999 43.47994
Charadrahyla nephila Anura EN Stream-dwelling 24.443279 39.06026 35.08314 42.69487
Charadrahyla nephila Anura EN Stream-dwelling 23.278941 38.90796 34.99626 42.50821
Charadrahyla nephila Anura EN Stream-dwelling 26.911302 39.38308 35.23342 42.91548
Charadrahyla taeniopus Anura VU Stream-dwelling 23.879216 38.89053 35.24888 42.52598
Charadrahyla taeniopus Anura VU Stream-dwelling 22.829884 38.75456 35.22169 42.45393
Charadrahyla taeniopus Anura VU Stream-dwelling 26.169380 39.18730 35.47004 42.80339
Charadrahyla trux Anura EN Stream-dwelling 24.643741 39.17321 35.58775 43.15450
Charadrahyla trux Anura EN Stream-dwelling 23.536379 39.03010 35.44495 42.95610
Charadrahyla trux Anura EN Stream-dwelling 26.514052 39.41492 35.72926 43.40824
Megastomatohyla mixe Anura CR Stream-dwelling 22.187059 38.68562 34.67674 42.34481
Megastomatohyla mixe Anura CR Stream-dwelling 20.787577 38.50349 34.49360 42.11215
Megastomatohyla mixe Anura CR Stream-dwelling 25.070986 39.06092 35.24941 42.93535
Megastomatohyla mixomaculata Anura EN Stream-dwelling 24.476973 38.92387 35.31721 42.92015
Megastomatohyla mixomaculata Anura EN Stream-dwelling 23.438962 38.79124 35.21925 42.75064
Megastomatohyla mixomaculata Anura EN Stream-dwelling 26.661051 39.20293 35.46457 43.20229
Megastomatohyla nubicola Anura CR Stream-dwelling 25.458091 39.10747 35.46275 43.05079
Megastomatohyla nubicola Anura CR Stream-dwelling 24.953062 39.04106 35.41909 42.98338
Megastomatohyla nubicola Anura CR Stream-dwelling 26.956993 39.30459 35.71584 43.37675
Megastomatohyla pellita Anura CR Stream-dwelling 26.748054 39.27743 35.59906 43.25404
Megastomatohyla pellita Anura CR Stream-dwelling 25.687348 39.13941 35.53455 43.16834
Megastomatohyla pellita Anura CR Stream-dwelling 28.307307 39.48031 35.77556 43.49192
Bromeliohyla bromeliacia Anura LC Arboreal 25.496314 39.57059 35.34598 43.34630
Bromeliohyla bromeliacia Anura LC Arboreal 24.515166 39.44315 35.48194 43.41505
Bromeliohyla bromeliacia Anura LC Arboreal 27.497307 39.83051 36.07643 44.14296
Bromeliohyla dendroscarta Anura EN Arboreal 24.443279 39.54430 35.94951 43.64754
Bromeliohyla dendroscarta Anura EN Arboreal 23.278941 39.39247 35.78683 43.40179
Bromeliohyla dendroscarta Anura EN Arboreal 26.911302 39.86613 36.35438 44.17711
Duellmanohyla chamulae Anura EN Stream-dwelling 27.578939 39.28308 35.40305 43.34864
Duellmanohyla chamulae Anura EN Stream-dwelling 26.636120 39.16150 35.30448 43.23122
Duellmanohyla chamulae Anura EN Stream-dwelling 29.355857 39.51222 35.45712 43.45849
Duellmanohyla ignicolor Anura NT Stream-dwelling 22.187059 38.62692 34.77121 42.36490
Duellmanohyla ignicolor Anura NT Stream-dwelling 20.787577 38.44478 34.60640 42.10991
Duellmanohyla ignicolor Anura NT Stream-dwelling 25.070986 39.00225 35.05851 42.90125
Duellmanohyla lythrodes Anura EN Stream-dwelling 22.415988 38.65389 34.72184 42.58582
Duellmanohyla lythrodes Anura EN Stream-dwelling 21.585361 38.54633 34.68420 42.48697
Duellmanohyla lythrodes Anura EN Stream-dwelling 23.641771 38.81262 34.39162 42.32220
Duellmanohyla rufioculis Anura LC Stream-dwelling 26.177716 39.19322 35.32304 43.29013
Duellmanohyla rufioculis Anura LC Stream-dwelling 25.480927 39.10226 35.29724 43.21075
Duellmanohyla rufioculis Anura LC Stream-dwelling 27.580806 39.37637 35.44613 43.49635
Duellmanohyla salvavida Anura EN Stream-dwelling 26.157984 39.23307 35.13756 43.40553
Duellmanohyla salvavida Anura EN Stream-dwelling 25.537721 39.15183 35.03805 43.27577
Duellmanohyla salvavida Anura EN Stream-dwelling 27.383776 39.39364 35.41723 43.74180
Duellmanohyla schmidtorum Anura NT Arboreal 26.933705 39.72411 35.88148 43.69065
Duellmanohyla schmidtorum Anura NT Arboreal 26.003249 39.60377 35.72128 43.53491
Duellmanohyla schmidtorum Anura NT Arboreal 28.861029 39.97339 36.08050 43.88609
Duellmanohyla soralia Anura EN Stream-dwelling 25.174190 39.06872 35.15814 42.61015
Duellmanohyla soralia Anura EN Stream-dwelling 24.673669 39.00255 35.09349 42.52521
Duellmanohyla soralia Anura EN Stream-dwelling 26.575538 39.25399 35.25612 42.79572
Duellmanohyla uranochroa Anura VU Stream-dwelling 25.548408 39.09525 35.70466 43.52432
Duellmanohyla uranochroa Anura VU Stream-dwelling 24.810554 38.99866 35.46659 43.26048
Duellmanohyla uranochroa Anura VU Stream-dwelling 26.869200 39.26814 35.78657 43.61514
Ptychohyla dendrophasma Anura CR Stream-dwelling 26.749010 39.23120 35.14236 42.96367
Ptychohyla dendrophasma Anura CR Stream-dwelling 25.647747 39.08747 35.41336 43.18154
Ptychohyla dendrophasma Anura CR Stream-dwelling 28.713870 39.48763 35.57186 43.47571
Ptychohyla euthysanota Anura LC Stream-dwelling 26.050814 39.17139 35.19444 42.92218
Ptychohyla euthysanota Anura LC Stream-dwelling 25.075721 39.04446 35.07918 42.77194
Ptychohyla euthysanota Anura LC Stream-dwelling 28.108432 39.43925 35.38075 43.24557
Ptychohyla hypomykter Anura VU Arboreal 25.825323 39.61711 35.77697 43.39574
Ptychohyla hypomykter Anura VU Arboreal 24.908732 39.49841 35.65772 43.25647
Ptychohyla hypomykter Anura VU Arboreal 27.667803 39.85570 35.96509 43.74743
Ptychohyla legleri Anura EN Stream-dwelling 24.812458 39.03796 35.22651 42.75770
Ptychohyla legleri Anura EN Stream-dwelling 24.080462 38.94334 35.15397 42.65877
Ptychohyla legleri Anura EN Stream-dwelling 26.063102 39.19961 35.32108 42.94434
Ptychohyla leonhardschultzei Anura LC Stream-dwelling 25.504390 39.04507 34.98237 43.10280
Ptychohyla leonhardschultzei Anura LC Stream-dwelling 24.397261 38.89976 34.76409 42.81760
Ptychohyla leonhardschultzei Anura LC Stream-dwelling 27.367351 39.28959 35.23976 43.39189
Ptychohyla zophodes Anura VU Stream-dwelling 25.149838 39.01403 35.43972 43.34379
Ptychohyla zophodes Anura VU Stream-dwelling 24.043183 38.87078 35.28349 43.09827
Ptychohyla zophodes Anura VU Stream-dwelling 27.432312 39.30947 35.72324 43.81433
Ptychohyla macrotympanum Anura VU Stream-dwelling 26.389820 39.19786 35.53654 43.17539
Ptychohyla macrotympanum Anura VU Stream-dwelling 25.317222 39.06015 35.47170 43.05215
Ptychohyla macrotympanum Anura VU Stream-dwelling 28.366978 39.45171 35.72837 43.48470
Ptychohyla salvadorensis Anura NT Arboreal 26.008626 39.51566 35.54664 43.28407
Ptychohyla salvadorensis Anura NT Arboreal 25.005581 39.38796 35.56835 43.22177
Ptychohyla salvadorensis Anura NT Arboreal 28.067313 39.77777 35.78930 43.62128
Ecnomiohyla fimbrimembra Anura VU Arboreal 27.636688 39.88884 36.00252 43.37881
Ecnomiohyla fimbrimembra Anura VU Arboreal 26.960683 39.80064 35.95990 43.27124
Ecnomiohyla fimbrimembra Anura VU Arboreal 29.020819 40.06941 36.09508 43.60795
Ecnomiohyla miliaria Anura LC Arboreal 26.143912 39.66166 35.92917 43.56172
Ecnomiohyla miliaria Anura LC Arboreal 25.387709 39.56315 36.14980 43.74611
Ecnomiohyla miliaria Anura LC Arboreal 27.567315 39.84709 36.12611 43.77736
Ecnomiohyla minera Anura VU Arboreal 25.096779 39.49238 35.58298 43.33664
Ecnomiohyla minera Anura VU Arboreal 24.020450 39.35181 35.50577 43.23501
Ecnomiohyla minera Anura VU Arboreal 27.293603 39.77930 35.82146 43.68297
Ecnomiohyla phantasmagoria Anura DD Arboreal 26.780535 39.60584 35.30161 43.25949
Ecnomiohyla phantasmagoria Anura DD Arboreal 26.004364 39.50472 35.31206 43.20197
Ecnomiohyla phantasmagoria Anura DD Arboreal 28.563188 39.83808 35.54117 43.56430
Ecnomiohyla salvaje Anura EN Arboreal 26.135487 39.56026 35.63897 43.23461
Ecnomiohyla salvaje Anura EN Arboreal 25.454076 39.47336 35.55740 43.11215
Ecnomiohyla salvaje Anura EN Arboreal 27.750357 39.76621 36.09967 43.69384
Ecnomiohyla thysanota Anura DD Arboreal 27.812573 39.81977 35.63336 43.40517
Ecnomiohyla thysanota Anura DD Arboreal 27.084203 39.72586 35.59170 43.30814
Ecnomiohyla thysanota Anura DD Arboreal 29.356453 40.01884 35.81330 43.68147
Ecnomiohyla valancifer Anura CR Arboreal 26.881155 39.73510 35.84972 43.71319
Ecnomiohyla valancifer Anura CR Arboreal 25.933953 39.61397 35.70655 43.48074
Ecnomiohyla valancifer Anura CR Arboreal 28.925281 39.99651 35.90704 43.94433
Exerodonta abdivita Anura NT Arboreal 24.589991 39.36010 35.49036 43.16909
Exerodonta abdivita Anura NT Arboreal 23.425321 39.20896 35.37413 42.98385
Exerodonta abdivita Anura NT Arboreal 27.093143 39.68493 35.91698 43.78447
Exerodonta perkinsi Anura EN Stream-dwelling 24.492303 38.87862 35.09531 43.38236
Exerodonta perkinsi Anura EN Stream-dwelling 23.296609 38.72376 34.98275 43.23014
Exerodonta perkinsi Anura EN Stream-dwelling 26.759446 39.17224 35.23645 43.60614
Exerodonta bivocata Anura EN Stream-dwelling 27.578939 39.38062 35.25595 43.57362
Exerodonta bivocata Anura EN Stream-dwelling 26.636120 39.25796 35.21170 43.45461
Exerodonta bivocata Anura EN Stream-dwelling 29.355857 39.61178 34.91691 43.36781
Exerodonta catracha Anura NT Arboreal 24.874925 39.45680 35.63254 43.40827
Exerodonta catracha Anura NT Arboreal 23.714409 39.30658 35.64630 43.35303
Exerodonta catracha Anura NT Arboreal 27.187387 39.75613 35.80067 43.67595
Exerodonta chimalapa Anura EN Stream-dwelling 27.384785 39.31692 35.49333 43.26785
Exerodonta chimalapa Anura EN Stream-dwelling 26.395290 39.19017 35.42016 43.18400
Exerodonta chimalapa Anura EN Stream-dwelling 29.371363 39.57138 35.79099 43.68600
Exerodonta smaragdina Anura LC Arboreal 24.636167 39.47920 35.70677 43.18645
Exerodonta smaragdina Anura LC Arboreal 23.506409 39.33222 35.54906 43.02002
Exerodonta smaragdina Anura LC Arboreal 26.570114 39.73080 35.88971 43.48629
Exerodonta xera Anura VU Arboreal 24.260106 39.40805 35.68823 43.45529
Exerodonta xera Anura VU Arboreal 23.071044 39.25226 35.17388 42.97353
Exerodonta xera Anura VU Arboreal 26.362962 39.68356 35.92555 43.75395
Exerodonta melanomma Anura VU Arboreal 26.192836 39.66507 36.04421 43.92654
Exerodonta melanomma Anura VU Arboreal 25.062977 39.51506 35.73704 43.50585
Exerodonta melanomma Anura VU Arboreal 28.025747 39.90842 36.14557 44.17049
Exerodonta sumichrasti Anura LC Arboreal 26.423995 39.68767 35.79391 43.73793
Exerodonta sumichrasti Anura LC Arboreal 25.409495 39.55586 35.32627 43.22020
Exerodonta sumichrasti Anura LC Arboreal 28.251982 39.92518 35.68996 43.74164
Plectrohyla acanthodes Anura EN Stream-dwelling 26.150379 39.07271 34.96809 42.65627
Plectrohyla acanthodes Anura EN Stream-dwelling 25.061825 38.93432 34.94784 42.56514
Plectrohyla acanthodes Anura EN Stream-dwelling 28.118004 39.32286 35.15929 42.92237
Plectrohyla avia Anura EN Arboreal 25.833150 39.60085 35.52551 43.73645
Plectrohyla avia Anura EN Arboreal 24.954271 39.48978 35.44844 43.61337
Plectrohyla avia Anura EN Arboreal 27.918184 39.86434 35.58353 43.88214
Plectrohyla chrysopleura Anura CR Stream-dwelling 26.003759 39.18973 34.57425 42.83867
Plectrohyla chrysopleura Anura CR Stream-dwelling 25.251289 39.09143 34.54137 42.80055
Plectrohyla chrysopleura Anura CR Stream-dwelling 27.401517 39.37231 34.76511 43.11117
Plectrohyla dasypus Anura CR Arboreal 25.174190 39.54713 35.67452 43.59558
Plectrohyla dasypus Anura CR Arboreal 24.673669 39.48280 35.44866 43.35916
Plectrohyla dasypus Anura CR Arboreal 26.575538 39.72724 35.92860 43.83308
Plectrohyla exquisita Anura CR Arboreal 25.174190 39.49347 35.92049 43.45297
Plectrohyla exquisita Anura CR Arboreal 24.673669 39.42838 35.70157 43.18529
Plectrohyla exquisita Anura CR Arboreal 26.575538 39.67570 35.93012 43.58358
Plectrohyla glandulosa Anura CR Stream-dwelling 22.235597 38.70568 35.20119 42.72096
Plectrohyla glandulosa Anura CR Stream-dwelling 20.945471 38.54155 35.06844 42.54049
Plectrohyla glandulosa Anura CR Stream-dwelling 24.805021 39.03257 35.25784 42.95383
Plectrohyla guatemalensis Anura NT Stream-dwelling 25.723092 39.13764 35.39014 43.10936
Plectrohyla guatemalensis Anura NT Stream-dwelling 24.818365 39.02161 35.31235 42.95563
Plectrohyla guatemalensis Anura NT Stream-dwelling 27.639855 39.38346 35.54475 43.43852
Plectrohyla hartwegi Anura EN Stream-dwelling 25.719539 39.01553 34.93115 42.93054
Plectrohyla hartwegi Anura EN Stream-dwelling 24.711484 38.88423 34.87936 42.79718
Plectrohyla hartwegi Anura EN Stream-dwelling 27.829048 39.29028 35.19240 43.28433
Plectrohyla ixil Anura VU Stream-dwelling 25.908896 39.10730 35.52770 43.29815
Plectrohyla ixil Anura VU Stream-dwelling 24.808487 38.96669 35.37072 43.11319
Plectrohyla ixil Anura VU Stream-dwelling 27.956208 39.36889 35.56246 43.45777
Plectrohyla lacertosa Anura EN Stream-dwelling 25.925600 39.10336 35.13008 43.32246
Plectrohyla lacertosa Anura EN Stream-dwelling 24.871607 38.96866 35.05646 43.21747
Plectrohyla lacertosa Anura EN Stream-dwelling 28.122208 39.38407 35.56353 43.95113
Plectrohyla matudai Anura LC Ground-dwelling 25.903408 39.77337 35.56730 43.53890
Plectrohyla matudai Anura LC Ground-dwelling 24.939083 39.64884 35.46106 43.42335
Plectrohyla matudai Anura LC Ground-dwelling 27.916979 40.03340 36.13770 44.18093
Plectrohyla pokomchi Anura EN Stream-dwelling 24.942963 39.06335 35.28329 42.91711
Plectrohyla pokomchi Anura EN Stream-dwelling 23.795138 38.91253 35.15755 42.78195
Plectrohyla pokomchi Anura EN Stream-dwelling 27.309028 39.37424 35.41536 43.14389
Plectrohyla psiloderma Anura EN Stream-dwelling 26.468834 39.24029 35.43685 43.46839
Plectrohyla psiloderma Anura EN Stream-dwelling 25.476230 39.11224 35.13738 43.11953
Plectrohyla psiloderma Anura EN Stream-dwelling 28.481769 39.49996 35.64762 43.84578
Plectrohyla quecchi Anura EN Stream-dwelling 25.712479 39.11011 35.46078 43.06826
Plectrohyla quecchi Anura EN Stream-dwelling 24.700136 38.97860 35.33669 42.85695
Plectrohyla quecchi Anura EN Stream-dwelling 27.813634 39.38308 35.68981 43.42048
Plectrohyla sagorum Anura VU Stream-dwelling 25.300085 39.10349 35.08821 42.86094
Plectrohyla sagorum Anura VU Stream-dwelling 24.312172 38.97792 34.99546 42.70249
Plectrohyla sagorum Anura VU Stream-dwelling 27.419860 39.37292 35.59274 43.45131
Plectrohyla tecunumani Anura CR Stream-dwelling 22.235597 38.67166 34.78463 42.41591
Plectrohyla tecunumani Anura CR Stream-dwelling 20.945471 38.50635 34.53955 42.08744
Plectrohyla tecunumani Anura CR Stream-dwelling 24.805021 39.00089 35.24208 42.95338
Plectrohyla teuchestes Anura CR Stream-dwelling 26.481996 39.22715 35.28191 43.18455
Plectrohyla teuchestes Anura CR Stream-dwelling 25.605134 39.11360 35.33364 43.16014
Plectrohyla teuchestes Anura CR Stream-dwelling 28.318240 39.46492 35.54447 43.45234
Macrogenioglottus alipioi Anura LC Semi-aquatic 25.431399 37.91164 34.93247 41.42940
Macrogenioglottus alipioi Anura LC Semi-aquatic 24.435579 37.77592 34.65745 41.10223
Macrogenioglottus alipioi Anura LC Semi-aquatic 27.180698 38.15005 34.81547 41.42310
Odontophrynus achalensis Anura VU Semi-aquatic 22.595443 36.62296 34.00607 39.03063
Odontophrynus achalensis Anura VU Semi-aquatic 20.641422 36.35538 33.96645 38.87736
Odontophrynus achalensis Anura VU Semi-aquatic 26.066129 37.09824 34.28964 39.59159
Odontophrynus cultripes Anura LC Fossorial 25.884733 38.51045 35.83509 41.65366
Odontophrynus cultripes Anura LC Fossorial 24.682676 38.34485 35.65867 41.42472
Odontophrynus cultripes Anura LC Fossorial 28.214034 38.83135 35.99252 41.98331
Odontophrynus cordobae Anura LC Stream-dwelling 23.623810 36.62209 33.64781 39.56629
Odontophrynus cordobae Anura LC Stream-dwelling 21.580867 36.33898 33.37979 39.15310
Odontophrynus cordobae Anura LC Stream-dwelling 27.145586 37.11015 33.98403 40.14156
Odontophrynus lavillai Anura LC Fossorial 24.753439 38.35727 35.24758 41.03120
Odontophrynus lavillai Anura LC Fossorial 23.324778 38.15932 35.24191 40.95870
Odontophrynus lavillai Anura LC Fossorial 27.204975 38.69694 35.46394 41.39651
Odontophrynus carvalhoi Anura LC Ground-dwelling 25.797977 37.70375 34.67868 40.99120
Odontophrynus carvalhoi Anura LC Ground-dwelling 24.741870 37.55589 34.07321 40.33138
Odontophrynus carvalhoi Anura LC Ground-dwelling 27.637547 37.96129 34.87193 41.33763
Proceratophrys appendiculata Anura LC Ground-dwelling 25.570890 38.14828 34.60022 41.86948
Proceratophrys appendiculata Anura LC Ground-dwelling 24.369687 37.98683 34.39749 41.63246
Proceratophrys appendiculata Anura LC Ground-dwelling 27.605375 38.42172 34.73634 42.14923
Proceratophrys melanopogon Anura LC Ground-dwelling 25.640222 38.20638 34.49397 41.65623
Proceratophrys melanopogon Anura LC Ground-dwelling 24.391799 38.03847 34.37995 41.48781
Proceratophrys melanopogon Anura LC Ground-dwelling 27.748476 38.48995 34.87642 42.14850
Proceratophrys phyllostomus Anura DD Ground-dwelling 25.556465 38.19409 34.63434 41.78671
Proceratophrys phyllostomus Anura DD Ground-dwelling 24.708649 38.07636 34.51943 41.64175
Proceratophrys phyllostomus Anura DD Ground-dwelling 27.149076 38.41524 34.63748 41.86467
Proceratophrys moehringi Anura DD Stream-dwelling 25.601492 37.59305 34.10681 41.27468
Proceratophrys moehringi Anura DD Stream-dwelling 24.813092 37.48525 34.04584 41.14978
Proceratophrys moehringi Anura DD Stream-dwelling 27.196193 37.81110 34.10076 41.39889
Proceratophrys boiei Anura LC Ground-dwelling 25.370437 38.18571 34.34559 41.50016
Proceratophrys boiei Anura LC Ground-dwelling 24.238531 38.03058 34.28400 41.36973
Proceratophrys boiei Anura LC Ground-dwelling 27.369346 38.45967 34.72550 41.96476
Proceratophrys laticeps Anura LC Ground-dwelling 25.254281 38.08893 34.03097 41.50871
Proceratophrys laticeps Anura LC Ground-dwelling 24.445702 37.98012 33.96533 41.42320
Proceratophrys laticeps Anura LC Ground-dwelling 26.755521 38.29096 34.21057 41.74124
Proceratophrys cururu Anura DD Ground-dwelling 24.239549 38.06010 34.86524 41.97906
Proceratophrys cururu Anura DD Ground-dwelling 22.780848 37.85961 34.54929 41.59108
Proceratophrys cururu Anura DD Ground-dwelling 26.761978 38.40680 35.11670 42.31007
Proceratophrys concavitympanum Anura DD Stream-dwelling 27.955903 37.88486 34.06000 41.57878
Proceratophrys concavitympanum Anura DD Stream-dwelling 27.137807 37.77358 33.86692 41.31414
Proceratophrys concavitympanum Anura DD Stream-dwelling 29.778513 38.13276 34.15588 41.85002
Proceratophrys moratoi Anura CR Semi-aquatic 26.272616 38.45409 35.00445 42.00897
Proceratophrys moratoi Anura CR Semi-aquatic 25.009737 38.28441 34.85523 41.87945
Proceratophrys moratoi Anura CR Semi-aquatic 28.773414 38.79010 35.22811 42.50687
Proceratophrys goyana Anura LC Ground-dwelling 26.616666 38.31132 34.84456 41.79181
Proceratophrys goyana Anura LC Ground-dwelling 25.373550 38.14170 34.70968 41.58501
Proceratophrys goyana Anura LC Ground-dwelling 28.796429 38.60876 35.07615 42.18362
Proceratophrys brauni Anura LC Ground-dwelling 24.597134 38.01265 34.56360 41.77568
Proceratophrys brauni Anura LC Ground-dwelling 22.759289 37.76856 34.28097 41.46335
Proceratophrys brauni Anura LC Ground-dwelling 27.369139 38.38082 34.91993 42.24676
Proceratophrys cristiceps Anura LC Ground-dwelling 25.624735 38.22355 35.21196 41.77670
Proceratophrys cristiceps Anura LC Ground-dwelling 24.599144 38.08728 34.95697 41.53596
Proceratophrys cristiceps Anura LC Ground-dwelling 27.277477 38.44316 35.38228 42.02507
Proceratophrys paviotii Anura DD Stream-dwelling 25.507727 37.71556 34.60919 40.95891
Proceratophrys paviotii Anura DD Stream-dwelling 24.733105 37.61202 34.50675 40.86751
Proceratophrys paviotii Anura DD Stream-dwelling 27.100258 37.92843 34.57796 41.16547
Proceratophrys subguttata Anura LC Ground-dwelling 24.321878 37.97352 34.55328 41.61274
Proceratophrys subguttata Anura LC Ground-dwelling 22.624344 37.74703 34.43337 41.37224
Proceratophrys subguttata Anura LC Ground-dwelling 26.857518 38.31183 35.00800 42.22515
Proceratophrys palustris Anura DD Ground-dwelling 25.942042 38.23224 34.67252 42.17134
Proceratophrys palustris Anura DD Ground-dwelling 24.610813 38.05036 34.45854 41.83515
Proceratophrys palustris Anura DD Ground-dwelling 28.503902 38.58227 34.75635 42.49414
Proceratophrys vielliardi Anura DD Ground-dwelling 26.110695 38.25492 34.68784 41.79230
Proceratophrys vielliardi Anura DD Ground-dwelling 24.912144 38.09410 34.54441 41.58767
Proceratophrys vielliardi Anura DD Ground-dwelling 28.317261 38.55099 35.04888 42.19938
Proceratophrys bigibbosa Anura NT Ground-dwelling 25.473780 38.16763 34.66870 41.84494
Proceratophrys bigibbosa Anura NT Ground-dwelling 23.667480 37.92241 34.44081 41.46762
Proceratophrys bigibbosa Anura NT Ground-dwelling 28.087860 38.52250 34.84414 42.13723
Proceratophrys avelinoi Anura LC Semi-aquatic 26.027404 38.43817 34.97964 42.05850
Proceratophrys avelinoi Anura LC Semi-aquatic 24.479761 38.22884 34.63911 41.61415
Proceratophrys avelinoi Anura LC Semi-aquatic 28.489336 38.77118 35.29710 42.47074
Adenomus kandianus Anura EN Stream-dwelling 27.311256 38.48379 35.06625 41.98446
Adenomus kandianus Anura EN Stream-dwelling 26.578946 38.38585 34.83568 41.66153
Adenomus kandianus Anura EN Stream-dwelling 29.131810 38.72727 35.21450 42.27970
Adenomus kelaartii Anura VU Ground-dwelling 27.537965 39.02099 35.49112 42.24568
Adenomus kelaartii Anura VU Ground-dwelling 26.783377 38.92291 35.43393 42.12296
Adenomus kelaartii Anura VU Ground-dwelling 29.426420 39.26644 35.80987 42.63013
Duttaphrynus atukoralei Anura LC Ground-dwelling 27.905526 39.15756 35.59963 42.36534
Duttaphrynus atukoralei Anura LC Ground-dwelling 27.123571 39.05488 35.51784 42.28835
Duttaphrynus atukoralei Anura LC Ground-dwelling 29.821058 39.40909 35.91400 42.82435
Duttaphrynus scaber Anura LC Ground-dwelling 27.326684 39.07244 35.86639 42.47023
Duttaphrynus scaber Anura LC Ground-dwelling 26.303513 38.93774 35.68322 42.20757
Duttaphrynus scaber Anura LC Ground-dwelling 29.575796 39.36854 36.19664 42.93445
Duttaphrynus beddomii Anura EN Ground-dwelling 27.160769 39.06542 35.70971 42.45316
Duttaphrynus beddomii Anura EN Ground-dwelling 26.441106 38.96980 35.61563 42.30521
Duttaphrynus beddomii Anura EN Ground-dwelling 28.707998 39.27099 35.78848 42.63872
Duttaphrynus brevirostris Anura DD Ground-dwelling 26.485775 38.90845 35.45658 42.01417
Duttaphrynus brevirostris Anura DD Ground-dwelling 25.652340 38.79830 35.48425 42.01949
Duttaphrynus brevirostris Anura DD Ground-dwelling 28.489556 39.17329 35.69099 42.28033
Duttaphrynus crocus Anura DD Ground-dwelling 27.836139 39.11914 36.01314 42.76328
Duttaphrynus crocus Anura DD Ground-dwelling 27.299652 39.04825 35.92596 42.67259
Duttaphrynus crocus Anura DD Ground-dwelling 29.045871 39.27901 36.18522 43.00615
Duttaphrynus dhufarensis Anura LC Ground-dwelling 26.174443 38.95522 35.92592 42.13605
Duttaphrynus dhufarensis Anura LC Ground-dwelling 25.210298 38.82869 35.84176 42.05468
Duttaphrynus dhufarensis Anura LC Ground-dwelling 27.803691 39.16903 36.08228 42.31736
Duttaphrynus himalayanus Anura LC Ground-dwelling 16.846374 37.68540 34.76889 41.08397
Duttaphrynus himalayanus Anura LC Ground-dwelling 14.865121 37.42734 34.60687 40.93083
Duttaphrynus himalayanus Anura LC Ground-dwelling 19.409653 38.01928 34.82537 41.11641
Duttaphrynus hololius Anura DD Ground-dwelling 27.111974 39.05075 35.82483 42.50443
Duttaphrynus hololius Anura DD Ground-dwelling 25.959742 38.89768 35.75548 42.34752
Duttaphrynus hololius Anura DD Ground-dwelling 29.381053 39.35219 36.12160 42.99143
Duttaphrynus kotagamai Anura EN Stream-dwelling 27.311256 38.47762 35.22369 42.13813
Duttaphrynus kotagamai Anura EN Stream-dwelling 26.578946 38.37989 35.12020 42.01227
Duttaphrynus kotagamai Anura EN Stream-dwelling 29.131810 38.72057 35.28672 42.31748
Duttaphrynus microtympanum Anura VU Ground-dwelling 27.358708 39.02136 35.83065 42.48235
Duttaphrynus microtympanum Anura VU Ground-dwelling 26.402781 38.89455 35.72200 42.34320
Duttaphrynus microtympanum Anura VU Ground-dwelling 29.307509 39.27987 36.01045 42.78400
Duttaphrynus noellerti Anura CR Ground-dwelling 27.311256 39.07869 35.92102 42.49665
Duttaphrynus noellerti Anura CR Ground-dwelling 26.578946 38.98053 35.78422 42.34959
Duttaphrynus noellerti Anura CR Ground-dwelling 29.131810 39.32274 36.26035 43.03297
Duttaphrynus olivaceus Anura LC Ground-dwelling 25.309856 38.82200 35.58642 42.07399
Duttaphrynus olivaceus Anura LC Ground-dwelling 23.812083 38.62405 35.55004 42.01621
Duttaphrynus olivaceus Anura LC Ground-dwelling 27.544408 39.11732 35.82542 42.35082
Duttaphrynus parietalis Anura NT Ground-dwelling 27.209847 38.96527 35.39213 42.16902
Duttaphrynus parietalis Anura NT Ground-dwelling 26.349017 38.85430 35.35134 42.05798
Duttaphrynus parietalis Anura NT Ground-dwelling 29.004641 39.19665 35.46954 42.29914
Duttaphrynus scorteccii Anura DD Ground-dwelling 24.727285 38.64165 35.50712 41.99290
Duttaphrynus scorteccii Anura DD Ground-dwelling 23.769170 38.51620 35.08093 41.52683
Duttaphrynus scorteccii Anura DD Ground-dwelling 26.383983 38.85856 35.64992 42.21963
Duttaphrynus silentvalleyensis Anura DD Stream-dwelling 26.793491 38.45609 35.02674 42.11953
Duttaphrynus silentvalleyensis Anura DD Stream-dwelling 25.581038 38.29369 34.93061 41.96969
Duttaphrynus silentvalleyensis Anura DD Stream-dwelling 29.313470 38.79362 34.96776 42.30800
Duttaphrynus stomaticus Anura LC Ground-dwelling 25.243454 38.82631 35.46919 41.89979
Duttaphrynus stomaticus Anura LC Ground-dwelling 23.925894 38.65303 35.28779 41.68930
Duttaphrynus stomaticus Anura LC Ground-dwelling 27.531109 39.12719 35.75945 42.29536
Duttaphrynus stuarti Anura DD Ground-dwelling 16.006937 37.56293 34.48669 40.64449
Duttaphrynus stuarti Anura DD Ground-dwelling 14.515037 37.36627 34.34030 40.51347
Duttaphrynus stuarti Anura DD Ground-dwelling 18.366591 37.87399 34.90010 40.98675
Duttaphrynus sumatranus Anura DD Stream-dwelling 28.762320 38.59199 35.26146 42.01040
Duttaphrynus sumatranus Anura DD Stream-dwelling 28.107465 38.50587 35.13691 41.87410
Duttaphrynus sumatranus Anura DD Stream-dwelling 29.991176 38.75360 35.46059 42.29644
Duttaphrynus valhallae Anura DD Ground-dwelling 27.453167 39.04654 35.78413 42.34047
Duttaphrynus valhallae Anura DD Ground-dwelling 27.049049 38.99394 35.78324 42.31594
Duttaphrynus valhallae Anura DD Ground-dwelling 28.657347 39.20328 35.95053 42.57887
Xanthophryne koynayensis Anura EN Ground-dwelling 26.636797 38.90046 35.91811 42.45121
Xanthophryne koynayensis Anura EN Ground-dwelling 25.741836 38.78446 35.80370 42.28349
Xanthophryne koynayensis Anura EN Ground-dwelling 28.748541 39.17418 35.94082 42.61364
Xanthophryne tigerina Anura CR Ground-dwelling 26.698922 38.98209 35.65559 42.29217
Xanthophryne tigerina Anura CR Ground-dwelling 25.807520 38.86444 35.54237 42.16154
Xanthophryne tigerina Anura CR Ground-dwelling 28.809379 39.26064 35.92365 42.74719
Pedostibes tuberculosus Anura EN Stream-dwelling 27.257720 38.48669 35.28258 42.29171
Pedostibes tuberculosus Anura EN Stream-dwelling 26.247648 38.35396 35.16804 42.15535
Pedostibes tuberculosus Anura EN Stream-dwelling 29.370686 38.76433 35.56440 42.69366
Churamiti maridadi Anura CR Arboreal 22.724429 38.39370 35.04526 41.83469
Churamiti maridadi Anura CR Arboreal 21.858574 38.27849 34.93743 41.72814
Churamiti maridadi Anura CR Arboreal 24.911424 38.68471 34.97677 41.90739
Nectophrynoides cryptus Anura EN Ground-dwelling 24.076140 38.73890 35.47249 42.27789
Nectophrynoides cryptus Anura EN Ground-dwelling 23.433959 38.65387 35.36900 42.18467
Nectophrynoides cryptus Anura EN Ground-dwelling 25.567374 38.93636 35.72997 42.55317
Nectophrynoides frontierei Anura DD Ground-dwelling 24.988717 38.78820 35.10621 41.96535
Nectophrynoides frontierei Anura DD Ground-dwelling 24.272514 38.69359 35.04932 41.86404
Nectophrynoides frontierei Anura DD Ground-dwelling 25.980715 38.91923 35.19408 42.10567
Nectophrynoides laevis Anura DD Ground-dwelling 24.195407 38.76471 35.58926 42.32028
Nectophrynoides laevis Anura DD Ground-dwelling 23.571279 38.68125 35.50563 42.21008
Nectophrynoides laevis Anura DD Ground-dwelling 25.699187 38.96580 35.54449 42.32197
Nectophrynoides laticeps Anura CR Ground-dwelling 22.724429 38.52751 35.18509 42.05629
Nectophrynoides laticeps Anura CR Ground-dwelling 21.858574 38.41020 35.12229 41.95159
Nectophrynoides laticeps Anura CR Ground-dwelling 24.911424 38.82380 35.48114 42.54931
Nectophrynoides minutus Anura EN Ground-dwelling 24.076140 38.71311 35.42753 42.28211
Nectophrynoides minutus Anura EN Ground-dwelling 23.433959 38.62887 35.37002 42.19377
Nectophrynoides minutus Anura EN Ground-dwelling 25.567374 38.90871 35.73711 42.59956
Nectophrynoides paulae Anura CR Arboreal 22.724429 38.35031 34.81293 41.69560
Nectophrynoides paulae Anura CR Arboreal 21.858574 38.23512 34.93253 41.74072
Nectophrynoides paulae Anura CR Arboreal 24.911424 38.64126 35.12177 42.13546
Nectophrynoides poyntoni Anura CR Ground-dwelling 21.407079 38.34373 35.25881 41.74033
Nectophrynoides poyntoni Anura CR Ground-dwelling 20.534143 38.22799 35.01902 41.50189
Nectophrynoides poyntoni Anura CR Ground-dwelling 23.114784 38.57015 35.30508 41.89816
Nectophrynoides pseudotornieri Anura CR Ground-dwelling 23.956874 38.67085 34.93698 41.82504
Nectophrynoides pseudotornieri Anura CR Ground-dwelling 23.296639 38.58421 34.87499 41.71553
Nectophrynoides pseudotornieri Anura CR Ground-dwelling 25.435562 38.86488 35.20454 42.15475
Nectophrynoides tornieri Anura LC Ground-dwelling 23.579017 38.60630 35.28236 42.15504
Nectophrynoides tornieri Anura LC Ground-dwelling 22.869950 38.51338 35.17149 42.00228
Nectophrynoides tornieri Anura LC Ground-dwelling 25.035159 38.79711 35.19324 42.08898
Nectophrynoides vestergaardi Anura EN Ground-dwelling 24.969464 38.82334 35.36744 42.04125
Nectophrynoides vestergaardi Anura EN Ground-dwelling 24.301742 38.73619 35.32968 41.95468
Nectophrynoides vestergaardi Anura EN Ground-dwelling 25.986178 38.95603 35.58205 42.31986
Nectophrynoides viviparus Anura LC Ground-dwelling 22.824760 38.49278 34.77043 41.60018
Nectophrynoides viviparus Anura LC Ground-dwelling 22.059754 38.39258 34.72855 41.51884
Nectophrynoides viviparus Anura LC Ground-dwelling 24.417852 38.70144 35.45979 42.35280
Nectophrynoides wendyae Anura CR Ground-dwelling 21.407079 38.32888 35.10469 41.64471
Nectophrynoides wendyae Anura CR Ground-dwelling 20.534143 38.21494 34.98590 41.48245
Nectophrynoides wendyae Anura CR Ground-dwelling 23.114784 38.55178 35.47013 42.05459
Schismaderma carens Anura LC Ground-dwelling 23.484047 38.54602 35.08119 41.84319
Schismaderma carens Anura LC Ground-dwelling 22.461967 38.41252 34.88650 41.59466
Schismaderma carens Anura LC Ground-dwelling 25.580482 38.81985 35.44451 42.37012
Bufotes balearicus Anura LC Ground-dwelling 22.704013 38.92938 36.02763 41.98910
Bufotes balearicus Anura LC Ground-dwelling 20.302823 38.61182 35.79832 41.73600
Bufotes balearicus Anura LC Ground-dwelling 26.115883 39.38061 36.30569 42.49101
Bufotes latastii Anura LC Ground-dwelling 11.686930 37.42133 34.58648 40.39728
Bufotes latastii Anura LC Ground-dwelling 8.922035 37.05294 34.21032 40.10614
Bufotes latastii Anura LC Ground-dwelling 15.050545 37.86948 35.09831 40.90402
Bufotes luristanicus Anura LC Ground-dwelling 23.571664 38.98486 35.80574 41.97681
Bufotes luristanicus Anura LC Ground-dwelling 21.950318 38.77102 35.99332 42.08979
Bufotes luristanicus Anura LC Ground-dwelling 26.007951 39.30619 36.18706 42.43892
Bufotes oblongus Anura LC Ground-dwelling 20.007132 38.50636 35.25895 41.26478
Bufotes oblongus Anura LC Ground-dwelling 18.726976 38.33837 35.41718 41.33711
Bufotes oblongus Anura LC Ground-dwelling 22.219849 38.79672 35.67078 41.74208
Bufotes pseudoraddei Anura LC Ground-dwelling 16.398198 38.02076 34.91242 40.83532
Bufotes pseudoraddei Anura LC Ground-dwelling 14.157880 37.72609 34.41193 40.44207
Bufotes pseudoraddei Anura LC Ground-dwelling 19.593271 38.44101 35.33947 41.32077
Bufotes surdus Anura LC Ground-dwelling 24.081525 38.98310 35.61669 41.94570
Bufotes surdus Anura LC Ground-dwelling 22.417750 38.76450 35.49481 41.77078
Bufotes surdus Anura LC Ground-dwelling 26.650077 39.32058 36.07148 42.58379
Bufotes turanensis Anura LC Ground-dwelling 20.488137 38.52633 35.38786 41.51169
Bufotes turanensis Anura LC Ground-dwelling 19.094219 38.34382 35.07515 41.17044
Bufotes turanensis Anura LC Ground-dwelling 22.661777 38.81094 35.50706 41.66645
Bufotes variabilis Anura DD Ground-dwelling 20.065655 38.55755 36.08552 41.51477
Bufotes variabilis Anura DD Ground-dwelling 17.716009 38.24496 35.82549 41.20133
Bufotes variabilis Anura DD Ground-dwelling 23.488288 39.01289 36.12601 41.78896
Bufotes zamdaensis Anura DD Ground-dwelling 10.733904 37.27654 34.12792 40.58524
Bufotes zamdaensis Anura DD Ground-dwelling 6.885555 36.76830 33.59320 40.08545
Bufotes zamdaensis Anura DD Ground-dwelling 12.867820 37.55836 34.74359 41.14072
Bufotes zugmayeri Anura LC Ground-dwelling 19.730635 38.43546 35.37943 41.78227
Bufotes zugmayeri Anura LC Ground-dwelling 17.928435 38.19807 35.10682 41.45615
Bufotes zugmayeri Anura LC Ground-dwelling 22.956501 38.86039 35.80510 42.28394
Ansonia albomaculata Anura LC Ground-dwelling 27.418306 38.99371 35.40384 42.23135
Ansonia albomaculata Anura LC Ground-dwelling 26.766164 38.90966 35.34912 42.17613
Ansonia albomaculata Anura LC Ground-dwelling 28.712143 39.16048 35.56319 42.43686
Ansonia torrentis Anura LC Stream-dwelling 27.002711 38.32357 35.13617 41.98750
Ansonia torrentis Anura LC Stream-dwelling 26.369992 38.24189 34.86963 41.69570
Ansonia torrentis Anura LC Stream-dwelling 28.309782 38.49231 35.13647 42.00775
Ansonia longidigita Anura LC Ground-dwelling 27.725703 39.04990 35.75822 42.71360
Ansonia longidigita Anura LC Ground-dwelling 27.092043 38.96716 35.69553 42.61153
Ansonia longidigita Anura LC Ground-dwelling 29.025838 39.21966 35.90789 43.00065
Ansonia endauensis Anura NT Stream-dwelling 28.514507 38.64305 34.98273 42.20630
Ansonia endauensis Anura NT Stream-dwelling 27.811479 38.54823 34.90818 42.10314
Ansonia endauensis Anura NT Stream-dwelling 29.886555 38.82810 34.95494 42.25899
Ansonia inthanon Anura LC Stream-dwelling 27.302950 38.42223 35.29042 41.80880
Ansonia inthanon Anura LC Stream-dwelling 26.394553 38.30022 35.21711 41.69835
Ansonia inthanon Anura LC Stream-dwelling 29.113469 38.66542 35.53557 42.17777
Ansonia kraensis Anura LC Stream-dwelling 28.042691 38.40151 34.86723 41.92816
Ansonia kraensis Anura LC Stream-dwelling 27.357106 38.31176 34.85626 41.85834
Ansonia kraensis Anura LC Stream-dwelling 29.822733 38.63454 35.03300 42.17935
Ansonia thinthinae Anura EN Stream-dwelling 27.493589 38.40668 34.72679 42.12609
Ansonia thinthinae Anura EN Stream-dwelling 26.574231 38.28333 35.00435 42.28491
Ansonia thinthinae Anura EN Stream-dwelling 29.198029 38.63535 34.89666 42.40629
Ansonia siamensis Anura EN Stream-dwelling 27.436291 38.33470 34.94632 41.85278
Ansonia siamensis Anura EN Stream-dwelling 26.821591 38.25487 34.87949 41.73468
Ansonia siamensis Anura EN Stream-dwelling 28.892412 38.52380 35.21967 42.17842
Ansonia fuliginea Anura LC Ground-dwelling 27.024307 38.96152 35.52374 42.56745
Ansonia fuliginea Anura LC Ground-dwelling 26.595031 38.90567 35.62244 42.65784
Ansonia fuliginea Anura LC Ground-dwelling 27.949343 39.08187 35.68783 42.82215
Ansonia mcgregori Anura LC Stream-dwelling 27.332163 38.47227 34.96692 42.09060
Ansonia mcgregori Anura LC Stream-dwelling 26.836342 38.40624 34.91340 42.01272
Ansonia mcgregori Anura LC Stream-dwelling 28.392437 38.61348 35.02638 42.20387
Ansonia muelleri Anura LC Stream-dwelling 27.498572 38.44220 34.94626 42.03118
Ansonia muelleri Anura LC Stream-dwelling 26.938824 38.36851 34.92405 41.94913
Ansonia muelleri Anura LC Stream-dwelling 28.644644 38.59307 35.15062 42.32560
Ansonia glandulosa Anura LC Stream-dwelling 28.454327 38.53334 35.08843 42.19580
Ansonia glandulosa Anura LC Stream-dwelling 27.830679 38.45187 35.02699 42.09358
Ansonia glandulosa Anura LC Stream-dwelling 29.604407 38.68357 35.42697 42.59285
Ansonia hanitschi Anura LC Ground-dwelling 27.414718 38.93503 35.14636 42.34401
Ansonia hanitschi Anura LC Ground-dwelling 26.798535 38.85542 35.06319 42.17992
Ansonia hanitschi Anura LC Ground-dwelling 28.664396 39.09647 35.26432 42.60591
Ansonia platysoma Anura LC Stream-dwelling 26.935514 38.28106 34.41161 41.81477
Ansonia platysoma Anura LC Stream-dwelling 26.316600 38.19883 34.42193 41.80365
Ansonia platysoma Anura LC Stream-dwelling 28.162487 38.44408 34.57157 42.06553
Ansonia minuta Anura LC Stream-dwelling 28.091134 38.48758 35.06065 42.00872
Ansonia minuta Anura LC Stream-dwelling 27.417910 38.39981 34.77687 41.70790
Ansonia minuta Anura LC Stream-dwelling 29.426900 38.66173 35.27480 42.31541
Ansonia spinulifer Anura LC Ground-dwelling 27.876153 38.97352 35.73726 42.59047
Ansonia spinulifer Anura LC Ground-dwelling 27.247089 38.88968 35.66498 42.48709
Ansonia spinulifer Anura LC Ground-dwelling 29.176900 39.14687 35.77527 42.74370
Ansonia jeetsukumarani Anura VU Stream-dwelling 27.462038 38.39465 35.06730 42.31012
Ansonia jeetsukumarani Anura VU Stream-dwelling 26.700857 38.29386 35.11138 42.31967
Ansonia jeetsukumarani Anura VU Stream-dwelling 28.886346 38.58325 35.10331 42.48120
Ansonia latidisca Anura EN Arboreal 27.811826 38.87064 35.32423 42.56151
Ansonia latidisca Anura EN Arboreal 27.298663 38.80338 35.29414 42.50349
Ansonia latidisca Anura EN Arboreal 28.868384 39.00913 35.42553 42.69655
Ansonia latiffi Anura NT Stream-dwelling 28.279112 38.51621 34.99535 42.15063
Ansonia latiffi Anura NT Stream-dwelling 27.612955 38.42961 34.94133 42.06984
Ansonia latiffi Anura NT Stream-dwelling 29.622301 38.69082 35.08385 42.34392
Ansonia latirostra Anura DD Arboreal 28.508630 39.07343 35.41317 42.42106
Ansonia latirostra Anura DD Arboreal 27.821987 38.98210 35.37254 42.30796
Ansonia latirostra Anura DD Arboreal 29.886072 39.25664 35.63273 42.75934
Ansonia tiomanica Anura LC Stream-dwelling 28.525468 38.49984 35.18667 42.12335
Ansonia tiomanica Anura LC Stream-dwelling 27.801205 38.40618 34.81218 41.73420
Ansonia tiomanica Anura LC Stream-dwelling 29.989784 38.68920 35.32479 42.28469
Ansonia malayana Anura LC Stream-dwelling 27.851774 38.57407 34.60355 41.91375
Ansonia malayana Anura LC Stream-dwelling 27.147180 38.48023 34.48780 41.76172
Ansonia malayana Anura LC Stream-dwelling 29.316337 38.76914 34.76296 42.18909
Pelophryne albotaeniata Anura VU Arboreal 27.636196 39.00134 35.52289 42.67394
Pelophryne albotaeniata Anura VU Arboreal 27.218140 38.94498 35.47249 42.57522
Pelophryne albotaeniata Anura VU Arboreal 28.579635 39.12853 35.66706 42.83266
Pelophryne api Anura LC Ground-dwelling 27.086462 38.99366 35.64028 42.45678
Pelophryne api Anura LC Ground-dwelling 26.556259 38.92441 35.55082 42.34869
Pelophryne api Anura LC Ground-dwelling 28.322808 39.15515 35.82285 42.70717
Pelophryne brevipes Anura LC Arboreal 27.567075 38.91104 35.57434 42.66712
Pelophryne brevipes Anura LC Arboreal 26.950022 38.82949 35.33608 42.38070
Pelophryne brevipes Anura LC Arboreal 28.795609 39.07340 35.71033 42.82623
Pelophryne guentheri Anura LC Ground-dwelling 27.337663 39.10338 35.56928 42.30922
Pelophryne guentheri Anura LC Ground-dwelling 26.703996 39.01995 35.60303 42.32401
Pelophryne guentheri Anura LC Ground-dwelling 28.532846 39.26075 35.88298 42.73775
Pelophryne lighti Anura LC Arboreal 27.369889 38.98173 35.51387 42.17803
Pelophryne lighti Anura LC Arboreal 26.909497 38.92106 35.48579 42.14586
Pelophryne lighti Anura LC Arboreal 28.330729 39.10834 35.68242 42.40119
Pelophryne linanitensis Anura CR Ground-dwelling 25.985565 38.92303 35.57467 42.14735
Pelophryne linanitensis Anura CR Ground-dwelling 25.023238 38.79634 35.54298 42.05593
Pelophryne linanitensis Anura CR Ground-dwelling 27.465236 39.11782 35.79220 42.49502
Pelophryne misera Anura LC Ground-dwelling 26.801121 38.96443 35.14779 42.27152
Pelophryne misera Anura LC Ground-dwelling 26.209815 38.88650 35.18149 42.23883
Pelophryne misera Anura LC Ground-dwelling 27.867897 39.10504 35.33389 42.57229
Pelophryne murudensis Anura CR Ground-dwelling 25.985565 38.96851 35.49004 42.50481
Pelophryne murudensis Anura CR Ground-dwelling 25.023238 38.83929 35.28209 42.19585
Pelophryne murudensis Anura CR Ground-dwelling 27.465236 39.16719 35.84376 42.97654
Pelophryne rhopophilia Anura VU Ground-dwelling 27.385057 39.07897 35.75937 42.31452
Pelophryne rhopophilia Anura VU Ground-dwelling 26.744047 38.99378 35.74185 42.27122
Pelophryne rhopophilia Anura VU Ground-dwelling 28.668715 39.24956 35.90899 42.57468
Pelophryne signata Anura LC Ground-dwelling 27.523100 39.03090 35.70966 42.61472
Pelophryne signata Anura LC Ground-dwelling 26.938135 38.95514 35.64147 42.52364
Pelophryne signata Anura LC Ground-dwelling 28.676945 39.18032 35.74381 42.76283
Ghatophryne ornata Anura EN Stream-dwelling 26.781316 38.30027 34.66875 41.59526
Ghatophryne ornata Anura EN Stream-dwelling 26.036271 38.20288 34.58739 41.48746
Ghatophryne ornata Anura EN Stream-dwelling 28.329553 38.50266 34.83783 41.87276
Ghatophryne rubigina Anura VU Stream-dwelling 27.548778 38.36310 34.76546 41.89669
Ghatophryne rubigina Anura VU Stream-dwelling 26.422586 38.21726 34.63282 41.68976
Ghatophryne rubigina Anura VU Stream-dwelling 29.780922 38.65216 34.94333 42.32511
Ingerophrynus biporcatus Anura LC Ground-dwelling 27.785064 39.13344 35.73805 42.74102
Ingerophrynus biporcatus Anura LC Ground-dwelling 27.190628 39.05427 35.68001 42.66558
Ingerophrynus biporcatus Anura LC Ground-dwelling 29.045335 39.30130 35.94237 43.06356
Ingerophrynus claviger Anura LC Ground-dwelling 27.318881 38.90418 35.62367 42.62892
Ingerophrynus claviger Anura LC Ground-dwelling 26.809860 38.83880 35.54085 42.51986
Ingerophrynus claviger Anura LC Ground-dwelling 28.268671 39.02616 35.76156 42.84080
Ingerophrynus divergens Anura LC Ground-dwelling 27.955190 39.08715 35.49504 42.69343
Ingerophrynus divergens Anura LC Ground-dwelling 27.327154 39.00442 35.39220 42.53783
Ingerophrynus divergens Anura LC Ground-dwelling 29.268710 39.26018 35.64727 42.95992
Ingerophrynus galeatus Anura LC Ground-dwelling 27.399347 39.05768 34.97220 42.46776
Ingerophrynus galeatus Anura LC Ground-dwelling 26.392352 38.92220 35.42551 42.86847
Ingerophrynus galeatus Anura LC Ground-dwelling 29.294549 39.31267 35.66647 43.28095
Ingerophrynus philippinicus Anura LC Ground-dwelling 27.754735 39.09059 35.66512 42.75722
Ingerophrynus philippinicus Anura LC Ground-dwelling 27.280231 39.02823 35.61095 42.68271
Ingerophrynus philippinicus Anura LC Ground-dwelling 28.758539 39.22252 35.74955 42.90725
Ingerophrynus gollum Anura EN Stream-dwelling 28.109933 38.48433 34.91699 42.29637
Ingerophrynus gollum Anura EN Stream-dwelling 27.442762 38.39541 34.79474 42.15381
Ingerophrynus gollum Anura EN Stream-dwelling 29.452359 38.66325 35.13144 42.59431
Ingerophrynus kumquat Anura EN Ground-dwelling 28.210706 39.10501 35.85547 42.99935
Ingerophrynus kumquat Anura EN Ground-dwelling 27.584449 39.02331 35.80485 42.86299
Ingerophrynus kumquat Anura EN Ground-dwelling 29.649269 39.29267 35.82888 43.09118
Ingerophrynus macrotis Anura LC Ground-dwelling 27.052312 39.00044 35.58939 42.46207
Ingerophrynus macrotis Anura LC Ground-dwelling 26.146455 38.88055 35.42977 42.22970
Ingerophrynus macrotis Anura LC Ground-dwelling 28.838698 39.23685 35.82248 42.84097
Ingerophrynus parvus Anura LC Stream-dwelling 28.322550 38.50843 34.30127 41.54620
Ingerophrynus parvus Anura LC Stream-dwelling 27.620510 38.41630 34.29468 41.49930
Ingerophrynus parvus Anura LC Stream-dwelling 29.801474 38.70250 34.46549 41.78834
Ingerophrynus quadriporcatus Anura LC Ground-dwelling 28.162664 39.08183 35.68615 42.73833
Ingerophrynus quadriporcatus Anura LC Ground-dwelling 27.553317 39.00293 35.58107 42.61310
Ingerophrynus quadriporcatus Anura LC Ground-dwelling 29.448586 39.24834 35.86148 42.92800
Ingerophrynus celebensis Anura LC Ground-dwelling 26.828017 38.92151 35.60969 42.47300
Ingerophrynus celebensis Anura LC Ground-dwelling 26.355440 38.85810 35.59934 42.47447
Ingerophrynus celebensis Anura LC Ground-dwelling 27.927707 39.06905 35.73364 42.60390
Bufo ailaoanus Anura EN Ground-dwelling 22.395776 38.09112 35.34661 41.25949
Bufo ailaoanus Anura EN Ground-dwelling 21.429350 37.96248 35.15611 41.01876
Bufo ailaoanus Anura EN Ground-dwelling 24.505404 38.37193 35.51597 41.50390
Bufo aspinius Anura EN Ground-dwelling 19.409389 37.56690 34.59868 40.55245
Bufo aspinius Anura EN Ground-dwelling 18.233419 37.41115 34.37175 40.30295
Bufo aspinius Anura EN Ground-dwelling 21.549212 37.85030 34.87176 40.91796
Bufo cryptotympanicus Anura LC Ground-dwelling 26.782508 38.64313 35.35221 41.65153
Bufo cryptotympanicus Anura LC Ground-dwelling 25.612648 38.48719 35.19223 41.44486
Bufo cryptotympanicus Anura LC Ground-dwelling 29.029103 38.94260 35.28452 41.78972
Bufo tuberculatus Anura NT Ground-dwelling 14.683533 37.10034 35.08541 39.42820
Bufo tuberculatus Anura NT Ground-dwelling 13.042082 36.88164 34.90529 39.24274
Bufo tuberculatus Anura NT Ground-dwelling 17.154584 37.42958 35.24904 39.58429
Bufo eichwaldi Anura VU Ground-dwelling 19.615826 37.69034 35.06667 40.96014
Bufo eichwaldi Anura VU Ground-dwelling 17.843222 37.45739 34.59825 40.41235
Bufo eichwaldi Anura VU Ground-dwelling 21.805016 37.97802 35.21289 41.11838
Bufo japonicus Anura LC Ground-dwelling 24.587237 38.30110 35.46620 41.44767
Bufo japonicus Anura LC Ground-dwelling 21.831463 37.93411 34.97534 40.87649
Bufo japonicus Anura LC Ground-dwelling 27.331172 38.66651 35.71216 41.81554
Bufo torrenticola Anura LC Ground-dwelling 24.914009 38.31112 35.53825 41.48029
Bufo torrenticola Anura LC Ground-dwelling 22.210472 37.95171 35.15091 40.92949
Bufo torrenticola Anura LC Ground-dwelling 27.642825 38.67390 35.70121 41.83778
Bufo pageoti Anura LC Ground-dwelling 23.716993 38.17925 35.15669 40.99612
Bufo pageoti Anura LC Ground-dwelling 22.621618 38.03311 35.05282 40.81259
Bufo pageoti Anura LC Ground-dwelling 25.692722 38.44284 35.27894 41.29212
Bufo stejnegeri Anura LC Ground-dwelling 22.263247 38.00233 34.83672 40.65035
Bufo stejnegeri Anura LC Ground-dwelling 17.891938 37.41900 34.28718 39.91617
Bufo stejnegeri Anura LC Ground-dwelling 25.612938 38.44933 35.30642 41.23007
Bufo verrucosissimus Anura NT Ground-dwelling 19.902773 37.68591 34.65946 40.38468
Bufo verrucosissimus Anura NT Ground-dwelling 17.302718 37.34796 34.48111 40.17009
Bufo verrucosissimus Anura NT Ground-dwelling 22.934507 38.07995 35.11665 40.97537
Strauchbufo raddei Anura LC Ground-dwelling 18.457993 37.74642 34.63826 41.39467
Strauchbufo raddei Anura LC Ground-dwelling 15.352836 37.34045 33.88518 40.66890
Strauchbufo raddei Anura LC Ground-dwelling 22.454686 38.26895 34.83477 41.66003
Didynamipus sjostedti Anura VU Ground-dwelling 26.914991 38.90798 35.51335 42.33115
Didynamipus sjostedti Anura VU Ground-dwelling 26.352934 38.83393 35.51707 42.29164
Didynamipus sjostedti Anura VU Ground-dwelling 28.180028 39.07464 35.68784 42.54072
Nimbaphrynoides occidentalis Anura CR Ground-dwelling 27.417573 38.94645 35.35905 42.51424
Nimbaphrynoides occidentalis Anura CR Ground-dwelling 26.699780 38.85188 35.47545 42.60532
Nimbaphrynoides occidentalis Anura CR Ground-dwelling 28.789297 39.12717 35.53946 42.75647
Nectophryne afra Anura LC Ground-dwelling 27.110622 38.86122 35.54626 42.29153
Nectophryne afra Anura LC Ground-dwelling 26.408558 38.76890 35.48728 42.15829
Nectophryne afra Anura LC Ground-dwelling 28.631399 39.06119 35.71627 42.60284
Nectophryne batesii Anura LC Ground-dwelling 27.082706 38.77409 35.41968 42.02434
Nectophryne batesii Anura LC Ground-dwelling 26.358747 38.67896 35.27541 41.87001
Nectophryne batesii Anura LC Ground-dwelling 28.641070 38.97885 35.57374 42.23623
Werneria bambutensis Anura CR Stream-dwelling 25.936864 38.18617 34.39566 41.64165
Werneria bambutensis Anura CR Stream-dwelling 25.218877 38.09231 34.50982 41.73864
Werneria bambutensis Anura CR Stream-dwelling 27.405161 38.37812 34.54967 41.81505
Werneria iboundji Anura CR Stream-dwelling 27.729088 38.38116 35.13822 42.11934
Werneria iboundji Anura CR Stream-dwelling 26.782051 38.25587 34.66071 41.55961
Werneria iboundji Anura CR Stream-dwelling 29.517435 38.61775 34.91318 42.01064
Werneria mertensiana Anura CR Stream-dwelling 26.586488 38.22429 34.90187 41.35423
Werneria mertensiana Anura CR Stream-dwelling 26.001122 38.14639 34.84580 41.26804
Werneria mertensiana Anura CR Stream-dwelling 27.970296 38.40844 35.00020 41.56609
Werneria tandyi Anura CR Stream-dwelling 26.871381 38.19742 34.82282 41.79363
Werneria tandyi Anura CR Stream-dwelling 26.335541 38.12812 34.80054 41.70993
Werneria tandyi Anura CR Stream-dwelling 28.169295 38.36527 35.00773 42.10631
Werneria preussi Anura EN Stream-dwelling 26.939038 38.34200 34.89716 42.43526
Werneria preussi Anura EN Stream-dwelling 26.407567 38.27148 34.78520 42.31005
Werneria preussi Anura EN Stream-dwelling 28.227584 38.51298 35.01945 42.62531
Werneria submontana Anura EN Stream-dwelling 26.871381 38.16505 34.60730 41.78985
Werneria submontana Anura EN Stream-dwelling 26.335541 38.09637 34.63078 41.73080
Werneria submontana Anura EN Stream-dwelling 28.169295 38.33141 34.42980 41.70878
Wolterstorffina chirioi Anura CR Ground-dwelling 25.529022 38.73284 35.35205 42.34434
Wolterstorffina chirioi Anura CR Ground-dwelling 24.726769 38.62669 35.25807 42.20422
Wolterstorffina chirioi Anura CR Ground-dwelling 27.197252 38.95357 35.42230 42.55476
Wolterstorffina mirei Anura EN Ground-dwelling 25.503435 38.70911 35.16160 42.05988
Wolterstorffina mirei Anura EN Ground-dwelling 24.696557 38.60277 35.13566 41.99895
Wolterstorffina mirei Anura EN Ground-dwelling 27.052238 38.91322 35.24167 42.23534
Wolterstorffina parvipalmata Anura CR Stream-dwelling 26.590947 38.14682 34.76535 41.59851
Wolterstorffina parvipalmata Anura CR Stream-dwelling 25.990155 38.06885 34.69799 41.51911
Wolterstorffina parvipalmata Anura CR Stream-dwelling 27.931386 38.32079 35.02828 41.98958
Leptophryne borbonica Anura LC Ground-dwelling 28.003333 38.99321 35.38925 42.11705
Leptophryne borbonica Anura LC Ground-dwelling 27.352050 38.90767 35.30077 41.97186
Leptophryne borbonica Anura LC Ground-dwelling 29.361238 39.17153 35.53951 42.32828
Leptophryne cruentata Anura CR Stream-dwelling 28.268583 38.40858 34.77078 41.78101
Leptophryne cruentata Anura CR Stream-dwelling 27.422313 38.29659 34.70828 41.68361
Leptophryne cruentata Anura CR Stream-dwelling 30.172717 38.66057 34.99740 42.12989
Pedostibes kempi Anura DD Arboreal 25.381128 38.57457 34.98897 41.74093
Pedostibes kempi Anura DD Arboreal 24.427616 38.44881 34.88092 41.58609
Pedostibes kempi Anura DD Arboreal 26.997123 38.78772 35.39478 42.23528
Altiphrynoides malcolmi Anura EN Ground-dwelling 19.551980 37.71234 33.78180 42.03098
Altiphrynoides malcolmi Anura EN Ground-dwelling 18.623349 37.58948 33.71380 41.89287
Altiphrynoides malcolmi Anura EN Ground-dwelling 20.878203 37.88781 33.67483 41.92139
Amazophrynella bokermanni Anura LC Ground-dwelling 27.730366 38.91634 34.92231 43.14131
Amazophrynella bokermanni Anura LC Ground-dwelling 27.089797 38.83206 35.13000 43.34418
Amazophrynella bokermanni Anura LC Ground-dwelling 29.328561 39.12663 35.21556 43.47454
Amazophrynella minuta Anura LC Ground-dwelling 27.352262 38.76968 35.25276 43.05485
Amazophrynella minuta Anura LC Ground-dwelling 26.630485 38.67332 35.09158 42.86209
Amazophrynella minuta Anura LC Ground-dwelling 28.887303 38.97464 35.36240 43.20807
Dendrophryniscus berthalutzae Anura LC Ground-dwelling 24.554178 38.44975 34.51141 42.60495
Dendrophryniscus berthalutzae Anura LC Ground-dwelling 22.850397 38.22806 34.31622 42.33922
Dendrophryniscus berthalutzae Anura LC Ground-dwelling 27.141045 38.78636 34.75871 42.90933
Dendrophryniscus krausae Anura DD Ground-dwelling 24.426399 38.47816 34.40467 42.46164
Dendrophryniscus krausae Anura DD Ground-dwelling 22.464546 38.22163 33.85797 41.79425
Dendrophryniscus krausae Anura DD Ground-dwelling 27.134302 38.83225 34.78822 42.96584
Dendrophryniscus leucomystax Anura LC Ground-dwelling 25.640890 38.56686 34.55958 42.83037
Dendrophryniscus leucomystax Anura LC Ground-dwelling 24.196548 38.37816 34.46123 42.65187
Dendrophryniscus leucomystax Anura LC Ground-dwelling 28.000857 38.87519 35.03012 43.25942
Dendrophryniscus brevipollicatus Anura LC Ground-dwelling 25.473399 38.60798 34.55906 42.89380
Dendrophryniscus brevipollicatus Anura LC Ground-dwelling 24.362228 38.46025 34.68421 42.98358
Dendrophryniscus brevipollicatus Anura LC Ground-dwelling 27.359660 38.85878 34.79278 43.19201
Dendrophryniscus carvalhoi Anura EN Ground-dwelling 25.507727 38.60140 34.66692 42.91618
Dendrophryniscus carvalhoi Anura EN Ground-dwelling 24.733105 38.50134 34.56817 42.78475
Dendrophryniscus carvalhoi Anura EN Ground-dwelling 27.100258 38.80711 34.90634 43.18640
Dendrophryniscus proboscideus Anura DD Ground-dwelling 25.273659 38.62149 34.60082 42.63165
Dendrophryniscus proboscideus Anura DD Ground-dwelling 24.417339 38.50899 34.47079 42.51537
Dendrophryniscus proboscideus Anura DD Ground-dwelling 27.049251 38.85477 34.82234 42.97298
Dendrophryniscus stawiarskyi Anura DD Ground-dwelling 24.851961 38.50960 34.73682 42.76689
Dendrophryniscus stawiarskyi Anura DD Ground-dwelling 23.130755 38.28083 34.38230 42.42662
Dendrophryniscus stawiarskyi Anura DD Ground-dwelling 27.596437 38.87438 34.93766 43.20302
Vandijkophrynus amatolicus Anura CR Ground-dwelling 20.359510 37.84154 34.14911 41.85229
Vandijkophrynus amatolicus Anura CR Ground-dwelling 18.811550 37.63581 33.73085 41.39675
Vandijkophrynus amatolicus Anura CR Ground-dwelling 22.663297 38.14773 34.27229 42.00519
Vandijkophrynus inyangae Anura VU Ground-dwelling 23.458157 38.27967 34.66341 42.56253
Vandijkophrynus inyangae Anura VU Ground-dwelling 22.128710 38.10398 34.45564 42.35530
Vandijkophrynus inyangae Anura VU Ground-dwelling 25.923501 38.60546 34.70300 42.73015
Vandijkophrynus angusticeps Anura LC Ground-dwelling 20.619652 37.97101 34.04325 41.96465
Vandijkophrynus angusticeps Anura LC Ground-dwelling 19.195990 37.78359 33.92904 41.80494
Vandijkophrynus angusticeps Anura LC Ground-dwelling 23.273232 38.32035 34.20671 42.22171
Vandijkophrynus gariepensis Anura LC Ground-dwelling 20.641087 37.93540 33.69917 41.52637
Vandijkophrynus gariepensis Anura LC Ground-dwelling 19.170112 37.73978 33.56536 41.35641
Vandijkophrynus gariepensis Anura LC Ground-dwelling 23.280547 38.28640 33.87560 41.89108
Vandijkophrynus robinsoni Anura LC Ground-dwelling 19.863346 37.82830 33.97794 42.30848
Vandijkophrynus robinsoni Anura LC Ground-dwelling 18.641401 37.66599 33.83266 42.17242
Vandijkophrynus robinsoni Anura LC Ground-dwelling 22.660848 38.19990 34.38324 42.69970
Anaxyrus hemiophrys Anura LC Ground-dwelling 18.452838 38.37359 36.41699 40.43538
Anaxyrus hemiophrys Anura LC Ground-dwelling 14.992718 37.93521 36.04201 39.92652
Anaxyrus hemiophrys Anura LC Ground-dwelling 23.226613 38.97842 36.90101 41.23506
Anaxyrus houstonensis Anura CR Ground-dwelling 26.847150 39.42299 37.03690 41.70282
Anaxyrus houstonensis Anura CR Ground-dwelling 25.700879 39.27966 36.96871 41.50759
Anaxyrus houstonensis Anura CR Ground-dwelling 29.219348 39.71961 37.27230 42.17292
Anaxyrus microscaphus Anura LC Ground-dwelling 20.201250 38.41153 35.93121 40.56093
Anaxyrus microscaphus Anura LC Ground-dwelling 18.077707 38.14961 35.73635 40.26698
Anaxyrus microscaphus Anura LC Ground-dwelling 23.433226 38.81015 36.17575 41.00816
Anaxyrus californicus Anura EN Ground-dwelling 21.079250 38.58420 36.03843 40.94409
Anaxyrus californicus Anura EN Ground-dwelling 19.542315 38.39416 35.82325 40.67692
Anaxyrus californicus Anura EN Ground-dwelling 23.599758 38.89586 36.45020 41.49882
Anaxyrus debilis Anura LC Fossorial 23.313032 40.23432 37.90163 42.87096
Anaxyrus debilis Anura LC Fossorial 21.734852 40.03843 37.51698 42.36153
Anaxyrus debilis Anura LC Fossorial 25.869823 40.55167 38.19877 43.31511
Anaxyrus kelloggi Anura LC Ground-dwelling 25.014850 39.09089 36.20520 41.86466
Anaxyrus kelloggi Anura LC Ground-dwelling 23.483398 38.89815 36.14213 41.70732
Anaxyrus kelloggi Anura LC Ground-dwelling 27.418042 39.39334 36.39104 42.18329
Anaxyrus mexicanus Anura LC Ground-dwelling 23.648498 38.93983 36.32242 41.88475
Anaxyrus mexicanus Anura LC Ground-dwelling 21.745288 38.70127 36.15200 41.55677
Anaxyrus mexicanus Anura LC Ground-dwelling 26.520420 39.29983 36.43440 42.15361
Anaxyrus quercicus Anura LC Ground-dwelling 26.912737 39.33596 36.30668 42.10533
Anaxyrus quercicus Anura LC Ground-dwelling 24.476380 39.03333 36.18648 41.87071
Anaxyrus quercicus Anura LC Ground-dwelling 29.656229 39.67674 36.66286 42.71291
Anaxyrus speciosus Anura LC Fossorial 24.159347 39.97414 37.29849 42.86546
Anaxyrus speciosus Anura LC Fossorial 22.767328 39.80021 37.06502 42.62763
Anaxyrus speciosus Anura LC Fossorial 26.490125 40.26538 37.47041 43.20018
Incilius occidentalis Anura LC Ground-dwelling 23.987227 39.56393 36.92611 42.46688
Incilius occidentalis Anura LC Ground-dwelling 22.837343 39.42028 36.67254 42.14270
Incilius occidentalis Anura LC Ground-dwelling 26.093001 39.82700 37.06706 42.70017
Incilius aucoinae Anura LC Ground-dwelling 25.362599 39.68392 36.57393 42.57831
Incilius aucoinae Anura LC Ground-dwelling 24.634074 39.59024 36.47233 42.44938
Incilius aucoinae Anura LC Ground-dwelling 26.672877 39.85239 36.57038 42.64482
Incilius melanochlorus Anura LC Ground-dwelling 26.242402 39.70621 36.69209 42.74267
Incilius melanochlorus Anura LC Ground-dwelling 25.504803 39.61318 36.70428 42.66990
Incilius melanochlorus Anura LC Ground-dwelling 27.712240 39.89159 36.87566 43.07139
Incilius campbelli Anura LC Stream-dwelling 26.128522 39.07660 35.80569 42.51357
Incilius campbelli Anura LC Stream-dwelling 25.265890 38.96877 35.66157 42.29239
Incilius campbelli Anura LC Stream-dwelling 27.952521 39.30462 35.81401 42.70163
Incilius leucomyos Anura NT Ground-dwelling 25.917576 39.70711 36.67132 42.71292
Incilius leucomyos Anura NT Ground-dwelling 25.079984 39.60206 36.58248 42.59992
Incilius leucomyos Anura NT Ground-dwelling 27.564304 39.91365 36.82193 42.95703
Incilius macrocristatus Anura NT Ground-dwelling 27.501277 39.90426 36.65623 43.02968
Incilius macrocristatus Anura NT Ground-dwelling 26.539788 39.78168 36.60481 42.94415
Incilius macrocristatus Anura NT Ground-dwelling 29.362059 40.14150 36.76062 43.26537
Incilius tutelarius Anura VU Stream-dwelling 26.063509 39.09796 35.90168 41.98152
Incilius tutelarius Anura VU Stream-dwelling 25.061473 38.97100 35.75383 41.85321
Incilius tutelarius Anura VU Stream-dwelling 28.180103 39.36612 36.17311 42.28457
Incilius cristatus Anura EN Ground-dwelling 24.221617 39.45190 36.39538 42.60375
Incilius cristatus Anura EN Ground-dwelling 23.185423 39.32198 36.23129 42.37527
Incilius cristatus Anura EN Ground-dwelling 26.534397 39.74189 36.66588 43.03827
Incilius perplexus Anura LC Ground-dwelling 25.009764 39.62457 36.84327 42.47946
Incilius perplexus Anura LC Ground-dwelling 24.026170 39.49854 36.78920 42.39535
Incilius perplexus Anura LC Ground-dwelling 26.752376 39.84786 36.98459 42.78073
Incilius cavifrons Anura EN Stream-dwelling 26.976054 39.16187 35.79718 42.22026
Incilius cavifrons Anura EN Stream-dwelling 25.987890 39.03590 35.67322 42.06246
Incilius cavifrons Anura EN Stream-dwelling 29.057037 39.42716 35.94612 42.53260
Incilius spiculatus Anura EN Stream-dwelling 22.187059 38.62483 35.00908 41.45447
Incilius spiculatus Anura EN Stream-dwelling 20.787577 38.44572 35.04859 41.40209
Incilius spiculatus Anura EN Stream-dwelling 25.070986 38.99391 36.00645 42.56682
Incilius chompipe Anura EN Ground-dwelling 24.025703 39.47657 36.42785 42.33935
Incilius chompipe Anura EN Ground-dwelling 23.191250 39.37171 36.39442 42.25578
Incilius chompipe Anura EN Ground-dwelling 25.507747 39.66281 36.80607 42.81391
Incilius coniferus Anura LC Ground-dwelling 26.088055 39.75456 36.58965 42.61302
Incilius coniferus Anura LC Ground-dwelling 25.347185 39.66131 36.51894 42.49475
Incilius coniferus Anura LC Ground-dwelling 27.514381 39.93409 36.89006 43.04032
Incilius coccifer Anura LC Ground-dwelling 26.494149 39.82588 36.47492 42.94743
Incilius coccifer Anura LC Ground-dwelling 25.668301 39.72142 36.27461 42.68268
Incilius coccifer Anura LC Ground-dwelling 28.258333 40.04903 36.71093 43.32933
Incilius cycladen Anura VU Ground-dwelling 25.060905 39.67208 36.86268 42.82881
Incilius cycladen Anura VU Ground-dwelling 23.994974 39.53559 36.51226 42.42382
Incilius cycladen Anura VU Ground-dwelling 26.928628 39.91123 37.11797 43.22062
Incilius signifer Anura LC Ground-dwelling 26.879933 39.85651 36.94967 43.11389
Incilius signifer Anura LC Ground-dwelling 26.296543 39.78347 36.88418 43.05995
Incilius signifer Anura LC Ground-dwelling 28.031257 40.00064 37.04085 43.28718
Incilius porteri Anura LC Ground-dwelling 25.744456 39.71193 36.68231 42.85453
Incilius porteri Anura LC Ground-dwelling 24.699963 39.57809 36.63827 42.78678
Incilius porteri Anura LC Ground-dwelling 27.875131 39.98495 36.90759 43.31851
Incilius ibarrai Anura LC Ground-dwelling 25.251816 39.65160 36.47829 42.33514
Incilius ibarrai Anura LC Ground-dwelling 24.210518 39.52038 36.43357 42.22998
Incilius ibarrai Anura LC Ground-dwelling 27.378039 39.91954 36.55402 42.55575
Incilius pisinnus Anura EN Ground-dwelling 24.273360 39.52035 36.57358 42.36498
Incilius pisinnus Anura EN Ground-dwelling 23.336191 39.40182 36.71733 42.45111
Incilius pisinnus Anura EN Ground-dwelling 25.826783 39.71681 36.85878 42.71174
Incilius epioticus Anura VU Ground-dwelling 24.247729 39.46614 36.41013 42.62333
Incilius epioticus Anura VU Ground-dwelling 23.486497 39.36925 36.31400 42.47839
Incilius epioticus Anura VU Ground-dwelling 25.406800 39.61367 36.54563 42.84599
Incilius gemmifer Anura EN Ground-dwelling 25.815355 39.63376 36.63152 42.57220
Incilius gemmifer Anura EN Ground-dwelling 24.824180 39.50735 36.46865 42.35782
Incilius gemmifer Anura EN Ground-dwelling 27.763579 39.88224 36.77464 42.81455
Incilius guanacaste Anura EN Ground-dwelling 26.434550 39.76841 36.69518 42.99328
Incilius guanacaste Anura EN Ground-dwelling 25.923240 39.70504 36.69249 42.95457
Incilius guanacaste Anura EN Ground-dwelling 27.889612 39.94875 36.87043 43.20675
Incilius holdridgei Anura CR Ground-dwelling 27.435694 39.85137 36.65976 43.02751
Incilius holdridgei Anura CR Ground-dwelling 26.744760 39.76512 36.56557 42.93967
Incilius holdridgei Anura CR Ground-dwelling 29.013624 40.04834 36.83050 43.24804
Incilius luetkenii Anura LC Ground-dwelling 26.554609 39.89682 37.25902 42.85941
Incilius luetkenii Anura LC Ground-dwelling 25.720962 39.79169 37.14468 42.65319
Incilius luetkenii Anura LC Ground-dwelling 28.432880 40.13367 37.35729 43.13514
Incilius nebulifer Anura LC Ground-dwelling 25.605637 39.63598 36.35473 42.55208
Incilius nebulifer Anura LC Ground-dwelling 24.450329 39.49341 36.29089 42.40983
Incilius nebulifer Anura LC Ground-dwelling 27.769772 39.90304 36.55257 42.89291
Incilius valliceps Anura LC Ground-dwelling 26.754601 39.80447 36.81559 42.82021
Incilius valliceps Anura LC Ground-dwelling 25.923092 39.69904 36.82321 42.73321
Incilius valliceps Anura LC Ground-dwelling 28.510144 40.02706 36.83917 42.98843
Incilius tacanensis Anura EN Stream-dwelling 25.222340 39.01670 36.05554 42.45602
Incilius tacanensis Anura EN Stream-dwelling 24.309797 38.90139 35.98203 42.36528
Incilius tacanensis Anura EN Stream-dwelling 27.326458 39.28258 36.20365 42.71187
Incilius bocourti Anura LC Ground-dwelling 25.379063 39.48882 36.26442 42.62926
Incilius bocourti Anura LC Ground-dwelling 24.367138 39.35989 36.30863 42.62106
Incilius bocourti Anura LC Ground-dwelling 27.419442 39.74879 36.53989 43.09426
Rhinella abei Anura LC Ground-dwelling 24.373733 39.78804 37.11826 42.14266
Rhinella abei Anura LC Ground-dwelling 22.634890 39.57067 37.32516 42.18382
Rhinella abei Anura LC Ground-dwelling 26.942582 40.10916 37.55187 42.80347
Rhinella pombali Anura LC Ground-dwelling 25.457101 39.93531 37.32631 42.46690
Rhinella pombali Anura LC Ground-dwelling 24.257156 39.78430 37.20652 42.24656
Rhinella pombali Anura LC Ground-dwelling 27.888390 40.24128 37.45312 42.75847
Rhinella achalensis Anura EN Ground-dwelling 22.398275 39.37341 35.69006 42.36340
Rhinella achalensis Anura EN Ground-dwelling 20.409249 39.12391 35.53670 42.09891
Rhinella achalensis Anura EN Ground-dwelling 25.864072 39.80816 36.10298 42.97966
Rhinella achavali Anura LC Stream-dwelling 24.159848 39.37637 37.05386 41.86415
Rhinella achavali Anura LC Stream-dwelling 22.297974 39.14224 36.92469 41.59740
Rhinella achavali Anura LC Stream-dwelling 27.251849 39.76520 37.46508 42.50436
Rhinella rubescens Anura LC Stream-dwelling 26.520357 39.67063 37.30861 42.38462
Rhinella rubescens Anura LC Stream-dwelling 25.414779 39.53012 37.19687 42.21572
Rhinella rubescens Anura LC Stream-dwelling 28.641762 39.94025 37.36579 42.54464
Rhinella acrolopha Anura EN Ground-dwelling 26.997239 40.03897 36.46394 43.37237
Rhinella acrolopha Anura EN Ground-dwelling 26.294779 39.94912 36.39386 43.27435
Rhinella acrolopha Anura EN Ground-dwelling 28.463507 40.22652 36.54818 43.56271
Rhinella acutirostris Anura LC Ground-dwelling 26.986549 39.93592 36.72240 43.26949
Rhinella acutirostris Anura LC Ground-dwelling 26.223594 39.84025 36.59639 43.07872
Rhinella acutirostris Anura LC Ground-dwelling 28.567511 40.13415 36.76121 43.44629
Rhinella alata Anura DD Ground-dwelling 26.736946 39.98231 36.68543 43.04650
Rhinella alata Anura DD Ground-dwelling 25.959981 39.88276 36.62530 42.90677
Rhinella alata Anura DD Ground-dwelling 28.199878 40.16977 37.26001 43.76059
Rhinella amabilis Anura CR Semi-aquatic 22.504554 39.53424 36.10218 42.74690
Rhinella amabilis Anura CR Semi-aquatic 21.223948 39.37708 36.06900 42.60026
Rhinella amabilis Anura CR Semi-aquatic 24.506837 39.77997 36.38132 43.03043
Rhinella amboroensis Anura DD Stream-dwelling 22.415740 38.74912 35.54181 41.97831
Rhinella amboroensis Anura DD Stream-dwelling 21.616824 38.64840 35.60346 42.04663
Rhinella amboroensis Anura DD Stream-dwelling 23.646629 38.90429 35.53870 42.00275
Rhinella veraguensis Anura LC Arboreal 19.828365 38.85123 35.70598 42.24012
Rhinella veraguensis Anura LC Arboreal 18.791244 38.72207 35.53282 41.99921
Rhinella veraguensis Anura LC Arboreal 21.170542 39.01838 35.77289 42.36010
Rhinella arborescandens Anura EN Arboreal 22.288978 39.23811 35.93749 42.28434
Rhinella arborescandens Anura EN Arboreal 21.418622 39.12909 35.81123 42.14834
Rhinella arborescandens Anura EN Arboreal 23.913806 39.44164 36.25932 42.60435
Rhinella arunco Anura NT Ground-dwelling 17.284226 38.73551 35.20305 41.52904
Rhinella arunco Anura NT Ground-dwelling 15.336621 38.49335 35.35913 41.63744
Rhinella arunco Anura NT Ground-dwelling 21.204778 39.22297 35.72010 42.11270
Rhinella atacamensis Anura VU Semi-aquatic 16.681890 38.86347 35.83040 41.96592
Rhinella atacamensis Anura VU Semi-aquatic 14.773121 38.62032 35.70610 41.81752
Rhinella atacamensis Anura VU Semi-aquatic 19.645032 39.24095 36.13709 42.37928
Rhinella bergi Anura LC Ground-dwelling 26.918918 39.98250 36.33011 43.05284
Rhinella bergi Anura LC Ground-dwelling 25.310883 39.78121 36.57603 43.19571
Rhinella bergi Anura LC Ground-dwelling 29.769001 40.33928 36.53957 43.42158
Rhinella castaneotica Anura LC Ground-dwelling 28.016999 40.07197 36.87834 43.53890
Rhinella castaneotica Anura LC Ground-dwelling 27.292009 39.97959 36.84130 43.44045
Rhinella castaneotica Anura LC Ground-dwelling 29.570361 40.26990 36.75968 43.52205
Rhinella cerradensis Anura DD Ground-dwelling 26.818249 40.36868 37.71408 43.14565
Rhinella cerradensis Anura DD Ground-dwelling 25.671643 40.21956 37.66456 42.98075
Rhinella cerradensis Anura DD Ground-dwelling 28.990244 40.65117 37.83820 43.45235
Rhinella jimi Anura LC Ground-dwelling 25.675823 40.20933 37.78923 42.95070
Rhinella jimi Anura LC Ground-dwelling 24.786098 40.09550 37.67587 42.85160
Rhinella jimi Anura LC Ground-dwelling 27.286336 40.41538 37.89951 43.25039
Rhinella chavin Anura EN Arboreal 19.316212 38.73080 35.53456 42.05142
Rhinella chavin Anura EN Arboreal 18.251736 38.59486 35.51471 42.02112
Rhinella chavin Anura EN Arboreal 21.470781 39.00597 35.84933 42.40857
Rhinella cristinae Anura EN Ground-dwelling 24.779899 39.66361 36.36167 42.85200
Rhinella cristinae Anura EN Ground-dwelling 23.907074 39.55537 36.24727 42.72344
Rhinella cristinae Anura EN Ground-dwelling 26.265578 39.84784 36.44534 42.99154
Rhinella dapsilis Anura LC Ground-dwelling 26.771160 39.89905 36.99012 43.54776
Rhinella dapsilis Anura LC Ground-dwelling 26.052148 39.80835 36.93868 43.37544
Rhinella dapsilis Anura LC Ground-dwelling 28.179073 40.07665 36.65164 43.37159
Rhinella martyi Anura LC Ground-dwelling 27.219237 39.92595 36.59334 43.29328
Rhinella martyi Anura LC Ground-dwelling 26.593578 39.84681 36.54162 43.18508
Rhinella martyi Anura LC Ground-dwelling 28.713338 40.11497 36.70090 43.48905
Rhinella lescurei Anura LC Ground-dwelling 27.398799 39.98602 36.30421 42.97384
Rhinella lescurei Anura LC Ground-dwelling 26.760844 39.90408 36.33033 42.92926
Rhinella lescurei Anura LC Ground-dwelling 29.054901 40.19872 36.49703 43.33144
Rhinella fernandezae Anura LC Ground-dwelling 24.664402 39.76435 36.67558 42.45989
Rhinella fernandezae Anura LC Ground-dwelling 22.868972 39.53553 36.49899 42.24120
Rhinella fernandezae Anura LC Ground-dwelling 27.761048 40.15899 37.00060 42.98137
Rhinella festae Anura LC Ground-dwelling 23.847590 39.56222 36.50926 42.71732
Rhinella festae Anura LC Ground-dwelling 22.673898 39.41388 36.43075 42.54869
Rhinella festae Anura LC Ground-dwelling 25.726598 39.79972 36.80578 43.17999
Rhinella fissipes Anura DD Ground-dwelling 20.371499 39.08923 36.16273 42.25411
Rhinella fissipes Anura DD Ground-dwelling 19.859569 39.02562 36.10343 42.17810
Rhinella fissipes Anura DD Ground-dwelling 21.554245 39.23620 36.24050 42.41218
Rhinella gallardoi Anura EN Ground-dwelling 22.860302 39.40486 36.28719 42.85690
Rhinella gallardoi Anura EN Ground-dwelling 21.222878 39.19932 36.17030 42.72670
Rhinella gallardoi Anura EN Ground-dwelling 25.222075 39.70132 36.68063 43.27865
Rhinella gnustae Anura DD Stream-dwelling 15.309324 37.82542 34.80860 41.14191
Rhinella gnustae Anura DD Stream-dwelling 13.823896 37.63890 34.71162 41.04708
Rhinella gnustae Anura DD Stream-dwelling 17.433722 38.09218 35.11212 41.46199
Rhinella henseli Anura LC Ground-dwelling 24.754242 39.62911 36.28350 42.97639
Rhinella henseli Anura LC Ground-dwelling 22.910064 39.40101 35.89039 42.47929
Rhinella henseli Anura LC Ground-dwelling 27.488369 39.96729 36.43120 43.28561
Rhinella inca Anura LC Ground-dwelling 18.924660 38.96715 35.78002 42.08678
Rhinella inca Anura LC Ground-dwelling 17.327923 38.76689 35.64991 41.87666
Rhinella inca Anura LC Ground-dwelling 20.235565 39.13157 35.86562 42.21966
Rhinella iserni Anura DD Ground-dwelling 22.045144 39.34848 36.48371 42.72502
Rhinella iserni Anura DD Ground-dwelling 21.430920 39.27143 36.43258 42.64640
Rhinella iserni Anura DD Ground-dwelling 23.044169 39.47380 36.63246 42.94857
Rhinella justinianoi Anura VU Ground-dwelling 20.851090 39.20235 36.21685 42.31831
Rhinella justinianoi Anura VU Ground-dwelling 19.991778 39.09553 36.04202 42.09204
Rhinella justinianoi Anura VU Ground-dwelling 22.138400 39.36236 36.38728 42.55727
Rhinella limensis Anura LC Ground-dwelling 20.432649 39.21003 36.02747 42.30207
Rhinella limensis Anura LC Ground-dwelling 19.468966 39.08791 35.98884 42.22631
Rhinella limensis Anura LC Ground-dwelling 22.257159 39.44122 36.25930 42.56964
Rhinella lindae Anura EN Ground-dwelling 26.219010 39.82074 37.12354 43.35949
Rhinella lindae Anura EN Ground-dwelling 25.544335 39.73557 37.06695 43.20481
Rhinella lindae Anura EN Ground-dwelling 27.553766 39.98924 37.07276 43.46859
Rhinella macrorhina Anura VU Ground-dwelling 22.376189 39.36581 35.94046 42.24011
Rhinella macrorhina Anura VU Ground-dwelling 21.363649 39.23971 35.85991 42.08024
Rhinella macrorhina Anura VU Ground-dwelling 24.075556 39.57745 36.03323 42.43711
Rhinella magnussoni Anura LC Ground-dwelling 27.479184 40.04337 36.98139 43.46683
Rhinella magnussoni Anura LC Ground-dwelling 26.818486 39.95928 36.85764 43.29170
Rhinella magnussoni Anura LC Ground-dwelling 29.058517 40.24437 37.18511 43.71593
Rhinella manu Anura LC Arboreal 17.447651 38.57606 35.19331 41.67207
Rhinella manu Anura LC Arboreal 15.911874 38.38570 35.03635 41.55111
Rhinella manu Anura LC Arboreal 18.738988 38.73611 35.32382 41.83422
Rhinella nesiotes Anura VU Arboreal 22.618688 39.23745 35.91711 42.54577
Rhinella nesiotes Anura VU Arboreal 21.958574 39.15495 35.82702 42.44858
Rhinella nesiotes Anura VU Arboreal 23.898670 39.39741 36.13347 42.80850
Rhinella multiverrucosa Anura DD Ground-dwelling 19.988662 39.15374 36.19224 42.29213
Rhinella multiverrucosa Anura DD Ground-dwelling 19.113652 39.04520 35.70547 41.85435
Rhinella multiverrucosa Anura DD Ground-dwelling 21.702088 39.36627 36.20443 42.34837
Rhinella nicefori Anura EN Ground-dwelling 23.852963 39.60051 35.97845 42.46406
Rhinella nicefori Anura EN Ground-dwelling 22.840176 39.47423 36.12132 42.45349
Rhinella nicefori Anura EN Ground-dwelling 25.399192 39.79331 36.04466 42.65224
Rhinella ocellata Anura LC Ground-dwelling 27.009451 40.01579 36.92557 43.43231
Rhinella ocellata Anura LC Ground-dwelling 25.941659 39.87803 36.43935 42.87348
Rhinella ocellata Anura LC Ground-dwelling 29.078226 40.28267 36.81611 43.36671
Rhinella poeppigii Anura LC Stream-dwelling 21.739407 38.70163 35.54117 41.80202
Rhinella poeppigii Anura LC Stream-dwelling 20.895931 38.59579 35.45438 41.71947
Rhinella poeppigii Anura LC Stream-dwelling 23.098493 38.87217 35.67715 41.96314
Rhinella proboscidea Anura LC Ground-dwelling 28.313141 40.14299 36.88587 43.63963
Rhinella proboscidea Anura LC Ground-dwelling 27.566929 40.04868 36.89550 43.58769
Rhinella proboscidea Anura LC Ground-dwelling 29.884467 40.34161 37.01315 43.86299
Rhinella pygmaea Anura LC Fossorial 25.579768 40.82994 37.52909 43.82439
Rhinella pygmaea Anura LC Fossorial 24.620118 40.70884 37.49572 43.71289
Rhinella pygmaea Anura LC Fossorial 27.183989 41.03237 37.59482 43.97126
Rhinella quechua Anura VU Ground-dwelling 19.541371 39.01947 35.74930 42.14626
Rhinella quechua Anura VU Ground-dwelling 18.637643 38.90718 35.62954 42.05630
Rhinella quechua Anura VU Ground-dwelling 20.933920 39.19250 35.79778 42.28757
Rhinella roqueana Anura LC Ground-dwelling 26.545471 39.94830 36.69128 43.11232
Rhinella roqueana Anura LC Ground-dwelling 25.728593 39.84521 36.64788 42.95492
Rhinella roqueana Anura LC Ground-dwelling 28.105935 40.14524 36.87876 43.47009
Rhinella rubropunctata Anura VU Ground-dwelling 16.184588 38.51445 35.45301 41.82167
Rhinella rubropunctata Anura VU Ground-dwelling 14.183536 38.26486 35.35151 41.72689
Rhinella rubropunctata Anura VU Ground-dwelling 20.279108 39.02516 35.80370 42.11890
Rhinella ruizi Anura VU Ground-dwelling 22.376189 39.40240 36.14846 42.54832
Rhinella ruizi Anura VU Ground-dwelling 21.363649 39.27315 35.72895 42.07461
Rhinella ruizi Anura VU Ground-dwelling 24.075556 39.61932 36.52339 42.97473
Rhinella rumbolli Anura NT Ground-dwelling 20.258844 39.05439 35.82723 41.98093
Rhinella rumbolli Anura NT Ground-dwelling 18.799881 38.87242 35.76855 41.85735
Rhinella rumbolli Anura NT Ground-dwelling 22.354595 39.31579 36.02375 42.31144
Rhinella scitula Anura DD Stream-dwelling 28.324691 39.55283 36.02460 42.64808
Rhinella scitula Anura DD Stream-dwelling 27.134453 39.40084 36.15265 42.68901
Rhinella scitula Anura DD Stream-dwelling 30.501091 39.83076 36.24953 42.99562
Rhinella sclerocephala Anura VU Ground-dwelling 26.644916 39.83624 36.34301 43.02816
Rhinella sclerocephala Anura VU Ground-dwelling 25.886984 39.74156 36.23735 42.86300
Rhinella sclerocephala Anura VU Ground-dwelling 28.062356 40.01329 36.86124 43.67040
Rhinella stanlaii Anura LC Ground-dwelling 19.981338 39.06516 36.05142 42.45162
Rhinella stanlaii Anura LC Ground-dwelling 19.135633 38.95872 35.91762 42.29152
Rhinella stanlaii Anura LC Ground-dwelling 21.290381 39.22991 36.06220 42.49617
Rhinella sternosignata Anura LC Ground-dwelling 25.448083 39.72861 36.55143 43.07136
Rhinella sternosignata Anura LC Ground-dwelling 24.619766 39.62470 36.52503 43.02222
Rhinella sternosignata Anura LC Ground-dwelling 26.949276 39.91693 36.69612 43.34066
Rhinella tacana Anura LC Arboreal 19.442031 38.84255 35.76609 42.18204
Rhinella tacana Anura LC Arboreal 18.292695 38.69759 35.63372 41.99991
Rhinella tacana Anura LC Arboreal 20.673729 38.99790 35.78340 42.23480
Rhinella tenrec Anura EN Ground-dwelling 26.219010 39.98949 36.96905 43.52450
Rhinella tenrec Anura EN Ground-dwelling 25.544335 39.90325 36.65909 43.17596
Rhinella tenrec Anura EN Ground-dwelling 27.553766 40.16010 37.09429 43.69269
Rhinella vellardi Anura EN Ground-dwelling 20.539738 39.20243 36.18037 42.33178
Rhinella vellardi Anura EN Ground-dwelling 19.667163 39.09203 36.11469 42.20118
Rhinella vellardi Anura EN Ground-dwelling 22.186833 39.41083 36.47879 42.73442
Rhinella veredas Anura LC Ground-dwelling 26.157976 39.84634 36.70040 43.50256
Rhinella veredas Anura LC Ground-dwelling 24.982371 39.69640 36.62886 43.39776
Rhinella veredas Anura LC Ground-dwelling 28.351713 40.12613 37.10410 44.06248
Rhinella yanachaga Anura EN Arboreal 21.012652 39.04456 35.67397 42.26196
Rhinella yanachaga Anura EN Arboreal 20.177954 38.93788 35.67286 42.20968
Rhinella yanachaga Anura EN Arboreal 22.689323 39.25885 35.87116 42.52634
Atelopus andinus Anura EN Stream-dwelling 24.240349 37.19898 33.33578 40.71229
Atelopus andinus Anura EN Stream-dwelling 23.599308 37.11610 33.46477 40.78769
Atelopus andinus Anura EN Stream-dwelling 25.599596 37.37471 33.48175 40.90588
Atelopus arsyecue Anura CR Stream-dwelling 25.195924 37.36262 33.74593 41.85851
Atelopus arsyecue Anura CR Stream-dwelling 24.229888 37.23518 33.31454 41.35971
Atelopus arsyecue Anura CR Stream-dwelling 27.326446 37.64368 33.78944 41.99175
Atelopus balios Anura CR Stream-dwelling 26.647145 37.62256 34.14580 41.57833
Atelopus balios Anura CR Stream-dwelling 25.667294 37.49351 34.03760 41.41080
Atelopus balios Anura CR Stream-dwelling 28.530719 37.87064 33.98406 41.55002
Atelopus bomolochos Anura CR Stream-dwelling 25.562622 37.40591 33.48402 41.36186
Atelopus bomolochos Anura CR Stream-dwelling 24.507041 37.26678 33.48436 41.28394
Atelopus bomolochos Anura CR Stream-dwelling 27.560739 37.66926 33.77186 41.73196
Atelopus carauta Anura DD Stream-dwelling 26.219010 37.50753 33.71014 41.09482
Atelopus carauta Anura DD Stream-dwelling 25.544335 37.41907 33.68928 41.09735
Atelopus carauta Anura DD Stream-dwelling 27.553766 37.68255 33.95457 41.33231
Atelopus carrikeri Anura EN Stream-dwelling 25.195924 37.37020 33.62857 41.20369
Atelopus carrikeri Anura EN Stream-dwelling 24.229888 37.24345 33.55829 41.04884
Atelopus carrikeri Anura EN Stream-dwelling 27.326446 37.64973 33.84018 41.58682
Atelopus certus Anura CR Stream-dwelling 26.761423 37.59290 33.89874 41.48009
Atelopus certus Anura CR Stream-dwelling 26.195234 37.51689 33.87161 41.34474
Atelopus certus Anura CR Stream-dwelling 27.980524 37.75657 33.88951 41.55150
Atelopus chirripoensis Anura DD Ground-dwelling 17.078254 36.88402 33.54274 40.90548
Atelopus chirripoensis Anura DD Ground-dwelling 15.980470 36.73776 33.37759 40.79074
Atelopus chirripoensis Anura DD Ground-dwelling 18.397641 37.05981 33.62719 41.01489
Atelopus chrysocorallus Anura CR Stream-dwelling 26.628438 37.51004 33.36594 41.29865
Atelopus chrysocorallus Anura CR Stream-dwelling 25.765485 37.39652 33.36100 41.20476
Atelopus chrysocorallus Anura CR Stream-dwelling 28.169923 37.71282 33.99126 42.01927
Atelopus coynei Anura CR Stream-dwelling 20.556552 36.77923 33.22359 40.34764
Atelopus coynei Anura CR Stream-dwelling 18.946918 36.56336 33.12846 40.20862
Atelopus coynei Anura CR Stream-dwelling 22.778661 37.07725 33.44496 40.67507
Atelopus cruciger Anura CR Stream-dwelling 26.826561 37.55421 33.71024 41.68424
Atelopus cruciger Anura CR Stream-dwelling 26.155457 37.46502 33.62354 41.57421
Atelopus cruciger Anura CR Stream-dwelling 28.382836 37.76103 33.93583 41.99855
Atelopus dimorphus Anura DD Stream-dwelling 23.440561 37.06265 33.16023 40.43559
Atelopus dimorphus Anura DD Stream-dwelling 22.815371 36.97939 33.09642 40.32840
Atelopus dimorphus Anura DD Stream-dwelling 24.661220 37.22521 33.27818 40.62454
Atelopus epikeisthos Anura EN Stream-dwelling 23.280537 37.09567 33.21189 40.88137
Atelopus epikeisthos Anura EN Stream-dwelling 22.528599 36.99577 33.11571 40.76712
Atelopus epikeisthos Anura EN Stream-dwelling 24.608732 37.27212 33.40628 41.09442
Atelopus exiguus Anura EN Stream-dwelling 23.949902 37.28282 33.59538 40.81090
Atelopus exiguus Anura EN Stream-dwelling 22.543976 37.09701 33.29525 40.50629
Atelopus exiguus Anura EN Stream-dwelling 26.144713 37.57289 33.79982 41.06538
Atelopus nanay Anura CR Stream-dwelling 26.647145 37.55792 33.58503 41.18577
Atelopus nanay Anura CR Stream-dwelling 25.667294 37.42854 33.44098 40.99507
Atelopus nanay Anura CR Stream-dwelling 28.530719 37.80663 33.72522 41.42196
Atelopus famelicus Anura CR Stream-dwelling 25.597617 37.38719 33.72737 41.13077
Atelopus famelicus Anura CR Stream-dwelling 24.953236 37.30194 33.60339 41.00124
Atelopus famelicus Anura CR Stream-dwelling 26.739957 37.53833 33.91646 41.34760
Atelopus flavescens Anura VU Stream-dwelling 26.960155 37.49029 33.35117 41.04427
Atelopus flavescens Anura VU Stream-dwelling 26.384148 37.41524 33.28023 40.94259
Atelopus flavescens Anura VU Stream-dwelling 28.038327 37.63075 33.57090 41.31643
Atelopus franciscus Anura LC Stream-dwelling 27.021779 37.49981 33.47498 41.33601
Atelopus franciscus Anura LC Stream-dwelling 26.432544 37.42210 33.43562 41.29428
Atelopus franciscus Anura LC Stream-dwelling 28.397710 37.68127 33.70163 41.61307
Atelopus galactogaster Anura DD Stream-dwelling 25.952777 37.42391 33.52117 41.53155
Atelopus galactogaster Anura DD Stream-dwelling 25.296430 37.33723 33.47668 41.47466
Atelopus galactogaster Anura DD Stream-dwelling 27.263195 37.59698 33.68638 41.78193
Atelopus glyphus Anura CR Stream-dwelling 26.997239 37.69948 33.95619 41.93345
Atelopus glyphus Anura CR Stream-dwelling 26.294779 37.60580 33.95545 41.88480
Atelopus glyphus Anura CR Stream-dwelling 28.463507 37.89503 34.08423 42.13939
Atelopus guitarraensis Anura DD Stream-dwelling 23.630387 37.17330 33.26752 40.85852
Atelopus guitarraensis Anura DD Stream-dwelling 22.829524 37.06780 33.26195 40.88628
Atelopus guitarraensis Anura DD Stream-dwelling 25.246144 37.38616 33.59146 41.27122
Atelopus podocarpus Anura CR Stream-dwelling 22.948003 37.07648 33.13240 40.97411
Atelopus podocarpus Anura CR Stream-dwelling 21.856167 36.93054 32.99641 40.86368
Atelopus podocarpus Anura CR Stream-dwelling 24.780959 37.32146 33.39448 41.36378
Atelopus ignescens Anura CR Stream-dwelling 21.548757 36.85406 33.28268 40.81045
Atelopus ignescens Anura CR Stream-dwelling 19.754427 36.61663 32.65754 40.16902
Atelopus ignescens Anura CR Stream-dwelling 23.905236 37.16587 33.65106 41.21872
Atelopus laetissimus Anura EN Stream-dwelling 26.777894 37.58011 33.50017 41.13517
Atelopus laetissimus Anura EN Stream-dwelling 25.908244 37.46426 33.42692 41.05047
Atelopus laetissimus Anura EN Stream-dwelling 28.696471 37.83570 33.74694 41.50649
Atelopus varius Anura CR Stream-dwelling 25.948131 37.46777 34.37813 40.73313
Atelopus varius Anura CR Stream-dwelling 25.253148 37.37583 34.22452 40.51448
Atelopus varius Anura CR Stream-dwelling 27.220614 37.63611 34.49833 40.90993
Atelopus longibrachius Anura EN Stream-dwelling 25.663078 37.38961 33.98882 41.72906
Atelopus longibrachius Anura EN Stream-dwelling 24.979688 37.29867 33.54736 41.24302
Atelopus longibrachius Anura EN Stream-dwelling 26.912421 37.55586 34.08571 41.94584
Atelopus longirostris Anura CR Stream-dwelling 20.556552 36.75226 33.03050 40.44428
Atelopus longirostris Anura CR Stream-dwelling 18.946918 36.54125 33.03816 40.43111
Atelopus longirostris Anura CR Stream-dwelling 22.778661 37.04355 33.31314 40.81094
Atelopus lozanoi Anura EN Stream-dwelling 22.392831 37.04240 33.15535 41.03603
Atelopus lozanoi Anura EN Stream-dwelling 21.447444 36.91671 33.19052 40.99636
Atelopus lozanoi Anura EN Stream-dwelling 24.281794 37.29355 33.38859 41.29714
Atelopus mandingues Anura DD Stream-dwelling 22.469781 37.01645 33.22383 40.68325
Atelopus mandingues Anura DD Stream-dwelling 21.526786 36.89148 33.20078 40.61240
Atelopus mandingues Anura DD Stream-dwelling 24.331870 37.26323 33.59469 41.09377
Atelopus mittermeieri Anura EN Stream-dwelling 22.013728 36.94176 32.76002 40.63052
Atelopus mittermeieri Anura EN Stream-dwelling 21.137557 36.82539 32.67142 40.48059
Atelopus mittermeieri Anura EN Stream-dwelling 23.830870 37.18310 33.14168 41.08967
Atelopus mucubajiensis Anura CR Stream-dwelling 26.717248 37.53518 32.92145 41.31212
Atelopus mucubajiensis Anura CR Stream-dwelling 25.882292 37.42575 32.88676 41.23275
Atelopus mucubajiensis Anura CR Stream-dwelling 28.269649 37.73864 33.58814 42.08131
Atelopus muisca Anura CR Stream-dwelling 22.469781 36.94781 33.20181 40.84585
Atelopus muisca Anura CR Stream-dwelling 21.526786 36.82179 33.10481 40.72708
Atelopus muisca Anura CR Stream-dwelling 24.331870 37.19665 33.37460 41.05695
Atelopus nahumae Anura EN Stream-dwelling 26.549236 37.49744 33.67653 41.40511
Atelopus nahumae Anura EN Stream-dwelling 25.669093 37.38354 33.46958 41.19092
Atelopus nahumae Anura EN Stream-dwelling 28.514169 37.75172 34.07295 41.90118
Atelopus nepiozomus Anura EN Stream-dwelling 22.776889 37.03478 33.22930 40.95410
Atelopus nepiozomus Anura EN Stream-dwelling 21.358820 36.84785 33.06293 40.71528
Atelopus nepiozomus Anura EN Stream-dwelling 24.916276 37.31679 33.38551 41.20899
Atelopus oxapampae Anura EN Stream-dwelling 21.012652 36.84788 33.50793 40.98616
Atelopus oxapampae Anura EN Stream-dwelling 20.177954 36.73840 33.42943 40.84836
Atelopus oxapampae Anura EN Stream-dwelling 22.689323 37.06779 33.55577 41.09791
Atelopus palmatus Anura CR Stream-dwelling 22.287150 36.92923 33.16456 40.64404
Atelopus palmatus Anura CR Stream-dwelling 20.278491 36.66348 32.54522 39.96179
Atelopus palmatus Anura CR Stream-dwelling 24.609385 37.23647 33.67091 41.19809
Atelopus pulcher Anura VU Stream-dwelling 23.232128 37.12446 33.60245 41.28662
Atelopus pulcher Anura VU Stream-dwelling 22.448501 37.02088 33.53284 41.23548
Atelopus pulcher Anura VU Stream-dwelling 24.760764 37.32650 33.88202 41.61007
Atelopus pyrodactylus Anura CR Stream-dwelling 22.538913 36.98057 33.45707 40.83225
Atelopus pyrodactylus Anura CR Stream-dwelling 21.736625 36.87520 33.34581 40.69859
Atelopus pyrodactylus Anura CR Stream-dwelling 23.802966 37.14659 33.60803 40.99447
Atelopus reticulatus Anura DD Stream-dwelling 23.440561 37.08279 33.20274 40.80938
Atelopus reticulatus Anura DD Stream-dwelling 22.815371 36.99884 33.41832 41.01144
Atelopus reticulatus Anura DD Stream-dwelling 24.661220 37.24670 32.97593 40.57056
Atelopus sanjosei Anura CR Stream-dwelling 25.694338 37.44540 33.62910 41.60672
Atelopus sanjosei Anura CR Stream-dwelling 24.958322 37.34778 33.38250 41.33664
Atelopus sanjosei Anura CR Stream-dwelling 27.032441 37.62289 33.64541 41.70102
Atelopus seminiferus Anura EN Stream-dwelling 22.873431 37.09532 33.65721 40.85548
Atelopus seminiferus Anura EN Stream-dwelling 22.053823 36.98581 33.28870 40.53062
Atelopus seminiferus Anura EN Stream-dwelling 24.459339 37.30720 33.91749 41.15328
Atelopus simulatus Anura CR Ground-dwelling 22.077646 37.50583 33.90987 41.10746
Atelopus simulatus Anura CR Ground-dwelling 20.881206 37.34787 33.66091 40.86763
Atelopus simulatus Anura CR Ground-dwelling 23.836516 37.73804 34.14667 41.43632
Atelopus siranus Anura DD Stream-dwelling 22.618688 36.92783 33.07254 40.48305
Atelopus siranus Anura DD Stream-dwelling 21.958574 36.84196 32.91331 40.34440
Atelopus siranus Anura DD Stream-dwelling 23.898670 37.09433 33.20604 40.63127
Atelopus spurrelli Anura NT Stream-dwelling 25.727072 37.37967 33.91783 41.41663
Atelopus spurrelli Anura NT Stream-dwelling 25.022669 37.28692 33.79870 41.25591
Atelopus spurrelli Anura NT Stream-dwelling 27.111319 37.56194 34.14662 41.73990
Atelopus tricolor Anura CR Stream-dwelling 21.173461 36.98039 33.19333 40.55389
Atelopus tricolor Anura CR Stream-dwelling 20.517245 36.89444 32.96617 40.35079
Atelopus tricolor Anura CR Stream-dwelling 22.412265 37.14264 33.33603 40.72234
Atelopus walkeri Anura DD Stream-dwelling 25.658511 37.42714 33.68411 41.40752
Atelopus walkeri Anura DD Stream-dwelling 24.705522 37.30363 33.61510 41.27258
Atelopus walkeri Anura DD Stream-dwelling 27.692744 37.69077 33.64734 41.51276
Bufoides meghalayanus Anura CR Stream-dwelling 22.878119 37.52126 33.59061 41.80569
Bufoides meghalayanus Anura CR Stream-dwelling 21.570552 37.35079 33.33861 41.60434
Bufoides meghalayanus Anura CR Stream-dwelling 25.033585 37.80227 33.92776 42.26567
Capensibufo rosei Anura CR Ground-dwelling 21.159405 38.11268 34.07101 41.97372
Capensibufo rosei Anura CR Ground-dwelling 19.851861 37.94272 34.00962 41.85777
Capensibufo rosei Anura CR Ground-dwelling 23.920330 38.47157 34.38010 42.53524
Capensibufo tradouwi Anura LC Ground-dwelling 20.479079 37.95876 33.97867 41.98205
Capensibufo tradouwi Anura LC Ground-dwelling 19.029523 37.76675 33.76660 41.76939
Capensibufo tradouwi Anura LC Ground-dwelling 23.198397 38.31897 34.34156 42.46800
Mertensophryne anotis Anura LC Ground-dwelling 26.203267 38.80867 34.58059 42.93174
Mertensophryne anotis Anura LC Ground-dwelling 25.385587 38.70239 34.50725 42.81651
Mertensophryne anotis Anura LC Ground-dwelling 27.964743 39.03764 34.80321 43.22963
Mertensophryne loveridgei Anura LC Ground-dwelling 25.430783 38.71341 34.51884 42.82326
Mertensophryne loveridgei Anura LC Ground-dwelling 24.693305 38.61672 34.34994 42.61358
Mertensophryne loveridgei Anura LC Ground-dwelling 27.210070 38.94668 34.66953 43.04511
Mertensophryne howelli Anura EN Ground-dwelling 25.924213 38.78971 34.71450 42.83441
Mertensophryne howelli Anura EN Ground-dwelling 25.272567 38.70420 34.64508 42.69204
Mertensophryne howelli Anura EN Ground-dwelling 27.348772 38.97664 34.86628 43.02625
Mertensophryne lindneri Anura LC Ground-dwelling 25.131080 38.64841 34.58000 42.82648
Mertensophryne lindneri Anura LC Ground-dwelling 24.275035 38.53690 34.53207 42.77144
Mertensophryne lindneri Anura LC Ground-dwelling 26.944658 38.88466 34.75341 43.08978
Mertensophryne lonnbergi Anura VU Ground-dwelling 21.344821 38.21931 34.07445 42.08767
Mertensophryne lonnbergi Anura VU Ground-dwelling 20.552650 38.11549 34.00406 41.99842
Mertensophryne lonnbergi Anura VU Ground-dwelling 23.055661 38.44352 34.53871 42.51760
Mertensophryne melanopleura Anura LC Ground-dwelling 24.021901 38.46617 34.48221 42.59121
Mertensophryne melanopleura Anura LC Ground-dwelling 23.149339 38.35320 34.38601 42.43100
Mertensophryne melanopleura Anura LC Ground-dwelling 26.153431 38.74214 34.78640 43.01029
Mertensophryne micranotis Anura LC Ground-dwelling 24.864519 38.66949 34.85355 43.17608
Mertensophryne micranotis Anura LC Ground-dwelling 24.168763 38.57775 34.69273 43.01706
Mertensophryne micranotis Anura LC Ground-dwelling 26.383578 38.86980 35.07488 43.44384
Mertensophryne mocquardi Anura DD Ground-dwelling 20.966321 38.11740 33.63232 41.93894
Mertensophryne mocquardi Anura DD Ground-dwelling 20.137854 38.00869 33.54393 41.83860
Mertensophryne mocquardi Anura DD Ground-dwelling 22.679478 38.34219 33.84979 42.24962
Mertensophryne nairobiensis Anura DD Ground-dwelling 21.279197 38.16302 33.55546 41.76181
Mertensophryne nairobiensis Anura DD Ground-dwelling 20.404394 38.04652 33.42667 41.62862
Mertensophryne nairobiensis Anura DD Ground-dwelling 23.119976 38.40817 33.75813 42.01838
Mertensophryne nyikae Anura NT Ground-dwelling 22.048889 38.24932 34.50328 42.43822
Mertensophryne nyikae Anura NT Ground-dwelling 21.126642 38.12676 34.38446 42.31019
Mertensophryne nyikae Anura NT Ground-dwelling 23.361655 38.42378 34.52529 42.54797
Mertensophryne schmidti Anura DD Ground-dwelling 25.404116 38.67717 34.89901 42.86817
Mertensophryne schmidti Anura DD Ground-dwelling 24.627851 38.57531 34.51947 42.47268
Mertensophryne schmidti Anura DD Ground-dwelling 27.368716 38.93497 35.18853 43.28547
Mertensophryne taitana Anura LC Ground-dwelling 23.044414 38.41453 34.63059 42.80516
Mertensophryne taitana Anura LC Ground-dwelling 22.186096 38.30051 34.55883 42.65912
Mertensophryne taitana Anura LC Ground-dwelling 24.933746 38.66551 34.04341 42.29534
Mertensophryne usambarae Anura CR Ground-dwelling 24.950210 38.68389 34.37475 42.63721
Mertensophryne usambarae Anura CR Ground-dwelling 24.330970 38.60174 34.29732 42.55179
Mertensophryne usambarae Anura CR Ground-dwelling 25.991640 38.82205 34.46668 42.78085
Mertensophryne uzunguensis Anura VU Ground-dwelling 21.910635 38.21723 34.46319 42.43393
Mertensophryne uzunguensis Anura VU Ground-dwelling 21.071793 38.10772 34.26987 42.20160
Mertensophryne uzunguensis Anura VU Ground-dwelling 23.415802 38.41372 34.49792 42.59164
Poyntonophrynus beiranus Anura LC Ground-dwelling 25.181103 38.63465 34.76584 42.97200
Poyntonophrynus beiranus Anura LC Ground-dwelling 24.171073 38.50278 34.60652 42.87675
Poyntonophrynus beiranus Anura LC Ground-dwelling 27.218350 38.90064 34.93854 43.16204
Poyntonophrynus damaranus Anura DD Fossorial 22.866077 39.31591 35.13300 43.20460
Poyntonophrynus damaranus Anura DD Fossorial 20.980579 39.06637 34.89844 42.92767
Poyntonophrynus damaranus Anura DD Fossorial 25.450160 39.65791 35.39321 43.60236
Poyntonophrynus dombensis Anura LC Ground-dwelling 23.207727 38.31839 34.14113 42.11012
Poyntonophrynus dombensis Anura LC Ground-dwelling 21.431949 38.08478 33.72094 41.68522
Poyntonophrynus dombensis Anura LC Ground-dwelling 25.742574 38.65185 34.68039 42.74041
Poyntonophrynus fenoulheti Anura LC Ground-dwelling 23.724595 38.52317 34.23846 42.45092
Poyntonophrynus fenoulheti Anura LC Ground-dwelling 22.509580 38.36341 34.19153 42.36353
Poyntonophrynus fenoulheti Anura LC Ground-dwelling 26.020701 38.82507 34.52314 42.84876
Poyntonophrynus grandisonae Anura DD Arboreal 24.242539 38.25301 34.12141 42.48252
Poyntonophrynus grandisonae Anura DD Arboreal 22.247010 37.99555 33.77573 42.10583
Poyntonophrynus grandisonae Anura DD Arboreal 27.063148 38.61693 34.33234 42.76702
Poyntonophrynus hoeschi Anura LC Ground-dwelling 21.808960 38.17733 34.38338 42.74312
Poyntonophrynus hoeschi Anura LC Ground-dwelling 19.997942 37.94149 34.09959 42.43306
Poyntonophrynus hoeschi Anura LC Ground-dwelling 24.506835 38.52865 34.43575 42.93288
Poyntonophrynus kavangensis Anura LC Ground-dwelling 23.860200 38.44684 33.98591 42.46323
Poyntonophrynus kavangensis Anura LC Ground-dwelling 22.640955 38.28619 33.84350 42.26377
Poyntonophrynus kavangensis Anura LC Ground-dwelling 26.170389 38.75122 34.49157 43.03953
Poyntonophrynus lughensis Anura LC Ground-dwelling 24.264083 38.52584 34.60763 43.13501
Poyntonophrynus lughensis Anura LC Ground-dwelling 23.484815 38.42403 34.47437 42.97317
Poyntonophrynus lughensis Anura LC Ground-dwelling 25.739384 38.71859 34.91432 43.44949
Poyntonophrynus parkeri Anura LC Ground-dwelling 21.921054 38.13860 34.39898 42.45987
Poyntonophrynus parkeri Anura LC Ground-dwelling 20.988335 38.01722 34.26190 42.30605
Poyntonophrynus parkeri Anura LC Ground-dwelling 23.992775 38.40821 34.86565 42.88659
Poyntonophrynus vertebralis Anura LC Ground-dwelling 20.623100 38.02136 33.99101 42.48872
Poyntonophrynus vertebralis Anura LC Ground-dwelling 19.102266 37.82371 33.92187 42.37211
Poyntonophrynus vertebralis Anura LC Ground-dwelling 23.319994 38.37185 33.80341 42.42066
Laurentophryne parkeri Anura DD Ground-dwelling 24.143899 38.43395 34.42054 42.42685
Laurentophryne parkeri Anura DD Ground-dwelling 23.402584 38.33934 34.23448 42.20878
Laurentophryne parkeri Anura DD Ground-dwelling 26.105081 38.68425 34.55610 42.65188
Metaphryniscus sosai Anura NT Ground-dwelling 25.661020 38.61156 34.85218 43.12351
Metaphryniscus sosai Anura NT Ground-dwelling 25.001401 38.52384 34.74903 42.98827
Metaphryniscus sosai Anura NT Ground-dwelling 27.238038 38.82127 34.26861 42.62870
Nannophryne apolobambica Anura CR Ground-dwelling 16.014487 37.34343 33.56737 41.56463
Nannophryne apolobambica Anura CR Ground-dwelling 15.217165 37.23772 33.56403 41.53704
Nannophryne apolobambica Anura CR Ground-dwelling 17.722618 37.56989 33.87420 41.88902
Nannophryne corynetes Anura EN Ground-dwelling 18.677429 37.70937 33.85138 41.70183
Nannophryne corynetes Anura EN Ground-dwelling 16.787942 37.46728 33.58744 41.48772
Nannophryne corynetes Anura EN Ground-dwelling 20.115611 37.89364 33.99710 41.76031
Nannophryne variegata Anura LC Ground-dwelling 10.857750 36.67935 32.24118 40.64011
Nannophryne variegata Anura LC Ground-dwelling 9.107686 36.44684 32.00846 40.45137
Nannophryne variegata Anura LC Ground-dwelling 14.778782 37.20029 33.05752 41.38707
Oreophrynella cryptica Anura NT Ground-dwelling 25.824577 38.68163 34.65916 43.55629
Oreophrynella cryptica Anura NT Ground-dwelling 25.051367 38.58193 34.66960 43.54210
Oreophrynella cryptica Anura NT Ground-dwelling 27.554962 38.90475 34.63634 43.64933
Oreophrynella dendronastes Anura DD Arboreal 26.634291 38.67705 34.59643 43.32701
Oreophrynella dendronastes Anura DD Arboreal 25.965013 38.58843 34.48987 43.21117
Oreophrynella dendronastes Anura DD Arboreal 28.137979 38.87617 34.83584 43.67347
Oreophrynella huberi Anura VU Ground-dwelling 26.013438 38.69396 34.40406 42.82431
Oreophrynella huberi Anura VU Ground-dwelling 25.225357 38.59148 34.37662 42.76953
Oreophrynella huberi Anura VU Ground-dwelling 27.691946 38.91222 34.78155 43.28636
Oreophrynella macconnelli Anura VU Arboreal 26.634291 38.62677 34.48543 43.10891
Oreophrynella macconnelli Anura VU Arboreal 25.965013 38.54007 34.13772 42.71546
Oreophrynella macconnelli Anura VU Arboreal 28.137979 38.82158 34.27878 43.02683
Oreophrynella nigra Anura VU Ground-dwelling 26.386750 38.76974 34.85094 43.37397
Oreophrynella nigra Anura VU Ground-dwelling 25.707210 38.68073 34.34543 42.82964
Oreophrynella nigra Anura VU Ground-dwelling 27.920527 38.97064 35.13999 43.64776
Oreophrynella quelchii Anura VU Ground-dwelling 26.386750 38.78424 34.56460 43.04755
Oreophrynella quelchii Anura VU Ground-dwelling 25.707210 38.69525 34.60258 43.05296
Oreophrynella quelchii Anura VU Ground-dwelling 27.920527 38.98509 34.67211 43.25790
Oreophrynella vasquezi Anura VU Ground-dwelling 25.638762 38.70834 34.42629 42.90462
Oreophrynella vasquezi Anura VU Ground-dwelling 24.915637 38.61399 34.33608 42.80436
Oreophrynella vasquezi Anura VU Ground-dwelling 27.345013 38.93096 34.46155 43.01361
Oreophrynella weiassipuensis Anura DD Arboreal 26.386750 38.52540 34.25043 42.59334
Oreophrynella weiassipuensis Anura DD Arboreal 25.707210 38.43741 34.11582 42.46483
Oreophrynella weiassipuensis Anura DD Arboreal 27.920527 38.72401 34.43499 42.80406
Osornophryne bufoniformis Anura NT Ground-dwelling 22.477925 38.12954 34.12142 42.30385
Osornophryne bufoniformis Anura NT Ground-dwelling 21.108842 37.95024 34.00869 42.14642
Osornophryne bufoniformis Anura NT Ground-dwelling 24.400338 38.38130 34.36053 42.63333
Osornophryne antisana Anura EN Ground-dwelling 21.879493 38.02503 33.90053 41.81284
Osornophryne antisana Anura EN Ground-dwelling 20.023597 37.78526 33.57747 41.50935
Osornophryne antisana Anura EN Ground-dwelling 24.280761 38.33526 34.18526 42.11604
Osornophryne percrassa Anura VU Ground-dwelling 22.409385 38.14893 33.90729 42.26327
Osornophryne percrassa Anura VU Ground-dwelling 21.593296 38.04146 33.77672 42.16893
Osornophryne percrassa Anura VU Ground-dwelling 23.972185 38.35474 34.10503 42.49365
Osornophryne puruanta Anura EN Ground-dwelling 22.043563 38.06454 34.09794 42.08780
Osornophryne puruanta Anura EN Ground-dwelling 20.823650 37.90297 33.89522 41.87317
Osornophryne puruanta Anura EN Ground-dwelling 23.766620 38.29274 34.22398 42.29480
Osornophryne cofanorum Anura LC Arboreal 22.043563 37.93738 33.73005 42.24738
Osornophryne cofanorum Anura LC Arboreal 20.823650 37.77668 33.58246 42.10028
Osornophryne cofanorum Anura LC Arboreal 23.766620 38.16435 33.76727 42.25707
Osornophryne guacamayo Anura VU Ground-dwelling 21.798297 38.05422 34.25901 42.16184
Osornophryne guacamayo Anura VU Ground-dwelling 20.205317 37.84834 33.96233 41.89451
Osornophryne guacamayo Anura VU Ground-dwelling 23.999839 38.33875 34.55695 42.53085
Osornophryne sumacoensis Anura VU Ground-dwelling 23.546002 38.35505 34.66131 42.58561
Osornophryne sumacoensis Anura VU Ground-dwelling 22.594071 38.22961 34.57005 42.43557
Osornophryne sumacoensis Anura VU Ground-dwelling 25.371396 38.59560 34.69565 42.66662
Osornophryne talipes Anura VU Ground-dwelling 22.798829 38.22693 33.86432 42.20462
Osornophryne talipes Anura VU Ground-dwelling 21.593918 38.06719 33.83191 42.13030
Osornophryne talipes Anura VU Ground-dwelling 24.513894 38.45429 34.25797 42.60087
Parapelophryne scalpta Anura VU Ground-dwelling 27.973108 39.12046 34.60266 43.35821
Parapelophryne scalpta Anura VU Ground-dwelling 27.367922 39.03908 34.57217 43.31464
Parapelophryne scalpta Anura VU Ground-dwelling 29.095461 39.27137 34.70983 43.54241
Peltophryne cataulaciceps Anura EN Ground-dwelling 27.342065 38.82950 34.48369 43.17013
Peltophryne cataulaciceps Anura EN Ground-dwelling 26.811429 38.75991 34.39526 43.08964
Peltophryne cataulaciceps Anura EN Ground-dwelling 28.180390 38.93943 34.59653 43.29209
Peltophryne longinasus Anura EN Ground-dwelling 27.472316 38.87717 34.94701 43.65756
Peltophryne longinasus Anura EN Ground-dwelling 26.963148 38.81040 34.88577 43.58300
Peltophryne longinasus Anura EN Ground-dwelling 28.313005 38.98742 35.01163 43.78067
Peltophryne gundlachi Anura VU Ground-dwelling 27.349678 38.74456 34.57894 42.97297
Peltophryne gundlachi Anura VU Ground-dwelling 26.856617 38.68012 34.52723 42.87752
Peltophryne gundlachi Anura VU Ground-dwelling 28.204192 38.85624 34.07472 42.49389
Peltophryne empusa Anura VU Ground-dwelling 27.419001 38.85450 35.15853 43.75779
Peltophryne empusa Anura VU Ground-dwelling 26.920430 38.78850 35.06508 43.65301
Peltophryne empusa Anura VU Ground-dwelling 28.264531 38.96644 34.73598 43.37364
Peltophryne florentinoi Anura CR Ground-dwelling 27.339951 38.81580 34.71995 43.07390
Peltophryne florentinoi Anura CR Ground-dwelling 26.841556 38.75078 34.64812 42.97427
Peltophryne florentinoi Anura CR Ground-dwelling 28.247420 38.93420 34.60303 43.00073
Peltophryne peltocephala Anura LC Ground-dwelling 27.451072 38.77991 34.51893 42.85427
Peltophryne peltocephala Anura LC Ground-dwelling 26.988578 38.71891 34.46162 42.76426
Peltophryne peltocephala Anura LC Ground-dwelling 28.261854 38.88684 34.61940 43.00884
Peltophryne fustiger Anura LC Ground-dwelling 27.328567 38.80075 34.79811 42.84236
Peltophryne fustiger Anura LC Ground-dwelling 26.784691 38.72908 34.73928 42.74969
Peltophryne fustiger Anura LC Ground-dwelling 28.239238 38.92077 34.88547 42.99133
Peltophryne taladai Anura VU Ground-dwelling 27.526040 38.82670 34.41995 42.76640
Peltophryne taladai Anura VU Ground-dwelling 27.061764 38.76606 34.38433 42.73933
Peltophryne taladai Anura VU Ground-dwelling 28.312350 38.92940 34.48026 42.80249
Peltophryne guentheri Anura LC Ground-dwelling 27.379774 38.77632 34.46853 42.97729
Peltophryne guentheri Anura LC Ground-dwelling 26.957644 38.72080 34.43543 42.92663
Peltophryne guentheri Anura LC Ground-dwelling 28.111792 38.87259 34.52595 43.08206
Peltophryne lemur Anura EN Ground-dwelling 27.004618 38.82474 34.33289 42.60214
Peltophryne lemur Anura EN Ground-dwelling 26.528828 38.76174 34.27613 42.50094
Peltophryne lemur Anura EN Ground-dwelling 27.685432 38.91490 34.46548 42.78535
Pseudobufo subasper Anura LC Aquatic 28.708095 38.99219 34.78689 43.46428
Pseudobufo subasper Anura LC Aquatic 28.034572 38.90458 34.95065 43.56281
Pseudobufo subasper Anura LC Aquatic 30.116301 39.17538 34.91975 43.62273
Rhaebo blombergi Anura NT Ground-dwelling 24.994174 38.38047 34.49939 42.44792
Rhaebo blombergi Anura NT Ground-dwelling 24.205040 38.27450 34.42686 42.34874
Rhaebo blombergi Anura NT Ground-dwelling 26.438534 38.57445 34.78603 42.73245
Rhaebo caeruleostictus Anura EN Ground-dwelling 23.758887 38.22747 34.28842 42.25160
Rhaebo caeruleostictus Anura EN Ground-dwelling 22.324464 38.03757 34.04001 41.93042
Rhaebo caeruleostictus Anura EN Ground-dwelling 25.862675 38.50598 34.58851 42.62532
Rhaebo glaberrimus Anura LC Stream-dwelling 25.116536 37.82037 33.66337 41.74773
Rhaebo glaberrimus Anura LC Stream-dwelling 24.390026 37.72516 33.46149 41.51044
Rhaebo glaberrimus Anura LC Stream-dwelling 26.503189 38.00209 33.79145 41.93748
Rhaebo guttatus Anura LC Ground-dwelling 27.457083 38.67279 34.61641 42.50508
Rhaebo guttatus Anura LC Ground-dwelling 26.701987 38.57315 34.53804 42.37519
Rhaebo guttatus Anura LC Ground-dwelling 29.062147 38.88459 34.84624 42.81124
Rhaebo hypomelas Anura LC Ground-dwelling 24.763365 38.35966 34.44980 42.28362
Rhaebo hypomelas Anura LC Ground-dwelling 23.971174 38.25719 34.37219 42.20838
Rhaebo hypomelas Anura LC Ground-dwelling 26.142791 38.53808 34.50350 42.41574
Rhaebo lynchi Anura DD Ground-dwelling 26.219010 38.52874 34.33630 42.29904
Rhaebo lynchi Anura DD Ground-dwelling 25.544335 38.44174 34.22811 42.17844
Rhaebo lynchi Anura DD Ground-dwelling 27.553766 38.70085 34.56695 42.62257
Rhaebo nasicus Anura LC Stream-dwelling 26.282545 37.96298 34.02916 41.85040
Rhaebo nasicus Anura LC Stream-dwelling 25.574936 37.87085 33.83484 41.62686
Rhaebo nasicus Anura LC Stream-dwelling 27.841494 38.16595 34.17596 42.06698
Truebella skoptes Anura DD Arboreal 16.870590 37.39331 33.44715 41.42367
Truebella skoptes Anura DD Arboreal 16.060145 37.28890 33.51421 41.49052
Truebella skoptes Anura DD Arboreal 18.188627 37.56312 33.56077 41.58838
Truebella tothastes Anura EN Ground-dwelling 17.246028 37.54141 33.42340 41.40448
Truebella tothastes Anura EN Ground-dwelling 15.244695 37.28106 33.26436 41.17610
Truebella tothastes Anura EN Ground-dwelling 18.862491 37.75169 33.44322 41.49295
Frostius erythrophthalmus Anura DD Ground-dwelling 24.625151 38.48174 34.36483 42.61011
Frostius erythrophthalmus Anura DD Ground-dwelling 23.579173 38.34403 34.21190 42.45509
Frostius erythrophthalmus Anura DD Ground-dwelling 26.746440 38.76102 34.67500 42.97263
Frostius pernambucensis Anura LC Ground-dwelling 25.359778 38.66705 34.08124 42.49829
Frostius pernambucensis Anura LC Ground-dwelling 24.455316 38.54829 33.85970 42.20694
Frostius pernambucensis Anura LC Ground-dwelling 26.769909 38.85221 34.86087 43.30525
Melanophryniscus admirabilis Anura CR Stream-dwelling 25.161922 37.76097 33.52663 41.75191
Melanophryniscus admirabilis Anura CR Stream-dwelling 23.375510 37.52768 33.52079 41.69720
Melanophryniscus admirabilis Anura CR Stream-dwelling 27.596386 38.07890 34.19490 42.48874
Melanophryniscus alipioi Anura DD Ground-dwelling 23.836674 38.14059 34.10522 41.90769
Melanophryniscus alipioi Anura DD Ground-dwelling 21.947547 37.88878 33.94493 41.67335
Melanophryniscus alipioi Anura DD Ground-dwelling 26.445416 38.48832 34.25411 42.14219
Melanophryniscus atroluteus Anura LC Ground-dwelling 24.524564 38.26362 34.47186 42.32503
Melanophryniscus atroluteus Anura LC Ground-dwelling 22.689610 38.02431 34.33405 42.17141
Melanophryniscus atroluteus Anura LC Ground-dwelling 27.607311 38.66566 34.72769 42.68275
Melanophryniscus cambaraensis Anura DD Stream-dwelling 24.426399 37.76112 33.62255 41.51137
Melanophryniscus cambaraensis Anura DD Stream-dwelling 22.464546 37.50273 33.52975 41.30368
Melanophryniscus cambaraensis Anura DD Stream-dwelling 27.134302 38.11776 34.17187 42.20578
Melanophryniscus cupreuscapularis Anura NT Ground-dwelling 26.975310 38.61314 34.39002 42.42071
Melanophryniscus cupreuscapularis Anura NT Ground-dwelling 25.294098 38.38788 34.17720 42.13746
Melanophryniscus cupreuscapularis Anura NT Ground-dwelling 29.456413 38.94558 34.73656 42.93156
Melanophryniscus dorsalis Anura VU Ground-dwelling 24.072478 38.33972 34.15230 42.26564
Melanophryniscus dorsalis Anura VU Ground-dwelling 22.357521 38.10861 34.05226 42.06789
Melanophryniscus dorsalis Anura VU Ground-dwelling 26.575175 38.67699 34.40675 42.65519
Melanophryniscus fulvoguttatus Anura LC Ground-dwelling 27.641975 38.66088 34.50391 43.13397
Melanophryniscus fulvoguttatus Anura LC Ground-dwelling 26.242134 38.47390 34.33319 42.91014
Melanophryniscus fulvoguttatus Anura LC Ground-dwelling 30.169295 38.99844 34.82991 43.62988
Melanophryniscus klappenbachi Anura LC Ground-dwelling 27.397163 38.64414 34.33673 42.58322
Melanophryniscus klappenbachi Anura LC Ground-dwelling 25.881645 38.44451 34.26887 42.46929
Melanophryniscus klappenbachi Anura LC Ground-dwelling 30.064492 38.99551 34.62053 43.07367
Melanophryniscus stelzneri Anura LC Ground-dwelling 21.266429 37.84866 34.13970 42.04356
Melanophryniscus stelzneri Anura LC Ground-dwelling 19.418980 37.60681 33.94523 41.81156
Melanophryniscus stelzneri Anura LC Ground-dwelling 24.429108 38.26269 34.43272 42.54264
Melanophryniscus langonei Anura CR Stream-dwelling 24.376416 37.54701 33.08471 41.37421
Melanophryniscus langonei Anura CR Stream-dwelling 22.454900 37.29225 32.94648 41.11076
Melanophryniscus langonei Anura CR Stream-dwelling 27.839004 38.00608 33.44400 41.92862
Melanophryniscus macrogranulosus Anura VU Ground-dwelling 24.608530 38.20986 34.13458 41.89873
Melanophryniscus macrogranulosus Anura VU Ground-dwelling 22.661462 37.94966 33.92470 41.64528
Melanophryniscus macrogranulosus Anura VU Ground-dwelling 27.384873 38.58087 34.32916 42.23238
Melanophryniscus montevidensis Anura VU Ground-dwelling 21.911915 37.86973 33.56777 41.79041
Melanophryniscus montevidensis Anura VU Ground-dwelling 20.254952 37.64878 33.31251 41.50213
Melanophryniscus montevidensis Anura VU Ground-dwelling 24.469373 38.21077 33.91282 42.12053
Melanophryniscus moreirae Anura NT Ground-dwelling 26.367176 38.50254 34.75267 42.80932
Melanophryniscus moreirae Anura NT Ground-dwelling 25.114381 38.33751 34.46326 42.45876
Melanophryniscus moreirae Anura NT Ground-dwelling 28.661754 38.80479 34.90128 43.11236
Melanophryniscus orejasmirandai Anura VU Ground-dwelling 21.605243 37.98541 34.09207 42.10424
Melanophryniscus orejasmirandai Anura VU Ground-dwelling 19.960698 37.76419 33.92451 41.85494
Melanophryniscus orejasmirandai Anura VU Ground-dwelling 24.021879 38.31048 34.49765 42.62600
Melanophryniscus pachyrhynus Anura DD Ground-dwelling 23.818283 38.23917 34.38447 42.14174
Melanophryniscus pachyrhynus Anura DD Ground-dwelling 21.870936 37.97973 34.05178 41.88764
Melanophryniscus pachyrhynus Anura DD Ground-dwelling 26.817409 38.63872 34.61017 42.50146
Melanophryniscus peritus Anura CR Ground-dwelling 26.025124 38.47307 34.46099 42.43498
Melanophryniscus peritus Anura CR Ground-dwelling 24.731811 38.30298 34.41222 42.33711
Melanophryniscus peritus Anura CR Ground-dwelling 28.479398 38.79583 34.66934 42.77401
Melanophryniscus sanmartini Anura NT Ground-dwelling 22.690220 38.06819 34.24270 42.69877
Melanophryniscus sanmartini Anura NT Ground-dwelling 20.937435 37.83299 33.78548 42.20263
Melanophryniscus sanmartini Anura NT Ground-dwelling 25.682122 38.46964 34.26102 42.88521
Melanophryniscus simplex Anura DD Ground-dwelling 24.622594 38.37298 33.87274 42.02199
Melanophryniscus simplex Anura DD Ground-dwelling 22.967796 38.15157 33.83180 41.88594
Melanophryniscus simplex Anura DD Ground-dwelling 27.106172 38.70528 34.07957 42.24136
Melanophryniscus spectabilis Anura DD Ground-dwelling 25.030061 38.35169 34.52513 42.63882
Melanophryniscus spectabilis Anura DD Ground-dwelling 23.208995 38.11384 33.95686 41.90232
Melanophryniscus spectabilis Anura DD Ground-dwelling 27.534925 38.67886 34.54847 42.76562
Melanophryniscus tumifrons Anura LC Ground-dwelling 24.668042 38.39121 34.25004 42.43669
Melanophryniscus tumifrons Anura LC Ground-dwelling 22.846535 38.14786 34.18146 42.28134
Melanophryniscus tumifrons Anura LC Ground-dwelling 27.422265 38.75916 34.54868 42.84893
Edalorhina nasuta Anura DD Ground-dwelling 21.012652 39.08113 35.37283 42.15586
Edalorhina nasuta Anura DD Ground-dwelling 20.177954 38.96960 35.35364 42.08606
Edalorhina nasuta Anura DD Ground-dwelling 22.689323 39.30516 35.54556 42.41413
Engystomops montubio Anura LC Ground-dwelling 24.548200 39.99637 37.20654 43.18261
Engystomops montubio Anura LC Ground-dwelling 23.589728 39.86997 37.11331 43.05486
Engystomops montubio Anura LC Ground-dwelling 26.277446 40.22440 37.21253 43.40838
Engystomops pustulatus Anura LC Ground-dwelling 24.708663 39.76873 36.54329 42.94884
Engystomops pustulatus Anura LC Ground-dwelling 23.711489 39.63796 36.58441 42.94299
Engystomops pustulatus Anura LC Ground-dwelling 26.509715 40.00492 36.71629 43.22805
Physalaemus caete Anura DD Ground-dwelling 25.573034 40.05231 37.01912 42.72039
Physalaemus caete Anura DD Ground-dwelling 24.683095 39.93250 36.92683 42.52708
Physalaemus caete Anura DD Ground-dwelling 26.789673 40.21609 37.18968 43.04928
Physalaemus aguirrei Anura LC Ground-dwelling 25.347903 39.78995 35.93693 43.31638
Physalaemus aguirrei Anura LC Ground-dwelling 24.555678 39.68484 35.84713 43.17944
Physalaemus aguirrei Anura LC Ground-dwelling 26.879017 39.99310 36.03207 43.45101
Physalaemus irroratus Anura DD Ground-dwelling 25.318445 39.71872 36.01828 43.19487
Physalaemus irroratus Anura DD Ground-dwelling 24.474568 39.60986 35.93778 43.08521
Physalaemus irroratus Anura DD Ground-dwelling 27.186891 39.95974 36.20264 43.48057
Physalaemus maculiventris Anura LC Semi-aquatic 25.447334 40.01305 36.52307 43.94714
Physalaemus maculiventris Anura LC Semi-aquatic 24.097712 39.83481 36.31845 43.71400
Physalaemus maculiventris Anura LC Semi-aquatic 27.707872 40.31159 36.69696 44.33930
Physalaemus moreirae Anura DD Ground-dwelling 25.767088 39.77481 36.18142 43.77952
Physalaemus moreirae Anura DD Ground-dwelling 24.218770 39.57248 36.00513 43.47644
Physalaemus moreirae Anura DD Ground-dwelling 28.316567 40.10797 36.53664 44.37486
Physalaemus albifrons Anura LC Semi-aquatic 25.688588 39.89564 37.06648 42.86951
Physalaemus albifrons Anura LC Semi-aquatic 24.676645 39.75962 36.87602 42.58430
Physalaemus albifrons Anura LC Semi-aquatic 27.464433 40.13435 36.99666 42.91752
Physalaemus centralis Anura LC Ground-dwelling 27.118340 39.36646 36.36388 42.21582
Physalaemus centralis Anura LC Ground-dwelling 26.015547 39.21791 36.18842 42.00131
Physalaemus centralis Anura LC Ground-dwelling 29.342062 39.66602 36.73447 42.75952
Physalaemus ephippifer Anura LC Ground-dwelling 27.665929 39.23497 36.11043 42.30167
Physalaemus ephippifer Anura LC Ground-dwelling 27.000143 39.14541 36.05084 42.18700
Physalaemus ephippifer Anura LC Ground-dwelling 29.183120 39.43907 36.23437 42.55704
Physalaemus erythros Anura DD Ground-dwelling 25.413877 39.19044 36.36692 42.18259
Physalaemus erythros Anura DD Ground-dwelling 24.128092 39.01648 36.12352 41.90979
Physalaemus erythros Anura DD Ground-dwelling 28.001458 39.54052 36.76521 42.77328
Physalaemus maximus Anura DD Ground-dwelling 25.173616 39.12034 35.99283 42.20695
Physalaemus maximus Anura DD Ground-dwelling 23.824675 38.94292 35.80397 41.91005
Physalaemus maximus Anura DD Ground-dwelling 27.850939 39.47248 36.27050 42.66748
Physalaemus angrensis Anura DD Ground-dwelling 26.367176 39.85932 36.35604 43.82815
Physalaemus angrensis Anura DD Ground-dwelling 25.114381 39.69240 36.17443 43.59663
Physalaemus angrensis Anura DD Ground-dwelling 28.661754 40.16504 36.36014 43.81925
Physalaemus rupestris Anura DD Ground-dwelling 25.729467 39.74377 36.05727 43.47314
Physalaemus rupestris Anura DD Ground-dwelling 24.488809 39.58109 36.34853 43.67264
Physalaemus rupestris Anura DD Ground-dwelling 27.741619 40.00763 36.23388 43.75923
Physalaemus atlanticus Anura VU Ground-dwelling 24.611884 40.45065 37.50055 43.85953
Physalaemus atlanticus Anura VU Ground-dwelling 23.481290 40.30316 37.41619 43.66172
Physalaemus atlanticus Anura VU Ground-dwelling 26.483027 40.69476 37.21330 43.73906
Physalaemus santafecinus Anura LC Semi-aquatic 26.197578 40.79615 37.36602 43.80096
Physalaemus santafecinus Anura LC Semi-aquatic 24.417318 40.56253 37.42819 43.77898
Physalaemus santafecinus Anura LC Semi-aquatic 29.181480 41.18773 37.69158 44.27517
Physalaemus spiniger Anura LC Ground-dwelling 25.419615 40.39689 37.01209 43.85590
Physalaemus spiniger Anura LC Ground-dwelling 23.884363 40.19909 36.87625 43.60548
Physalaemus spiniger Anura LC Ground-dwelling 27.874749 40.71321 37.38985 44.39504
Physalaemus barrioi Anura DD Ground-dwelling 26.367176 39.48898 36.07928 42.26701
Physalaemus barrioi Anura DD Ground-dwelling 25.114381 39.32345 36.06159 42.18082
Physalaemus barrioi Anura DD Ground-dwelling 28.661754 39.79217 36.62662 43.00446
Physalaemus biligonigerus Anura LC Ground-dwelling 25.536829 39.39662 36.23183 42.80814
Physalaemus biligonigerus Anura LC Ground-dwelling 23.961950 39.18669 36.12693 42.60710
Physalaemus biligonigerus Anura LC Ground-dwelling 28.329558 39.76890 36.59577 43.37345
Physalaemus jordanensis Anura DD Ground-dwelling 25.494788 39.52938 36.74974 42.31476
Physalaemus jordanensis Anura DD Ground-dwelling 24.170422 39.35554 36.60736 42.09157
Physalaemus jordanensis Anura DD Ground-dwelling 27.878316 39.84223 36.95696 42.68672
Physalaemus bokermanni Anura DD Ground-dwelling 25.405019 39.88462 36.85744 43.17111
Physalaemus bokermanni Anura DD Ground-dwelling 23.841325 39.67745 36.61961 42.83167
Physalaemus bokermanni Anura DD Ground-dwelling 27.977586 40.22546 37.47054 44.00663
Physalaemus cuqui Anura LC Semi-aquatic 23.566375 39.96886 37.03304 42.96840
Physalaemus cuqui Anura LC Semi-aquatic 22.042177 39.76960 37.03589 42.92848
Physalaemus cuqui Anura LC Semi-aquatic 25.882039 40.27158 37.28676 43.29322
Physalaemus kroyeri Anura LC Ground-dwelling 25.116057 39.85603 36.92717 43.16804
Physalaemus kroyeri Anura LC Ground-dwelling 24.046624 39.71651 36.88704 43.04522
Physalaemus kroyeri Anura LC Ground-dwelling 27.096290 40.11438 37.12810 43.48344
Physalaemus fernandezae Anura LC Ground-dwelling 21.347061 38.50435 35.18917 41.60942
Physalaemus fernandezae Anura LC Ground-dwelling 19.539597 38.26157 34.99603 41.43131
Physalaemus fernandezae Anura LC Ground-dwelling 24.328282 38.90479 35.37288 41.89811
Physalaemus deimaticus Anura DD Ground-dwelling 24.239549 39.58526 36.05843 43.34975
Physalaemus deimaticus Anura DD Ground-dwelling 22.780848 39.39189 35.90134 43.14193
Physalaemus deimaticus Anura DD Ground-dwelling 26.761978 39.91964 36.40626 43.77373
Physalaemus insperatus Anura DD Ground-dwelling 24.139907 39.56887 35.73957 43.36704
Physalaemus insperatus Anura DD Ground-dwelling 22.399972 39.34117 35.60757 43.19431
Physalaemus insperatus Anura DD Ground-dwelling 26.818981 39.91948 36.12052 43.75014
Physalaemus evangelistai Anura DD Ground-dwelling 24.826713 39.62629 36.05076 43.73957
Physalaemus evangelistai Anura DD Ground-dwelling 23.454470 39.44439 35.84268 43.51732
Physalaemus evangelistai Anura DD Ground-dwelling 27.381718 39.96496 36.29478 44.16535
Physalaemus nanus Anura LC Ground-dwelling 24.433707 39.56505 35.88511 43.26843
Physalaemus nanus Anura LC Ground-dwelling 22.696087 39.33571 35.74532 43.03793
Physalaemus nanus Anura LC Ground-dwelling 27.026981 39.90732 36.25018 43.72464
Physalaemus fischeri Anura LC Ground-dwelling 26.496327 39.81263 36.19761 43.88160
Physalaemus fischeri Anura LC Ground-dwelling 25.642603 39.70001 36.14045 43.75738
Physalaemus fischeri Anura LC Ground-dwelling 28.151526 40.03098 36.35467 44.06438
Physalaemus olfersii Anura LC Ground-dwelling 25.340978 39.66199 35.69566 43.22666
Physalaemus olfersii Anura LC Ground-dwelling 24.031589 39.49043 35.56998 43.06600
Physalaemus olfersii Anura LC Ground-dwelling 27.558587 39.95256 35.95991 43.60421
Physalaemus lisei Anura LC Ground-dwelling 24.289874 39.52329 35.88537 42.94745
Physalaemus lisei Anura LC Ground-dwelling 22.492919 39.28479 35.68702 42.70019
Physalaemus lisei Anura LC Ground-dwelling 27.032103 39.88726 36.16639 43.32238
Physalaemus marmoratus Anura LC Semi-aquatic 26.612461 41.18121 37.78308 44.59943
Physalaemus marmoratus Anura LC Semi-aquatic 25.468178 41.03037 37.53592 44.31551
Physalaemus marmoratus Anura LC Semi-aquatic 28.857230 41.47712 37.73435 44.72448
Physalaemus obtectus Anura DD Ground-dwelling 25.439976 39.71956 36.17445 43.33973
Physalaemus obtectus Anura DD Ground-dwelling 24.371888 39.57992 36.02429 43.16176
Physalaemus obtectus Anura DD Ground-dwelling 27.592530 40.00098 36.28673 43.59998
Physalaemus soaresi Anura EN Ground-dwelling 26.021599 39.79564 35.99424 43.40109
Physalaemus soaresi Anura EN Ground-dwelling 24.831798 39.63950 35.86122 43.19535
Physalaemus soaresi Anura EN Ground-dwelling 27.814199 40.03089 36.36110 43.86535
Pleurodema borellii Anura LC Ground-dwelling 20.279145 39.84197 36.90049 43.19920
Pleurodema borellii Anura LC Ground-dwelling 18.563068 39.61807 36.72340 42.94429
Pleurodema borellii Anura LC Ground-dwelling 23.570305 40.27137 36.96536 43.33371
Pleurodema cinereum Anura LC Ground-dwelling 16.522737 39.36866 36.21707 42.41941
Pleurodema cinereum Anura LC Ground-dwelling 15.247655 39.20039 36.09118 42.30865
Pleurodema cinereum Anura LC Ground-dwelling 18.831059 39.67327 36.41590 42.59176
Pleurodema fuscomaculatum Anura DD Ground-dwelling 28.055012 40.82912 37.18344 44.10533
Pleurodema fuscomaculatum Anura DD Ground-dwelling 27.161795 40.71095 37.32755 44.22621
Pleurodema fuscomaculatum Anura DD Ground-dwelling 29.930085 41.07719 37.30575 44.33353
Pleurodema bibroni Anura NT Ground-dwelling 24.091148 39.08195 36.04125 41.68885
Pleurodema bibroni Anura NT Ground-dwelling 22.267969 38.83482 35.84672 41.37029
Pleurodema bibroni Anura NT Ground-dwelling 27.110885 39.49127 36.36078 42.15804
Pleurodema kriegi Anura NT Ground-dwelling 22.767744 38.87985 36.07738 41.86014
Pleurodema kriegi Anura NT Ground-dwelling 20.660679 38.59692 35.72092 41.36596
Pleurodema kriegi Anura NT Ground-dwelling 26.547062 39.38732 36.45051 42.48903
Pleurodema guayapae Anura LC Ground-dwelling 23.274886 39.78009 36.79571 42.40357
Pleurodema guayapae Anura LC Ground-dwelling 21.433220 39.54036 36.75710 42.18917
Pleurodema guayapae Anura LC Ground-dwelling 26.396576 40.18643 37.22456 43.06512
Pseudopaludicola mystacalis Anura LC Semi-aquatic 26.343088 39.94350 35.86987 44.31304
Pseudopaludicola mystacalis Anura LC Semi-aquatic 25.057833 39.77456 35.57205 43.98916
Pseudopaludicola mystacalis Anura LC Semi-aquatic 28.688588 40.25178 36.06270 44.61732
Pseudopaludicola boliviana Anura LC Ground-dwelling 27.471463 40.06113 36.30227 43.76713
Pseudopaludicola boliviana Anura LC Ground-dwelling 26.606348 39.94980 36.28587 43.67489
Pseudopaludicola boliviana Anura LC Ground-dwelling 29.295213 40.29584 36.43450 43.97230
Pseudopaludicola pusilla Anura LC Ground-dwelling 26.358857 39.99363 36.32340 44.22589
Pseudopaludicola pusilla Anura LC Ground-dwelling 25.528835 39.88510 36.11678 44.01377
Pseudopaludicola pusilla Anura LC Ground-dwelling 28.005748 40.20897 35.71282 43.74832
Pseudopaludicola saltica Anura LC Ground-dwelling 26.514153 40.07759 36.20718 44.06774
Pseudopaludicola saltica Anura LC Ground-dwelling 25.308992 39.91951 36.39391 44.18877
Pseudopaludicola saltica Anura LC Ground-dwelling 28.826744 40.38095 36.89234 44.90680
Pseudopaludicola canga Anura DD Ground-dwelling 27.812266 40.07950 35.93791 43.95080
Pseudopaludicola canga Anura DD Ground-dwelling 27.054275 39.98072 35.84422 43.81983
Pseudopaludicola canga Anura DD Ground-dwelling 29.368989 40.28236 36.06534 44.21850
Pseudopaludicola mineira Anura DD Ground-dwelling 24.239549 39.59644 35.94058 43.56732
Pseudopaludicola mineira Anura DD Ground-dwelling 22.780848 39.41040 35.72256 43.33465
Pseudopaludicola mineira Anura DD Ground-dwelling 26.761978 39.91815 35.65172 43.33953
Pseudopaludicola llanera Anura LC Ground-dwelling 26.602201 39.88934 35.93874 44.07161
Pseudopaludicola llanera Anura LC Ground-dwelling 25.736558 39.78022 35.53040 43.64197
Pseudopaludicola llanera Anura LC Ground-dwelling 28.294131 40.10263 35.96266 44.18328
Pseudopaludicola ternetzi Anura LC Ground-dwelling 26.261083 40.14106 36.57026 43.47394
Pseudopaludicola ternetzi Anura LC Ground-dwelling 25.066050 39.98671 36.22743 43.06582
Pseudopaludicola ternetzi Anura LC Ground-dwelling 28.504573 40.43081 36.94021 43.92551
Crossodactylodes bokermanni Anura NT Arboreal 25.586483 39.26399 35.17932 43.29848
Crossodactylodes bokermanni Anura NT Arboreal 24.778278 39.15888 35.12339 43.18292
Crossodactylodes bokermanni Anura NT Arboreal 27.180488 39.47131 35.40867 43.61959
Crossodactylodes izecksohni Anura NT Ground-dwelling 25.507727 39.36534 35.13034 43.36211
Crossodactylodes izecksohni Anura NT Ground-dwelling 24.733105 39.26377 35.06349 43.26256
Crossodactylodes izecksohni Anura NT Ground-dwelling 27.100258 39.57415 35.25011 43.56677
Crossodactylodes pintoi Anura DD Ground-dwelling 26.644333 39.54658 35.25170 43.43737
Crossodactylodes pintoi Anura DD Ground-dwelling 25.472962 39.39169 35.09026 43.22317
Crossodactylodes pintoi Anura DD Ground-dwelling 28.583817 39.80303 35.71753 43.92256
Paratelmatobius mantiqueira Anura DD Ground-dwelling 25.819660 39.39039 35.75327 43.92231
Paratelmatobius mantiqueira Anura DD Ground-dwelling 24.519545 39.21846 35.09383 43.20376
Paratelmatobius mantiqueira Anura DD Ground-dwelling 28.235919 39.70993 35.79914 44.07409
Paratelmatobius cardosoi Anura DD Ground-dwelling 24.843556 39.22207 35.44728 43.32017
Paratelmatobius cardosoi Anura DD Ground-dwelling 23.494971 39.04727 35.23071 43.13099
Paratelmatobius cardosoi Anura DD Ground-dwelling 27.086180 39.51276 35.66975 43.65745
Paratelmatobius gaigeae Anura DD Ground-dwelling 26.367176 39.47753 35.05092 43.06932
Paratelmatobius gaigeae Anura DD Ground-dwelling 25.114381 39.31379 35.01834 43.01065
Paratelmatobius gaigeae Anura DD Ground-dwelling 28.661754 39.77743 35.40018 43.58379
Paratelmatobius poecilogaster Anura DD Ground-dwelling 24.843556 39.32543 35.12691 43.31799
Paratelmatobius poecilogaster Anura DD Ground-dwelling 23.494971 39.14565 35.02612 43.14809
Paratelmatobius poecilogaster Anura DD Ground-dwelling 27.086180 39.62439 35.47830 43.82218
Paratelmatobius lutzii Anura DD Ground-dwelling 26.367176 39.46070 35.36410 43.49579
Paratelmatobius lutzii Anura DD Ground-dwelling 25.114381 39.30010 35.05403 43.15043
Paratelmatobius lutzii Anura DD Ground-dwelling 28.661754 39.75486 35.65255 43.89719
Scythrophrys sawayae Anura LC Ground-dwelling 24.315448 39.25663 35.30073 43.72145
Scythrophrys sawayae Anura LC Ground-dwelling 22.567229 39.02469 35.05590 43.43659
Scythrophrys sawayae Anura LC Ground-dwelling 26.899526 39.59945 35.56145 44.17875
Rupirana cardosoi Anura NT Stream-dwelling 24.728820 38.73514 34.95564 42.99939
Rupirana cardosoi Anura NT Stream-dwelling 23.588041 38.58488 34.76274 42.76878
Rupirana cardosoi Anura NT Stream-dwelling 27.189613 39.05927 35.27736 43.52453
Adenomera ajurauna Anura DD Ground-dwelling 25.405019 38.27084 35.30921 41.77466
Adenomera ajurauna Anura DD Ground-dwelling 23.841325 38.06094 34.75517 41.15448
Adenomera ajurauna Anura DD Ground-dwelling 27.977586 38.61616 35.45458 42.09783
Adenomera araucaria Anura LC Ground-dwelling 24.552864 38.52844 34.82165 42.34143
Adenomera araucaria Anura LC Ground-dwelling 22.689759 38.28681 34.49021 41.96832
Adenomera araucaria Anura LC Ground-dwelling 27.254547 38.87881 34.80374 42.50512
Adenomera thomei Anura LC Ground-dwelling 25.330132 38.70301 35.19043 42.39004
Adenomera thomei Anura LC Ground-dwelling 24.585320 38.60387 35.11374 42.27611
Adenomera thomei Anura LC Ground-dwelling 26.796379 38.89819 35.38312 42.69172
Adenomera nana Anura LC Ground-dwelling 24.510537 38.70423 35.27457 42.60378
Adenomera nana Anura LC Ground-dwelling 22.813381 38.47948 35.02607 42.26327
Adenomera nana Anura LC Ground-dwelling 27.092544 39.04615 35.42483 42.89004
Adenomera bokermanni Anura LC Ground-dwelling 25.414600 38.74286 34.95805 42.37566
Adenomera bokermanni Anura LC Ground-dwelling 24.028089 38.55971 34.77234 42.18734
Adenomera bokermanni Anura LC Ground-dwelling 27.805441 39.05869 35.13227 42.61669
Adenomera coca Anura LC Ground-dwelling 14.331934 37.24729 33.54540 40.75003
Adenomera coca Anura LC Ground-dwelling 13.213313 37.10053 33.59872 40.72872
Adenomera coca Anura LC Ground-dwelling 16.050315 37.47274 34.10734 41.28848
Adenomera diptyx Anura LC Ground-dwelling 26.981328 38.98195 34.75991 42.44049
Adenomera diptyx Anura LC Ground-dwelling 25.732651 38.81670 34.66456 42.30702
Adenomera diptyx Anura LC Ground-dwelling 29.387016 39.30033 35.23251 42.92013
Adenomera hylaedactyla Anura LC Ground-dwelling 27.166479 38.97445 34.87707 42.75133
Adenomera hylaedactyla Anura LC Ground-dwelling 26.346369 38.86635 34.71639 42.58972
Adenomera hylaedactyla Anura LC Ground-dwelling 28.835891 39.19450 34.85112 42.79738
Adenomera martinezi Anura NT Ground-dwelling 27.532009 38.99568 35.11432 42.66271
Adenomera martinezi Anura NT Ground-dwelling 26.682734 38.88328 34.97443 42.48782
Adenomera martinezi Anura NT Ground-dwelling 29.192145 39.21538 35.33230 43.04098
Adenomera marmorata Anura LC Ground-dwelling 25.564663 38.77339 34.98499 42.49458
Adenomera marmorata Anura LC Ground-dwelling 24.202971 38.59599 34.95521 42.36344
Adenomera marmorata Anura LC Ground-dwelling 27.926676 39.08110 35.34647 43.01896
Adenomera heyeri Anura LC Ground-dwelling 27.281904 39.12580 35.52777 42.75437
Adenomera heyeri Anura LC Ground-dwelling 26.669524 39.04498 35.45429 42.63393
Adenomera heyeri Anura LC Ground-dwelling 28.764068 39.32141 35.85216 43.24908
Adenomera lutzi Anura EN Ground-dwelling 26.634291 38.95474 35.25566 42.85292
Adenomera lutzi Anura EN Ground-dwelling 25.965013 38.86521 35.10800 42.65831
Adenomera lutzi Anura EN Ground-dwelling 28.137979 39.15589 35.02109 42.74988
Hydrolaetare caparu Anura DD Fossorial 28.128787 41.16287 37.23614 45.04769
Hydrolaetare caparu Anura DD Fossorial 27.330846 41.05815 36.93341 44.68544
Hydrolaetare caparu Anura DD Fossorial 30.372757 41.45737 37.04285 44.99710
Hydrolaetare schmidti Anura LC Ground-dwelling 28.148108 40.12297 36.52528 44.01028
Hydrolaetare schmidti Anura LC Ground-dwelling 27.430187 40.02837 36.48482 43.93290
Hydrolaetare schmidti Anura LC Ground-dwelling 29.732715 40.33177 36.78502 44.37926
Hydrolaetare dantasi Anura LC Ground-dwelling 27.863680 40.05538 36.39269 44.10365
Hydrolaetare dantasi Anura LC Ground-dwelling 27.029240 39.94682 36.36856 44.06203
Hydrolaetare dantasi Anura LC Ground-dwelling 29.437505 40.26014 36.46205 44.23958
Leptodactylus poecilochilus Anura LC Ground-dwelling 26.680225 38.94890 35.91414 42.28610
Leptodactylus poecilochilus Anura LC Ground-dwelling 25.911002 38.84798 35.85640 42.18661
Leptodactylus poecilochilus Anura LC Ground-dwelling 28.200520 39.14835 36.03517 42.48274
Leptodactylus chaquensis Anura LC Semi-aquatic 26.099597 39.88633 36.30199 43.19009
Leptodactylus chaquensis Anura LC Semi-aquatic 24.762092 39.71076 35.87429 42.73736
Leptodactylus chaquensis Anura LC Semi-aquatic 28.538527 40.20647 36.58948 43.50387
Leptodactylus fragilis Anura LC Ground-dwelling 26.337448 41.49871 38.54345 44.49312
Leptodactylus fragilis Anura LC Ground-dwelling 25.513078 41.39306 38.41227 44.33841
Leptodactylus fragilis Anura LC Ground-dwelling 28.002482 41.71210 38.80080 44.86722
Leptodactylus longirostris Anura LC Ground-dwelling 26.905383 41.36753 38.37617 44.73128
Leptodactylus longirostris Anura LC Ground-dwelling 26.218668 41.27816 38.04147 44.34925
Leptodactylus longirostris Anura LC Ground-dwelling 28.426577 41.56550 38.31247 44.75333
Leptodactylus caatingae Anura LC Ground-dwelling 25.579659 39.82765 36.31369 43.18618
Leptodactylus caatingae Anura LC Ground-dwelling 24.429335 39.67905 36.04005 42.90311
Leptodactylus caatingae Anura LC Ground-dwelling 27.526307 40.07912 36.51738 43.46021
Leptodactylus camaquara Anura DD Fossorial 24.849922 40.78918 36.99005 44.44123
Leptodactylus camaquara Anura DD Fossorial 23.635965 40.62921 36.93617 44.35663
Leptodactylus camaquara Anura DD Fossorial 27.503328 41.13882 37.39297 44.92308
Leptodactylus colombiensis Anura LC Ground-dwelling 24.593519 39.76085 36.43560 43.37850
Leptodactylus colombiensis Anura LC Ground-dwelling 23.794090 39.65566 36.35459 43.24381
Leptodactylus colombiensis Anura LC Ground-dwelling 26.125091 39.96239 36.52194 43.57436
Leptodactylus cunicularius Anura LC Ground-dwelling 25.514052 39.96718 36.54734 43.22389
Leptodactylus cunicularius Anura LC Ground-dwelling 24.230008 39.79618 36.34093 42.98220
Leptodactylus cunicularius Anura LC Ground-dwelling 28.013511 40.30003 36.68094 43.58506
Leptodactylus cupreus Anura DD Fossorial 25.413877 40.76607 37.23625 44.46723
Leptodactylus cupreus Anura DD Fossorial 24.128092 40.59980 37.11836 44.32230
Leptodactylus cupreus Anura DD Fossorial 28.001458 41.10069 37.60371 44.93723
Leptodactylus notoaktites Anura LC Ground-dwelling 25.414465 39.11722 35.97724 42.09793
Leptodactylus notoaktites Anura LC Ground-dwelling 23.902272 38.91371 35.87955 41.83820
Leptodactylus notoaktites Anura LC Ground-dwelling 27.936579 39.45664 36.15989 42.40836
Leptodactylus mystaceus Anura LC Ground-dwelling 27.391638 39.29969 36.00026 42.67218
Leptodactylus mystaceus Anura LC Ground-dwelling 26.616978 39.19673 35.97476 42.59835
Leptodactylus mystaceus Anura LC Ground-dwelling 29.020081 39.51614 36.18850 42.98473
Leptodactylus spixi Anura LC Ground-dwelling 25.342827 39.12294 35.92981 42.43385
Leptodactylus spixi Anura LC Ground-dwelling 24.320717 38.98791 35.76560 42.25591
Leptodactylus spixi Anura LC Ground-dwelling 27.193636 39.36745 36.18598 42.74065
Leptodactylus elenae Anura LC Ground-dwelling 26.996791 39.45799 36.02564 42.50875
Leptodactylus elenae Anura LC Ground-dwelling 25.819465 39.30448 35.84055 42.27604
Leptodactylus elenae Anura LC Ground-dwelling 29.226977 39.74878 35.93925 42.61451
Leptodactylus diedrus Anura LC Ground-dwelling 28.493201 40.55720 37.10819 43.71610
Leptodactylus diedrus Anura LC Ground-dwelling 27.756839 40.46164 37.03336 43.59538
Leptodactylus diedrus Anura LC Ground-dwelling 30.017070 40.75496 37.25744 44.00455
Leptodactylus discodactylus Anura LC Ground-dwelling 27.327946 40.61364 37.05427 43.55517
Leptodactylus discodactylus Anura LC Ground-dwelling 26.565881 40.51452 37.04046 43.51211
Leptodactylus discodactylus Anura LC Ground-dwelling 28.857816 40.81262 37.26038 43.89308
Leptodactylus griseigularis Anura LC Ground-dwelling 19.576581 39.60583 36.89307 42.75779
Leptodactylus griseigularis Anura LC Ground-dwelling 18.462239 39.46258 36.71560 42.53802
Leptodactylus griseigularis Anura LC Ground-dwelling 21.003182 39.78922 37.18506 43.12217
Leptodactylus validus Anura LC Ground-dwelling 26.827292 40.11106 36.99688 43.22580
Leptodactylus validus Anura LC Ground-dwelling 26.345518 40.04823 36.90342 43.08870
Leptodactylus validus Anura LC Ground-dwelling 27.606556 40.21270 37.00881 43.30013
Leptodactylus fallax Anura CR Ground-dwelling 27.025101 39.99146 36.48116 43.71467
Leptodactylus fallax Anura CR Ground-dwelling 26.486366 39.92269 36.45100 43.64505
Leptodactylus fallax Anura CR Ground-dwelling 27.925091 40.10635 36.49445 43.81231
Leptodactylus labyrinthicus Anura LC Semi-aquatic 27.120105 40.20609 36.49155 44.00693
Leptodactylus labyrinthicus Anura LC Semi-aquatic 25.993410 40.06062 36.53962 44.01733
Leptodactylus labyrinthicus Anura LC Semi-aquatic 29.319756 40.49008 36.79779 44.40236
Leptodactylus myersi Anura LC Ground-dwelling 27.159601 40.06319 36.37615 43.89722
Leptodactylus myersi Anura LC Ground-dwelling 26.552420 39.98463 36.30049 43.75934
Leptodactylus myersi Anura LC Ground-dwelling 28.634805 40.25406 36.50694 44.11172
Leptodactylus knudseni Anura LC Ground-dwelling 27.329725 40.01589 36.06123 43.41616
Leptodactylus knudseni Anura LC Ground-dwelling 26.610715 39.92217 35.94771 43.26007
Leptodactylus knudseni Anura LC Ground-dwelling 28.873842 40.21717 36.18355 43.70815
Leptodactylus pentadactylus Anura LC Ground-dwelling 27.378011 40.00958 36.53100 43.68773
Leptodactylus pentadactylus Anura LC Ground-dwelling 26.639960 39.91567 36.53958 43.62395
Leptodactylus pentadactylus Anura LC Ground-dwelling 28.932426 40.20735 36.68890 44.00359
Leptodactylus flavopictus Anura LC Ground-dwelling 25.384871 39.90266 36.59109 43.59434
Leptodactylus flavopictus Anura LC Ground-dwelling 24.034128 39.72454 36.20774 43.16141
Leptodactylus flavopictus Anura LC Ground-dwelling 27.579660 40.19208 36.76703 43.88555
Leptodactylus furnarius Anura LC Ground-dwelling 26.269845 39.50252 36.44029 42.73493
Leptodactylus furnarius Anura LC Ground-dwelling 25.009416 39.33520 36.34216 42.55401
Leptodactylus furnarius Anura LC Ground-dwelling 28.626676 39.81539 36.63876 43.05266
Leptodactylus plaumanni Anura LC Ground-dwelling 25.418702 40.30155 36.82875 43.30910
Leptodactylus plaumanni Anura LC Ground-dwelling 23.675826 40.07574 36.70086 43.13214
Leptodactylus plaumanni Anura LC Ground-dwelling 28.025479 40.63930 36.93560 43.63129
Leptodactylus stenodema Anura LC Ground-dwelling 27.717652 40.25346 36.55471 43.90344
Leptodactylus stenodema Anura LC Ground-dwelling 27.003041 40.15895 36.49106 43.83150
Leptodactylus stenodema Anura LC Ground-dwelling 29.264530 40.45805 36.60957 44.05916
Leptodactylus hylodes Anura DD Ground-dwelling 25.075066 39.80194 36.12025 43.44931
Leptodactylus hylodes Anura DD Ground-dwelling 24.235158 39.69231 36.01739 43.31139
Leptodactylus hylodes Anura DD Ground-dwelling 26.511323 39.98942 36.34725 43.72328
Leptodactylus jolyi Anura LC Ground-dwelling 26.020097 40.34888 37.47779 43.00542
Leptodactylus jolyi Anura LC Ground-dwelling 24.849086 40.19619 37.54017 42.97287
Leptodactylus jolyi Anura LC Ground-dwelling 28.330340 40.65012 37.90097 43.62339
Leptodactylus magistris Anura CR Stream-dwelling 26.357961 39.19576 36.02024 42.37806
Leptodactylus magistris Anura CR Stream-dwelling 25.399787 39.06964 35.89811 42.15942
Leptodactylus magistris Anura CR Stream-dwelling 27.780686 39.38303 36.15820 42.61049
Leptodactylus laticeps Anura NT Ground-dwelling 26.307345 39.94290 36.45345 43.59468
Leptodactylus laticeps Anura NT Ground-dwelling 24.751080 39.74053 36.38970 43.44731
Leptodactylus laticeps Anura NT Ground-dwelling 28.957216 40.28747 36.78045 44.15095
Leptodactylus lauramiriamae Anura DD Ground-dwelling 27.763750 40.15974 36.21020 43.61274
Leptodactylus lauramiriamae Anura DD Ground-dwelling 26.957891 40.05389 36.26634 43.62247
Leptodactylus lauramiriamae Anura DD Ground-dwelling 29.588991 40.39947 36.31174 43.85399
Leptodactylus nesiotus Anura LC Ground-dwelling 26.924526 39.71163 36.72723 42.89638
Leptodactylus nesiotus Anura LC Ground-dwelling 26.317318 39.63132 36.62209 42.72486
Leptodactylus nesiotus Anura LC Ground-dwelling 28.184637 39.87829 36.97174 43.20878
Leptodactylus marambaiae Anura LC Ground-dwelling 25.340600 39.93536 36.74500 43.51127
Leptodactylus marambaiae Anura LC Ground-dwelling 24.319075 39.80080 36.60990 43.34084
Leptodactylus marambaiae Anura LC Ground-dwelling 26.756310 40.12185 36.88519 43.67174
Leptodactylus natalensis Anura LC Ground-dwelling 25.809704 39.89753 36.13550 43.06475
Leptodactylus natalensis Anura LC Ground-dwelling 24.927821 39.78360 36.29390 43.19612
Leptodactylus natalensis Anura LC Ground-dwelling 27.301589 40.09027 36.39535 43.36273
Leptodactylus paraensis Anura LC Ground-dwelling 27.767747 40.11429 36.42593 43.50816
Leptodactylus paraensis Anura LC Ground-dwelling 27.064964 40.02458 36.35330 43.40034
Leptodactylus paraensis Anura LC Ground-dwelling 29.346831 40.31586 36.57654 43.78812
Leptodactylus rhodonotus Anura LC Ground-dwelling 23.333376 39.58001 36.15319 43.33169
Leptodactylus rhodonotus Anura LC Ground-dwelling 22.589292 39.48376 36.06139 43.23407
Leptodactylus rhodonotus Anura LC Ground-dwelling 24.597438 39.74352 36.24025 43.46074
Leptodactylus peritoaktites Anura EN Ground-dwelling 25.461567 39.93485 36.26311 43.52897
Leptodactylus peritoaktites Anura EN Ground-dwelling 24.521753 39.81191 36.26779 43.49377
Leptodactylus peritoaktites Anura EN Ground-dwelling 27.195947 40.16171 36.51341 43.94717
Leptodactylus pustulatus Anura LC Ground-dwelling 27.665615 40.16772 36.66554 43.74704
Leptodactylus pustulatus Anura LC Ground-dwelling 26.787351 40.05283 36.53998 43.60425
Leptodactylus pustulatus Anura LC Ground-dwelling 29.448419 40.40095 36.92041 44.07927
Leptodactylus rhodomerus Anura LC Ground-dwelling 24.945437 39.84504 35.97912 43.03823
Leptodactylus rhodomerus Anura LC Ground-dwelling 24.157754 39.74022 36.07833 43.09791
Leptodactylus rhodomerus Anura LC Ground-dwelling 26.383049 40.03634 36.15270 43.26802
Leptodactylus riveroi Anura LC Ground-dwelling 28.114959 40.40774 36.59376 44.20166
Leptodactylus riveroi Anura LC Ground-dwelling 27.412721 40.31419 36.79315 44.36354
Leptodactylus riveroi Anura LC Ground-dwelling 29.645107 40.61159 36.77756 44.46580
Leptodactylus silvanimbus Anura CR Ground-dwelling 26.468834 39.99534 36.27793 43.10516
Leptodactylus silvanimbus Anura CR Ground-dwelling 25.476230 39.86557 36.18740 42.97918
Leptodactylus silvanimbus Anura CR Ground-dwelling 28.481769 40.25850 36.52256 43.49871
Leptodactylus rugosus Anura LC Ground-dwelling 26.163880 39.91910 36.69901 43.78369
Leptodactylus rugosus Anura LC Ground-dwelling 25.412506 39.81996 36.24077 43.31032
Leptodactylus rugosus Anura LC Ground-dwelling 27.739709 40.12702 36.86340 44.02750
Leptodactylus sabanensis Anura LC Ground-dwelling 25.846398 39.91437 36.51271 43.38101
Leptodactylus sabanensis Anura LC Ground-dwelling 25.081505 39.81432 36.36669 43.22797
Leptodactylus sabanensis Anura LC Ground-dwelling 27.582190 40.14140 36.68973 43.61529
Leptodactylus savagei Anura LC Ground-dwelling 26.773944 40.09012 36.34452 43.46873
Leptodactylus savagei Anura LC Ground-dwelling 26.064076 39.99595 36.25004 43.38077
Leptodactylus savagei Anura LC Ground-dwelling 28.215785 40.28138 36.43959 43.64443
Leptodactylus sertanejo Anura LC Ground-dwelling 26.405234 39.92304 36.29947 43.45528
Leptodactylus sertanejo Anura LC Ground-dwelling 25.218258 39.76774 36.21635 43.33736
Leptodactylus sertanejo Anura LC Ground-dwelling 28.660825 40.21814 36.38292 43.69517
Leptodactylus tapiti Anura DD Ground-dwelling 26.340198 40.00032 36.02580 43.37804
Leptodactylus tapiti Anura DD Ground-dwelling 25.101302 39.83914 36.03649 43.35424
Leptodactylus tapiti Anura DD Ground-dwelling 28.488172 40.27977 36.44731 44.01534
Leptodactylus turimiquensis Anura NT Ground-dwelling 26.576005 40.11523 36.89376 43.79947
Leptodactylus turimiquensis Anura NT Ground-dwelling 25.857205 40.01902 36.84374 43.68956
Leptodactylus turimiquensis Anura NT Ground-dwelling 28.008431 40.30696 36.96468 44.01008
Leptodactylus vastus Anura LC Ground-dwelling 26.647385 40.03797 36.71404 43.74725
Leptodactylus vastus Anura LC Ground-dwelling 25.810397 39.92891 36.62677 43.59501
Leptodactylus vastus Anura LC Ground-dwelling 28.137903 40.23219 36.62383 43.74564
Leptodactylus viridis Anura DD Ground-dwelling 25.228317 39.91110 36.40443 43.43035
Leptodactylus viridis Anura DD Ground-dwelling 24.474889 39.81198 36.33844 43.30724
Leptodactylus viridis Anura DD Ground-dwelling 26.747475 40.11096 36.63413 43.78561
Leptodactylus syphax Anura LC Ground-dwelling 26.667612 39.79369 36.26281 43.68804
Leptodactylus syphax Anura LC Ground-dwelling 25.575964 39.65150 36.16065 43.54347
Leptodactylus syphax Anura LC Ground-dwelling 28.751025 40.06507 36.53880 44.04345
Celsiella revocata Anura VU Stream-dwelling 26.754122 37.12378 33.08561 40.81955
Celsiella revocata Anura VU Stream-dwelling 25.918210 37.01351 33.01854 40.74349
Celsiella revocata Anura VU Stream-dwelling 28.300054 37.32772 33.31686 41.09752
Celsiella vozmedianoi Anura EN Stream-dwelling 26.880586 37.18144 33.51529 40.96864
Celsiella vozmedianoi Anura EN Stream-dwelling 26.247396 37.09654 33.44345 40.87570
Celsiella vozmedianoi Anura EN Stream-dwelling 28.358386 37.37959 33.52444 41.11947
Hyalinobatrachium aureoguttatum Anura LC Stream-dwelling 25.264575 37.07563 33.55987 41.29514
Hyalinobatrachium aureoguttatum Anura LC Stream-dwelling 24.496812 36.97471 33.48683 41.19858
Hyalinobatrachium aureoguttatum Anura LC Stream-dwelling 26.694167 37.26355 33.70403 41.50454
Hyalinobatrachium valerioi Anura LC Stream-dwelling 24.921736 36.98559 33.36889 40.75475
Hyalinobatrachium valerioi Anura LC Stream-dwelling 24.055164 36.87151 33.22579 40.62942
Hyalinobatrachium valerioi Anura LC Stream-dwelling 26.437298 37.18510 33.59716 40.97793
Hyalinobatrachium talamancae Anura LC Stream-dwelling 22.320708 36.69804 32.70843 39.93801
Hyalinobatrachium talamancae Anura LC Stream-dwelling 21.414495 36.57914 32.61418 39.87757
Hyalinobatrachium talamancae Anura LC Stream-dwelling 23.754809 36.88620 32.92204 40.18560
Hyalinobatrachium chirripoi Anura LC Stream-dwelling 25.509494 37.05491 33.56110 41.43973
Hyalinobatrachium chirripoi Anura LC Stream-dwelling 24.775934 36.95968 33.39868 41.21481
Hyalinobatrachium chirripoi Anura LC Stream-dwelling 26.908133 37.23649 33.07346 40.97709
Hyalinobatrachium colymbiphyllum Anura LC Stream-dwelling 25.808728 37.17042 33.35041 41.35884
Hyalinobatrachium colymbiphyllum Anura LC Stream-dwelling 25.103027 37.07469 33.30633 41.26852
Hyalinobatrachium colymbiphyllum Anura LC Stream-dwelling 27.173804 37.35561 33.59580 41.73994
Hyalinobatrachium pellucidum Anura NT Stream-dwelling 22.678013 36.72045 32.99150 40.82423
Hyalinobatrachium pellucidum Anura NT Stream-dwelling 21.622548 36.58073 32.95063 40.77273
Hyalinobatrachium pellucidum Anura NT Stream-dwelling 24.418380 36.95083 33.16307 41.04091
Hyalinobatrachium cappellei Anura LC Stream-dwelling 27.603738 37.38046 33.30206 41.14589
Hyalinobatrachium cappellei Anura LC Stream-dwelling 26.910942 37.28819 33.25227 41.03435
Hyalinobatrachium cappellei Anura LC Stream-dwelling 29.172923 37.58944 33.41485 41.34439
Hyalinobatrachium taylori Anura LC Stream-dwelling 26.747424 37.23319 33.20494 41.10124
Hyalinobatrachium taylori Anura LC Stream-dwelling 26.067726 37.14380 33.16986 40.96040
Hyalinobatrachium taylori Anura LC Stream-dwelling 28.283875 37.43526 33.24241 41.24802
Hyalinobatrachium iaspidiense Anura LC Stream-dwelling 27.765677 37.43841 33.87295 41.41503
Hyalinobatrachium iaspidiense Anura LC Stream-dwelling 27.047649 37.34500 33.83185 41.33233
Hyalinobatrachium iaspidiense Anura LC Stream-dwelling 29.308510 37.63911 34.06959 41.71089
Hyalinobatrachium fleischmanni Anura LC Stream-dwelling 26.107156 37.16337 33.42900 41.14536
Hyalinobatrachium fleischmanni Anura LC Stream-dwelling 25.248882 37.04881 33.30592 40.99859
Hyalinobatrachium fleischmanni Anura LC Stream-dwelling 27.824243 37.39256 33.22674 41.13651
Hyalinobatrachium tatayoi Anura LC Stream-dwelling 25.779576 37.10544 33.06368 40.76426
Hyalinobatrachium tatayoi Anura LC Stream-dwelling 25.030458 37.00701 33.01417 40.70438
Hyalinobatrachium tatayoi Anura LC Stream-dwelling 27.223107 37.29513 33.20968 41.00632
Hyalinobatrachium duranti Anura EN Stream-dwelling 26.081594 37.17400 33.57061 41.05545
Hyalinobatrachium duranti Anura EN Stream-dwelling 25.212821 37.05998 33.37739 40.86889
Hyalinobatrachium duranti Anura EN Stream-dwelling 27.650603 37.37992 33.62027 41.24209
Hyalinobatrachium ibama Anura LC Stream-dwelling 23.658001 36.83110 33.05641 40.75790
Hyalinobatrachium ibama Anura LC Stream-dwelling 22.806281 36.71993 32.91200 40.62756
Hyalinobatrachium ibama Anura LC Stream-dwelling 25.343156 37.05106 32.93900 40.74889
Hyalinobatrachium pallidum Anura NT Stream-dwelling 26.647918 37.20204 33.36007 41.12364
Hyalinobatrachium pallidum Anura NT Stream-dwelling 25.771494 37.08690 33.33625 41.01690
Hyalinobatrachium pallidum Anura NT Stream-dwelling 28.371607 37.42850 33.67161 41.58326
Hyalinobatrachium fragile Anura NT Stream-dwelling 26.769939 37.27784 33.61039 41.20214
Hyalinobatrachium fragile Anura NT Stream-dwelling 25.959786 37.17036 33.48536 41.08919
Hyalinobatrachium fragile Anura NT Stream-dwelling 28.357253 37.48841 33.82156 41.47674
Hyalinobatrachium orientale Anura VU Stream-dwelling 26.726920 37.21916 32.95295 41.06574
Hyalinobatrachium orientale Anura VU Stream-dwelling 26.132472 37.13997 32.91559 40.98329
Hyalinobatrachium orientale Anura VU Stream-dwelling 27.942615 37.38109 33.39791 41.53820
Hyalinobatrachium esmeralda Anura EN Stream-dwelling 22.392831 36.67752 32.75751 40.47347
Hyalinobatrachium esmeralda Anura EN Stream-dwelling 21.447444 36.55182 32.60136 40.28612
Hyalinobatrachium esmeralda Anura EN Stream-dwelling 24.281794 36.92869 33.05984 40.87857
Hyalinobatrachium guairarepanense Anura EN Stream-dwelling 26.436249 37.19036 33.11413 40.83207
Hyalinobatrachium guairarepanense Anura EN Stream-dwelling 25.696256 37.09444 33.08646 40.72516
Hyalinobatrachium guairarepanense Anura EN Stream-dwelling 27.808205 37.36819 33.34245 41.13741
Hyalinobatrachium vireovittatum Anura LC Stream-dwelling 25.980752 37.14904 33.59798 41.12012
Hyalinobatrachium vireovittatum Anura LC Stream-dwelling 25.337423 37.06309 33.49802 40.99658
Hyalinobatrachium vireovittatum Anura LC Stream-dwelling 27.253220 37.31904 33.78167 41.42685
Centrolene acanthidiocephalum Anura DD Stream-dwelling 24.390020 36.70851 33.09290 40.40812
Centrolene acanthidiocephalum Anura DD Stream-dwelling 23.746759 36.62553 33.00930 40.32070
Centrolene acanthidiocephalum Anura DD Stream-dwelling 25.828703 36.89409 33.21358 40.62425
Centrolene antioquiense Anura NT Stream-dwelling 23.499493 36.56174 33.05998 40.02339
Centrolene antioquiense Anura NT Stream-dwelling 22.573781 36.44206 32.88150 39.83036
Centrolene antioquiense Anura NT Stream-dwelling 25.034323 36.76018 33.27818 40.34343
Centrolene azulae Anura DD Stream-dwelling 23.440561 36.60756 32.77534 40.13843
Centrolene azulae Anura DD Stream-dwelling 22.815371 36.52418 32.74277 40.06412
Centrolene azulae Anura DD Stream-dwelling 24.661220 36.77037 33.13562 40.47834
Centrolene ballux Anura EN Stream-dwelling 20.180939 36.11834 32.46191 39.63629
Centrolene ballux Anura EN Stream-dwelling 18.072574 35.84615 32.57847 39.71591
Centrolene ballux Anura EN Stream-dwelling 22.820081 36.45906 32.76484 40.00810
Centrolene buckleyi Anura CR Arboreal 21.581875 36.84563 33.27289 40.48714
Centrolene buckleyi Anura CR Arboreal 19.877003 36.62452 33.03262 40.18063
Centrolene buckleyi Anura CR Arboreal 23.857711 37.14080 33.62713 40.93240
Centrolene condor Anura EN Stream-dwelling 24.698762 36.78233 33.58508 40.63217
Centrolene condor Anura EN Stream-dwelling 23.813822 36.66594 33.24911 40.31629
Centrolene condor Anura EN Stream-dwelling 26.444972 37.01199 33.75688 40.87471
Centrolene heloderma Anura VU Stream-dwelling 22.853294 36.53841 32.86609 39.86636
Centrolene heloderma Anura VU Stream-dwelling 21.600959 36.37562 32.69262 39.66431
Centrolene heloderma Anura VU Stream-dwelling 24.661456 36.77344 33.02013 40.09076
Centrolene hybrida Anura LC Stream-dwelling 23.795869 36.68759 32.87449 40.39556
Centrolene hybrida Anura LC Stream-dwelling 22.987032 36.57974 32.83503 40.35388
Centrolene hybrida Anura LC Stream-dwelling 25.433078 36.90589 33.05354 40.69192
Centrolene lemniscatum Anura DD Stream-dwelling 20.305860 36.19928 32.81614 39.78146
Centrolene lemniscatum Anura DD Stream-dwelling 19.198666 36.05403 32.59533 39.53968
Centrolene lemniscatum Anura DD Stream-dwelling 22.523955 36.49026 33.21160 40.25217
Centrolene lynchi Anura EN Stream-dwelling 19.805326 36.19791 32.68901 39.79128
Centrolene lynchi Anura EN Stream-dwelling 17.198230 35.85027 32.23328 39.29443
Centrolene lynchi Anura EN Stream-dwelling 22.861501 36.60543 32.89771 40.10784
Centrolene medemi Anura EN Stream-dwelling 24.333127 36.82187 33.24515 40.82990
Centrolene medemi Anura EN Stream-dwelling 23.577956 36.72101 33.20424 40.75243
Centrolene medemi Anura EN Stream-dwelling 25.809976 37.01912 33.45641 41.06206
Centrolene muelleri Anura DD Stream-dwelling 21.422387 36.40870 32.94870 40.06916
Centrolene muelleri Anura DD Stream-dwelling 20.467645 36.28025 32.82789 39.91664
Centrolene muelleri Anura DD Stream-dwelling 23.163460 36.64295 33.06964 40.29136
Centrolene paezorum Anura DD Arboreal 22.833468 37.01718 33.60527 40.79218
Centrolene paezorum Anura DD Arboreal 21.394430 36.82995 33.47406 40.63878
Centrolene paezorum Anura DD Arboreal 24.669687 37.25608 33.71943 41.00206
Centrolene petrophilum Anura EN Stream-dwelling 22.354356 36.36614 32.54609 39.72212
Centrolene petrophilum Anura EN Stream-dwelling 21.407774 36.24052 32.43887 39.50809
Centrolene petrophilum Anura EN Stream-dwelling 24.256757 36.61860 32.72495 39.97154
Centrolene quindianum Anura VU Stream-dwelling 21.760455 36.33457 32.54699 39.78425
Centrolene quindianum Anura VU Stream-dwelling 20.629565 36.18510 32.36606 39.55416
Centrolene quindianum Anura VU Stream-dwelling 23.539392 36.56969 32.71945 40.05813
Centrolene robledoi Anura LC Stream-dwelling 23.513577 36.63626 33.23283 40.36148
Centrolene robledoi Anura LC Stream-dwelling 22.620531 36.51724 33.12167 40.23036
Centrolene robledoi Anura LC Stream-dwelling 25.062023 36.84263 33.32046 40.49473
Centrolene sanchezi Anura EN Stream-dwelling 24.131088 36.71112 32.71957 40.15848
Centrolene sanchezi Anura EN Stream-dwelling 23.069526 36.57056 32.65664 40.02124
Centrolene sanchezi Anura EN Stream-dwelling 25.733614 36.92331 33.35435 40.82643
Centrolene savagei Anura LC Stream-dwelling 23.420053 36.67724 33.06942 40.36214
Centrolene savagei Anura LC Stream-dwelling 22.590097 36.56645 32.82622 40.10669
Centrolene savagei Anura LC Stream-dwelling 24.943630 36.88063 33.18743 40.50223
Centrolene solitaria Anura EN Stream-dwelling 24.779899 36.84657 33.07028 40.04212
Centrolene solitaria Anura EN Stream-dwelling 23.907074 36.73000 32.97291 39.90646
Centrolene solitaria Anura EN Stream-dwelling 26.265578 37.04499 33.20688 40.20738
Centrolene venezuelense Anura LC Arboreal 25.914060 37.39477 33.76405 41.10542
Centrolene venezuelense Anura LC Arboreal 25.017113 37.27789 33.36908 40.68575
Centrolene venezuelense Anura LC Arboreal 27.611024 37.61590 33.75848 41.13948
Cochranella duidaeana Anura VU Arboreal 25.661020 37.34153 34.06816 41.30172
Cochranella duidaeana Anura VU Arboreal 25.001401 37.25453 34.02145 41.21772
Cochranella duidaeana Anura VU Arboreal 27.238038 37.54954 34.18395 41.40944
Cochranella euhystrix Anura CR Stream-dwelling 24.352695 36.73739 33.03326 40.54996
Cochranella euhystrix Anura CR Stream-dwelling 23.754925 36.65696 32.84499 40.34445
Cochranella euhystrix Anura CR Stream-dwelling 25.398234 36.87809 33.12751 40.70395
Cochranella euknemos Anura LC Stream-dwelling 26.952201 37.08364 33.08654 40.38677
Cochranella euknemos Anura LC Stream-dwelling 26.301013 36.99553 32.94178 40.22213
Cochranella euknemos Anura LC Stream-dwelling 28.267367 37.26158 33.35754 40.73426
Cochranella geijskesi Anura LC Stream-dwelling 27.500006 37.14040 33.18910 40.69786
Cochranella geijskesi Anura LC Stream-dwelling 26.772190 37.04488 33.24397 40.72928
Cochranella geijskesi Anura LC Stream-dwelling 29.321560 37.37944 33.51567 41.12976
Cochranella granulosa Anura LC Stream-dwelling 26.621754 37.07245 32.89918 40.41120
Cochranella granulosa Anura LC Stream-dwelling 25.938697 36.98133 32.95894 40.41436
Cochranella granulosa Anura LC Stream-dwelling 28.013098 37.25804 33.50656 41.15113
Cochranella litoralis Anura VU Arboreal 24.020878 37.18359 33.15333 40.52844
Cochranella litoralis Anura VU Arboreal 23.085034 37.05902 33.51926 40.85394
Cochranella litoralis Anura VU Arboreal 25.607719 37.39481 33.96233 41.45564
Cochranella mache Anura NT Stream-dwelling 24.822887 36.87273 33.44219 40.72805
Cochranella mache Anura NT Stream-dwelling 24.014786 36.76423 33.30608 40.56152
Cochranella mache Anura NT Stream-dwelling 26.283031 37.06876 33.70725 41.12517
Cochranella nola Anura LC Stream-dwelling 20.416553 36.23640 32.97701 39.94224
Cochranella nola Anura LC Stream-dwelling 19.350653 36.09726 32.97953 39.93099
Cochranella nola Anura LC Stream-dwelling 21.655891 36.39817 33.09535 40.09171
Cochranella phryxa Anura DD Arboreal 21.173461 36.77931 33.21790 40.40794
Cochranella phryxa Anura DD Arboreal 20.517245 36.69293 33.09811 40.27118
Cochranella phryxa Anura DD Arboreal 22.412265 36.94236 33.34903 40.60245
Cochranella ramirezi Anura NT Stream-dwelling 26.619965 36.94987 33.36218 40.53173
Cochranella ramirezi Anura NT Stream-dwelling 25.944346 36.86331 33.26387 40.41455
Cochranella ramirezi Anura NT Stream-dwelling 27.998673 37.12652 33.37505 40.58958
Cochranella resplendens Anura LC Arboreal 24.332635 37.20432 33.54566 41.06417
Cochranella resplendens Anura LC Arboreal 23.455063 37.08909 33.44738 40.97060
Cochranella resplendens Anura LC Arboreal 25.923395 37.41320 33.77234 41.30933
Cochranella riveroi Anura VU Arboreal 26.913050 37.49920 33.95837 41.34316
Cochranella riveroi Anura VU Arboreal 26.225726 37.40893 33.64123 41.01208
Cochranella riveroi Anura VU Arboreal 28.306766 37.68224 34.03256 41.49836
Cochranella xanthocheridia Anura VU Stream-dwelling 26.059772 36.91950 33.44741 40.70483
Cochranella xanthocheridia Anura VU Stream-dwelling 25.330763 36.82439 33.35973 40.55524
Cochranella xanthocheridia Anura VU Stream-dwelling 27.539355 37.11253 33.41376 40.73940
Espadarana andina Anura LC Stream-dwelling 24.917962 36.27166 33.30671 39.32452
Espadarana andina Anura LC Stream-dwelling 24.094180 36.16150 33.16253 39.15361
Espadarana andina Anura LC Stream-dwelling 26.576027 36.49338 33.50736 39.62998
Nymphargus anomalus Anura EN Stream-dwelling 22.772920 36.54050 33.23372 40.00407
Nymphargus anomalus Anura EN Stream-dwelling 21.184011 36.33376 33.21246 39.87218
Nymphargus anomalus Anura EN Stream-dwelling 24.943916 36.82297 33.17983 39.98644
Nymphargus armatus Anura CR Stream-dwelling 24.017258 36.71439 32.22253 40.05689
Nymphargus armatus Anura CR Stream-dwelling 23.300537 36.62041 32.53720 40.31543
Nymphargus armatus Anura CR Stream-dwelling 25.278806 36.87980 33.07247 40.94152
Nymphargus bejaranoi Anura EN Arboreal 18.373837 36.39613 32.82799 39.90962
Nymphargus bejaranoi Anura EN Arboreal 17.415068 36.27128 32.72548 39.75335
Nymphargus bejaranoi Anura EN Arboreal 19.848472 36.58817 32.89563 40.01544
Nymphargus buenaventura Anura EN Stream-dwelling 23.949902 36.67471 33.04698 40.13085
Nymphargus buenaventura Anura EN Stream-dwelling 22.543976 36.49326 32.78446 39.91177
Nymphargus buenaventura Anura EN Stream-dwelling 26.144713 36.95798 33.32402 40.45898
Nymphargus cariticommatus Anura EN Stream-dwelling 23.601658 36.66639 33.43655 40.55695
Nymphargus cariticommatus Anura EN Stream-dwelling 22.518885 36.52397 33.22306 40.36039
Nymphargus cariticommatus Anura EN Stream-dwelling 25.475904 36.91293 33.71270 40.88748
Nymphargus chami Anura NT Arboreal 26.059772 37.51957 33.77086 41.09159
Nymphargus chami Anura NT Arboreal 25.330763 37.42538 33.61165 40.90923
Nymphargus chami Anura NT Arboreal 27.539355 37.71072 33.95688 41.27337
Nymphargus chancas Anura EN Stream-dwelling 24.155691 36.77012 33.00563 40.03662
Nymphargus chancas Anura EN Stream-dwelling 23.551146 36.69186 32.93365 39.95698
Nymphargus chancas Anura EN Stream-dwelling 25.436941 36.93598 33.30508 40.40837
Nymphargus cochranae Anura LC Stream-dwelling 22.826475 36.55699 33.04983 40.34897
Nymphargus cochranae Anura LC Stream-dwelling 21.394099 36.37141 32.89115 40.16888
Nymphargus cochranae Anura LC Stream-dwelling 24.878471 36.82285 33.38191 40.78975
Nymphargus cristinae Anura EN Arboreal 26.219010 37.43294 33.39252 40.88050
Nymphargus cristinae Anura EN Arboreal 25.544335 37.34555 33.33154 40.77188
Nymphargus cristinae Anura EN Arboreal 27.553766 37.60584 33.62954 41.19824
Nymphargus garciae Anura VU Arboreal 23.273735 37.03091 33.06533 40.47403
Nymphargus garciae Anura VU Arboreal 22.308120 36.90506 33.03732 40.36013
Nymphargus garciae Anura VU Arboreal 24.862181 37.23794 33.16731 40.69460
Nymphargus grandisonae Anura LC Arboreal 23.720289 37.21499 33.57989 40.68444
Nymphargus grandisonae Anura LC Arboreal 22.685618 37.07882 33.52471 40.66927
Nymphargus grandisonae Anura LC Arboreal 25.352863 37.42986 33.75543 41.00597
Nymphargus griffithsi Anura LC Arboreal 23.743922 37.20123 33.33682 40.52795
Nymphargus griffithsi Anura LC Arboreal 22.716623 37.06384 33.30824 40.40636
Nymphargus griffithsi Anura LC Arboreal 25.377269 37.41969 33.75742 41.00659
Nymphargus ignotus Anura LC Arboreal 25.195669 37.31981 34.17487 41.21252
Nymphargus ignotus Anura LC Arboreal 24.480405 37.22634 34.07865 41.11015
Nymphargus ignotus Anura LC Arboreal 26.527539 37.49385 34.24934 41.33509
Nymphargus laurae Anura EN Arboreal 23.546002 37.15915 32.99614 40.49084
Nymphargus laurae Anura EN Arboreal 22.594071 37.03467 32.91403 40.39397
Nymphargus laurae Anura EN Arboreal 25.371396 37.39783 33.11553 40.69681
Nymphargus luminosus Anura EN Arboreal 26.219010 37.48007 34.11508 41.32423
Nymphargus luminosus Anura EN Arboreal 25.544335 37.39156 34.02163 41.19385
Nymphargus luminosus Anura EN Arboreal 27.553766 37.65518 34.19629 41.51934
Nymphargus luteopunctatus Anura EN Arboreal 24.215542 37.21426 33.64933 40.83287
Nymphargus luteopunctatus Anura EN Arboreal 23.173833 37.07860 33.50577 40.66428
Nymphargus luteopunctatus Anura EN Arboreal 25.704822 37.40822 33.80224 41.06862
Nymphargus mariae Anura LC Arboreal 23.573881 37.08787 33.27442 40.56013
Nymphargus mariae Anura LC Arboreal 22.508707 36.94996 33.18464 40.40746
Nymphargus mariae Anura LC Arboreal 25.252170 37.30516 33.49564 40.87653
Nymphargus mixomaculatus Anura CR Stream-dwelling 15.191863 35.59975 32.33678 39.30460
Nymphargus mixomaculatus Anura CR Stream-dwelling 13.688102 35.40482 31.79868 38.84464
Nymphargus mixomaculatus Anura CR Stream-dwelling 18.280341 36.00011 32.54875 39.41260
Nymphargus nephelophila Anura DD Stream-dwelling 25.616302 36.99688 33.05412 40.45427
Nymphargus nephelophila Anura DD Stream-dwelling 24.961494 36.90944 32.96609 40.35282
Nymphargus nephelophila Anura DD Stream-dwelling 27.028064 37.18539 33.52807 40.99080
Nymphargus ocellatus Anura DD Arboreal 21.012652 36.77162 33.26308 40.56113
Nymphargus ocellatus Anura DD Arboreal 20.177954 36.66199 33.09073 40.36820
Nymphargus ocellatus Anura DD Arboreal 22.689323 36.99185 33.13856 40.48468
Nymphargus oreonympha Anura LC Arboreal 25.616302 37.35225 33.55530 41.02388
Nymphargus oreonympha Anura LC Arboreal 24.961494 37.26517 33.46053 40.90244
Nymphargus oreonympha Anura LC Arboreal 27.028064 37.54001 33.52839 41.02822
Nymphargus phenax Anura EN Arboreal 15.448306 36.06451 32.29385 39.51796
Nymphargus phenax Anura EN Arboreal 14.520308 35.93942 32.13261 39.33217
Nymphargus phenax Anura EN Arboreal 16.818757 36.24925 32.51301 39.70550
Nymphargus pluvialis Anura EN Stream-dwelling 18.213965 35.96509 32.26456 39.69908
Nymphargus pluvialis Anura EN Stream-dwelling 16.103271 35.68972 31.91523 39.32210
Nymphargus pluvialis Anura EN Stream-dwelling 19.629302 36.14974 32.52849 39.94068
Nymphargus posadae Anura LC Arboreal 23.216621 37.01280 33.61436 41.00355
Nymphargus posadae Anura LC Arboreal 22.050632 36.85978 33.46751 40.80247
Nymphargus posadae Anura LC Arboreal 25.038896 37.25194 33.80544 41.25057
Nymphargus prasinus Anura VU Arboreal 24.715045 37.35799 33.33892 40.62297
Nymphargus prasinus Anura VU Arboreal 23.992522 37.26300 33.27555 40.57429
Nymphargus prasinus Anura VU Arboreal 26.082948 37.53783 33.57506 40.90196
Nymphargus rosada Anura VU Arboreal 23.041754 37.10086 33.51192 40.55783
Nymphargus rosada Anura VU Arboreal 22.166195 36.98507 33.34923 40.37475
Nymphargus rosada Anura VU Arboreal 24.594547 37.30621 33.69908 40.81304
Nymphargus ruizi Anura VU Arboreal 24.349283 37.21030 33.61470 40.91787
Nymphargus ruizi Anura VU Arboreal 23.442929 37.09308 33.60508 40.85814
Nymphargus ruizi Anura VU Arboreal 25.806519 37.39877 33.81238 41.20683
Nymphargus siren Anura EN Arboreal 23.177687 37.15476 33.28112 40.91484
Nymphargus siren Anura EN Arboreal 22.090125 37.01012 33.11676 40.79612
Nymphargus siren Anura EN Arboreal 24.880369 37.38121 33.56948 41.26477
Nymphargus spilotus Anura NT Arboreal 22.792552 37.02984 33.58854 40.92370
Nymphargus spilotus Anura NT Arboreal 22.040989 36.93145 33.50804 40.76523
Nymphargus spilotus Anura NT Arboreal 24.304586 37.22780 33.45793 40.86499
Nymphargus vicenteruedai Anura DD Stream-dwelling 22.245615 36.51900 33.05539 40.24403
Nymphargus vicenteruedai Anura DD Stream-dwelling 21.369508 36.40533 32.97997 40.14413
Nymphargus vicenteruedai Anura DD Stream-dwelling 24.109886 36.76088 33.13135 40.46362
Nymphargus wileyi Anura CR Stream-dwelling 23.546002 36.69778 33.04414 40.39225
Nymphargus wileyi Anura CR Stream-dwelling 22.594071 36.57331 32.92436 40.20681
Nymphargus wileyi Anura CR Stream-dwelling 25.371396 36.93647 32.90065 40.28089
Rulyrana adiazeta Anura VU Stream-dwelling 24.169136 36.74580 33.33011 40.88092
Rulyrana adiazeta Anura VU Stream-dwelling 23.423816 36.64718 32.54303 40.08938
Rulyrana adiazeta Anura VU Stream-dwelling 25.730577 36.95240 33.00928 40.67923
Rulyrana flavopunctata Anura LC Stream-dwelling 24.288524 36.80292 33.36682 40.61045
Rulyrana flavopunctata Anura LC Stream-dwelling 23.355952 36.67911 33.22822 40.43286
Rulyrana flavopunctata Anura LC Stream-dwelling 25.937328 37.02183 33.25814 40.53878
Rulyrana mcdiarmidi Anura NT Stream-dwelling 23.448417 36.69004 33.15129 40.36413
Rulyrana mcdiarmidi Anura NT Stream-dwelling 22.540238 36.56968 33.00468 40.19855
Rulyrana mcdiarmidi Anura NT Stream-dwelling 25.090264 36.90763 33.26402 40.56165
Rulyrana saxiscandens Anura EN Stream-dwelling 24.021783 36.72017 33.40476 40.78195
Rulyrana saxiscandens Anura EN Stream-dwelling 23.410536 36.63969 33.31880 40.65172
Rulyrana saxiscandens Anura EN Stream-dwelling 25.363768 36.89685 33.31929 40.78688
Rulyrana spiculata Anura NT Stream-dwelling 19.071909 36.06351 32.82932 39.80441
Rulyrana spiculata Anura NT Stream-dwelling 17.961681 35.91737 32.59407 39.57758
Rulyrana spiculata Anura NT Stream-dwelling 20.469963 36.24754 33.02793 39.96029
Rulyrana susatamai Anura NT Stream-dwelling 23.785363 36.66063 32.88388 39.94229
Rulyrana susatamai Anura NT Stream-dwelling 22.958292 36.55158 32.77774 39.80068
Rulyrana susatamai Anura NT Stream-dwelling 25.283948 36.85824 33.05099 40.11109
Sachatamia albomaculata Anura LC Stream-dwelling 26.248368 37.04447 33.16165 40.72935
Sachatamia albomaculata Anura LC Stream-dwelling 25.520070 36.94878 33.23671 40.75428
Sachatamia albomaculata Anura LC Stream-dwelling 27.653948 37.22914 33.27437 40.91337
Sachatamia punctulata Anura VU Stream-dwelling 23.993935 36.65083 33.03967 40.34880
Sachatamia punctulata Anura VU Stream-dwelling 23.177567 36.54482 32.89927 40.13305
Sachatamia punctulata Anura VU Stream-dwelling 25.498235 36.84619 32.99010 40.31337
Sachatamia ilex Anura LC Stream-dwelling 26.138545 37.04129 33.31040 40.90609
Sachatamia ilex Anura LC Stream-dwelling 25.422141 36.94547 33.21478 40.75707
Sachatamia ilex Anura LC Stream-dwelling 27.509604 37.22468 33.41772 40.99712
Sachatamia orejuela Anura LC Stream-dwelling 23.998408 36.67930 32.92946 40.24104
Sachatamia orejuela Anura LC Stream-dwelling 22.863834 36.52996 32.83525 40.04983
Sachatamia orejuela Anura LC Stream-dwelling 25.694855 36.90261 33.55297 40.96085
Teratohyla adenocheira Anura LC Stream-dwelling 28.135369 37.23974 33.83613 41.25484
Teratohyla adenocheira Anura LC Stream-dwelling 27.354455 37.13674 33.65754 41.01951
Teratohyla adenocheira Anura LC Stream-dwelling 29.900587 37.47255 33.80207 41.31177
Teratohyla midas Anura LC Arboreal 27.629739 37.64186 34.18161 41.46608
Teratohyla midas Anura LC Arboreal 26.904977 37.54732 34.09887 41.31414
Teratohyla midas Anura LC Arboreal 29.167572 37.84244 34.33228 41.73399
Teratohyla spinosa Anura LC Stream-dwelling 25.843011 36.89192 32.90357 40.28279
Teratohyla spinosa Anura LC Stream-dwelling 25.059903 36.78880 32.81404 40.14501
Teratohyla spinosa Anura LC Stream-dwelling 27.301731 37.08400 33.28850 40.71849
Teratohyla amelie Anura LC Arboreal 22.463913 36.96776 33.76540 40.69259
Teratohyla amelie Anura LC Arboreal 21.560522 36.84829 33.54524 40.46119
Teratohyla amelie Anura LC Arboreal 23.842362 37.15006 33.88274 40.86748
Teratohyla pulverata Anura LC Arboreal 26.243454 37.49702 33.93833 41.29533
Teratohyla pulverata Anura LC Arboreal 25.520140 37.40203 33.86604 41.15932
Teratohyla pulverata Anura LC Arboreal 27.624234 37.67834 33.93994 41.40118
Vitreorana antisthenesi Anura VU Arboreal 26.946554 37.53198 33.85646 41.33688
Vitreorana antisthenesi Anura VU Arboreal 26.121161 37.42288 33.78641 41.21827
Vitreorana antisthenesi Anura VU Arboreal 28.605285 37.75123 33.99723 41.60880
Vitreorana castroviejoi Anura EN Arboreal 26.479711 37.50546 34.11646 41.25863
Vitreorana castroviejoi Anura EN Arboreal 25.877888 37.42589 34.01508 41.13648
Vitreorana castroviejoi Anura EN Arboreal 27.645281 37.65955 34.24895 41.47448
Vitreorana eurygnatha Anura LC Arboreal 25.378317 37.39037 33.69717 40.90159
Vitreorana eurygnatha Anura LC Arboreal 24.156648 37.22988 33.49901 40.71605
Vitreorana eurygnatha Anura LC Arboreal 27.594753 37.68153 33.86121 41.18784
Vitreorana gorzulae Anura LC Arboreal 25.972272 37.34385 33.58475 40.78485
Vitreorana gorzulae Anura LC Arboreal 25.232928 37.24730 33.48779 40.65033
Vitreorana gorzulae Anura LC Arboreal 27.661667 37.56446 33.98440 41.32560
Vitreorana helenae Anura VU Arboreal 25.749492 37.34476 33.55839 41.03449
Vitreorana helenae Anura VU Arboreal 24.986070 37.24427 33.43336 40.88944
Vitreorana helenae Anura VU Arboreal 27.485853 37.57333 33.84256 41.35696
Vitreorana parvula Anura VU Stream-dwelling 24.424983 36.77583 33.06113 40.41090
Vitreorana parvula Anura VU Stream-dwelling 22.657193 36.54628 32.87722 40.13402
Vitreorana parvula Anura VU Stream-dwelling 27.074565 37.11989 33.17332 40.71175
Vitreorana uranoscopa Anura LC Arboreal 25.466365 37.32814 33.63819 40.87226
Vitreorana uranoscopa Anura LC Arboreal 24.088028 37.14647 33.53997 40.64535
Vitreorana uranoscopa Anura LC Arboreal 27.735210 37.62719 33.77660 41.20184
Ikakogi tayrona Anura VU Stream-dwelling 26.777894 37.21541 33.21888 40.89090
Ikakogi tayrona Anura VU Stream-dwelling 25.908244 37.10063 33.29170 40.94560
Ikakogi tayrona Anura VU Stream-dwelling 28.696471 37.46863 33.29769 41.02707
Allophryne ruthveni Anura LC Arboreal 27.614657 38.49169 34.08931 42.94843
Allophryne ruthveni Anura LC Arboreal 26.925965 38.40124 34.00438 42.81695
Allophryne ruthveni Anura LC Arboreal 29.161403 38.69486 34.25649 43.20285
Nasikabatrachus sahyadrensis Anura NT Fossorial 27.532572 38.61914 31.08356 44.28148
Nasikabatrachus sahyadrensis Anura NT Fossorial 26.652368 38.49778 32.34934 45.56523
Nasikabatrachus sahyadrensis Anura NT Fossorial 29.249326 38.85584 33.09623 46.27571
Sooglossus thomasseti Anura CR Stream-dwelling 26.783332 36.89714 31.14475 43.31120
Sooglossus thomasseti Anura CR Stream-dwelling 26.200616 36.81322 31.07950 43.26417
Sooglossus thomasseti Anura CR Stream-dwelling 27.685753 37.02708 31.27642 43.48160
Sooglossus sechellensis Anura EN Ground-dwelling 26.783332 37.42028 31.14432 42.65259
Sooglossus sechellensis Anura EN Ground-dwelling 26.200616 37.33871 31.11498 42.57532
Sooglossus sechellensis Anura EN Ground-dwelling 27.685753 37.54659 31.26121 42.80701
Sechellophryne pipilodryas Anura CR Ground-dwelling 26.783332 37.38263 31.67366 43.71810
Sechellophryne pipilodryas Anura CR Ground-dwelling 26.200616 37.30289 31.59982 43.61783
Sechellophryne pipilodryas Anura CR Ground-dwelling 27.685753 37.50612 31.78801 43.87556
Sechellophryne gardineri Anura EN Ground-dwelling 26.783332 37.45925 31.75705 43.64863
Sechellophryne gardineri Anura EN Ground-dwelling 26.200616 37.37792 31.66509 43.54434
Sechellophryne gardineri Anura EN Ground-dwelling 27.685753 37.58519 32.04204 43.97293
Hemisus barotseensis Anura DD Fossorial 24.548723 39.13097 33.43598 44.55596
Hemisus barotseensis Anura DD Fossorial 23.557461 38.99620 33.25157 44.33314
Hemisus barotseensis Anura DD Fossorial 26.838861 39.44231 33.44786 44.59798
Hemisus microscaphus Anura LC Fossorial 21.469888 38.69731 33.55928 44.98779
Hemisus microscaphus Anura LC Fossorial 20.622706 38.58038 33.41185 44.84895
Hemisus microscaphus Anura LC Fossorial 23.170868 38.93208 33.77136 45.26655
Hemisus marmoratus Anura LC Fossorial 25.391544 39.19209 33.39197 44.72287
Hemisus marmoratus Anura LC Fossorial 24.462391 39.06469 33.21817 44.67048
Hemisus marmoratus Anura LC Fossorial 27.359410 39.46192 33.61696 45.03187
Hemisus perreti Anura LC Fossorial 27.840166 39.51658 33.80514 44.88818
Hemisus perreti Anura LC Fossorial 26.953565 39.39592 33.70574 44.79750
Hemisus perreti Anura LC Fossorial 29.717312 39.77207 34.20440 45.32071
Hemisus guineensis Anura LC Fossorial 25.273719 39.22641 33.81087 44.88223
Hemisus guineensis Anura LC Fossorial 24.379651 39.10492 33.75019 44.74234
Hemisus guineensis Anura LC Fossorial 27.230347 39.49229 33.74070 44.88999
Hemisus guttatus Anura NT Fossorial 22.652319 38.74177 33.27205 44.03584
Hemisus guttatus Anura NT Fossorial 21.436520 38.57713 33.20243 43.92475
Hemisus guttatus Anura NT Fossorial 24.642175 39.01123 33.45714 44.32483
Hemisus olivaceus Anura LC Fossorial 26.232700 39.32114 33.33566 44.79842
Hemisus olivaceus Anura LC Fossorial 25.510335 39.22020 33.28884 44.66551
Hemisus olivaceus Anura LC Fossorial 27.812561 39.54189 33.18458 44.73275
Hemisus wittei Anura DD Fossorial 23.907516 38.98134 33.64815 44.68732
Hemisus wittei Anura DD Fossorial 23.019740 38.86163 33.43853 44.48614
Hemisus wittei Anura DD Fossorial 25.866143 39.24547 33.77428 44.90308
Hemisus brachydactylus Anura DD Fossorial 22.402422 38.80275 33.55428 44.93319
Hemisus brachydactylus Anura DD Fossorial 21.596021 38.69220 33.42746 44.82805
Hemisus brachydactylus Anura DD Fossorial 24.505875 39.09113 33.81119 45.22640
Balebreviceps hillmani Anura CR Ground-dwelling 20.132346 37.48308 31.92930 42.72789
Balebreviceps hillmani Anura CR Ground-dwelling 19.211996 37.35599 31.68141 42.45677
Balebreviceps hillmani Anura CR Ground-dwelling 21.359748 37.65257 32.04409 42.86459
Callulina dawida Anura CR Ground-dwelling 24.359369 38.11367 32.25474 43.41667
Callulina dawida Anura CR Ground-dwelling 23.668023 38.01821 32.16508 43.31728
Callulina dawida Anura CR Ground-dwelling 25.512240 38.27286 32.40426 43.61145
Callulina kanga Anura CR Arboreal 22.932171 37.80938 32.11727 42.82942
Callulina kanga Anura CR Arboreal 22.237243 37.71404 32.01970 42.79038
Callulina kanga Anura CR Arboreal 24.553563 38.03181 32.24131 43.05294
Callulina laphami Anura CR Ground-dwelling 22.722915 37.76531 32.06713 42.89141
Callulina laphami Anura CR Ground-dwelling 21.996958 37.66555 32.41800 43.26224
Callulina laphami Anura CR Ground-dwelling 24.206308 37.96917 32.41677 43.16935
Callulina shengena Anura CR Arboreal 23.282669 37.78601 32.18080 43.33163
Callulina shengena Anura CR Arboreal 22.540368 37.68349 32.11441 43.25545
Callulina shengena Anura CR Arboreal 24.824741 37.99899 32.05878 43.24298
Callulina hanseni Anura CR Arboreal 23.956874 37.90680 32.33818 43.44477
Callulina hanseni Anura CR Arboreal 23.296639 37.81568 32.21824 43.33142
Callulina hanseni Anura CR Arboreal 25.435562 38.11086 32.56166 43.63779
Callulina meteora Anura CR Ground-dwelling 23.956874 37.97142 32.64181 43.69228
Callulina meteora Anura CR Ground-dwelling 23.296639 37.88148 32.53517 43.56346
Callulina meteora Anura CR Ground-dwelling 25.435562 38.17286 32.75400 43.85149
Callulina kisiwamsitu Anura EN Arboreal 24.969464 38.09638 32.52084 43.94521
Callulina kisiwamsitu Anura EN Arboreal 24.301742 38.00490 32.44489 43.77330
Callulina kisiwamsitu Anura EN Arboreal 25.986178 38.23568 32.63648 44.14353
Callulina kreffti Anura LC Ground-dwelling 23.860988 38.05936 32.34342 43.53849
Callulina kreffti Anura LC Ground-dwelling 23.173785 37.96688 32.27441 43.41321
Callulina kreffti Anura LC Ground-dwelling 25.328131 38.25682 32.07795 43.33998
Callulina stanleyi Anura CR Arboreal 23.282669 37.88307 31.88738 43.02365
Callulina stanleyi Anura CR Arboreal 22.540368 37.78195 31.73587 42.85863
Callulina stanleyi Anura CR Arboreal 24.824741 38.09314 32.18685 43.34616
Spelaeophryne methneri Anura LC Fossorial 23.909980 39.00315 33.20249 44.77991
Spelaeophryne methneri Anura LC Fossorial 23.101740 38.89264 33.11908 44.66356
Spelaeophryne methneri Anura LC Fossorial 25.645941 39.24051 33.60553 45.19361
Probreviceps durirostris Anura EN Ground-dwelling 23.204491 37.98964 32.05493 43.04997
Probreviceps durirostris Anura EN Ground-dwelling 22.464152 37.88890 31.89602 42.90506
Probreviceps durirostris Anura EN Ground-dwelling 24.966850 38.22946 32.31459 43.38657
Probreviceps rungwensis Anura EN Ground-dwelling 22.541731 37.82823 32.26453 43.12143
Probreviceps rungwensis Anura EN Ground-dwelling 21.750533 37.71976 32.17935 42.95928
Probreviceps rungwensis Anura EN Ground-dwelling 24.163424 38.05057 32.75312 43.62873
Probreviceps loveridgei Anura EN Ground-dwelling 23.183642 37.92571 32.40212 43.54884
Probreviceps loveridgei Anura EN Ground-dwelling 22.446462 37.82593 31.76605 42.92775
Probreviceps loveridgei Anura EN Ground-dwelling 24.888468 38.15646 32.17950 43.24273
Probreviceps macrodactylus Anura EN Ground-dwelling 24.206993 38.11469 31.92236 43.19690
Probreviceps macrodactylus Anura EN Ground-dwelling 23.534341 38.02171 31.96775 43.26825
Probreviceps macrodactylus Anura EN Ground-dwelling 25.490370 38.29210 32.17090 43.39301
Probreviceps uluguruensis Anura EN Ground-dwelling 24.076140 38.10082 32.87293 44.14539
Probreviceps uluguruensis Anura EN Ground-dwelling 23.433959 38.01301 32.69123 43.98153
Probreviceps uluguruensis Anura EN Ground-dwelling 25.567374 38.30473 33.10942 44.38399
Probreviceps rhodesianus Anura EN Ground-dwelling 23.996436 38.01289 32.69721 44.04617
Probreviceps rhodesianus Anura EN Ground-dwelling 22.773987 37.84844 32.55243 43.85042
Probreviceps rhodesianus Anura EN Ground-dwelling 26.339431 38.32808 32.86135 44.18247
Breviceps acutirostris Anura LC Fossorial 20.398534 38.43964 32.93690 43.92204
Breviceps acutirostris Anura LC Fossorial 19.038648 38.25525 32.76538 43.77829
Breviceps acutirostris Anura LC Fossorial 22.843827 38.77119 33.47264 44.51102
Breviceps adspersus Anura LC Fossorial 23.235416 38.98512 33.07311 44.44343
Breviceps adspersus Anura LC Fossorial 21.859388 38.79150 32.90116 44.18094
Breviceps adspersus Anura LC Fossorial 25.618039 39.32037 33.40050 44.86145
Breviceps gibbosus Anura NT Fossorial 20.495403 38.62373 32.51666 43.84669
Breviceps gibbosus Anura NT Fossorial 19.136806 38.44069 32.14426 43.43833
Breviceps gibbosus Anura NT Fossorial 23.371439 39.01122 33.03835 44.30330
Breviceps fichus Anura LC Fossorial 22.428292 38.92993 33.54074 44.59525
Breviceps fichus Anura LC Fossorial 21.620325 38.81931 33.47173 44.52844
Breviceps fichus Anura LC Fossorial 24.106198 39.15965 33.72407 44.81757
Breviceps mossambicus Anura LC Fossorial 24.337377 39.13387 33.76495 45.06756
Breviceps mossambicus Anura LC Fossorial 23.316554 38.99485 33.70768 44.92768
Breviceps mossambicus Anura LC Fossorial 26.324499 39.40449 34.01916 45.38619
Breviceps rosei Anura LC Fossorial 20.322527 38.61383 32.78776 44.21811
Breviceps rosei Anura LC Fossorial 19.044861 38.43579 32.60048 44.00582
Breviceps rosei Anura LC Fossorial 22.878734 38.97001 33.16245 44.67957
Breviceps bagginsi Anura NT Fossorial 22.432296 38.86431 32.99018 44.14899
Breviceps bagginsi Anura NT Fossorial 21.227912 38.70076 32.84489 44.02034
Breviceps bagginsi Anura NT Fossorial 24.309545 39.11924 33.23279 44.48385
Breviceps sopranus Anura LC Fossorial 23.698684 39.04406 32.86736 44.23207
Breviceps sopranus Anura LC Fossorial 22.591766 38.89269 32.78427 44.11183
Breviceps sopranus Anura LC Fossorial 25.694204 39.31692 33.03892 44.51631
Breviceps macrops Anura NT Fossorial 19.431808 38.49998 33.00156 44.47209
Breviceps macrops Anura NT Fossorial 18.527495 38.37709 32.81860 44.35521
Breviceps macrops Anura NT Fossorial 21.495659 38.78044 33.31061 44.79741
Breviceps namaquensis Anura LC Fossorial 20.033551 38.53729 32.91181 44.52109
Breviceps namaquensis Anura LC Fossorial 18.926217 38.38839 32.78682 44.34642
Breviceps namaquensis Anura LC Fossorial 22.553382 38.87610 33.22884 44.91855
Breviceps fuscus Anura LC Fossorial 20.903760 38.70859 32.90094 44.18741
Breviceps fuscus Anura LC Fossorial 19.375030 38.49860 32.69690 43.91982
Breviceps fuscus Anura LC Fossorial 23.452771 39.05872 32.85366 44.16873
Breviceps montanus Anura LC Fossorial 20.530325 38.62793 32.80838 44.44289
Breviceps montanus Anura LC Fossorial 19.118463 38.43727 32.61670 44.28758
Breviceps montanus Anura LC Fossorial 23.183947 38.98627 33.29579 44.81908
Breviceps verrucosus Anura LC Fossorial 21.820150 38.80658 32.48293 44.26163
Breviceps verrucosus Anura LC Fossorial 20.492598 38.62406 32.34685 44.05467
Breviceps verrucosus Anura LC Fossorial 23.933620 39.09716 32.66250 44.46507
Breviceps poweri Anura LC Fossorial 24.302454 39.09029 34.16549 45.23457
Breviceps poweri Anura LC Fossorial 23.341469 38.95875 33.88255 45.01612
Breviceps poweri Anura LC Fossorial 26.461874 39.38587 34.39488 45.49727
Breviceps sylvestris Anura NT Fossorial 23.170293 38.91117 33.14142 44.47697
Breviceps sylvestris Anura NT Fossorial 21.994117 38.75143 33.12483 44.45146
Breviceps sylvestris Anura NT Fossorial 25.548593 39.23416 33.28528 44.77047
Acanthixalus sonjae Anura VU Arboreal 27.507602 40.25607 35.54799 45.03871
Acanthixalus sonjae Anura VU Arboreal 26.944636 40.18108 35.46185 44.94577
Acanthixalus sonjae Anura VU Arboreal 28.762691 40.42327 35.74004 45.24591
Acanthixalus spinosus Anura LC Arboreal 27.312911 40.26116 36.03006 45.62234
Acanthixalus spinosus Anura LC Arboreal 26.567673 40.16232 35.78926 45.37466
Acanthixalus spinosus Anura LC Arboreal 28.944718 40.47758 36.10697 45.70559
Kassina arboricola Anura VU Semi-aquatic 27.494190 40.58076 36.02365 45.30697
Kassina arboricola Anura VU Semi-aquatic 26.920661 40.50446 35.96091 45.24130
Kassina arboricola Anura VU Semi-aquatic 28.740056 40.74649 36.15099 45.53748
Kassina cassinoides Anura LC Semi-aquatic 27.378388 40.59624 35.72507 45.34537
Kassina cassinoides Anura LC Semi-aquatic 26.536565 40.48376 35.53636 45.13930
Kassina cassinoides Anura LC Semi-aquatic 29.372994 40.86273 36.18786 45.93115
Kassina cochranae Anura LC Arboreal 27.405888 40.23638 35.57774 44.78876
Kassina cochranae Anura LC Arboreal 26.703853 40.14211 35.61886 44.83231
Kassina cochranae Anura LC Arboreal 28.929047 40.44092 35.71035 44.98607
Kassina decorata Anura VU Semi-aquatic 26.324881 40.52032 35.50554 45.33793
Kassina decorata Anura VU Semi-aquatic 25.657596 40.43142 35.08003 44.84792
Kassina decorata Anura VU Semi-aquatic 27.833333 40.72129 35.60887 45.39032
Kassina fusca Anura LC Ground-dwelling 27.588580 40.31908 35.82285 45.00875
Kassina fusca Anura LC Ground-dwelling 26.751515 40.20832 35.70466 44.86963
Kassina fusca Anura LC Ground-dwelling 29.473264 40.56845 36.05698 45.29429
Kassina jozani Anura EN Ground-dwelling 25.722910 40.04205 35.77831 45.14309
Kassina jozani Anura EN Ground-dwelling 25.130638 39.96280 35.70003 45.02362
Kassina jozani Anura EN Ground-dwelling 26.733407 40.17726 35.68151 45.08816
Kassina kuvangensis Anura LC Semi-aquatic 23.722489 40.07665 35.25805 44.49692
Kassina kuvangensis Anura LC Semi-aquatic 22.795379 39.95060 35.14382 44.38032
Kassina kuvangensis Anura LC Semi-aquatic 25.913209 40.37450 35.58147 44.84542
Kassina lamottei Anura LC Ground-dwelling 27.485368 40.28366 35.42911 44.61472
Kassina lamottei Anura LC Ground-dwelling 26.850050 40.19934 35.37902 44.53504
Kassina lamottei Anura LC Ground-dwelling 28.847616 40.46446 35.76140 44.99954
Kassina maculata Anura LC Ground-dwelling 25.318444 40.03498 35.37027 44.89067
Kassina maculata Anura LC Ground-dwelling 24.361110 39.90746 35.27393 44.78868
Kassina maculata Anura LC Ground-dwelling 27.209229 40.28685 35.55277 45.17514
Kassina maculifer Anura LC Ground-dwelling 24.321629 39.97579 35.31653 44.69490
Kassina maculifer Anura LC Ground-dwelling 23.537691 39.87274 35.14765 44.52612
Kassina maculifer Anura LC Ground-dwelling 25.811537 40.17162 35.57227 45.01569
Kassina maculosa Anura LC Ground-dwelling 26.761119 40.28652 35.74533 44.69527
Kassina maculosa Anura LC Ground-dwelling 26.005787 40.18698 35.64631 44.59745
Kassina maculosa Anura LC Ground-dwelling 28.382604 40.50019 36.26571 45.25918
Kassina senegalensis Anura LC Ground-dwelling 25.105426 40.02600 35.93589 44.90641
Kassina senegalensis Anura LC Ground-dwelling 24.138885 39.89602 35.83873 44.83056
Kassina senegalensis Anura LC Ground-dwelling 27.106254 40.29507 35.70137 44.78007
Kassina mertensi Anura LC Ground-dwelling 26.304072 40.29188 35.29053 44.49597
Kassina mertensi Anura LC Ground-dwelling 25.650014 40.20305 35.25669 44.42669
Kassina mertensi Anura LC Ground-dwelling 27.885818 40.50671 35.58525 44.87059
Kassina schioetzi Anura LC Ground-dwelling 27.634408 40.31957 35.22059 44.85465
Kassina schioetzi Anura LC Ground-dwelling 26.933669 40.22681 35.22329 44.81670
Kassina schioetzi Anura LC Ground-dwelling 29.077077 40.51056 35.46235 45.23841
Kassina somalica Anura LC Ground-dwelling 24.059714 39.92138 35.54715 44.94297
Kassina somalica Anura LC Ground-dwelling 23.302803 39.81872 35.48342 44.79603
Kassina somalica Anura LC Ground-dwelling 25.535567 40.12156 35.55642 44.99820
Kassina wazae Anura DD Semi-aquatic 27.350742 40.54820 35.61432 45.39302
Kassina wazae Anura DD Semi-aquatic 26.457641 40.42868 35.83385 45.56517
Kassina wazae Anura DD Semi-aquatic 29.705655 40.86333 36.08879 45.97129
Phlyctimantis boulengeri Anura LC Arboreal 27.247730 40.14168 35.52880 45.12513
Phlyctimantis boulengeri Anura LC Arboreal 26.656960 40.06441 35.51394 45.05997
Phlyctimantis boulengeri Anura LC Arboreal 28.517440 40.30775 35.65238 45.31668
Phlyctimantis keithae Anura EN Arboreal 21.407079 39.36734 34.74970 44.33770
Phlyctimantis keithae Anura EN Arboreal 20.534143 39.25132 34.79948 44.39347
Phlyctimantis keithae Anura EN Arboreal 23.114784 39.59430 35.01352 44.54670
Phlyctimantis leonardi Anura LC Arboreal 27.686478 40.13172 36.07863 45.44784
Phlyctimantis leonardi Anura LC Arboreal 26.874847 40.02432 35.97955 45.33380
Phlyctimantis leonardi Anura LC Arboreal 29.423445 40.36157 35.96699 45.46534
Phlyctimantis verrucosus Anura LC Arboreal 25.832861 39.88616 35.37204 45.15476
Phlyctimantis verrucosus Anura LC Arboreal 25.150010 39.79471 35.30755 45.03475
Phlyctimantis verrucosus Anura LC Arboreal 27.442836 40.10176 35.49196 45.40034
Semnodactylus wealii Anura LC Ground-dwelling 21.394761 39.54681 34.79477 44.47059
Semnodactylus wealii Anura LC Ground-dwelling 20.013311 39.36137 34.55469 44.19232
Semnodactylus wealii Anura LC Ground-dwelling 23.697789 39.85595 34.92007 44.73351
Afrixalus aureus Anura LC Arboreal 24.324323 40.13185 35.33163 44.82090
Afrixalus aureus Anura LC Arboreal 23.210643 39.98295 35.38660 44.76306
Afrixalus aureus Anura LC Arboreal 26.352864 40.40307 35.54606 44.96530
Afrixalus clarkei Anura EN Arboreal 22.651964 39.95486 34.85146 44.30890
Afrixalus clarkei Anura EN Arboreal 21.745245 39.83552 34.76769 44.19696
Afrixalus clarkei Anura EN Arboreal 24.388079 40.18337 34.96640 44.41420
Afrixalus delicatus Anura LC Arboreal 24.953801 40.23933 35.55508 44.71981
Afrixalus delicatus Anura LC Arboreal 24.091863 40.12491 35.43110 44.60973
Afrixalus delicatus Anura LC Arboreal 26.689541 40.46974 35.80476 44.95281
Afrixalus stuhlmanni Anura LC Arboreal 24.756386 40.28507 34.91120 44.55947
Afrixalus stuhlmanni Anura LC Arboreal 24.056514 40.18895 34.82674 44.46685
Afrixalus stuhlmanni Anura LC Arboreal 26.310122 40.49846 35.17752 44.88858
Afrixalus dorsalis Anura LC Arboreal 27.415883 40.59518 35.92933 45.60833
Afrixalus dorsalis Anura LC Arboreal 26.732879 40.50441 35.82053 45.49217
Afrixalus dorsalis Anura LC Arboreal 28.859663 40.78706 36.20654 45.88383
Afrixalus paradorsalis Anura LC Arboreal 26.935515 40.48007 35.90382 45.47968
Afrixalus paradorsalis Anura LC Arboreal 26.245436 40.38783 35.80753 45.34281
Afrixalus paradorsalis Anura LC Arboreal 28.439988 40.68118 36.03955 45.65705
Afrixalus dorsimaculatus Anura EN Arboreal 24.969464 40.14633 35.45532 44.66090
Afrixalus dorsimaculatus Anura EN Arboreal 24.301742 40.05716 35.41615 44.59038
Afrixalus dorsimaculatus Anura EN Arboreal 25.986178 40.28211 35.86564 45.10497
Afrixalus enseticola Anura VU Arboreal 20.520457 39.63599 35.43128 44.46133
Afrixalus enseticola Anura VU Arboreal 19.636801 39.51721 35.09865 44.12484
Afrixalus enseticola Anura VU Arboreal 22.054137 39.84213 35.60120 44.63010
Afrixalus equatorialis Anura LC Arboreal 27.895451 40.64373 36.17665 45.32180
Afrixalus equatorialis Anura LC Arboreal 27.134742 40.54147 36.10423 45.24082
Afrixalus equatorialis Anura LC Arboreal 29.549605 40.86611 36.21960 45.45431
Afrixalus fornasini Anura LC Arboreal 25.012184 40.17946 35.61096 45.05270
Afrixalus fornasini Anura LC Arboreal 24.078857 40.05486 35.52617 44.91625
Afrixalus fornasini Anura LC Arboreal 26.851918 40.42507 35.77336 45.26256
Afrixalus fulvovittatus Anura LC Arboreal 27.410726 40.61368 36.40987 45.42173
Afrixalus fulvovittatus Anura LC Arboreal 26.675116 40.51342 36.28419 45.26608
Afrixalus fulvovittatus Anura LC Arboreal 28.992060 40.82921 36.70783 45.74745
Afrixalus knysnae Anura EN Arboreal 20.985171 39.69486 35.33119 44.59187
Afrixalus knysnae Anura EN Arboreal 19.358019 39.47589 35.23359 44.45591
Afrixalus knysnae Anura EN Arboreal 23.607267 40.04772 35.24800 44.46017
Afrixalus lacteus Anura EN Arboreal 26.406869 40.30427 35.74219 45.00292
Afrixalus lacteus Anura EN Arboreal 25.779143 40.21988 35.33857 44.59910
Afrixalus lacteus Anura EN Arboreal 27.748605 40.48466 35.67132 44.93110
Afrixalus laevis Anura LC Arboreal 26.924450 40.49379 35.89425 45.39960
Afrixalus laevis Anura LC Arboreal 26.219093 40.39893 35.82220 45.30928
Afrixalus laevis Anura LC Arboreal 28.512948 40.70740 35.73964 45.33982
Afrixalus leucostictus Anura LC Arboreal 26.356490 40.46860 35.43362 44.71686
Afrixalus leucostictus Anura LC Arboreal 25.696518 40.38127 35.45647 44.69070
Afrixalus leucostictus Anura LC Arboreal 27.981715 40.68365 35.86726 45.19040
Afrixalus lindholmi Anura DD Arboreal 27.472036 40.42895 35.55499 44.97436
Afrixalus lindholmi Anura DD Arboreal 26.789465 40.33808 35.68745 45.03757
Afrixalus lindholmi Anura DD Arboreal 28.902188 40.61934 35.85455 45.34581
Afrixalus morerei Anura VU Arboreal 22.756109 39.83213 35.30543 44.70019
Afrixalus morerei Anura VU Arboreal 21.965932 39.72988 35.20060 44.62930
Afrixalus morerei Anura VU Arboreal 24.573055 40.06725 35.48453 44.93623
Afrixalus nigeriensis Anura LC Arboreal 27.590114 40.58992 36.08714 45.20441
Afrixalus nigeriensis Anura LC Arboreal 26.974905 40.50837 35.94030 45.09648
Afrixalus nigeriensis Anura LC Arboreal 28.925279 40.76690 36.30719 45.46935
Afrixalus orophilus Anura LC Arboreal 22.870229 39.97369 35.00508 44.55363
Afrixalus orophilus Anura LC Arboreal 22.216784 39.88805 34.93734 44.43591
Afrixalus orophilus Anura LC Arboreal 24.281501 40.15865 34.95291 44.56971
Afrixalus osorioi Anura LC Arboreal 26.890802 40.54356 35.63593 45.12664
Afrixalus osorioi Anura LC Arboreal 26.086159 40.43661 35.46317 44.95518
Afrixalus osorioi Anura LC Arboreal 28.658126 40.77847 35.72939 45.29675
Afrixalus quadrivittatus Anura LC Arboreal 26.207737 40.41672 35.48554 45.06559
Afrixalus quadrivittatus Anura LC Arboreal 25.409794 40.31190 35.47661 45.01258
Afrixalus quadrivittatus Anura LC Arboreal 27.968308 40.64800 36.21681 45.93698
Afrixalus schneideri Anura DD Arboreal 26.939038 40.56349 36.14843 45.78307
Afrixalus schneideri Anura DD Arboreal 26.407567 40.49326 36.11323 45.75075
Afrixalus schneideri Anura DD Arboreal 28.227584 40.73377 36.34469 45.93066
Afrixalus septentrionalis Anura LC Arboreal 23.376981 40.12614 35.86302 44.74848
Afrixalus septentrionalis Anura LC Arboreal 22.638950 40.02711 35.74764 44.64759
Afrixalus septentrionalis Anura LC Arboreal 24.889815 40.32914 36.11915 45.00097
Afrixalus spinifrons Anura LC Arboreal 22.002189 39.78229 35.19302 44.80464
Afrixalus spinifrons Anura LC Arboreal 20.730213 39.61373 35.06070 44.56871
Afrixalus spinifrons Anura LC Arboreal 23.934886 40.03840 35.32605 44.98102
Afrixalus sylvaticus Anura VU Arboreal 25.292334 40.26932 35.07783 44.59315
Afrixalus sylvaticus Anura VU Arboreal 24.684023 40.18855 34.92936 44.42670
Afrixalus sylvaticus Anura VU Arboreal 26.300898 40.40324 35.20643 44.72384
Afrixalus uluguruensis Anura VU Arboreal 22.365889 39.86024 35.08077 43.96672
Afrixalus uluguruensis Anura VU Arboreal 21.575638 39.75563 34.97795 43.82232
Afrixalus uluguruensis Anura VU Arboreal 24.072422 40.08615 35.22811 44.28735
Afrixalus upembae Anura DD Arboreal 24.710512 40.09838 35.46779 45.04465
Afrixalus upembae Anura DD Arboreal 23.861793 39.98562 35.35582 44.89782
Afrixalus upembae Anura DD Arboreal 26.765922 40.37146 35.71011 45.41461
Afrixalus vibekensis Anura LC Arboreal 27.478518 40.59069 35.50155 45.32016
Afrixalus vibekensis Anura LC Arboreal 26.905442 40.51532 35.85366 45.62580
Afrixalus vibekensis Anura LC Arboreal 28.702806 40.75170 35.35070 45.21248
Afrixalus vittiger Anura LC Arboreal 27.579058 40.60644 36.14172 45.63447
Afrixalus vittiger Anura LC Arboreal 26.815992 40.50467 35.85695 45.36351
Afrixalus vittiger Anura LC Arboreal 29.271754 40.83219 36.28347 45.88248
Afrixalus weidholzi Anura LC Arboreal 27.293536 40.44615 35.64133 45.02106
Afrixalus weidholzi Anura LC Arboreal 26.490661 40.34098 35.49406 44.90292
Afrixalus weidholzi Anura LC Arboreal 29.098135 40.68255 35.73066 45.14358
Afrixalus wittei Anura LC Arboreal 24.088004 40.14410 35.24558 44.68080
Afrixalus wittei Anura LC Arboreal 23.175567 40.02406 35.35417 44.82690
Afrixalus wittei Anura LC Arboreal 26.144421 40.41466 35.56281 44.97779
Heterixalus alboguttatus Anura LC Arboreal 25.314844 40.21263 35.29657 44.82320
Heterixalus alboguttatus Anura LC Arboreal 24.458250 40.10054 35.41532 44.93822
Heterixalus alboguttatus Anura LC Arboreal 26.797722 40.40668 35.48098 44.99457
Heterixalus boettgeri Anura LC Arboreal 25.436102 40.24988 35.18291 44.54198
Heterixalus boettgeri Anura LC Arboreal 24.609226 40.14151 35.08770 44.44389
Heterixalus boettgeri Anura LC Arboreal 26.830675 40.43265 35.46643 44.80022
Heterixalus madagascariensis Anura LC Arboreal 25.807052 40.27060 35.23079 44.54949
Heterixalus madagascariensis Anura LC Arboreal 24.852044 40.14370 35.10422 44.43365
Heterixalus madagascariensis Anura LC Arboreal 27.292203 40.46794 35.46998 44.88555
Heterixalus punctatus Anura LC Arboreal 25.807052 40.28235 35.14501 44.64561
Heterixalus punctatus Anura LC Arboreal 24.852044 40.15450 34.85583 44.38378
Heterixalus punctatus Anura LC Arboreal 27.292203 40.48117 35.37008 44.90397
Heterixalus andrakata Anura LC Arboreal 26.039008 40.31067 35.40136 44.93015
Heterixalus andrakata Anura LC Arboreal 25.102259 40.18569 35.19382 44.60721
Heterixalus andrakata Anura LC Arboreal 27.586486 40.51713 35.13242 44.72722
Heterixalus tricolor Anura LC Arboreal 27.320578 40.41153 35.36632 44.61639
Heterixalus tricolor Anura LC Arboreal 26.205818 40.26519 35.12455 44.46161
Heterixalus tricolor Anura LC Arboreal 29.049002 40.63844 35.66362 44.99463
Heterixalus variabilis Anura LC Arboreal 26.916750 40.39418 35.49379 45.28712
Heterixalus variabilis Anura LC Arboreal 26.047153 40.27903 34.91168 44.68872
Heterixalus variabilis Anura LC Arboreal 28.377450 40.58760 35.70496 45.49427
Heterixalus betsileo Anura LC Arboreal 25.498544 40.14896 35.47702 45.16268
Heterixalus betsileo Anura LC Arboreal 24.618312 40.03290 35.35940 45.03644
Heterixalus betsileo Anura LC Arboreal 26.996274 40.34643 35.67716 45.37351
Heterixalus carbonei Anura LC Arboreal 26.840697 40.45017 36.16318 45.62674
Heterixalus carbonei Anura LC Arboreal 26.115189 40.35138 36.21485 45.67906
Heterixalus carbonei Anura LC Arboreal 28.279821 40.64613 36.41879 45.91846
Heterixalus luteostriatus Anura LC Arboreal 26.541627 40.40518 35.68998 44.97563
Heterixalus luteostriatus Anura LC Arboreal 25.720972 40.29321 35.60615 44.90823
Heterixalus luteostriatus Anura LC Arboreal 28.077293 40.61472 35.88625 45.25468
Heterixalus rutenbergi Anura LC Arboreal 25.519471 40.28345 35.64867 45.22877
Heterixalus rutenbergi Anura LC Arboreal 24.633226 40.16438 35.44312 44.97132
Heterixalus rutenbergi Anura LC Arboreal 27.049034 40.48896 35.76458 45.34883
Tachycnemis seychellensis Anura LC Arboreal 26.783332 40.42096 35.57342 45.61441
Tachycnemis seychellensis Anura LC Arboreal 26.200616 40.34282 35.62622 45.64899
Tachycnemis seychellensis Anura LC Arboreal 27.685753 40.54198 35.84888 45.96667
Alexteroon hypsiphonus Anura LC Stream-dwelling 27.224069 40.25375 35.92077 44.67713
Alexteroon hypsiphonus Anura LC Stream-dwelling 26.507033 40.15531 35.88397 44.60371
Alexteroon hypsiphonus Anura LC Stream-dwelling 28.798542 40.46991 35.93225 44.71240
Alexteroon jynx Anura CR Stream-dwelling 26.939038 40.15616 35.81592 44.84744
Alexteroon jynx Anura CR Stream-dwelling 26.407567 40.08382 35.59457 44.62072
Alexteroon jynx Anura CR Stream-dwelling 28.227584 40.33155 35.88138 44.98083
Alexteroon obstetricans Anura LC Stream-dwelling 27.016445 40.28852 35.69135 44.58869
Alexteroon obstetricans Anura LC Stream-dwelling 26.316797 40.19476 35.59368 44.52585
Alexteroon obstetricans Anura LC Stream-dwelling 28.549007 40.49390 35.72012 44.72633
Hyperolius acuticeps Anura LC Arboreal 23.235110 40.23562 35.92788 45.01366
Hyperolius acuticeps Anura LC Arboreal 22.297600 40.11348 35.79767 44.90640
Hyperolius acuticeps Anura LC Arboreal 25.197739 40.49133 35.90338 45.02627
Hyperolius howelli Anura LC Arboreal 21.280168 39.99775 35.75407 44.40328
Hyperolius howelli Anura LC Arboreal 20.375695 39.87776 36.15048 44.84489
Hyperolius howelli Anura LC Arboreal 23.103493 40.23964 35.83252 44.37023
Hyperolius friedemanni Anura DD Arboreal 22.853796 40.14610 35.65677 44.48087
Hyperolius friedemanni Anura DD Arboreal 21.901946 40.01890 35.54153 44.36764
Hyperolius friedemanni Anura DD Arboreal 24.663396 40.38790 35.78874 44.63509
Hyperolius adspersus Anura LC Arboreal 27.370081 40.76568 36.14871 45.44056
Hyperolius adspersus Anura LC Arboreal 26.594549 40.66212 36.01850 45.25821
Hyperolius adspersus Anura LC Arboreal 29.052849 40.99037 36.17377 45.52371
Hyperolius dartevellei Anura LC Arboreal 26.592862 40.68392 35.91884 45.00030
Hyperolius dartevellei Anura LC Arboreal 25.762928 40.57391 36.44290 45.52516
Hyperolius dartevellei Anura LC Arboreal 28.520378 40.93943 36.58673 45.80626
Hyperolius acutirostris Anura LC Arboreal 26.579066 40.60037 36.08966 44.99611
Hyperolius acutirostris Anura LC Arboreal 25.963018 40.51804 36.02127 44.90989
Hyperolius acutirostris Anura LC Arboreal 27.974417 40.78685 36.23094 45.21439
Hyperolius ademetzi Anura EN Arboreal 26.406869 40.66789 36.42457 44.86252
Hyperolius ademetzi Anura EN Arboreal 25.779143 40.58277 36.35958 44.78649
Hyperolius ademetzi Anura EN Arboreal 27.748605 40.84984 36.48264 45.01599
Hyperolius discodactylus Anura LC Arboreal 23.073654 40.12559 35.48046 43.98438
Hyperolius discodactylus Anura LC Arboreal 22.409303 40.03754 35.99356 44.44524
Hyperolius discodactylus Anura LC Arboreal 24.578369 40.32503 35.60617 44.13781
Hyperolius lateralis Anura LC Arboreal 23.330458 40.17645 35.65098 44.52591
Hyperolius lateralis Anura LC Arboreal 22.657968 40.08751 35.59822 44.44647
Hyperolius lateralis Anura LC Arboreal 24.895508 40.38344 36.04732 44.87830
Hyperolius nitidulus Anura LC Arboreal 27.303716 40.80119 35.81256 44.75432
Hyperolius nitidulus Anura LC Arboreal 26.486684 40.69106 35.72905 44.68475
Hyperolius nitidulus Anura LC Arboreal 29.177424 41.05376 36.68849 45.68670
Hyperolius tuberculatus Anura LC Arboreal 27.156022 40.74972 36.65528 45.50707
Hyperolius tuberculatus Anura LC Arboreal 26.417441 40.65187 36.62659 45.43619
Hyperolius tuberculatus Anura LC Arboreal 28.795839 40.96697 36.74739 45.69421
Hyperolius argus Anura LC Arboreal 25.393277 40.44354 35.78004 44.54368
Hyperolius argus Anura LC Arboreal 24.474530 40.32249 35.89469 44.59347
Hyperolius argus Anura LC Arboreal 27.183807 40.67945 36.08945 44.91648
Hyperolius atrigularis Anura DD Arboreal 23.112720 40.19972 35.92612 44.36108
Hyperolius atrigularis Anura DD Arboreal 22.355155 40.09970 35.84220 44.26272
Hyperolius atrigularis Anura DD Arboreal 24.623852 40.39923 36.06531 44.46647
Hyperolius balfouri Anura LC Arboreal 25.960324 40.53908 36.11633 44.78724
Hyperolius balfouri Anura LC Arboreal 25.148667 40.43227 36.04330 44.68754
Hyperolius balfouri Anura LC Arboreal 27.671878 40.76430 36.14804 44.94124
Hyperolius baumanni Anura LC Arboreal 28.323208 41.01445 37.09568 46.13486
Hyperolius baumanni Anura LC Arboreal 27.637246 40.92116 36.98099 45.97583
Hyperolius baumanni Anura LC Arboreal 29.712530 41.20338 37.28732 46.47137
Hyperolius sylvaticus Anura LC Arboreal 27.596293 40.93259 36.70357 45.36026
Hyperolius sylvaticus Anura LC Arboreal 27.009244 40.85425 36.64122 45.26361
Hyperolius sylvaticus Anura LC Arboreal 28.888822 41.10507 36.84086 45.57306
Hyperolius bobirensis Anura VU Arboreal 27.513427 40.88172 36.34231 45.15674
Hyperolius bobirensis Anura VU Arboreal 26.982304 40.81128 36.28603 45.04163
Hyperolius bobirensis Anura VU Arboreal 28.691591 41.03798 36.72953 45.55444
Hyperolius picturatus Anura LC Arboreal 27.442426 40.79348 36.60515 45.40611
Hyperolius picturatus Anura LC Arboreal 26.824772 40.71135 36.56755 45.32755
Hyperolius picturatus Anura LC Arboreal 28.765873 40.96946 36.45711 45.31037
Hyperolius benguellensis Anura LC Arboreal 24.173211 40.34373 36.10180 44.46865
Hyperolius benguellensis Anura LC Arboreal 23.102850 40.20147 36.05277 44.40117
Hyperolius benguellensis Anura LC Arboreal 26.393841 40.63888 36.18426 44.66375
Hyperolius nasutus Anura LC Arboreal 24.259589 40.39138 35.77616 44.07712
Hyperolius nasutus Anura LC Arboreal 23.070188 40.23305 35.74842 44.09199
Hyperolius nasutus Anura LC Arboreal 26.551382 40.69644 36.04947 44.43894
Hyperolius inyangae Anura VU Arboreal 23.500975 40.29599 35.74302 44.59227
Hyperolius inyangae Anura VU Arboreal 22.417011 40.15095 35.70431 44.52956
Hyperolius inyangae Anura VU Arboreal 25.821020 40.60641 36.11753 45.01718
Hyperolius bicolor Anura DD Arboreal 26.575552 40.57693 36.38034 45.00935
Hyperolius bicolor Anura DD Arboreal 25.491610 40.43276 36.33754 44.92009
Hyperolius bicolor Anura DD Arboreal 29.001640 40.89962 36.58930 45.42072
Hyperolius bolifambae Anura LC Arboreal 26.619858 40.70732 36.47623 45.22382
Hyperolius bolifambae Anura LC Arboreal 26.001845 40.62460 36.41262 45.18110
Hyperolius bolifambae Anura LC Arboreal 28.046435 40.89828 36.52658 45.32245
Hyperolius bopeleti Anura VU Arboreal 26.693191 40.76254 36.44183 45.20077
Hyperolius bopeleti Anura VU Arboreal 26.112566 40.68588 36.38097 45.10295
Hyperolius bopeleti Anura VU Arboreal 28.043157 40.94078 36.40408 45.22415
Hyperolius brachiofasciatus Anura DD Arboreal 26.886888 40.71650 36.74679 45.35786
Hyperolius brachiofasciatus Anura DD Arboreal 26.069609 40.60718 36.51756 45.09323
Hyperolius brachiofasciatus Anura DD Arboreal 28.456836 40.92651 36.67618 45.38561
Hyperolius camerunensis Anura LC Arboreal 26.265358 40.64272 36.43299 45.17271
Hyperolius camerunensis Anura LC Arboreal 25.590641 40.55176 36.29415 45.02021
Hyperolius camerunensis Anura LC Arboreal 27.673775 40.83261 36.59335 45.41017
Hyperolius castaneus Anura LC Arboreal 23.133186 40.29380 35.98810 44.66519
Hyperolius castaneus Anura LC Arboreal 22.491192 40.20829 35.88971 44.56803
Hyperolius castaneus Anura LC Arboreal 24.545490 40.48192 36.20761 44.98124
Hyperolius frontalis Anura LC Arboreal 23.484241 40.27948 36.08022 44.38266
Hyperolius frontalis Anura LC Arboreal 22.797965 40.18976 36.01095 44.30387
Hyperolius frontalis Anura LC Arboreal 25.119486 40.49325 36.28038 44.64290
Hyperolius cystocandicans Anura EN Arboreal 21.132444 39.92974 35.27292 44.09428
Hyperolius cystocandicans Anura EN Arboreal 20.271533 39.81500 35.59425 44.43520
Hyperolius cystocandicans Anura EN Arboreal 22.863109 40.16040 35.58362 44.43422
Hyperolius cinereus Anura LC Arboreal 23.623667 40.22319 36.10557 44.95638
Hyperolius cinereus Anura LC Arboreal 22.179172 40.03043 35.90673 44.73784
Hyperolius cinereus Anura LC Arboreal 25.989532 40.53890 36.30549 45.28089
Hyperolius chlorosteus Anura LC Arboreal 27.438537 40.73019 36.03897 45.34770
Hyperolius chlorosteus Anura LC Arboreal 26.788201 40.64506 35.92875 45.18121
Hyperolius chlorosteus Anura LC Arboreal 28.801411 40.90859 36.25912 45.61888
Hyperolius laurenti Anura NT Arboreal 27.731561 40.74219 35.62625 45.00559
Hyperolius laurenti Anura NT Arboreal 27.203725 40.67365 35.54673 44.92170
Hyperolius laurenti Anura NT Arboreal 28.925910 40.89728 35.80618 45.26044
Hyperolius torrentis Anura VU Arboreal 28.120253 40.77653 36.29885 44.84604
Hyperolius torrentis Anura VU Arboreal 27.396271 40.68077 36.23563 44.77874
Hyperolius torrentis Anura VU Arboreal 29.629225 40.97613 36.79541 45.44593
Hyperolius chrysogaster Anura NT Arboreal 23.519285 40.14791 35.83168 44.84325
Hyperolius chrysogaster Anura NT Arboreal 22.854186 40.05862 35.77279 44.74260
Hyperolius chrysogaster Anura NT Arboreal 25.112810 40.36184 36.08602 45.16197
Hyperolius cinnamomeoventris Anura LC Arboreal 26.238740 40.58472 36.89224 45.67685
Hyperolius cinnamomeoventris Anura LC Arboreal 25.412535 40.47220 36.89398 45.61271
Hyperolius cinnamomeoventris Anura LC Arboreal 28.082721 40.83587 37.02247 45.92405
Hyperolius veithi Anura LC Arboreal 28.076027 40.78744 36.35777 45.23798
Hyperolius veithi Anura LC Arboreal 27.394920 40.69620 36.26738 45.10175
Hyperolius veithi Anura LC Arboreal 29.718242 41.00744 36.60037 45.52159
Hyperolius molleri Anura LC Arboreal 27.058557 40.69353 36.07373 44.89058
Hyperolius molleri Anura LC Arboreal 26.510448 40.61966 36.01301 44.83564
Hyperolius molleri Anura LC Arboreal 27.987002 40.81867 36.12411 44.99860
Hyperolius thomensis Anura EN Arboreal 26.962622 40.65709 35.94354 45.11983
Hyperolius thomensis Anura EN Arboreal 26.447166 40.58803 35.98237 45.15849
Hyperolius thomensis Anura EN Arboreal 27.902257 40.78297 36.06977 45.23941
Hyperolius concolor Anura LC Arboreal 27.520611 40.73074 36.42945 44.88390
Hyperolius concolor Anura LC Arboreal 26.860852 40.64260 36.35117 44.78565
Hyperolius concolor Anura LC Arboreal 28.974535 40.92500 36.51332 45.03404
Hyperolius zonatus Anura LC Semi-aquatic 27.493724 41.10252 36.43827 45.76753
Hyperolius zonatus Anura LC Semi-aquatic 26.885429 41.02123 36.38979 45.69962
Hyperolius zonatus Anura LC Semi-aquatic 28.742693 41.26943 36.53782 45.90697
Hyperolius constellatus Anura VU Arboreal 23.526802 40.24743 35.90141 44.52317
Hyperolius constellatus Anura VU Arboreal 22.874684 40.16269 35.81424 44.39495
Hyperolius constellatus Anura VU Arboreal 25.094796 40.45119 36.11099 44.75495
Hyperolius diaphanus Anura DD Arboreal 24.594368 40.47828 35.75508 44.62779
Hyperolius diaphanus Anura DD Arboreal 23.900597 40.38473 35.76029 44.60608
Hyperolius diaphanus Anura DD Arboreal 26.464241 40.73041 35.92495 44.79543
Hyperolius dintelmanni Anura EN Arboreal 26.939038 40.77484 36.28782 45.21627
Hyperolius dintelmanni Anura EN Arboreal 26.407567 40.70475 36.43789 45.32434
Hyperolius dintelmanni Anura EN Arboreal 28.227584 40.94478 36.48145 45.46783
Hyperolius endjami Anura LC Arboreal 26.358872 40.56555 36.45355 44.78893
Hyperolius endjami Anura LC Arboreal 25.757240 40.48605 36.42813 44.67717
Hyperolius endjami Anura LC Arboreal 27.809207 40.75717 36.65326 45.06822
Hyperolius fasciatus Anura DD Arboreal 26.312193 40.64652 36.67864 45.12316
Hyperolius fasciatus Anura DD Arboreal 25.168396 40.49244 36.41722 44.81428
Hyperolius fasciatus Anura DD Arboreal 28.810506 40.98308 36.86440 45.46245
Hyperolius ferreirai Anura DD Arboreal 26.312193 40.68352 36.34916 44.95141
Hyperolius ferreirai Anura DD Arboreal 25.168396 40.53333 36.24034 44.79123
Hyperolius ferreirai Anura DD Arboreal 28.810506 41.01156 36.86555 45.49349
Hyperolius ferrugineus Anura DD Arboreal 24.936081 40.43506 36.43106 45.31076
Hyperolius ferrugineus Anura DD Arboreal 24.142280 40.32966 36.04127 44.90347
Hyperolius ferrugineus Anura DD Arboreal 26.756497 40.67677 36.62977 45.53971
Hyperolius fuscigula Anura DD Arboreal 25.858927 40.59318 36.85837 45.36184
Hyperolius fuscigula Anura DD Arboreal 24.717795 40.44051 36.47938 44.93637
Hyperolius fuscigula Anura DD Arboreal 28.328987 40.92364 37.00549 45.67828
Hyperolius fusciventris Anura LC Arboreal 27.477042 40.75331 36.12592 45.13074
Hyperolius fusciventris Anura LC Arboreal 26.840777 40.66753 36.05099 45.03187
Hyperolius fusciventris Anura LC Arboreal 28.865762 40.94054 36.23432 45.33601
Hyperolius guttulatus Anura LC Arboreal 27.487790 40.70556 36.37045 45.60014
Hyperolius guttulatus Anura LC Arboreal 26.844795 40.61986 36.04655 45.23293
Hyperolius guttulatus Anura LC Arboreal 28.879429 40.89102 36.47939 45.71804
Hyperolius ghesquieri Anura DD Arboreal 28.083849 40.80296 36.03018 45.06530
Hyperolius ghesquieri Anura DD Arboreal 27.281501 40.69647 35.96959 44.92846
Hyperolius ghesquieri Anura DD Arboreal 29.655091 41.01150 36.13082 45.24704
Hyperolius glandicolor Anura LC Arboreal 23.189440 40.15209 35.84229 44.43234
Hyperolius glandicolor Anura LC Arboreal 22.406469 40.04895 35.76550 44.36129
Hyperolius glandicolor Anura LC Arboreal 24.856414 40.37169 35.96051 44.54508
Hyperolius phantasticus Anura LC Arboreal 27.675117 40.76935 36.55653 45.51974
Hyperolius phantasticus Anura LC Arboreal 26.914250 40.66718 36.44529 45.41833
Hyperolius phantasticus Anura LC Arboreal 29.337238 40.99255 36.91866 46.04945
Hyperolius gularis Anura DD Arboreal 26.873119 40.69054 36.48706 45.30964
Hyperolius gularis Anura DD Arboreal 25.742142 40.53974 36.26437 45.10211
Hyperolius gularis Anura DD Arboreal 29.286375 41.01231 36.78883 45.62357
Hyperolius horstockii Anura LC Arboreal 20.653426 39.72137 35.86561 44.76471
Hyperolius horstockii Anura LC Arboreal 19.213302 39.52868 35.60072 44.49930
Hyperolius horstockii Anura LC Arboreal 23.156558 40.05630 35.71635 44.75078
Hyperolius hutsebauti Anura LC Arboreal 26.078060 40.67723 36.43296 45.02044
Hyperolius hutsebauti Anura LC Arboreal 25.399436 40.58660 36.35061 44.93432
Hyperolius hutsebauti Anura LC Arboreal 27.651365 40.88736 36.64678 45.29793
Hyperolius igbettensis Anura LC Arboreal 27.355103 40.64069 36.27628 45.21941
Hyperolius igbettensis Anura LC Arboreal 26.644597 40.54690 36.17153 45.10794
Hyperolius igbettensis Anura LC Arboreal 28.982974 40.85560 36.45123 45.38006
Hyperolius jacobseni Anura DD Arboreal 27.361917 40.65345 36.14993 45.42526
Hyperolius jacobseni Anura DD Arboreal 26.510324 40.54000 36.14898 45.35941
Hyperolius jacobseni Anura DD Arboreal 29.066751 40.88057 36.33978 45.60566
Hyperolius poweri Anura LC Arboreal 22.904700 40.06297 35.82782 44.57256
Hyperolius poweri Anura LC Arboreal 21.758907 39.90921 35.73045 44.43234
Hyperolius poweri Anura LC Arboreal 24.722131 40.30686 36.28205 45.06349
Hyperolius inornatus Anura DD Arboreal 27.976925 40.85934 36.31064 45.12588
Hyperolius inornatus Anura DD Arboreal 26.996749 40.72774 36.14674 44.93393
Hyperolius inornatus Anura DD Arboreal 30.102839 41.14474 36.54507 45.43053
Hyperolius jackie Anura DD Arboreal 21.747229 40.02946 35.98475 44.37398
Hyperolius jackie Anura DD Arboreal 21.135373 39.94942 35.91521 44.25507
Hyperolius jackie Anura DD Arboreal 22.883913 40.17815 36.13432 44.58092
Hyperolius kachalolae Anura LC Arboreal 23.908592 40.24265 35.85859 44.30596
Hyperolius kachalolae Anura LC Arboreal 22.960010 40.11857 35.76050 44.18484
Hyperolius kachalolae Anura LC Arboreal 26.056325 40.52359 36.07043 44.70634
Hyperolius kibarae Anura DD Arboreal 24.674386 40.50614 35.95083 45.03890
Hyperolius kibarae Anura DD Arboreal 23.823188 40.39264 35.81729 44.88281
Hyperolius kibarae Anura DD Arboreal 26.719807 40.77887 35.86644 45.21320
Hyperolius kihangensis Anura EN Arboreal 21.407079 39.95632 35.43812 44.27081
Hyperolius kihangensis Anura EN Arboreal 20.534143 39.83974 35.30777 44.18541
Hyperolius kihangensis Anura EN Arboreal 23.114784 40.18439 35.67678 44.48527
Hyperolius kivuensis Anura LC Arboreal 23.839394 40.27188 36.49991 44.83670
Hyperolius kivuensis Anura LC Arboreal 22.958956 40.15541 36.36188 44.69105
Hyperolius kivuensis Anura LC Arboreal 25.801814 40.53148 36.59735 44.90512
Hyperolius quinquevittatus Anura LC Arboreal 24.149719 40.37181 36.00081 44.76480
Hyperolius quinquevittatus Anura LC Arboreal 23.219015 40.24732 35.78819 44.54623
Hyperolius quinquevittatus Anura LC Arboreal 26.277833 40.65645 36.19311 45.06687
Hyperolius kuligae Anura LC Arboreal 26.145058 40.59106 35.85924 44.65013
Hyperolius kuligae Anura LC Arboreal 25.449228 40.49660 35.78094 44.53924
Hyperolius kuligae Anura LC Arboreal 27.681912 40.79968 36.03218 44.89506
Hyperolius lamottei Anura LC Arboreal 27.249632 40.69643 36.27537 45.35091
Hyperolius lamottei Anura LC Arboreal 26.450517 40.59007 36.19366 45.21173
Hyperolius lamottei Anura LC Arboreal 28.997233 40.92904 36.45257 45.60200
Hyperolius langi Anura LC Arboreal 25.072367 40.39556 35.25176 44.46180
Hyperolius langi Anura LC Arboreal 24.364753 40.30238 35.15010 44.38116
Hyperolius langi Anura LC Arboreal 26.589204 40.59529 35.46021 44.73789
Hyperolius leleupi Anura EN Arboreal 23.604962 40.27186 36.09002 44.59015
Hyperolius leleupi Anura EN Arboreal 22.907547 40.17941 36.08954 44.52517
Hyperolius leleupi Anura EN Arboreal 25.322709 40.49956 36.35959 44.95012
Hyperolius leucotaenius Anura EN Arboreal 24.124201 40.36670 35.66742 44.64569
Hyperolius leucotaenius Anura EN Arboreal 23.451480 40.27591 35.59089 44.50452
Hyperolius leucotaenius Anura EN Arboreal 25.814791 40.59486 36.03432 45.02328
Hyperolius lupiroensis Anura DD Arboreal 23.483256 40.17410 35.52525 44.34891
Hyperolius lupiroensis Anura DD Arboreal 22.779398 40.08232 35.44138 44.26021
Hyperolius lupiroensis Anura DD Arboreal 24.996018 40.37134 35.70105 44.45683
Hyperolius major Anura LC Arboreal 24.333573 40.42833 36.09572 44.46835
Hyperolius major Anura LC Arboreal 23.487005 40.31623 35.85251 44.21004
Hyperolius major Anura LC Arboreal 26.450609 40.70867 36.34151 44.70648
Hyperolius marginatus Anura LC Arboreal 24.330379 40.28857 35.92882 44.30647
Hyperolius marginatus Anura LC Arboreal 23.399575 40.16542 35.84498 44.20899
Hyperolius marginatus Anura LC Arboreal 26.358460 40.55688 36.09743 44.60341
Hyperolius mariae Anura LC Arboreal 24.748637 40.33311 35.71936 44.68463
Hyperolius mariae Anura LC Arboreal 24.058582 40.24152 35.67270 44.64837
Hyperolius mariae Anura LC Arboreal 26.103598 40.51294 35.93340 44.95960
Hyperolius minutissimus Anura VU Arboreal 22.366666 40.10351 35.62632 44.12128
Hyperolius minutissimus Anura VU Arboreal 21.563064 39.99666 35.47949 43.95125
Hyperolius minutissimus Anura VU Arboreal 24.127799 40.33767 35.96154 44.52351
Hyperolius spinigularis Anura VU Arboreal 25.580488 40.52728 36.19015 44.79427
Hyperolius spinigularis Anura VU Arboreal 24.461692 40.37631 36.05722 44.59729
Hyperolius spinigularis Anura VU Arboreal 27.657782 40.80760 36.74508 45.41950
Hyperolius tanneri Anura CR Arboreal 24.950210 40.53737 36.58049 45.29536
Hyperolius tanneri Anura CR Arboreal 24.330970 40.45494 36.52614 45.23684
Hyperolius tanneri Anura CR Arboreal 25.991640 40.67602 36.61281 45.37969
Hyperolius mitchelli Anura LC Arboreal 25.014349 40.63160 35.89471 44.81540
Hyperolius mitchelli Anura LC Arboreal 24.137059 40.51124 35.85647 44.77627
Hyperolius mitchelli Anura LC Arboreal 26.861956 40.88508 36.40557 45.28146
Hyperolius puncticulatus Anura EN Arboreal 25.471053 40.58610 36.14237 44.85257
Hyperolius puncticulatus Anura EN Arboreal 24.878106 40.50607 36.00574 44.70243
Hyperolius puncticulatus Anura EN Arboreal 26.478129 40.72204 36.26706 45.00307
Hyperolius substriatus Anura LC Arboreal 24.514467 40.46646 36.19571 44.71978
Hyperolius substriatus Anura LC Arboreal 23.660410 40.35209 36.12486 44.59705
Hyperolius substriatus Anura LC Arboreal 26.318080 40.70799 36.45362 45.03849
Hyperolius montanus Anura LC Arboreal 20.892307 39.89793 35.67257 44.14692
Hyperolius montanus Anura LC Arboreal 20.016665 39.78012 35.57834 44.09927
Hyperolius montanus Anura LC Arboreal 22.625380 40.13109 35.91067 44.39720
Hyperolius mosaicus Anura LC Arboreal 26.754771 40.72302 36.16143 45.08219
Hyperolius mosaicus Anura LC Arboreal 26.094654 40.63479 36.13110 45.03457
Hyperolius mosaicus Anura LC Arboreal 28.254214 40.92341 36.21650 45.18238
Hyperolius ocellatus Anura LC Arboreal 27.141267 40.85628 36.66695 45.09428
Hyperolius ocellatus Anura LC Arboreal 26.395825 40.75648 36.55672 45.00065
Hyperolius ocellatus Anura LC Arboreal 28.790080 41.07704 36.88453 45.42707
Hyperolius nasicus Anura LC Arboreal 23.794759 40.24690 35.75634 44.68236
Hyperolius nasicus Anura LC Arboreal 22.826155 40.11795 35.60852 44.52339
Hyperolius nasicus Anura LC Arboreal 25.911978 40.52877 35.77418 44.79728
Hyperolius nienokouensis Anura EN Arboreal 27.473684 40.79374 36.81197 45.48448
Hyperolius nienokouensis Anura EN Arboreal 26.952467 40.72377 36.74997 45.40687
Hyperolius nienokouensis Anura EN Arboreal 28.551760 40.93848 36.94019 45.65523
Hyperolius nimbae Anura EN Arboreal 27.417573 40.75727 36.57231 45.29289
Hyperolius nimbae Anura EN Arboreal 26.699780 40.66102 36.40048 45.05092
Hyperolius nimbae Anura EN Arboreal 28.789297 40.94119 36.69597 45.46408
Hyperolius obscurus Anura DD Arboreal 25.258929 40.58746 36.08904 44.96606
Hyperolius obscurus Anura DD Arboreal 24.386335 40.46933 36.15392 45.00696
Hyperolius obscurus Anura DD Arboreal 27.452886 40.88447 36.70567 45.71279
Hyperolius occidentalis Anura LC Arboreal 27.133686 40.71626 36.27671 44.78089
Hyperolius occidentalis Anura LC Arboreal 26.358942 40.61340 36.31801 44.83989
Hyperolius occidentalis Anura LC Arboreal 28.758312 40.93195 36.60649 45.13123
Hyperolius parallelus Anura LC Arboreal 25.250967 40.42722 36.35538 45.16993
Hyperolius parallelus Anura LC Arboreal 24.192116 40.28761 36.26238 45.02320
Hyperolius parallelus Anura LC Arboreal 27.438888 40.71569 36.52959 45.41241
Hyperolius pardalis Anura LC Arboreal 27.048199 40.62472 36.19218 45.04119
Hyperolius pardalis Anura LC Arboreal 26.347821 40.53304 36.05582 44.84802
Hyperolius pardalis Anura LC Arboreal 28.580140 40.82526 36.22384 45.10338
Hyperolius parkeri Anura LC Arboreal 25.716492 40.48261 36.74223 45.13899
Hyperolius parkeri Anura LC Arboreal 24.949872 40.37866 36.69618 45.04358
Hyperolius parkeri Anura LC Arboreal 27.326049 40.70087 36.59252 45.05359
Hyperolius pickersgilli Anura EN Arboreal 22.733181 40.06677 35.84560 44.55913
Hyperolius pickersgilli Anura EN Arboreal 21.564977 39.91128 35.66373 44.41147
Hyperolius pickersgilli Anura EN Arboreal 24.526486 40.30546 36.12188 44.78819
Hyperolius pictus Anura LC Arboreal 22.228748 40.12985 35.90221 44.56832
Hyperolius pictus Anura LC Arboreal 21.390572 40.01776 35.85067 44.49158
Hyperolius pictus Anura LC Arboreal 23.804185 40.34053 36.13667 44.88272
Hyperolius platyceps Anura LC Arboreal 27.368916 40.77353 36.14101 45.77775
Hyperolius platyceps Anura LC Arboreal 26.548648 40.66266 36.02857 45.64784
Hyperolius platyceps Anura LC Arboreal 29.178262 41.01807 36.40838 46.13689
Hyperolius polli Anura DD Arboreal 27.663703 40.84993 36.28714 45.07879
Hyperolius polli Anura DD Arboreal 26.879375 40.74429 36.17613 44.92091
Hyperolius polli Anura DD Arboreal 29.314225 41.07222 36.59050 45.41449
Hyperolius polystictus Anura VU Arboreal 23.997463 40.36047 35.88894 44.77371
Hyperolius polystictus Anura VU Arboreal 23.106229 40.24063 35.70956 44.58336
Hyperolius polystictus Anura VU Arboreal 26.210753 40.65808 36.12543 45.05717
Hyperolius pseudargus Anura LC Arboreal 22.428292 40.00146 35.38732 44.18708
Hyperolius pseudargus Anura LC Arboreal 21.620325 39.89480 35.36879 44.17212
Hyperolius pseudargus Anura LC Arboreal 24.106198 40.22296 35.76611 44.59300
Hyperolius pusillus Anura LC Arboreal 24.885057 40.32592 35.91100 45.05524
Hyperolius pusillus Anura LC Arboreal 23.904941 40.19498 35.75622 44.86945
Hyperolius pusillus Anura LC Arboreal 26.707592 40.56941 36.03086 45.23661
Hyperolius pustulifer Anura DD Arboreal 21.747229 40.00513 35.55554 44.29176
Hyperolius pustulifer Anura DD Arboreal 21.135373 39.92329 35.51677 44.18814
Hyperolius pustulifer Anura DD Arboreal 22.883913 40.15716 35.70987 44.50561
Hyperolius pyrrhodictyon Anura LC Arboreal 24.130655 40.25689 35.82877 44.34159
Hyperolius pyrrhodictyon Anura LC Arboreal 22.970147 40.10401 35.92878 44.38070
Hyperolius pyrrhodictyon Anura LC Arboreal 26.216976 40.53175 36.00855 44.63303
Hyperolius quadratomaculatus Anura DD Arboreal 26.050056 40.60263 36.65197 45.03155
Hyperolius quadratomaculatus Anura DD Arboreal 25.337464 40.50754 36.54749 44.92075
Hyperolius quadratomaculatus Anura DD Arboreal 27.838797 40.84134 36.53568 45.04435
Hyperolius rhizophilus Anura DD Arboreal 28.540974 40.90019 36.30644 45.25730
Hyperolius rhizophilus Anura DD Arboreal 27.543779 40.76888 36.19501 45.09209
Hyperolius rhizophilus Anura DD Arboreal 30.702213 41.18478 36.53239 45.56704
Hyperolius rhodesianus Anura LC Arboreal 24.071884 40.22645 35.85298 44.64838
Hyperolius rhodesianus Anura LC Arboreal 22.771063 40.05309 35.84336 44.64135
Hyperolius rhodesianus Anura LC Arboreal 26.140437 40.50212 36.30638 45.18309
Hyperolius riggenbachi Anura LC Arboreal 26.104227 40.54059 36.32499 45.06603
Hyperolius riggenbachi Anura LC Arboreal 25.359743 40.44190 36.26364 44.97919
Hyperolius riggenbachi Anura LC Arboreal 27.643991 40.74470 35.92223 44.74366
Hyperolius robustus Anura DD Arboreal 27.996953 40.92399 36.39463 45.37313
Hyperolius robustus Anura DD Arboreal 27.254434 40.82523 36.32822 45.25750
Hyperolius robustus Anura DD Arboreal 29.778122 41.16089 36.55047 45.60182
Hyperolius rubrovermiculatus Anura EN Arboreal 25.321092 40.39520 35.93843 44.42474
Hyperolius rubrovermiculatus Anura EN Arboreal 24.755532 40.32048 35.89136 44.36170
Hyperolius rubrovermiculatus Anura EN Arboreal 26.333056 40.52891 36.06400 44.56561
Hyperolius rwandae Anura LC Arboreal 22.081561 40.09148 35.73666 44.28852
Hyperolius rwandae Anura LC Arboreal 21.443820 40.00650 35.65036 44.15852
Hyperolius rwandae Anura LC Arboreal 23.477003 40.27743 35.79192 44.44412
Hyperolius sankuruensis Anura DD Arboreal 27.695253 40.86728 36.44952 45.38845
Hyperolius sankuruensis Anura DD Arboreal 26.880058 40.75896 36.30943 45.21528
Hyperolius sankuruensis Anura DD Arboreal 29.738443 41.13879 36.52102 45.57875
Hyperolius schoutedeni Anura LC Arboreal 27.306234 40.82609 36.74363 45.62415
Hyperolius schoutedeni Anura LC Arboreal 26.550510 40.72479 36.63707 45.47914
Hyperolius schoutedeni Anura LC Arboreal 28.932660 41.04409 36.97295 45.93338
Hyperolius semidiscus Anura LC Arboreal 22.172167 40.09613 35.37649 44.10458
Hyperolius semidiscus Anura LC Arboreal 20.881804 39.92262 35.22963 43.93897
Hyperolius semidiscus Anura LC Arboreal 24.279850 40.37954 35.66114 44.45826
Hyperolius sheldricki Anura DD Arboreal 24.694735 40.39933 35.69907 44.69629
Hyperolius sheldricki Anura DD Arboreal 24.081602 40.31780 35.60054 44.60476
Hyperolius sheldricki Anura DD Arboreal 25.763962 40.54150 36.16649 45.13920
Hyperolius soror Anura LC Arboreal 27.444949 40.70770 35.79609 44.72577
Hyperolius soror Anura LC Arboreal 26.776927 40.62028 35.69094 44.56226
Hyperolius soror Anura LC Arboreal 28.875840 40.89494 35.89908 44.86933
Hyperolius steindachneri Anura LC Arboreal 24.796433 40.41398 36.27281 44.65874
Hyperolius steindachneri Anura LC Arboreal 23.908881 40.29500 36.16193 44.50749
Hyperolius steindachneri Anura LC Arboreal 26.919026 40.69851 36.48468 44.95181
Hyperolius stenodactylus Anura DD Arboreal 26.635901 40.69245 36.49231 45.24118
Hyperolius stenodactylus Anura DD Arboreal 26.092921 40.62046 35.98564 44.68474
Hyperolius stenodactylus Anura DD Arboreal 28.090018 40.88524 36.66090 45.48591
Hyperolius swynnertoni Anura LC Arboreal 24.933537 40.55708 36.36222 44.99983
Hyperolius swynnertoni Anura LC Arboreal 23.869338 40.41432 36.10499 44.81456
Hyperolius swynnertoni Anura LC Arboreal 27.121340 40.85056 36.65543 45.27503
Hyperolius vilhenai Anura DD Arboreal 25.406932 40.66313 36.28580 45.02471
Hyperolius vilhenai Anura DD Arboreal 24.563333 40.54812 36.22488 44.96082
Hyperolius vilhenai Anura DD Arboreal 27.505971 40.94929 36.77123 45.61185
Hyperolius viridigulosus Anura NT Arboreal 27.372762 40.76683 36.75646 45.46778
Hyperolius viridigulosus Anura NT Arboreal 26.864035 40.69962 36.72172 45.37782
Hyperolius viridigulosus Anura NT Arboreal 28.435902 40.90729 36.80453 45.57987
Hyperolius viridis Anura LC Arboreal 22.366758 40.14366 35.72935 44.42667
Hyperolius viridis Anura LC Arboreal 21.457840 40.02264 35.21209 43.90549
Hyperolius viridis Anura LC Arboreal 24.096419 40.37396 36.05602 44.81077
Hyperolius watsonae Anura CR Arboreal 25.321092 40.56211 36.23804 45.45414
Hyperolius watsonae Anura CR Arboreal 24.755532 40.48550 36.19794 45.41074
Hyperolius watsonae Anura CR Arboreal 26.333056 40.69918 36.45754 45.71365
Hyperolius xenorhinus Anura DD Arboreal 24.942060 40.48169 36.36717 44.96883
Hyperolius xenorhinus Anura DD Arboreal 24.161731 40.37796 36.17457 44.71158
Hyperolius xenorhinus Anura DD Arboreal 26.688954 40.71388 36.65536 45.22706
Kassinula wittei Anura LC Arboreal 23.809444 40.21767 36.04985 44.55769
Kassinula wittei Anura LC Arboreal 22.910718 40.09767 35.97606 44.49107
Kassinula wittei Anura LC Arboreal 25.915219 40.49882 36.06940 44.66827
Morerella cyanophthalma Anura VU Stream-dwelling 27.193219 40.17923 35.93925 45.06595
Morerella cyanophthalma Anura VU Stream-dwelling 26.723565 40.11627 35.89894 44.98258
Morerella cyanophthalma Anura VU Stream-dwelling 28.101430 40.30099 35.99050 45.13564
Arlequinus krebsi Anura EN Arboreal 26.208443 40.40088 35.86622 45.23735
Arlequinus krebsi Anura EN Arboreal 25.536956 40.31035 35.70161 45.05079
Arlequinus krebsi Anura EN Arboreal 27.567404 40.58410 36.04374 45.46975
Callixalus pictus Anura VU Arboreal 23.889645 40.06392 35.86929 44.63159
Callixalus pictus Anura VU Arboreal 23.226776 39.97603 35.77476 44.57005
Callixalus pictus Anura VU Arboreal 25.505338 40.27816 36.06771 44.87414
Chrysobatrachus cupreonitens Anura EN Ground-dwelling 24.320764 40.26362 35.46874 44.96331
Chrysobatrachus cupreonitens Anura EN Ground-dwelling 23.579763 40.16515 35.38491 44.82789
Chrysobatrachus cupreonitens Anura EN Ground-dwelling 26.380765 40.53739 35.99706 45.65413
Opisthothylax immaculatus Anura LC Arboreal 27.342157 40.53699 35.63952 44.88009
Opisthothylax immaculatus Anura LC Arboreal 26.595807 40.43634 35.63040 44.78665
Opisthothylax immaculatus Anura LC Arboreal 28.955665 40.75458 35.89443 45.29492
Paracassina kounhiensis Anura VU Arboreal 20.156993 39.49836 35.09679 44.11579
Paracassina kounhiensis Anura VU Arboreal 19.347405 39.39253 34.90337 43.94459
Paracassina kounhiensis Anura VU Arboreal 21.587441 39.68533 35.10061 44.09160
Paracassina obscura Anura LC Arboreal 21.559205 39.75708 35.05283 44.05595
Paracassina obscura Anura LC Arboreal 20.716299 39.64313 35.12272 44.10916
Paracassina obscura Anura LC Arboreal 23.287211 39.99069 35.24350 44.24372
Cryptothylax greshoffii Anura LC Arboreal 27.689937 39.74982 34.73189 45.07568
Cryptothylax greshoffii Anura LC Arboreal 26.897361 39.64187 34.74583 45.07062
Cryptothylax greshoffii Anura LC Arboreal 29.425200 39.98616 34.93444 45.36898
Cryptothylax minutus Anura DD Arboreal 28.077285 39.83314 34.64996 45.35227
Cryptothylax minutus Anura DD Arboreal 27.322300 39.73158 34.56148 45.23192
Cryptothylax minutus Anura DD Arboreal 29.696265 40.05093 35.00943 45.75644
Arthroleptis adelphus Anura LC Ground-dwelling 27.024086 39.10245 33.26474 44.15936
Arthroleptis adelphus Anura LC Ground-dwelling 26.327656 39.00820 33.15480 44.03420
Arthroleptis adelphus Anura LC Ground-dwelling 28.541919 39.30787 33.39055 44.31786
Arthroleptis bioko Anura EN Ground-dwelling 26.217367 38.98265 33.47824 44.28401
Arthroleptis bioko Anura EN Ground-dwelling 25.707002 38.91488 33.81267 44.56227
Arthroleptis bioko Anura EN Ground-dwelling 27.240774 39.11854 33.64672 44.50407
Arthroleptis brevipes Anura DD Ground-dwelling 28.309546 39.24305 34.44063 45.04398
Arthroleptis brevipes Anura DD Ground-dwelling 27.666869 39.15636 34.08288 44.69700
Arthroleptis brevipes Anura DD Ground-dwelling 29.617524 39.41948 34.58150 45.16613
Arthroleptis poecilonotus Anura LC Ground-dwelling 27.224396 39.10881 33.76202 45.51462
Arthroleptis poecilonotus Anura LC Ground-dwelling 26.474221 39.00780 33.67011 45.35484
Arthroleptis poecilonotus Anura LC Ground-dwelling 28.855439 39.32843 33.79538 45.59734
Arthroleptis crusculum Anura NT Ground-dwelling 27.345886 39.03322 33.57455 44.38733
Arthroleptis crusculum Anura NT Ground-dwelling 26.526667 38.92299 33.50698 44.27479
Arthroleptis crusculum Anura NT Ground-dwelling 29.206861 39.28363 33.68011 44.57618
Arthroleptis nimbaensis Anura DD Ground-dwelling 27.417573 39.07270 33.19499 44.21565
Arthroleptis nimbaensis Anura DD Ground-dwelling 26.699780 38.97590 33.14791 44.18053
Arthroleptis nimbaensis Anura DD Ground-dwelling 28.789297 39.25769 33.52840 44.57260
Arthroleptis langeri Anura EN Ground-dwelling 27.346209 39.06651 33.56235 44.27418
Arthroleptis langeri Anura EN Ground-dwelling 26.738029 38.98427 33.50386 44.26323
Arthroleptis langeri Anura EN Ground-dwelling 28.528471 39.22639 33.79667 44.51534
Arthroleptis adolfifriederici Anura LC Ground-dwelling 22.261274 38.41521 33.02638 44.01471
Arthroleptis adolfifriederici Anura LC Ground-dwelling 21.582470 38.32506 33.06538 44.12451
Arthroleptis adolfifriederici Anura LC Ground-dwelling 23.819761 38.62218 33.22498 44.10039
Arthroleptis krokosua Anura CR Ground-dwelling 27.569557 39.12686 33.56345 44.67331
Arthroleptis krokosua Anura CR Ground-dwelling 26.904379 39.03720 33.52954 44.56472
Arthroleptis krokosua Anura CR Ground-dwelling 29.008240 39.32078 33.95614 45.15948
Arthroleptis palava Anura LC Ground-dwelling 26.251583 38.98862 33.66698 44.33546
Arthroleptis palava Anura LC Ground-dwelling 25.530438 38.89216 33.74437 44.40487
Arthroleptis palava Anura LC Ground-dwelling 27.776078 39.19255 33.79636 44.51363
Arthroleptis variabilis Anura LC Ground-dwelling 27.224462 39.07053 33.72169 44.55565
Arthroleptis variabilis Anura LC Ground-dwelling 26.489320 38.97178 33.54785 44.38959
Arthroleptis variabilis Anura LC Ground-dwelling 28.804222 39.28273 34.10154 45.03224
Arthroleptis perreti Anura EN Ground-dwelling 26.871381 39.07085 34.01212 45.05435
Arthroleptis perreti Anura EN Ground-dwelling 26.335541 38.99803 33.97607 44.97979
Arthroleptis perreti Anura EN Ground-dwelling 28.169295 39.24724 34.21952 45.34701
Arthroleptis affinis Anura LC Ground-dwelling 23.286124 38.66315 33.47070 44.56943
Arthroleptis affinis Anura LC Ground-dwelling 22.539856 38.56439 33.46160 44.52917
Arthroleptis affinis Anura LC Ground-dwelling 24.866494 38.87231 33.61712 44.64961
Arthroleptis nikeae Anura CR Ground-dwelling 22.724429 38.52365 33.11129 44.16753
Arthroleptis nikeae Anura CR Ground-dwelling 21.858574 38.40656 32.98938 44.00184
Arthroleptis nikeae Anura CR Ground-dwelling 24.911424 38.81940 33.40620 44.48179
Arthroleptis reichei Anura LC Ground-dwelling 22.597699 38.43791 32.77363 43.30154
Arthroleptis reichei Anura LC Ground-dwelling 21.811456 38.33432 32.69859 43.15534
Arthroleptis reichei Anura LC Ground-dwelling 24.217568 38.65134 33.12236 43.72174
Arthroleptis anotis Anura DD Ground-dwelling 23.282669 38.59818 33.71337 44.29865
Arthroleptis anotis Anura DD Ground-dwelling 22.540368 38.49682 33.60581 44.19804
Arthroleptis anotis Anura DD Ground-dwelling 24.824741 38.80874 34.01242 44.61622
Arthroleptis aureoli Anura NT Stream-dwelling 27.218440 38.34338 32.79733 44.06495
Arthroleptis aureoli Anura NT Stream-dwelling 26.351647 38.22475 32.68944 43.92163
Arthroleptis aureoli Anura NT Stream-dwelling 29.232567 38.61901 33.00571 44.35235
Arthroleptis formosus Anura DD Ground-dwelling 27.528684 38.92186 33.63512 44.34874
Arthroleptis formosus Anura DD Ground-dwelling 26.539829 38.78868 33.61632 44.32879
Arthroleptis formosus Anura DD Ground-dwelling 29.995306 39.25408 34.21750 44.97290
Arthroleptis sylvaticus Anura LC Ground-dwelling 27.267277 39.16353 33.68156 44.89341
Arthroleptis sylvaticus Anura LC Ground-dwelling 26.526794 39.06165 33.42420 44.63180
Arthroleptis sylvaticus Anura LC Ground-dwelling 28.878855 39.38525 33.80459 45.02860
Arthroleptis taeniatus Anura LC Ground-dwelling 27.210066 38.98151 33.79042 44.70040
Arthroleptis taeniatus Anura LC Ground-dwelling 26.467416 38.88338 33.70189 44.56957
Arthroleptis taeniatus Anura LC Ground-dwelling 28.822651 39.19458 33.95166 44.93613
Arthroleptis bivittatus Anura DD Ground-dwelling 27.317798 39.14414 33.40265 44.71325
Arthroleptis bivittatus Anura DD Ground-dwelling 26.590804 39.04660 33.28744 44.61230
Arthroleptis bivittatus Anura DD Ground-dwelling 28.805033 39.34369 33.58075 44.94686
Arthroleptis carquejai Anura DD Ground-dwelling 24.983440 38.74476 33.39522 44.35557
Arthroleptis carquejai Anura DD Ground-dwelling 24.064064 38.61861 33.24874 44.24126
Arthroleptis carquejai Anura DD Ground-dwelling 27.148369 39.04180 33.64442 44.59341
Arthroleptis stenodactylus Anura LC Ground-dwelling 24.362313 38.71096 33.19403 44.49310
Arthroleptis stenodactylus Anura LC Ground-dwelling 23.396384 38.58138 32.84541 44.11212
Arthroleptis stenodactylus Anura LC Ground-dwelling 26.379790 38.98161 33.44995 44.82141
Arthroleptis fichika Anura EN Ground-dwelling 24.950210 38.78860 33.00906 43.84557
Arthroleptis fichika Anura EN Ground-dwelling 24.330970 38.70534 32.92245 43.76427
Arthroleptis fichika Anura EN Ground-dwelling 25.991640 38.92863 33.07600 43.94533
Arthroleptis kidogo Anura CR Ground-dwelling 23.956874 38.73263 33.04229 44.46901
Arthroleptis kidogo Anura CR Ground-dwelling 23.296639 38.64228 32.94102 44.36760
Arthroleptis kidogo Anura CR Ground-dwelling 25.435562 38.93497 33.21463 44.69611
Arthroleptis xenochirus Anura LC Ground-dwelling 24.007309 38.77299 33.56260 43.93370
Arthroleptis xenochirus Anura LC Ground-dwelling 23.119712 38.65598 33.43978 43.82810
Arthroleptis xenochirus Anura LC Ground-dwelling 26.112963 39.05056 33.79664 44.23928
Arthroleptis francei Anura VU Ground-dwelling 25.770673 38.91891 33.56217 44.55753
Arthroleptis francei Anura VU Ground-dwelling 24.680085 38.77229 33.48674 44.44441
Arthroleptis francei Anura VU Ground-dwelling 27.836127 39.19661 33.98669 45.02931
Arthroleptis wahlbergii Anura LC Ground-dwelling 22.582754 38.41521 33.30940 44.46563
Arthroleptis wahlbergii Anura LC Ground-dwelling 21.368879 38.24872 33.13134 44.28064
Arthroleptis wahlbergii Anura LC Ground-dwelling 24.480279 38.67547 33.16385 44.31417
Arthroleptis hematogaster Anura DD Ground-dwelling 23.889645 38.57626 33.24882 44.31629
Arthroleptis hematogaster Anura DD Ground-dwelling 23.226776 38.48650 33.19967 44.24597
Arthroleptis hematogaster Anura DD Ground-dwelling 25.505338 38.79503 33.20188 44.29920
Arthroleptis kutogundua Anura CR Ground-dwelling 21.451903 38.34395 32.25834 43.68751
Arthroleptis kutogundua Anura CR Ground-dwelling 20.570019 38.22281 32.33744 43.68360
Arthroleptis kutogundua Anura CR Ground-dwelling 22.815304 38.53123 32.38847 43.82307
Arthroleptis lameerei Anura LC Ground-dwelling 24.912047 38.81509 32.99009 43.85287
Arthroleptis lameerei Anura LC Ground-dwelling 24.031868 38.69713 32.87893 43.71163
Arthroleptis lameerei Anura LC Ground-dwelling 27.023895 39.09811 33.37733 44.29773
Arthroleptis lonnbergi Anura DD Ground-dwelling 24.631934 38.74420 33.54080 44.40319
Arthroleptis lonnbergi Anura DD Ground-dwelling 23.966708 38.65529 33.26545 44.08278
Arthroleptis lonnbergi Anura DD Ground-dwelling 25.802639 38.90067 33.51630 44.39469
Arthroleptis tanneri Anura EN Ground-dwelling 24.950210 38.77113 33.61177 44.30796
Arthroleptis tanneri Anura EN Ground-dwelling 24.330970 38.68851 33.49031 44.16521
Arthroleptis tanneri Anura EN Ground-dwelling 25.991640 38.91007 33.79937 44.56889
Arthroleptis loveridgei Anura DD Ground-dwelling 25.902852 38.92714 33.81210 44.63997
Arthroleptis loveridgei Anura DD Ground-dwelling 25.146397 38.82220 34.08878 44.88876
Arthroleptis loveridgei Anura DD Ground-dwelling 27.436374 39.13987 33.91689 44.79157
Arthroleptis mossoensis Anura DD Ground-dwelling 23.146860 38.55332 32.65201 43.62341
Arthroleptis mossoensis Anura DD Ground-dwelling 22.643982 38.48545 32.88945 43.87642
Arthroleptis mossoensis Anura DD Ground-dwelling 24.322970 38.71203 32.79527 43.75915
Arthroleptis nguruensis Anura VU Ground-dwelling 23.956874 38.78507 32.96070 44.17266
Arthroleptis nguruensis Anura VU Ground-dwelling 23.296639 38.69587 32.86198 44.10395
Arthroleptis nguruensis Anura VU Ground-dwelling 25.435562 38.98482 33.22226 44.40875
Arthroleptis nlonakoensis Anura EN Ground-dwelling 26.219322 38.91484 33.39270 44.45570
Arthroleptis nlonakoensis Anura EN Ground-dwelling 25.532485 38.82137 32.96912 44.00746
Arthroleptis nlonakoensis Anura EN Ground-dwelling 27.588661 39.10118 33.64295 44.74299
Arthroleptis phrynoides Anura DD Ground-dwelling 27.556439 39.07864 33.35020 44.43328
Arthroleptis phrynoides Anura DD Ground-dwelling 26.889095 38.98933 33.07429 44.15378
Arthroleptis phrynoides Anura DD Ground-dwelling 29.396437 39.32487 33.63857 44.69492
Arthroleptis pyrrhoscelis Anura LC Ground-dwelling 23.621843 38.58468 33.08313 43.86739
Arthroleptis pyrrhoscelis Anura LC Ground-dwelling 22.965351 38.49659 32.83889 43.62140
Arthroleptis pyrrhoscelis Anura LC Ground-dwelling 25.177660 38.79343 33.36549 44.11218
Arthroleptis schubotzi Anura LC Ground-dwelling 22.867225 38.51817 33.87941 44.49397
Arthroleptis schubotzi Anura LC Ground-dwelling 22.154882 38.42262 33.71874 44.35323
Arthroleptis schubotzi Anura LC Ground-dwelling 24.347980 38.71679 33.93004 44.54186
Arthroleptis xenodactyloides Anura LC Ground-dwelling 24.493518 38.82343 33.37060 44.19255
Arthroleptis xenodactyloides Anura LC Ground-dwelling 23.567173 38.69739 33.20883 44.04741
Arthroleptis xenodactyloides Anura LC Ground-dwelling 26.438208 39.08803 33.59316 44.40694
Arthroleptis xenodactylus Anura EN Ground-dwelling 24.969464 38.81491 33.64418 44.47006
Arthroleptis xenodactylus Anura EN Ground-dwelling 24.301742 38.72433 33.36582 44.15077
Arthroleptis xenodactylus Anura EN Ground-dwelling 25.986178 38.95282 33.61070 44.43609
Arthroleptis spinalis Anura DD Ground-dwelling 23.272773 38.63954 33.48651 44.00664
Arthroleptis spinalis Anura DD Ground-dwelling 22.753880 38.56906 33.40884 43.94631
Arthroleptis spinalis Anura DD Ground-dwelling 24.365281 38.78795 33.76728 44.27753
Arthroleptis stridens Anura DD Ground-dwelling 24.969464 38.74397 33.80337 44.71721
Arthroleptis stridens Anura DD Ground-dwelling 24.301742 38.65391 33.42796 44.35149
Arthroleptis stridens Anura DD Ground-dwelling 25.986178 38.88109 33.96135 44.93052
Arthroleptis troglodytes Anura CR Ground-dwelling 25.290536 38.78046 32.79145 43.68009
Arthroleptis troglodytes Anura CR Ground-dwelling 24.324423 38.65108 32.50929 43.31247
Arthroleptis troglodytes Anura CR Ground-dwelling 27.284860 39.04753 32.99648 43.99202
Arthroleptis tuberosus Anura DD Ground-dwelling 27.147065 39.01176 33.36489 44.99722
Arthroleptis tuberosus Anura DD Ground-dwelling 26.411997 38.91059 33.33455 44.88437
Arthroleptis tuberosus Anura DD Ground-dwelling 28.738069 39.23072 33.55656 45.27849
Arthroleptis vercammeni Anura DD Ground-dwelling 24.143899 38.61427 33.51664 44.53184
Arthroleptis vercammeni Anura DD Ground-dwelling 23.402584 38.51413 33.11339 44.10499
Arthroleptis vercammeni Anura DD Ground-dwelling 26.105081 38.87920 33.50378 44.58115
Arthroleptis zimmeri Anura DD Ground-dwelling 27.099706 39.02445 32.98472 44.00754
Arthroleptis zimmeri Anura DD Ground-dwelling 26.646207 38.96295 32.93590 43.94002
Arthroleptis zimmeri Anura DD Ground-dwelling 27.938027 39.13813 33.07498 44.13235
Cardioglossa alsco Anura EN Stream-dwelling 26.038381 38.34595 32.13953 43.15363
Cardioglossa alsco Anura EN Stream-dwelling 25.289497 38.24497 32.01838 43.03755
Cardioglossa alsco Anura EN Stream-dwelling 27.743644 38.57589 33.49254 44.56498
Cardioglossa nigromaculata Anura LC Ground-dwelling 26.708645 39.08821 33.41878 44.73289
Cardioglossa nigromaculata Anura LC Ground-dwelling 26.095839 39.00533 33.33372 44.62305
Cardioglossa nigromaculata Anura LC Ground-dwelling 28.063954 39.27151 33.51805 44.76004
Cardioglossa cyaneospila Anura NT Stream-dwelling 22.368897 37.85286 31.86161 42.98636
Cardioglossa cyaneospila Anura NT Stream-dwelling 21.713388 37.76266 31.71524 42.86431
Cardioglossa cyaneospila Anura NT Stream-dwelling 23.849486 38.05662 32.12582 43.26202
Cardioglossa gratiosa Anura LC Stream-dwelling 27.310402 38.50197 33.32301 44.05751
Cardioglossa gratiosa Anura LC Stream-dwelling 26.567850 38.40172 33.28551 43.98966
Cardioglossa gratiosa Anura LC Stream-dwelling 28.917348 38.71893 33.21316 43.99029
Cardioglossa elegans Anura LC Stream-dwelling 26.988511 38.48609 33.29844 44.13121
Cardioglossa elegans Anura LC Stream-dwelling 26.301857 38.39313 33.26633 44.10975
Cardioglossa elegans Anura LC Stream-dwelling 28.494971 38.69003 33.49132 44.37888
Cardioglossa leucomystax Anura LC Stream-dwelling 27.251798 38.54575 33.48965 44.09037
Cardioglossa leucomystax Anura LC Stream-dwelling 26.503638 38.44501 32.95841 43.49707
Cardioglossa leucomystax Anura LC Stream-dwelling 28.861404 38.76249 33.29281 43.91916
Cardioglossa trifasciata Anura CR Stream-dwelling 26.871381 38.46997 32.84367 43.72028
Cardioglossa trifasciata Anura CR Stream-dwelling 26.335541 38.39705 32.75731 43.61731
Cardioglossa trifasciata Anura CR Stream-dwelling 28.169295 38.64661 33.16523 44.14863
Cardioglossa escalerae Anura LC Ground-dwelling 26.775264 39.06095 33.61688 44.73585
Cardioglossa escalerae Anura LC Ground-dwelling 26.069596 38.96422 33.55937 44.62684
Cardioglossa escalerae Anura LC Ground-dwelling 28.352516 39.27714 33.87717 45.08914
Cardioglossa manengouba Anura CR Stream-dwelling 26.871381 38.40984 33.04348 43.97296
Cardioglossa manengouba Anura CR Stream-dwelling 26.335541 38.33912 32.96542 43.87790
Cardioglossa manengouba Anura CR Stream-dwelling 28.169295 38.58113 33.26812 44.20324
Cardioglossa oreas Anura EN Stream-dwelling 25.936864 38.24243 32.79396 43.88221
Cardioglossa oreas Anura EN Stream-dwelling 25.218877 38.14550 32.84436 43.95767
Cardioglossa oreas Anura EN Stream-dwelling 27.405161 38.44065 33.01063 44.16890
Cardioglossa pulchra Anura EN Stream-dwelling 26.603590 38.36758 32.53503 43.48449
Cardioglossa pulchra Anura EN Stream-dwelling 25.954276 38.28082 32.54927 43.47100
Cardioglossa pulchra Anura EN Stream-dwelling 27.987230 38.55246 32.80353 43.84594
Cardioglossa venusta Anura EN Stream-dwelling 26.406869 38.47813 33.29828 44.21398
Cardioglossa venusta Anura EN Stream-dwelling 25.779143 38.39138 33.23739 44.12707
Cardioglossa venusta Anura EN Stream-dwelling 27.748605 38.66355 33.34197 44.36947
Cardioglossa gracilis Anura LC Stream-dwelling 27.146335 38.40287 33.16013 43.92079
Cardioglossa gracilis Anura LC Stream-dwelling 26.425542 38.30619 33.08924 43.81654
Cardioglossa gracilis Anura LC Stream-dwelling 28.704256 38.61183 33.00692 43.74695
Cardioglossa melanogaster Anura VU Stream-dwelling 26.603590 38.23567 32.60330 43.30081
Cardioglossa melanogaster Anura VU Stream-dwelling 25.954276 38.15018 32.57935 43.21622
Cardioglossa melanogaster Anura VU Stream-dwelling 27.987230 38.41785 32.93555 43.62891
Cardioglossa schioetzi Anura VU Ground-dwelling 26.687790 38.90467 33.64837 44.50902
Cardioglossa schioetzi Anura VU Ground-dwelling 25.965816 38.80773 33.47830 44.36592
Cardioglossa schioetzi Anura VU Ground-dwelling 28.260926 39.11588 33.93949 44.78099
Astylosternus batesi Anura LC Ground-dwelling 27.299517 39.08896 34.11526 44.55295
Astylosternus batesi Anura LC Ground-dwelling 26.548833 38.98799 34.02934 44.42160
Astylosternus batesi Anura LC Ground-dwelling 28.937685 39.30931 33.84333 44.39518
Astylosternus schioetzi Anura EN Stream-dwelling 26.611241 38.38327 33.22461 43.91543
Astylosternus schioetzi Anura EN Stream-dwelling 26.014233 38.30462 32.84140 43.54114
Astylosternus schioetzi Anura EN Stream-dwelling 27.981681 38.56381 32.99711 43.77856
Astylosternus diadematus Anura LC Stream-dwelling 26.531088 38.35391 32.39909 43.51316
Astylosternus diadematus Anura LC Stream-dwelling 25.868129 38.26441 32.71003 43.78294
Astylosternus diadematus Anura LC Stream-dwelling 27.916019 38.54087 33.04250 44.20512
Astylosternus perreti Anura EN Stream-dwelling 26.406869 38.38187 33.36453 44.18570
Astylosternus perreti Anura EN Stream-dwelling 25.779143 38.29745 33.32695 44.06188
Astylosternus perreti Anura EN Stream-dwelling 27.748605 38.56231 32.70955 43.61154
Astylosternus rheophilus Anura NT Stream-dwelling 26.306386 38.32485 32.58201 43.42255
Astylosternus rheophilus Anura NT Stream-dwelling 25.611818 38.23137 32.58897 43.39618
Astylosternus rheophilus Anura NT Stream-dwelling 27.802452 38.52622 32.79934 43.66340
Astylosternus nganhanus Anura CR Ground-dwelling 26.139581 38.93109 33.79374 44.84485
Astylosternus nganhanus Anura CR Ground-dwelling 25.348329 38.82275 33.33265 44.33224
Astylosternus nganhanus Anura CR Ground-dwelling 27.951284 39.17916 34.43750 45.44630
Trichobatrachus robustus Anura LC Stream-dwelling 27.141912 38.41923 32.71179 43.62147
Trichobatrachus robustus Anura LC Stream-dwelling 26.387550 38.31753 32.53689 43.45675
Trichobatrachus robustus Anura LC Stream-dwelling 28.783784 38.64057 32.86190 43.83190
Astylosternus fallax Anura VU Stream-dwelling 26.781658 38.45835 32.58109 43.93333
Astylosternus fallax Anura VU Stream-dwelling 26.197936 38.38078 32.50856 43.83133
Astylosternus fallax Anura VU Stream-dwelling 28.097089 38.63315 32.62609 44.06041
Astylosternus laurenti Anura EN Stream-dwelling 26.661280 38.46714 33.03008 44.61097
Astylosternus laurenti Anura EN Stream-dwelling 26.064875 38.38762 32.96883 44.50495
Astylosternus laurenti Anura EN Stream-dwelling 27.989922 38.64430 33.18110 44.85053
Astylosternus montanus Anura LC Stream-dwelling 26.199680 38.30514 32.53224 43.60034
Astylosternus montanus Anura LC Stream-dwelling 25.492788 38.21058 32.42067 43.50512
Astylosternus montanus Anura LC Stream-dwelling 27.710964 38.50732 33.23796 44.38339
Astylosternus ranoides Anura EN Ground-dwelling 25.936864 38.87840 32.80011 43.89974
Astylosternus ranoides Anura EN Ground-dwelling 25.218877 38.78087 32.58916 43.64961
Astylosternus ranoides Anura EN Ground-dwelling 27.405161 39.07784 32.93858 44.10273
Astylosternus laticephalus Anura NT Ground-dwelling 27.367501 39.05851 33.63312 44.44454
Astylosternus laticephalus Anura NT Ground-dwelling 26.841866 38.98851 33.56413 44.37524
Astylosternus laticephalus Anura NT Ground-dwelling 28.489341 39.20791 33.72306 44.52702
Astylosternus occidentalis Anura LC Ground-dwelling 27.406181 39.07724 33.96207 45.00753
Astylosternus occidentalis Anura LC Ground-dwelling 26.743719 38.98793 33.86733 44.95102
Astylosternus occidentalis Anura LC Ground-dwelling 28.802950 39.26554 34.16183 45.29571
Nyctibates corrugatus Anura LC Ground-dwelling 26.652185 38.91883 33.67419 44.75917
Nyctibates corrugatus Anura LC Ground-dwelling 26.037980 38.83655 33.52896 44.56589
Nyctibates corrugatus Anura LC Ground-dwelling 28.045634 39.10552 33.96745 45.06755
Scotobleps gabonicus Anura LC Stream-dwelling 27.363159 38.30315 32.78312 43.69939
Scotobleps gabonicus Anura LC Stream-dwelling 26.612014 38.20258 32.66842 43.56534
Scotobleps gabonicus Anura LC Stream-dwelling 28.998966 38.52218 33.08870 44.05342
Leptodactylodon albiventris Anura EN Stream-dwelling 26.504264 38.33786 32.73450 44.02678
Leptodactylodon albiventris Anura EN Stream-dwelling 25.952113 38.26277 32.39634 43.66349
Leptodactylodon albiventris Anura EN Stream-dwelling 28.009269 38.54255 32.94855 44.31104
Leptodactylodon boulengeri Anura NT Stream-dwelling 26.354599 38.27766 33.14327 44.31724
Leptodactylodon boulengeri Anura NT Stream-dwelling 25.668964 38.18563 33.13839 44.30383
Leptodactylodon boulengeri Anura NT Stream-dwelling 27.780256 38.46902 33.31166 44.48479
Leptodactylodon erythrogaster Anura CR Stream-dwelling 26.871381 38.33058 32.94603 44.19836
Leptodactylodon erythrogaster Anura CR Stream-dwelling 26.335541 38.25861 32.87881 44.13408
Leptodactylodon erythrogaster Anura CR Stream-dwelling 28.169295 38.50491 33.10510 44.38797
Leptodactylodon stevarti Anura EN Stream-dwelling 26.910204 38.31681 33.06113 44.00201
Leptodactylodon stevarti Anura EN Stream-dwelling 26.145273 38.21380 33.15017 44.05978
Leptodactylodon stevarti Anura EN Stream-dwelling 28.612489 38.54604 33.38311 44.40628
Leptodactylodon axillaris Anura CR Ground-dwelling 25.477847 38.78985 33.52242 44.56160
Leptodactylodon axillaris Anura CR Ground-dwelling 24.666345 38.68019 33.43169 44.52146
Leptodactylodon axillaris Anura CR Ground-dwelling 26.907224 38.98300 33.79451 44.83769
Leptodactylodon perreti Anura EN Stream-dwelling 25.926381 38.19200 32.47363 43.47550
Leptodactylodon perreti Anura EN Stream-dwelling 25.195917 38.09560 32.37349 43.42999
Leptodactylodon perreti Anura EN Stream-dwelling 27.471006 38.39584 32.58445 43.66581
Leptodactylodon bueanus Anura EN Stream-dwelling 26.947891 38.41191 32.12690 43.02018
Leptodactylodon bueanus Anura EN Stream-dwelling 26.416901 38.34020 32.34527 43.22384
Leptodactylodon bueanus Anura EN Stream-dwelling 28.225716 38.58450 32.43169 43.34602
Leptodactylodon bicolor Anura NT Stream-dwelling 26.388676 38.32953 32.76040 43.43109
Leptodactylodon bicolor Anura NT Stream-dwelling 25.708774 38.23625 32.63964 43.27376
Leptodactylodon bicolor Anura NT Stream-dwelling 27.829234 38.52717 32.88887 43.59864
Leptodactylodon ornatus Anura EN Stream-dwelling 26.365422 38.30181 32.81985 43.53006
Leptodactylodon ornatus Anura EN Stream-dwelling 25.715242 38.21426 32.73860 43.44138
Leptodactylodon ornatus Anura EN Stream-dwelling 27.719248 38.48412 32.98903 43.70208
Leptodactylodon mertensi Anura EN Stream-dwelling 26.406869 38.34341 32.88135 43.57778
Leptodactylodon mertensi Anura EN Stream-dwelling 25.779143 38.25911 32.81847 43.46711
Leptodactylodon mertensi Anura EN Stream-dwelling 27.748605 38.52362 33.25908 44.02453
Leptodactylodon polyacanthus Anura VU Stream-dwelling 26.251086 38.29881 32.42254 43.48178
Leptodactylodon polyacanthus Anura VU Stream-dwelling 25.534076 38.20152 32.35451 43.36701
Leptodactylodon polyacanthus Anura VU Stream-dwelling 27.729647 38.49943 32.75072 43.88831
Leptodactylodon ovatus Anura LC Stream-dwelling 26.599589 38.38407 32.74833 43.65937
Leptodactylodon ovatus Anura LC Stream-dwelling 25.996749 38.30234 32.69354 43.54748
Leptodactylodon ovatus Anura LC Stream-dwelling 27.944207 38.56635 33.16932 44.16997
Leptodactylodon wildi Anura CR Stream-dwelling 26.939038 38.47323 32.45634 43.78576
Leptodactylodon wildi Anura CR Stream-dwelling 26.407567 38.40112 32.40908 43.69992
Leptodactylodon wildi Anura CR Stream-dwelling 28.227584 38.64806 33.01049 44.39887
Leptodactylodon blanci Anura EN Stream-dwelling 28.150596 38.59549 33.21310 44.40868
Leptodactylodon blanci Anura EN Stream-dwelling 27.295856 38.48046 33.08108 44.26222
Leptodactylodon blanci Anura EN Stream-dwelling 29.795923 38.81691 33.66013 44.90614
Leptodactylodon ventrimarmoratus Anura VU Ground-dwelling 26.532115 39.00149 33.82434 44.79105
Leptodactylodon ventrimarmoratus Anura VU Ground-dwelling 25.949555 38.92226 33.85042 44.76618
Leptodactylodon ventrimarmoratus Anura VU Ground-dwelling 27.936638 39.19251 33.23865 44.20411
Leptopelis anchietae Anura LC Ground-dwelling 24.393966 38.60373 33.30932 43.96969
Leptopelis anchietae Anura LC Ground-dwelling 23.138727 38.43563 33.12056 43.73181
Leptopelis anchietae Anura LC Ground-dwelling 26.691007 38.91135 33.39843 44.13106
Leptopelis lebeaui Anura DD Arboreal 25.404116 38.60437 33.51963 44.33627
Leptopelis lebeaui Anura DD Arboreal 24.627851 38.50056 33.51667 44.37170
Leptopelis lebeaui Anura DD Arboreal 27.368716 38.86707 33.51006 44.40692
Leptopelis argenteus Anura LC Ground-dwelling 25.122155 38.75692 33.27429 44.31138
Leptopelis argenteus Anura LC Ground-dwelling 24.402240 38.65980 33.15391 44.23105
Leptopelis argenteus Anura LC Ground-dwelling 26.797111 38.98287 33.31411 44.43229
Leptopelis cynnamomeus Anura LC Arboreal 24.190636 38.46333 33.00503 43.89202
Leptopelis cynnamomeus Anura LC Arboreal 23.277586 38.33979 32.87909 43.78251
Leptopelis cynnamomeus Anura LC Arboreal 26.330736 38.75289 33.34353 44.29951
Leptopelis ocellatus Anura LC Arboreal 27.578733 39.07632 34.00764 44.57565
Leptopelis ocellatus Anura LC Arboreal 26.796519 38.97040 34.03463 44.60372
Leptopelis ocellatus Anura LC Arboreal 29.285018 39.30736 34.39372 44.98569
Leptopelis spiritusnoctis Anura LC Arboreal 27.518245 38.95188 33.78351 44.78119
Leptopelis spiritusnoctis Anura LC Arboreal 26.872881 38.86521 33.67106 44.59972
Leptopelis spiritusnoctis Anura LC Arboreal 28.914084 39.13934 33.76423 44.81864
Leptopelis aubryi Anura LC Arboreal 27.431326 38.93538 33.05276 44.08732
Leptopelis aubryi Anura LC Arboreal 26.651943 38.83028 33.04747 44.04933
Leptopelis aubryi Anura LC Arboreal 29.107174 39.16136 33.30506 44.40784
Leptopelis marginatus Anura DD Arboreal 23.852061 38.36538 33.08606 43.62657
Leptopelis marginatus Anura DD Arboreal 22.629716 38.19953 32.97801 43.60199
Leptopelis marginatus Anura DD Arboreal 25.862777 38.63819 33.25206 43.86265
Leptopelis aubryioides Anura LC Arboreal 27.145790 38.91264 33.50615 44.67411
Leptopelis aubryioides Anura LC Arboreal 26.429087 38.81431 33.49872 44.63045
Leptopelis aubryioides Anura LC Arboreal 28.719753 39.12857 33.74453 45.01221
Leptopelis susanae Anura EN Stream-dwelling 21.108538 37.59444 32.81527 43.30606
Leptopelis susanae Anura EN Stream-dwelling 20.215463 37.47407 32.69421 43.21356
Leptopelis susanae Anura EN Stream-dwelling 22.834404 37.82705 33.03470 43.51701
Leptopelis bequaerti Anura DD Arboreal 27.359116 38.93991 33.09218 43.86830
Leptopelis bequaerti Anura DD Arboreal 26.707474 38.85332 33.07166 43.84777
Leptopelis bequaerti Anura DD Arboreal 28.652445 39.11177 33.24902 43.99433
Leptopelis uluguruensis Anura NT Arboreal 23.656065 38.47874 33.75076 44.25949
Leptopelis uluguruensis Anura NT Arboreal 22.957616 38.38463 32.96277 43.44846
Leptopelis uluguruensis Anura NT Arboreal 25.118163 38.67575 33.20118 43.72376
Leptopelis bocagii Anura LC Fossorial 23.674840 39.55462 34.21583 44.73016
Leptopelis bocagii Anura LC Fossorial 22.701115 39.42067 34.08541 44.57366
Leptopelis bocagii Anura LC Fossorial 25.752116 39.84036 34.47556 45.06401
Leptopelis concolor Anura LC Arboreal 24.896767 38.59861 33.19178 44.18126
Leptopelis concolor Anura LC Arboreal 24.243803 38.50908 33.45084 44.41015
Leptopelis concolor Anura LC Arboreal 26.069293 38.75937 33.36597 44.36406
Leptopelis vermiculatus Anura EN Arboreal 23.348394 38.36224 33.45389 44.35948
Leptopelis vermiculatus Anura EN Arboreal 22.595104 38.26071 33.31171 44.19807
Leptopelis vermiculatus Anura EN Arboreal 24.871630 38.56755 33.68781 44.59360
Leptopelis boulengeri Anura LC Arboreal 27.380505 38.92053 33.59365 44.22767
Leptopelis boulengeri Anura LC Arboreal 26.643134 38.82078 33.72590 44.32553
Leptopelis boulengeri Anura LC Arboreal 28.978612 39.13673 33.77011 44.49884
Leptopelis brevipes Anura DD Arboreal 26.217367 38.76377 33.58728 43.81270
Leptopelis brevipes Anura DD Arboreal 25.707002 38.69379 33.51622 43.76911
Leptopelis brevipes Anura DD Arboreal 27.240774 38.90411 33.69199 43.99095
Leptopelis notatus Anura LC Arboreal 27.231291 38.81060 32.91824 43.70855
Leptopelis notatus Anura LC Arboreal 26.437866 38.70420 32.89036 43.60323
Leptopelis notatus Anura LC Arboreal 29.005134 39.04847 33.13723 44.04444
Leptopelis brevirostris Anura LC Arboreal 27.061706 38.82159 33.00018 43.84924
Leptopelis brevirostris Anura LC Arboreal 26.365222 38.72734 33.20457 44.02029
Leptopelis brevirostris Anura LC Arboreal 28.574725 39.02633 33.35584 44.17984
Leptopelis palmatus Anura EN Stream-dwelling 27.154492 38.33157 33.06830 44.22190
Leptopelis palmatus Anura EN Stream-dwelling 26.573730 38.25282 33.06373 44.20319
Leptopelis palmatus Anura EN Stream-dwelling 28.071748 38.45595 33.33006 44.50182
Leptopelis mossambicus Anura LC Arboreal 24.814600 38.51329 33.19653 44.12886
Leptopelis mossambicus Anura LC Arboreal 23.731766 38.36757 33.05244 43.94337
Leptopelis mossambicus Anura LC Arboreal 26.863564 38.78901 33.36352 44.32169
Leptopelis parvus Anura DD Arboreal 24.674386 38.56472 33.30935 44.10785
Leptopelis parvus Anura DD Arboreal 23.823188 38.45064 33.03690 43.82730
Leptopelis parvus Anura DD Arboreal 26.719807 38.83887 33.36080 44.19753
Leptopelis rufus Anura LC Arboreal 27.245377 38.88667 33.21420 44.37551
Leptopelis rufus Anura LC Arboreal 26.512504 38.78836 33.60622 44.74660
Leptopelis rufus Anura LC Arboreal 28.836298 39.10008 33.48425 44.61229
Leptopelis bufonides Anura LC Fossorial 27.385740 40.04949 34.03196 45.18775
Leptopelis bufonides Anura LC Fossorial 26.549382 39.94012 33.88450 45.04227
Leptopelis bufonides Anura LC Fossorial 29.447297 40.31908 34.30646 45.56804
Leptopelis nordequatorialis Anura LC Arboreal 25.966567 38.71123 32.85830 43.87160
Leptopelis nordequatorialis Anura LC Arboreal 25.219641 38.61124 32.81015 43.80638
Leptopelis nordequatorialis Anura LC Arboreal 27.624703 38.93321 33.02056 44.15317
Leptopelis christyi Anura LC Arboreal 24.301034 38.45440 33.13645 44.10983
Leptopelis christyi Anura LC Arboreal 23.621067 38.36300 32.86895 43.79829
Leptopelis christyi Anura LC Arboreal 25.852228 38.66290 33.36884 44.34989
Leptopelis flavomaculatus Anura LC Arboreal 24.868849 38.65200 33.48321 44.27220
Leptopelis flavomaculatus Anura LC Arboreal 23.989980 38.53259 33.28765 44.04153
Leptopelis flavomaculatus Anura LC Arboreal 26.717258 38.90313 33.75507 44.61354
Leptopelis calcaratus Anura LC Arboreal 27.153833 38.94909 33.54889 44.35286
Leptopelis calcaratus Anura LC Arboreal 26.425959 38.84978 33.38354 44.13501
Leptopelis calcaratus Anura LC Arboreal 28.766474 39.16914 33.51626 44.34130
Leptopelis yaldeni Anura VU Arboreal 22.701908 38.32151 32.59209 43.44347
Leptopelis yaldeni Anura VU Arboreal 21.833298 38.20421 32.52457 43.35634
Leptopelis yaldeni Anura VU Arboreal 24.734265 38.59596 32.72319 43.52322
Leptopelis crystallinoron Anura DD Arboreal 26.910204 38.77745 33.13121 44.21345
Leptopelis crystallinoron Anura DD Arboreal 26.145273 38.67416 33.03729 44.15893
Leptopelis crystallinoron Anura DD Arboreal 28.612489 39.00732 33.38794 44.51512
Leptopelis parkeri Anura EN Arboreal 23.752030 38.42310 32.52212 43.77839
Leptopelis parkeri Anura EN Arboreal 23.046473 38.32659 32.41144 43.65842
Leptopelis parkeri Anura EN Arboreal 25.148950 38.61416 32.69840 43.94821
Leptopelis fiziensis Anura DD Arboreal 24.114352 38.34056 32.80718 43.63964
Leptopelis fiziensis Anura DD Arboreal 23.475927 38.25437 32.68488 43.54604
Leptopelis fiziensis Anura DD Arboreal 25.669647 38.55052 33.04954 43.92836
Leptopelis karissimbensis Anura VU Arboreal 22.283253 38.14161 33.04132 43.83216
Leptopelis karissimbensis Anura VU Arboreal 21.587309 38.04675 32.91745 43.72897
Leptopelis karissimbensis Anura VU Arboreal 23.973052 38.37195 33.32479 44.17591
Leptopelis kivuensis Anura LC Arboreal 22.902296 38.18976 32.98821 44.33768
Leptopelis kivuensis Anura LC Arboreal 22.244473 38.10021 32.88409 44.26198
Leptopelis kivuensis Anura LC Arboreal 24.404973 38.39431 32.69023 44.03399
Leptopelis millsoni Anura LC Arboreal 27.261777 38.78437 33.80438 44.89660
Leptopelis millsoni Anura LC Arboreal 26.538378 38.68840 33.70388 44.78378
Leptopelis millsoni Anura LC Arboreal 28.861853 38.99667 33.52693 44.62821
Leptopelis fenestratus Anura DD Arboreal 24.942060 38.58675 32.96785 43.54229
Leptopelis fenestratus Anura DD Arboreal 24.161731 38.48125 32.85315 43.42328
Leptopelis fenestratus Anura DD Arboreal 26.688954 38.82292 33.40466 44.01834
Leptopelis mackayi Anura VU Arboreal 24.410289 38.55245 33.13544 44.11543
Leptopelis mackayi Anura VU Arboreal 23.583942 38.43948 32.99304 43.96196
Leptopelis mackayi Anura VU Arboreal 26.173823 38.79355 33.56926 44.60634
Leptopelis gramineus Anura LC Fossorial 20.324242 39.13806 33.24824 44.10416
Leptopelis gramineus Anura LC Fossorial 19.454499 39.02010 33.35639 44.10415
Leptopelis gramineus Anura LC Fossorial 21.865214 39.34706 33.92076 44.74555
Leptopelis natalensis Anura LC Arboreal 22.281442 38.23403 32.92843 43.63194
Leptopelis natalensis Anura LC Arboreal 21.047359 38.06990 32.83919 43.50126
Leptopelis natalensis Anura LC Arboreal 24.190531 38.48793 32.95167 43.59915
Leptopelis jordani Anura DD Arboreal 25.397022 38.56891 32.98260 44.23628
Leptopelis jordani Anura DD Arboreal 24.293143 38.42072 32.80377 44.04263
Leptopelis jordani Anura DD Arboreal 27.327403 38.82804 33.39203 44.68093
Leptopelis occidentalis Anura NT Arboreal 27.510048 38.79683 32.95534 44.05794
Leptopelis occidentalis Anura NT Arboreal 26.950857 38.72247 32.90880 43.97505
Leptopelis occidentalis Anura NT Arboreal 28.704978 38.95573 33.16063 44.34744
Leptopelis macrotis Anura NT Stream-dwelling 27.442054 38.47925 32.63222 43.73641
Leptopelis macrotis Anura NT Stream-dwelling 26.844583 38.39767 33.03880 44.22228
Leptopelis macrotis Anura NT Stream-dwelling 28.702945 38.65142 32.93992 44.03008
Leptopelis ragazzii Anura VU Stream-dwelling 20.148228 37.54928 31.72686 42.95115
Leptopelis ragazzii Anura VU Stream-dwelling 19.306753 37.43398 31.62492 42.85807
Leptopelis ragazzii Anura VU Stream-dwelling 21.633919 37.75285 31.90686 43.20918
Leptopelis modestus Anura LC Stream-dwelling 26.257750 38.35717 32.94157 43.61492
Leptopelis modestus Anura LC Stream-dwelling 25.638215 38.27247 32.82528 43.50397
Leptopelis modestus Anura LC Stream-dwelling 27.652042 38.54779 32.84327 43.53323
Leptopelis xenodactylus Anura EN Arboreal 21.728331 38.15396 32.52600 43.32781
Leptopelis xenodactylus Anura EN Arboreal 20.372004 37.96827 32.25518 42.94637
Leptopelis xenodactylus Anura EN Arboreal 23.719717 38.42661 32.60557 43.49040
Leptopelis parbocagii Anura LC Fossorial 24.088564 39.51561 34.23937 45.16601
Leptopelis parbocagii Anura LC Fossorial 23.145720 39.38663 34.15666 45.13084
Leptopelis parbocagii Anura LC Fossorial 26.163826 39.79952 34.46655 45.48236
Leptopelis viridis Anura LC Arboreal 27.279072 38.82038 33.68188 44.38363
Leptopelis viridis Anura LC Arboreal 26.460712 38.70874 33.57858 44.20595
Leptopelis viridis Anura LC Arboreal 29.145000 39.07493 34.09665 44.86518
Leptopelis vannutellii Anura LC Arboreal 21.863209 38.07263 32.82841 43.57597
Leptopelis vannutellii Anura LC Arboreal 21.023039 37.95966 32.70414 43.47005
Leptopelis vannutellii Anura LC Arboreal 23.515220 38.29477 33.05478 43.82937
Leptopelis zebra Anura LC Arboreal 26.520945 38.77057 32.86026 44.26261
Leptopelis zebra Anura LC Arboreal 25.882742 38.68377 32.79072 44.15416
Leptopelis zebra Anura LC Arboreal 28.039264 38.97708 33.09578 44.58311
Leptopelis oryi Anura LC Arboreal 25.769297 38.61338 33.04444 43.66925
Leptopelis oryi Anura LC Arboreal 24.978614 38.50755 32.92118 43.57372
Leptopelis oryi Anura LC Arboreal 27.401027 38.83178 33.27654 43.93991
Phrynomantis affinis Anura LC Ground-dwelling 23.868686 37.46318 32.23082 42.57364
Phrynomantis affinis Anura LC Ground-dwelling 22.798995 37.31396 32.11194 42.41171
Phrynomantis affinis Anura LC Ground-dwelling 26.116951 37.77681 32.46079 42.95212
Phrynomantis annectens Anura LC Ground-dwelling 22.026281 37.15352 31.67261 42.21614
Phrynomantis annectens Anura LC Ground-dwelling 20.457391 36.93631 31.75497 42.25546
Phrynomantis annectens Anura LC Ground-dwelling 24.661077 37.51831 32.33440 42.94865
Phrynomantis bifasciatus Anura LC Ground-dwelling 23.837722 37.47494 32.52485 42.87316
Phrynomantis bifasciatus Anura LC Ground-dwelling 22.768711 37.32321 32.38699 42.68654
Phrynomantis bifasciatus Anura LC Ground-dwelling 25.942348 37.77365 32.69897 43.07741
Phrynomantis microps Anura LC Ground-dwelling 27.295052 37.99454 32.42890 42.95104
Phrynomantis microps Anura LC Ground-dwelling 26.463500 37.87751 32.32804 42.83023
Phrynomantis microps Anura LC Ground-dwelling 29.186307 38.26072 32.56763 43.16831
Phrynomantis somalicus Anura LC Ground-dwelling 25.563207 37.74262 32.56993 42.74761
Phrynomantis somalicus Anura LC Ground-dwelling 24.858967 37.64322 32.14604 42.34817
Phrynomantis somalicus Anura LC Ground-dwelling 26.845458 37.92358 32.63504 42.87190
Hoplophryne rogersi Anura EN Arboreal 24.290366 37.95639 33.68729 43.02219
Hoplophryne rogersi Anura EN Arboreal 23.613576 37.86326 33.58200 42.86963
Hoplophryne rogersi Anura EN Arboreal 25.508639 38.12404 33.79667 43.17303
Hoplophryne uluguruensis Anura EN Arboreal 23.742587 37.95233 33.23394 42.88879
Hoplophryne uluguruensis Anura EN Arboreal 23.071514 37.85906 33.19910 42.83251
Hoplophryne uluguruensis Anura EN Arboreal 25.326150 38.17244 33.41778 43.10416
Parhoplophryne usambarica Anura CR Ground-dwelling 24.988717 38.30911 33.61221 42.89498
Parhoplophryne usambarica Anura CR Ground-dwelling 24.272514 38.21095 33.50808 42.76781
Parhoplophryne usambarica Anura CR Ground-dwelling 25.980715 38.44506 33.86414 43.27249
Adelastes hylonomos Anura DD Ground-dwelling 27.593172 39.90510 35.92961 44.30516
Adelastes hylonomos Anura DD Ground-dwelling 26.923381 39.81281 35.81069 44.17400
Adelastes hylonomos Anura DD Ground-dwelling 29.101493 40.11294 36.08567 44.46285
Arcovomer passarellii Anura LC Ground-dwelling 25.474285 39.65658 36.18095 43.91075
Arcovomer passarellii Anura LC Ground-dwelling 24.516564 39.52759 36.08125 43.75596
Arcovomer passarellii Anura LC Ground-dwelling 27.163774 39.88413 36.17511 43.96473
Elachistocleis ovalis Anura LC Ground-dwelling 27.036804 40.24198 37.24553 43.29084
Elachistocleis ovalis Anura LC Ground-dwelling 26.166438 40.12599 37.14351 43.10826
Elachistocleis ovalis Anura LC Ground-dwelling 28.785355 40.47499 37.28340 43.50949
Elachistocleis surinamensis Anura LC Ground-dwelling 26.647062 40.22566 36.90173 43.31954
Elachistocleis surinamensis Anura LC Ground-dwelling 25.904183 40.12605 36.86171 43.18416
Elachistocleis surinamensis Anura LC Ground-dwelling 28.045070 40.41313 36.95856 43.49602
Elachistocleis bumbameuboi Anura DD Ground-dwelling 27.872069 40.18064 36.38324 43.82679
Elachistocleis bumbameuboi Anura DD Ground-dwelling 27.165577 40.08453 36.63923 44.03039
Elachistocleis bumbameuboi Anura DD Ground-dwelling 29.316476 40.37712 36.58980 44.10269
Elachistocleis erythrogaster Anura NT Fossorial 24.552864 40.65552 37.22944 44.51897
Elachistocleis erythrogaster Anura NT Fossorial 22.689759 40.40232 36.81878 44.05745
Elachistocleis erythrogaster Anura NT Fossorial 27.254547 41.02270 37.22104 44.74273
Elachistocleis carvalhoi Anura LC Ground-dwelling 27.861527 40.08578 36.58118 43.84995
Elachistocleis carvalhoi Anura LC Ground-dwelling 27.108365 39.98555 36.46406 43.68062
Elachistocleis carvalhoi Anura LC Ground-dwelling 29.376474 40.28737 36.77398 44.09326
Elachistocleis piauiensis Anura LC Fossorial 26.764324 40.98612 37.37453 44.58783
Elachistocleis piauiensis Anura LC Fossorial 25.840292 40.86062 37.27840 44.44664
Elachistocleis piauiensis Anura LC Fossorial 28.373097 41.20461 37.62960 44.92836
Elachistocleis helianneae Anura LC Ground-dwelling 28.199796 40.12774 36.80058 43.60916
Elachistocleis helianneae Anura LC Ground-dwelling 27.475866 40.03123 36.71869 43.50304
Elachistocleis helianneae Anura LC Ground-dwelling 29.843425 40.34687 36.98253 43.88167
Elachistocleis pearsei Anura LC Ground-dwelling 26.314168 39.91486 36.56848 43.95978
Elachistocleis pearsei Anura LC Ground-dwelling 25.584929 39.81766 36.51349 43.84723
Elachistocleis pearsei Anura LC Ground-dwelling 27.837965 40.11796 36.84605 44.33487
Elachistocleis matogrosso Anura LC Ground-dwelling 28.005538 40.15552 36.49317 43.63587
Elachistocleis matogrosso Anura LC Ground-dwelling 26.968289 40.01505 36.46441 43.58750
Elachistocleis matogrosso Anura LC Ground-dwelling 30.066391 40.43462 36.91824 44.16696
Elachistocleis skotogaster Anura LC Ground-dwelling 20.986425 39.23224 35.95827 43.00217
Elachistocleis skotogaster Anura LC Ground-dwelling 19.451389 39.02570 35.44229 42.47811
Elachistocleis skotogaster Anura LC Ground-dwelling 23.184627 39.52801 36.17547 43.17245
Elachistocleis panamensis Anura LC Ground-dwelling 26.588801 39.91524 36.45744 43.72472
Elachistocleis panamensis Anura LC Ground-dwelling 25.861614 39.81830 36.39767 43.64106
Elachistocleis panamensis Anura LC Ground-dwelling 28.183716 40.12783 36.68141 44.04915
Elachistocleis surumu Anura DD Ground-dwelling 26.692696 39.96647 36.10626 43.23681
Elachistocleis surumu Anura DD Ground-dwelling 25.970277 39.86926 36.02598 43.12243
Elachistocleis surumu Anura DD Ground-dwelling 28.278396 40.17982 36.13783 43.40320
Gastrophryne olivacea Anura LC Ground-dwelling 24.383518 39.57063 36.90376 42.63900
Gastrophryne olivacea Anura LC Ground-dwelling 22.705492 39.34169 36.46838 42.14310
Gastrophryne olivacea Anura LC Ground-dwelling 27.106910 39.94219 37.08313 43.02837
Gastrophryne elegans Anura LC Ground-dwelling 26.142297 39.80213 36.16245 42.96842
Gastrophryne elegans Anura LC Ground-dwelling 25.254937 39.68206 36.20966 42.97654
Gastrophryne elegans Anura LC Ground-dwelling 28.015873 40.05565 36.31903 43.17034
Hypopachus barberi Anura NT Ground-dwelling 25.795938 39.69125 35.75601 43.31297
Hypopachus barberi Anura NT Ground-dwelling 24.800905 39.55683 35.68691 43.15780
Hypopachus barberi Anura NT Ground-dwelling 27.824822 39.96531 36.20769 43.86640
Hypopachus variolosus Anura LC Ground-dwelling 25.999588 39.84858 36.10318 43.29752
Hypopachus variolosus Anura LC Ground-dwelling 25.085939 39.72304 35.93622 43.07784
Hypopachus variolosus Anura LC Ground-dwelling 27.798365 40.09574 36.26099 43.51084
Hypopachus pictiventris Anura LC Ground-dwelling 26.180623 39.84252 35.96805 43.46635
Hypopachus pictiventris Anura LC Ground-dwelling 25.377782 39.73332 35.84176 43.30336
Hypopachus pictiventris Anura LC Ground-dwelling 27.683524 40.04695 36.08930 43.65673
Hamptophryne alios Anura DD Ground-dwelling 24.683804 39.61915 36.41087 42.97756
Hamptophryne alios Anura DD Ground-dwelling 23.932034 39.51730 36.32261 42.83667
Hamptophryne alios Anura DD Ground-dwelling 25.966569 39.79294 36.44414 43.04588
Stereocyclops histrio Anura DD Ground-dwelling 25.192998 39.64942 36.02681 43.38386
Stereocyclops histrio Anura DD Ground-dwelling 24.420885 39.54413 35.94651 43.25255
Stereocyclops histrio Anura DD Ground-dwelling 26.685840 39.85302 36.14748 43.65065
Stereocyclops parkeri Anura LC Ground-dwelling 25.788988 39.89010 36.34401 42.81627
Stereocyclops parkeri Anura LC Ground-dwelling 24.795952 39.75674 36.26300 42.67571
Stereocyclops parkeri Anura LC Ground-dwelling 27.532147 40.12418 36.51285 43.16769
Dasypops schirchi Anura VU Ground-dwelling 25.230689 39.20298 34.61398 43.11994
Dasypops schirchi Anura VU Ground-dwelling 24.471858 39.10021 35.08802 43.56134
Dasypops schirchi Anura VU Ground-dwelling 26.618351 39.39093 35.50258 44.00408
Myersiella microps Anura LC Ground-dwelling 25.506256 39.26750 35.10173 43.71033
Myersiella microps Anura LC Ground-dwelling 24.410891 39.11931 35.11547 43.70629
Myersiella microps Anura LC Ground-dwelling 27.413052 39.52548 35.32658 44.02825
Chiasmocleis cordeiroi Anura DD Ground-dwelling 25.024351 38.84112 35.17462 42.45343
Chiasmocleis cordeiroi Anura DD Ground-dwelling 24.244099 38.73538 35.10444 42.36027
Chiasmocleis cordeiroi Anura DD Ground-dwelling 26.604310 39.05524 35.33453 42.71885
Chiasmocleis crucis Anura DD Ground-dwelling 25.024351 38.84017 34.98646 42.84935
Chiasmocleis crucis Anura DD Ground-dwelling 24.244099 38.73355 34.87012 42.68760
Chiasmocleis crucis Anura DD Ground-dwelling 26.604310 39.05606 34.87576 42.81782
Chiasmocleis schubarti Anura LC Ground-dwelling 25.349638 38.88020 35.04732 42.71022
Chiasmocleis schubarti Anura LC Ground-dwelling 24.491918 38.76288 34.92332 42.57827
Chiasmocleis schubarti Anura LC Ground-dwelling 27.016355 39.10819 35.15921 42.88822
Chiasmocleis capixaba Anura LC Ground-dwelling 25.255289 38.82049 35.04360 42.46685
Chiasmocleis capixaba Anura LC Ground-dwelling 24.473612 38.71471 34.94907 42.34243
Chiasmocleis capixaba Anura LC Ground-dwelling 26.717986 39.01843 35.18032 42.70835
Chiasmocleis carvalhoi Anura LC Ground-dwelling 28.586957 39.25808 35.56672 43.32194
Chiasmocleis carvalhoi Anura LC Ground-dwelling 27.818666 39.15248 35.46408 43.19894
Chiasmocleis carvalhoi Anura LC Ground-dwelling 30.071424 39.46212 35.71769 43.48704
Chiasmocleis mehelyi Anura DD Ground-dwelling 28.055119 39.20608 35.51466 43.13593
Chiasmocleis mehelyi Anura DD Ground-dwelling 26.984489 39.05778 35.33134 42.97504
Chiasmocleis mehelyi Anura DD Ground-dwelling 30.233673 39.50784 35.81999 43.52739
Chiasmocleis albopunctata Anura LC Ground-dwelling 27.279077 39.10928 35.71797 42.89797
Chiasmocleis albopunctata Anura LC Ground-dwelling 26.215381 38.96412 35.63627 42.78201
Chiasmocleis albopunctata Anura LC Ground-dwelling 29.413566 39.40056 35.97513 43.28677
Chiasmocleis leucosticta Anura LC Ground-dwelling 25.283639 38.76799 35.14178 42.68291
Chiasmocleis leucosticta Anura LC Ground-dwelling 23.750788 38.55814 35.08738 42.56646
Chiasmocleis leucosticta Anura LC Ground-dwelling 27.806123 39.11332 35.23988 42.85311
Chiasmocleis mantiqueira Anura DD Ground-dwelling 24.933356 38.77644 35.37755 43.00769
Chiasmocleis mantiqueira Anura DD Ground-dwelling 23.521258 38.58321 35.10419 42.66535
Chiasmocleis mantiqueira Anura DD Ground-dwelling 27.700419 39.15509 35.67741 43.42835
Chiasmocleis centralis Anura DD Fossorial 27.352354 40.18136 36.61442 44.56265
Chiasmocleis centralis Anura DD Fossorial 26.180835 40.01933 35.99271 43.82093
Chiasmocleis centralis Anura DD Fossorial 29.510605 40.47986 36.93821 45.01773
Chiasmocleis gnoma Anura DD Ground-dwelling 25.361645 38.95307 34.95169 42.44970
Chiasmocleis gnoma Anura DD Ground-dwelling 24.597670 38.84614 34.87697 42.32429
Chiasmocleis gnoma Anura DD Ground-dwelling 26.767371 39.14984 35.44104 43.02497
Chiasmocleis anatipes Anura LC Ground-dwelling 25.477238 38.89840 35.56625 42.99624
Chiasmocleis anatipes Anura LC Ground-dwelling 24.685530 38.78927 35.41042 42.85582
Chiasmocleis anatipes Anura LC Ground-dwelling 26.997356 39.10794 35.66645 43.17828
Chiasmocleis devriesi Anura LC Ground-dwelling 29.053741 39.38594 35.93331 42.98472
Chiasmocleis devriesi Anura LC Ground-dwelling 28.213297 39.27071 35.80139 42.82280
Chiasmocleis devriesi Anura LC Ground-dwelling 30.510378 39.58566 36.06235 43.20223
Chiasmocleis sapiranga Anura DD Ground-dwelling 25.167955 38.81215 34.61535 42.18361
Chiasmocleis sapiranga Anura DD Ground-dwelling 24.335483 38.69808 34.57885 42.03599
Chiasmocleis sapiranga Anura DD Ground-dwelling 26.538348 38.99991 34.94160 42.59651
Chiasmocleis atlantica Anura LC Ground-dwelling 25.679423 38.85370 34.81779 42.28625
Chiasmocleis atlantica Anura LC Ground-dwelling 24.483544 38.68724 34.61803 42.01064
Chiasmocleis atlantica Anura LC Ground-dwelling 27.710290 39.13637 35.40394 43.01875
Chiasmocleis avilapiresae Anura LC Ground-dwelling 28.305475 39.25156 35.22321 43.30297
Chiasmocleis avilapiresae Anura LC Ground-dwelling 27.581550 39.15322 35.14519 43.17236
Chiasmocleis avilapiresae Anura LC Ground-dwelling 29.907291 39.46915 35.35537 43.54864
Chiasmocleis shudikarensis Anura LC Ground-dwelling 28.024634 39.12990 35.33051 43.21147
Chiasmocleis shudikarensis Anura LC Ground-dwelling 27.320343 39.03380 35.28018 43.13473
Chiasmocleis shudikarensis Anura LC Ground-dwelling 29.584005 39.34265 35.58682 43.48079
Ctenophryne aequatorialis Anura EN Ground-dwelling 22.811877 38.42605 34.66867 42.34927
Ctenophryne aequatorialis Anura EN Ground-dwelling 21.189432 38.20084 34.35268 41.96343
Ctenophryne aequatorialis Anura EN Ground-dwelling 25.126705 38.74736 34.78359 42.66530
Ctenophryne carpish Anura EN Ground-dwelling 22.538913 38.40066 34.05264 42.24252
Ctenophryne carpish Anura EN Ground-dwelling 21.736625 38.29259 33.91587 42.09064
Ctenophryne carpish Anura EN Ground-dwelling 23.802966 38.57094 34.26960 42.41926
Ctenophryne aterrima Anura LC Ground-dwelling 25.293489 38.71564 34.22679 42.72386
Ctenophryne aterrima Anura LC Ground-dwelling 24.535608 38.61021 34.28970 42.73054
Ctenophryne aterrima Anura LC Ground-dwelling 26.673421 38.90761 34.36510 42.85299
Ctenophryne minor Anura DD Ground-dwelling 25.597617 38.76419 35.04864 42.84349
Ctenophryne minor Anura DD Ground-dwelling 24.953236 38.67439 35.00982 42.81647
Ctenophryne minor Anura DD Ground-dwelling 26.739957 38.92338 35.25517 43.10693
Ctenophryne barbatula Anura EN Ground-dwelling 21.012652 38.23720 34.76127 41.69011
Ctenophryne barbatula Anura EN Ground-dwelling 20.177954 38.12148 34.46562 41.36730
Ctenophryne barbatula Anura EN Ground-dwelling 22.689323 38.46967 35.01485 41.94590
Paradoxophyla palmata Anura LC Fossorial 25.578599 38.87571 34.19654 44.10721
Paradoxophyla palmata Anura LC Fossorial 24.652025 38.74606 34.08285 43.99450
Paradoxophyla palmata Anura LC Fossorial 27.078761 39.08562 34.67072 44.61680
Paradoxophyla tiarano Anura DD Ground-dwelling 26.568402 38.04504 33.08556 43.22978
Paradoxophyla tiarano Anura DD Ground-dwelling 25.568278 37.90557 33.14754 43.22891
Paradoxophyla tiarano Anura DD Ground-dwelling 28.182329 38.27012 32.74187 42.98499
Scaphiophryne boribory Anura VU Ground-dwelling 25.699645 37.93991 32.76978 42.13661
Scaphiophryne boribory Anura VU Ground-dwelling 24.597743 37.78491 32.70459 41.96646
Scaphiophryne boribory Anura VU Ground-dwelling 27.375863 38.17568 33.05190 42.55805
Scaphiophryne madagascariensis Anura NT Fossorial 25.607336 38.88879 34.27866 43.85204
Scaphiophryne madagascariensis Anura NT Fossorial 24.646038 38.75239 34.15105 43.71632
Scaphiophryne madagascariensis Anura NT Fossorial 27.296487 39.12846 34.50290 44.15863
Scaphiophryne menabensis Anura LC Semi-aquatic 26.592710 38.32396 33.10231 43.11858
Scaphiophryne menabensis Anura LC Semi-aquatic 25.768998 38.20667 33.55669 43.46790
Scaphiophryne menabensis Anura LC Semi-aquatic 28.162113 38.54743 33.68933 43.76046
Scaphiophryne marmorata Anura VU Ground-dwelling 25.028017 37.81178 33.18575 42.59576
Scaphiophryne marmorata Anura VU Ground-dwelling 24.122637 37.68470 33.03467 42.38292
Scaphiophryne marmorata Anura VU Ground-dwelling 26.483014 38.01599 33.20681 42.72623
Scaphiophryne gottlebei Anura EN Fossorial 25.961269 38.93133 33.96243 43.57662
Scaphiophryne gottlebei Anura EN Fossorial 24.978178 38.79379 33.90156 43.48533
Scaphiophryne gottlebei Anura EN Fossorial 27.647933 39.16729 34.31646 43.98988
Scaphiophryne spinosa Anura LC Ground-dwelling 25.557185 37.88746 32.69314 42.76077
Scaphiophryne spinosa Anura LC Ground-dwelling 24.656080 37.76084 32.80083 42.83935
Scaphiophryne spinosa Anura LC Ground-dwelling 27.032402 38.09475 32.93042 42.98093
Scaphiophryne calcarata Anura LC Ground-dwelling 26.328345 38.06251 33.39324 42.87398
Scaphiophryne calcarata Anura LC Ground-dwelling 25.482823 37.94525 33.40006 42.89549
Scaphiophryne calcarata Anura LC Ground-dwelling 27.854613 38.27418 33.65568 43.21892
Scaphiophryne brevis Anura LC Ground-dwelling 26.051362 37.99858 32.63091 42.68111
Scaphiophryne brevis Anura LC Ground-dwelling 25.162217 37.87417 32.50328 42.55579
Scaphiophryne brevis Anura LC Ground-dwelling 27.587748 38.21354 32.83679 42.89767
Anodonthyla boulengerii Anura NT Arboreal 25.658466 37.89918 32.77790 42.61978
Anodonthyla boulengerii Anura NT Arboreal 24.718607 37.76673 32.63618 42.47905
Anodonthyla boulengerii Anura NT Arboreal 27.190594 38.11509 32.70027 42.62247
Anodonthyla vallani Anura CR Arboreal 25.675466 37.81568 32.77717 42.09718
Anodonthyla vallani Anura CR Arboreal 24.907261 37.70882 32.73495 42.02546
Anodonthyla vallani Anura CR Arboreal 27.038275 38.00524 32.99450 42.36069
Anodonthyla hutchisoni Anura EN Arboreal 26.568402 37.94210 32.90727 43.06955
Anodonthyla hutchisoni Anura EN Arboreal 25.568278 37.80310 32.73922 42.91901
Anodonthyla hutchisoni Anura EN Arboreal 28.182329 38.16641 32.80832 42.97858
Anodonthyla moramora Anura EN Arboreal 25.602585 37.84769 32.53594 42.08481
Anodonthyla moramora Anura EN Arboreal 24.578700 37.70521 32.56417 42.13477
Anodonthyla moramora Anura EN Arboreal 27.455263 38.10549 32.78103 42.43716
Anodonthyla nigrigularis Anura EN Arboreal 25.470711 37.82805 33.04902 42.37221
Anodonthyla nigrigularis Anura EN Arboreal 24.638202 37.71267 32.95533 42.25133
Anodonthyla nigrigularis Anura EN Arboreal 26.815810 38.01446 33.20040 42.60344
Anodonthyla pollicaris Anura DD Arboreal 24.739076 37.72273 32.81324 42.41601
Anodonthyla pollicaris Anura DD Arboreal 23.834706 37.60006 32.79886 42.37653
Anodonthyla pollicaris Anura DD Arboreal 26.202108 37.92117 32.97410 42.58390
Anodonthyla theoi Anura CR Arboreal 26.349269 37.92988 32.71932 42.67179
Anodonthyla theoi Anura CR Arboreal 25.509637 37.81390 32.66975 42.51584
Anodonthyla theoi Anura CR Arboreal 27.846172 38.13665 32.76955 42.83566
Anodonthyla jeanbai Anura EN Arboreal 25.690591 37.81842 32.82898 42.81671
Anodonthyla jeanbai Anura EN Arboreal 24.820352 37.69815 32.68688 42.64550
Anodonthyla jeanbai Anura EN Arboreal 27.041343 38.00510 32.91038 42.99489
Anodonthyla emilei Anura EN Arboreal 25.602585 37.91350 33.09968 43.01049
Anodonthyla emilei Anura EN Arboreal 24.578700 37.77286 32.92948 42.77968
Anodonthyla emilei Anura EN Arboreal 27.455263 38.16800 33.40765 43.37592
Anodonthyla montana Anura VU Arboreal 26.085788 37.97572 32.82287 42.90701
Anodonthyla montana Anura VU Arboreal 25.201041 37.85161 32.67925 42.67701
Anodonthyla montana Anura VU Arboreal 27.693333 38.20123 32.79394 43.00172
Anodonthyla rouxae Anura EN Arboreal 25.810460 37.94735 33.10127 42.69858
Anodonthyla rouxae Anura EN Arboreal 24.974355 37.83122 33.00500 42.59565
Anodonthyla rouxae Anura EN Arboreal 27.228074 38.14427 33.34626 42.95864
Cophyla berara Anura EN Arboreal 26.714144 37.92307 32.93067 42.84417
Cophyla berara Anura EN Arboreal 26.022414 37.82709 32.88217 42.75099
Cophyla berara Anura EN Arboreal 27.874484 38.08406 32.64093 42.60894
Cophyla occultans Anura VU Arboreal 26.541039 37.87967 32.98022 42.72393
Cophyla occultans Anura VU Arboreal 25.503906 37.73423 32.78038 42.51697
Cophyla occultans Anura VU Arboreal 28.114216 38.10027 33.19433 43.02548
Cophyla phyllodactyla Anura LC Arboreal 26.619382 37.94876 33.59380 42.98117
Cophyla phyllodactyla Anura LC Arboreal 25.683947 37.81774 33.54482 42.84617
Cophyla phyllodactyla Anura LC Arboreal 28.188923 38.16859 33.81763 43.29101
Rhombophryne minuta Anura EN Fossorial 26.301993 39.00879 33.72340 43.80003
Rhombophryne minuta Anura EN Fossorial 25.109214 38.84324 33.62586 43.59515
Rhombophryne minuta Anura EN Fossorial 28.019582 39.24719 34.13325 44.40503
Plethodontohyla fonetana Anura EN Ground-dwelling 27.071073 38.09211 32.77314 42.94394
Plethodontohyla fonetana Anura EN Ground-dwelling 26.258359 37.97841 32.69367 42.88663
Plethodontohyla fonetana Anura EN Ground-dwelling 28.680915 38.31734 32.99667 43.26029
Plethodontohyla guentheri Anura EN Ground-dwelling 26.301993 38.11563 32.60152 43.01784
Plethodontohyla guentheri Anura EN Ground-dwelling 25.109214 37.94628 33.04851 43.51968
Plethodontohyla guentheri Anura EN Ground-dwelling 28.019582 38.35951 33.26382 43.65290
Plethodontohyla notosticta Anura LC Arboreal 25.871874 37.85620 33.30749 43.09327
Plethodontohyla notosticta Anura LC Arboreal 24.946376 37.72470 33.19524 42.98029
Plethodontohyla notosticta Anura LC Arboreal 27.406744 38.07428 33.49342 43.30605
Plethodontohyla bipunctata Anura LC Fossorial 25.509301 38.90900 33.74845 43.95007
Plethodontohyla bipunctata Anura LC Fossorial 24.606459 38.78573 33.63967 43.75129
Plethodontohyla bipunctata Anura LC Fossorial 26.986404 39.11068 34.87760 45.18836
Plethodontohyla tuberata Anura NT Ground-dwelling 25.356789 37.95016 32.82889 42.42762
Plethodontohyla tuberata Anura NT Ground-dwelling 24.450485 37.82301 32.75862 42.36655
Plethodontohyla tuberata Anura NT Ground-dwelling 26.927001 38.17044 33.09729 42.73612
Plethodontohyla brevipes Anura VU Ground-dwelling 25.798160 37.97226 33.24776 43.09428
Plethodontohyla brevipes Anura VU Ground-dwelling 24.840228 37.83756 33.07843 42.90996
Plethodontohyla brevipes Anura VU Ground-dwelling 27.496485 38.21107 33.42036 43.28474
Plethodontohyla ocellata Anura LC Ground-dwelling 25.651662 37.96308 33.23150 42.99673
Plethodontohyla ocellata Anura LC Ground-dwelling 24.703940 37.83056 33.16674 42.85048
Plethodontohyla ocellata Anura LC Ground-dwelling 27.173530 38.17590 33.26861 43.17346
Plethodontohyla inguinalis Anura LC Arboreal 25.765672 37.80314 33.28913 42.55068
Plethodontohyla inguinalis Anura LC Arboreal 24.803148 37.66645 33.11299 42.33478
Plethodontohyla inguinalis Anura LC Arboreal 27.304505 38.02168 33.50274 42.82252
Plethodontohyla mihanika Anura LC Arboreal 25.342373 37.82477 32.89586 42.77197
Plethodontohyla mihanika Anura LC Arboreal 24.428303 37.69904 33.07980 42.89296
Plethodontohyla mihanika Anura LC Arboreal 26.837615 38.03044 33.06336 42.87671
Rhombophryne laevipes Anura LC Fossorial 26.169486 39.08624 33.82003 43.76685
Rhombophryne laevipes Anura LC Fossorial 25.165856 38.94621 33.74914 43.68462
Rhombophryne laevipes Anura LC Fossorial 27.773655 39.31006 34.11874 44.08062
Rhombophryne coudreaui Anura NT Fossorial 26.332444 39.10100 34.15518 44.34158
Rhombophryne coudreaui Anura NT Fossorial 25.298873 38.95764 33.62736 43.79203
Rhombophryne coudreaui Anura NT Fossorial 27.920851 39.32132 33.72574 43.91976
Rhombophryne testudo Anura EN Ground-dwelling 27.320578 38.31411 33.05232 43.22577
Rhombophryne testudo Anura EN Ground-dwelling 26.205818 38.15854 32.92323 43.11102
Rhombophryne testudo Anura EN Ground-dwelling 29.049002 38.55531 33.37366 43.61949
Rhombophryne coronata Anura LC Fossorial 25.370303 38.88658 34.29151 44.01511
Rhombophryne coronata Anura LC Fossorial 24.441566 38.75893 34.20927 43.89531
Rhombophryne coronata Anura LC Fossorial 26.933446 39.10143 34.54425 44.31866
Rhombophryne serratopalpebrosa Anura EN Ground-dwelling 26.301993 38.09380 33.68599 43.68739
Rhombophryne serratopalpebrosa Anura EN Ground-dwelling 25.109214 37.92778 33.66663 43.63523
Rhombophryne serratopalpebrosa Anura EN Ground-dwelling 28.019582 38.33286 33.80809 43.85199
Rhombophryne guentherpetersi Anura EN Ground-dwelling 26.546214 38.13592 33.53367 43.17937
Rhombophryne guentherpetersi Anura EN Ground-dwelling 25.367540 37.96995 33.36945 43.01378
Rhombophryne guentherpetersi Anura EN Ground-dwelling 28.327551 38.38676 33.69182 43.47258
Rhombophryne mangabensis Anura VU Fossorial 26.937894 39.13615 33.99805 43.60427
Rhombophryne mangabensis Anura VU Fossorial 25.795704 38.97503 34.05030 43.57117
Rhombophryne mangabensis Anura VU Fossorial 28.688809 39.38313 34.14902 43.77950
Rhombophryne matavy Anura CR Ground-dwelling 26.423580 38.02638 32.91728 42.44943
Rhombophryne matavy Anura CR Ground-dwelling 25.872015 37.95035 32.84704 42.38667
Rhombophryne matavy Anura CR Ground-dwelling 27.617485 38.19096 33.41758 43.03316
Stumpffia analamaina Anura CR Ground-dwelling 27.023169 38.13434 31.95556 42.83250
Stumpffia analamaina Anura CR Ground-dwelling 25.803661 37.96364 31.83916 42.71027
Stumpffia analamaina Anura CR Ground-dwelling 28.941364 38.40284 32.47605 43.36528
Stumpffia be Anura EN Ground-dwelling 26.777976 38.08684 33.74425 43.31182
Stumpffia be Anura EN Ground-dwelling 25.898010 37.96334 33.43739 42.99011
Stumpffia be Anura EN Ground-dwelling 28.212146 38.28812 33.54853 43.17151
Stumpffia hara Anura CR Ground-dwelling 26.423580 38.09708 33.41001 42.90143
Stumpffia hara Anura CR Ground-dwelling 25.872015 38.02059 33.37742 42.85482
Stumpffia hara Anura CR Ground-dwelling 27.617485 38.26265 33.62409 43.13955
Stumpffia megsoni Anura DD Ground-dwelling 26.423580 38.04445 33.50908 43.50470
Stumpffia megsoni Anura DD Ground-dwelling 25.872015 37.96692 33.45021 43.40061
Stumpffia megsoni Anura DD Ground-dwelling 27.617485 38.21229 33.67976 43.65355
Stumpffia staffordi Anura VU Ground-dwelling 26.423580 38.02851 32.94688 42.45210
Stumpffia staffordi Anura VU Ground-dwelling 25.872015 37.95188 32.97888 42.47164
Stumpffia staffordi Anura VU Ground-dwelling 27.617485 38.19439 33.06983 42.58446
Stumpffia gimmeli Anura LC Ground-dwelling 26.652358 38.02288 33.06999 42.60712
Stumpffia gimmeli Anura LC Ground-dwelling 25.731684 37.89398 32.63144 42.11879
Stumpffia gimmeli Anura LC Ground-dwelling 28.229467 38.24369 33.48732 43.09473
Stumpffia psologlossa Anura EN Ground-dwelling 26.375246 37.92530 32.89268 42.51019
Stumpffia psologlossa Anura EN Ground-dwelling 25.218471 37.76332 32.75541 42.32751
Stumpffia psologlossa Anura EN Ground-dwelling 28.241907 38.18669 33.36849 43.12272
Stumpffia madagascariensis Anura EN Ground-dwelling 26.423580 38.03340 33.67745 43.30013
Stumpffia madagascariensis Anura EN Ground-dwelling 25.872015 37.95793 33.52365 43.10395
Stumpffia madagascariensis Anura EN Ground-dwelling 27.617485 38.19677 33.80957 43.47606
Stumpffia pygmaea Anura EN Ground-dwelling 27.320578 38.17818 33.48276 43.22540
Stumpffia pygmaea Anura EN Ground-dwelling 26.205818 38.02069 33.42265 43.17865
Stumpffia pygmaea Anura EN Ground-dwelling 29.049002 38.42238 33.73415 43.49668
Stumpffia grandis Anura LC Ground-dwelling 25.855883 37.98291 33.24968 43.18672
Stumpffia grandis Anura LC Ground-dwelling 24.880186 37.84764 33.15356 43.04499
Stumpffia grandis Anura LC Ground-dwelling 27.382080 38.19450 33.37232 43.36157
Stumpffia roseifemoralis Anura EN Ground-dwelling 26.301993 38.11824 33.44400 42.95782
Stumpffia roseifemoralis Anura EN Ground-dwelling 25.109214 37.95048 33.22347 42.81704
Stumpffia roseifemoralis Anura EN Ground-dwelling 28.019582 38.35980 33.71562 43.17552
Stumpffia tetradactyla Anura DD Ground-dwelling 26.081972 38.02829 33.08504 42.78639
Stumpffia tetradactyla Anura DD Ground-dwelling 25.057045 37.88273 32.44171 42.13632
Stumpffia tetradactyla Anura DD Ground-dwelling 27.636050 38.24900 33.38750 43.05121
Stumpffia miery Anura EN Ground-dwelling 25.602585 38.00264 33.24199 42.82898
Stumpffia miery Anura EN Ground-dwelling 24.578700 37.85757 33.26060 42.81189
Stumpffia miery Anura EN Ground-dwelling 27.455263 38.26513 33.55470 43.17714
Stumpffia tridactyla Anura DD Ground-dwelling 25.367684 37.91901 33.31217 43.34679
Stumpffia tridactyla Anura DD Ground-dwelling 24.399745 37.78271 33.17897 43.18138
Stumpffia tridactyla Anura DD Ground-dwelling 26.866285 38.13004 33.47261 43.52846
Madecassophryne truebae Anura EN Ground-dwelling 25.584456 37.96271 33.28637 42.57772
Madecassophryne truebae Anura EN Ground-dwelling 24.742056 37.84269 33.20344 42.48226
Madecassophryne truebae Anura EN Ground-dwelling 26.930508 38.15450 33.46783 42.78703
Melanobatrachus indicus Anura VU Ground-dwelling 27.680389 37.74442 32.84692 42.88794
Melanobatrachus indicus Anura VU Ground-dwelling 26.866634 37.63211 32.82322 42.78037
Melanobatrachus indicus Anura VU Ground-dwelling 29.236498 37.95919 33.01270 43.25385
Otophryne pyburni Anura LC Ground-dwelling 27.295143 37.57070 32.28850 42.05144
Otophryne pyburni Anura LC Ground-dwelling 26.643349 37.47923 32.01533 41.79841
Otophryne pyburni Anura LC Ground-dwelling 28.837654 37.78718 32.67691 42.48348
Otophryne robusta Anura LC Ground-dwelling 25.947155 37.43908 32.49014 42.24133
Otophryne robusta Anura LC Ground-dwelling 25.201586 37.33440 32.39358 42.09565
Otophryne robusta Anura LC Ground-dwelling 27.617498 37.67361 32.87203 42.64424
Otophryne steyermarki Anura LC Ground-dwelling 25.791139 37.41685 32.10937 42.12408
Otophryne steyermarki Anura LC Ground-dwelling 25.015182 37.30960 31.98250 41.89829
Otophryne steyermarki Anura LC Ground-dwelling 27.476298 37.64976 32.29489 42.34607
Synapturanus mirandaribeiroi Anura LC Ground-dwelling 27.657286 37.60582 32.76011 42.76695
Synapturanus mirandaribeiroi Anura LC Ground-dwelling 27.003674 37.51732 32.68357 42.66440
Synapturanus mirandaribeiroi Anura LC Ground-dwelling 29.177555 37.81167 33.00735 43.07004
Synapturanus salseri Anura LC Ground-dwelling 28.248516 37.74508 32.93779 43.02203
Synapturanus salseri Anura LC Ground-dwelling 27.559392 37.64890 32.91357 42.98053
Synapturanus salseri Anura LC Ground-dwelling 29.794448 37.96085 33.12033 43.22086
Synapturanus rabus Anura LC Fossorial 27.474790 38.60902 33.79165 43.41901
Synapturanus rabus Anura LC Fossorial 26.722904 38.50452 33.58291 43.28177
Synapturanus rabus Anura LC Fossorial 28.956333 38.81493 34.00745 43.68944
Kalophrynus baluensis Anura LC Ground-dwelling 26.801121 36.88092 33.24667 41.07096
Kalophrynus baluensis Anura LC Ground-dwelling 26.209815 36.79860 33.19304 40.99019
Kalophrynus baluensis Anura LC Ground-dwelling 27.867897 37.02942 33.41736 41.27381
Kalophrynus intermedius Anura LC Ground-dwelling 28.200580 37.12748 32.98459 41.10313
Kalophrynus intermedius Anura LC Ground-dwelling 27.565113 37.03664 32.92247 40.99797
Kalophrynus intermedius Anura LC Ground-dwelling 29.566394 37.32272 32.94083 41.19044
Kalophrynus subterrestris Anura LC Ground-dwelling 27.861912 37.03537 32.94196 40.99816
Kalophrynus subterrestris Anura LC Ground-dwelling 27.273012 36.95280 32.93276 40.94138
Kalophrynus subterrestris Anura LC Ground-dwelling 29.157170 37.21697 32.91718 41.03774
Kalophrynus heterochirus Anura LC Ground-dwelling 27.784330 37.07006 33.00657 40.87034
Kalophrynus heterochirus Anura LC Ground-dwelling 27.169758 36.98228 32.98129 40.76561
Kalophrynus heterochirus Anura LC Ground-dwelling 29.078023 37.25484 33.45863 41.40480
Kalophrynus palmatissimus Anura EN Ground-dwelling 27.998586 37.01703 33.55146 40.54355
Kalophrynus palmatissimus Anura EN Ground-dwelling 27.358417 36.92576 33.42114 40.37710
Kalophrynus palmatissimus Anura EN Ground-dwelling 29.303096 37.20303 33.65088 40.79691
Kalophrynus bunguranus Anura DD Ground-dwelling 27.443786 37.13251 32.81515 41.42630
Kalophrynus bunguranus Anura DD Ground-dwelling 26.999324 37.06910 32.73533 41.32150
Kalophrynus bunguranus Anura DD Ground-dwelling 28.214218 37.24242 32.96208 41.60796
Kalophrynus orangensis Anura LC Ground-dwelling 27.022195 37.04630 32.91794 41.23501
Kalophrynus orangensis Anura LC Ground-dwelling 26.326408 36.94829 32.81461 41.06029
Kalophrynus orangensis Anura LC Ground-dwelling 28.536450 37.25960 32.93966 41.39491
Kalophrynus nubicola Anura LC Ground-dwelling 27.002711 36.98726 32.78010 40.92170
Kalophrynus nubicola Anura LC Ground-dwelling 26.369992 36.89843 32.69659 40.80240
Kalophrynus nubicola Anura LC Ground-dwelling 28.309782 37.17077 32.97169 41.13615
Kalophrynus eok Anura DD Ground-dwelling 25.985565 36.88393 32.39029 40.89636
Kalophrynus eok Anura DD Ground-dwelling 25.023238 36.74643 32.31347 40.76518
Kalophrynus eok Anura DD Ground-dwelling 27.465236 37.09534 32.62661 41.23121
Kalophrynus interlineatus Anura LC Ground-dwelling 27.249138 37.01718 32.89312 41.17046
Kalophrynus interlineatus Anura LC Ground-dwelling 26.326594 36.88631 32.80048 41.02973
Kalophrynus interlineatus Anura LC Ground-dwelling 29.046410 37.27213 33.04449 41.38126
Kalophrynus punctatus Anura LC Ground-dwelling 27.584128 37.06061 33.10403 41.17073
Kalophrynus punctatus Anura LC Ground-dwelling 27.097125 36.99256 33.07265 41.09652
Kalophrynus punctatus Anura LC Ground-dwelling 28.604418 37.20317 33.17724 41.28479
Kalophrynus minusculus Anura LC Ground-dwelling 28.022415 37.24921 33.01643 41.68166
Kalophrynus minusculus Anura LC Ground-dwelling 27.409670 37.16167 32.91890 41.56979
Kalophrynus minusculus Anura LC Ground-dwelling 29.353663 37.43939 33.13597 41.83561
Kalophrynus robinsoni Anura DD Ground-dwelling 28.376697 37.28568 33.26255 41.79977
Kalophrynus robinsoni Anura DD Ground-dwelling 27.761115 37.19776 33.22634 41.70243
Kalophrynus robinsoni Anura DD Ground-dwelling 29.657551 37.46863 33.39343 42.04561
Kalophrynus pleurostigma Anura LC Ground-dwelling 28.189902 37.35208 32.74556 41.91955
Kalophrynus pleurostigma Anura LC Ground-dwelling 27.574238 37.26579 32.69030 41.84115
Kalophrynus pleurostigma Anura LC Ground-dwelling 29.546347 37.54220 32.92554 42.14208
Choerophryne allisoni Anura DD Ground-dwelling 27.414332 35.39147 30.91641 39.49095
Choerophryne allisoni Anura DD Ground-dwelling 26.588272 35.27206 30.81976 39.38064
Choerophryne allisoni Anura DD Ground-dwelling 29.236805 35.65492 31.03590 39.60555
Choerophryne burtoni Anura LC Ground-dwelling 26.422582 35.30416 31.06344 39.28283
Choerophryne burtoni Anura LC Ground-dwelling 25.544047 35.17891 31.00302 39.20410
Choerophryne burtoni Anura LC Ground-dwelling 27.978208 35.52593 31.28611 39.60314
Choerophryne longirostris Anura NT Ground-dwelling 26.509275 35.40794 31.24956 39.82543
Choerophryne longirostris Anura NT Ground-dwelling 25.870527 35.31358 31.15987 39.75686
Choerophryne longirostris Anura NT Ground-dwelling 27.662209 35.57825 31.30751 39.95959
Choerophryne proboscidea Anura LC Ground-dwelling 26.706228 35.29617 30.92440 39.23835
Choerophryne proboscidea Anura LC Ground-dwelling 25.836666 35.17088 30.90784 39.08257
Choerophryne proboscidea Anura LC Ground-dwelling 27.871244 35.46401 30.99197 39.39840
Choerophryne rostellifer Anura LC Ground-dwelling 26.992490 35.49726 30.93861 39.84308
Choerophryne rostellifer Anura LC Ground-dwelling 26.152653 35.37474 30.87373 39.67838
Choerophryne rostellifer Anura LC Ground-dwelling 28.185266 35.67127 31.34940 40.31164
Aphantophryne minuta Anura LC Ground-dwelling 26.640378 35.31386 31.16880 39.56615
Aphantophryne minuta Anura LC Ground-dwelling 25.627491 35.16690 31.00603 39.41040
Aphantophryne minuta Anura LC Ground-dwelling 28.501219 35.58386 31.43189 39.92890
Aphantophryne sabini Anura LC Ground-dwelling 27.777034 35.47461 30.93056 39.40712
Aphantophryne sabini Anura LC Ground-dwelling 26.851879 35.34132 30.78810 39.26317
Aphantophryne sabini Anura LC Ground-dwelling 29.482554 35.72034 31.14828 39.68713
Aphantophryne pansa Anura LC Ground-dwelling 26.164562 35.25851 30.97480 40.00483
Aphantophryne pansa Anura LC Ground-dwelling 25.259796 35.12542 30.92217 39.89933
Aphantophryne pansa Anura LC Ground-dwelling 27.542938 35.46126 30.96186 40.07534
Asterophrys leucopus Anura LC Ground-dwelling 27.111446 35.43247 31.27755 39.37906
Asterophrys leucopus Anura LC Ground-dwelling 26.333032 35.32060 31.25521 39.38131
Asterophrys leucopus Anura LC Ground-dwelling 28.586995 35.64453 31.52105 39.68270
Asterophrys turpicola Anura LC Ground-dwelling 27.073855 35.47329 31.10115 39.32374
Asterophrys turpicola Anura LC Ground-dwelling 26.407478 35.37599 31.08396 39.27089
Asterophrys turpicola Anura LC Ground-dwelling 28.398325 35.66668 31.33527 39.57407
Xenorhina adisca Anura DD Ground-dwelling 27.040369 35.37559 31.27467 39.49464
Xenorhina adisca Anura DD Ground-dwelling 26.325143 35.27384 30.93365 39.09479
Xenorhina adisca Anura DD Ground-dwelling 28.318539 35.55744 31.36735 39.69824
Xenorhina anorbis Anura DD Ground-dwelling 26.052448 35.22036 31.12004 39.13133
Xenorhina anorbis Anura DD Ground-dwelling 25.360335 35.12262 31.14390 39.16344
Xenorhina anorbis Anura DD Ground-dwelling 27.583350 35.43655 31.28639 39.40277
Xenorhina arboricola Anura LC Arboreal 26.848660 35.20262 30.92484 39.14653
Xenorhina arboricola Anura LC Arboreal 26.128618 35.09858 30.98980 39.17443
Xenorhina arboricola Anura LC Arboreal 28.024168 35.37247 31.05724 39.36310
Xenorhina arfakiana Anura LC Ground-dwelling 27.603582 35.62528 31.93349 40.57968
Xenorhina arfakiana Anura LC Ground-dwelling 26.950469 35.52927 31.88407 40.51197
Xenorhina arfakiana Anura LC Ground-dwelling 28.802742 35.80155 32.05196 40.78766
Xenorhina bidens Anura LC Ground-dwelling 27.544936 35.51492 31.14995 39.52561
Xenorhina bidens Anura LC Ground-dwelling 26.786438 35.40545 31.05940 39.39187
Xenorhina bidens Anura LC Ground-dwelling 29.159443 35.74793 31.35918 39.82390
Xenorhina bouwensi Anura LC Ground-dwelling 26.913759 35.35768 31.24395 39.38487
Xenorhina bouwensi Anura LC Ground-dwelling 26.220961 35.25711 31.14745 39.23438
Xenorhina bouwensi Anura LC Ground-dwelling 28.199347 35.54430 31.31454 39.56807
Xenorhina eiponis Anura DD Ground-dwelling 25.363952 35.10678 31.10105 39.32685
Xenorhina eiponis Anura DD Ground-dwelling 24.632364 34.99903 31.02970 39.21887
Xenorhina eiponis Anura DD Ground-dwelling 26.831311 35.32290 31.04830 39.31097
Xenorhina fuscigula Anura LC Fossorial 26.040089 36.21213 31.86168 40.46438
Xenorhina fuscigula Anura LC Fossorial 25.096472 36.07666 31.78288 40.35155
Xenorhina fuscigula Anura LC Fossorial 27.361400 36.40183 31.98890 40.65094
Xenorhina gigantea Anura DD Ground-dwelling 25.980655 35.19470 31.02120 39.29616
Xenorhina gigantea Anura DD Ground-dwelling 25.299772 35.09762 30.97076 39.16258
Xenorhina gigantea Anura DD Ground-dwelling 27.417968 35.39962 31.10942 39.47318
Xenorhina huon Anura DD Ground-dwelling 26.147605 35.17696 30.87354 38.81310
Xenorhina huon Anura DD Ground-dwelling 25.217439 35.04245 30.83187 38.74929
Xenorhina huon Anura DD Ground-dwelling 27.388036 35.35634 31.05505 39.07097
Xenorhina lanthanites Anura DD Ground-dwelling 26.229018 35.16530 30.95887 39.21073
Xenorhina lanthanites Anura DD Ground-dwelling 25.905818 35.11886 30.90448 39.18623
Xenorhina lanthanites Anura DD Ground-dwelling 26.983440 35.27368 31.10975 39.37173
Xenorhina macrodisca Anura DD Ground-dwelling 23.777654 34.96089 30.87586 39.20242
Xenorhina macrodisca Anura DD Ground-dwelling 22.879292 34.83039 30.58226 38.83017
Xenorhina macrodisca Anura DD Ground-dwelling 25.403142 35.19701 31.20321 39.57048
Xenorhina macrops Anura LC Ground-dwelling 26.330316 35.27651 31.13758 39.35437
Xenorhina macrops Anura LC Ground-dwelling 25.659065 35.18157 31.11219 39.27030
Xenorhina macrops Anura LC Ground-dwelling 27.635672 35.46115 31.18793 39.45710
Xenorhina mehelyi Anura LC Ground-dwelling 26.547565 35.36692 31.40154 39.25232
Xenorhina mehelyi Anura LC Ground-dwelling 25.677572 35.24114 31.30322 39.14297
Xenorhina mehelyi Anura LC Ground-dwelling 28.044019 35.58328 31.69173 39.66486
Xenorhina minima Anura LC Ground-dwelling 26.245583 35.23630 31.06720 39.41161
Xenorhina minima Anura LC Ground-dwelling 25.556114 35.13792 31.02501 39.33159
Xenorhina minima Anura LC Ground-dwelling 27.643111 35.43572 31.44444 39.87428
Xenorhina multisica Anura LC Ground-dwelling 24.602473 34.98516 31.11722 39.00949
Xenorhina multisica Anura LC Ground-dwelling 23.812938 34.87258 30.87762 38.73066
Xenorhina multisica Anura LC Ground-dwelling 26.113770 35.20065 31.24522 39.15060
Xenorhina obesa Anura LC Ground-dwelling 26.763112 35.36589 30.94373 39.33429
Xenorhina obesa Anura LC Ground-dwelling 25.938253 35.24628 30.87103 39.20875
Xenorhina obesa Anura LC Ground-dwelling 27.980928 35.54247 31.10543 39.58726
Xenorhina ocellata Anura LC Ground-dwelling 26.214531 35.33682 31.34770 39.43482
Xenorhina ocellata Anura LC Ground-dwelling 25.537436 35.23641 31.23491 39.30595
Xenorhina ocellata Anura LC Ground-dwelling 27.543608 35.53391 31.53521 39.70130
Xenorhina ophiodon Anura DD Ground-dwelling 27.691081 35.46180 31.21952 39.83329
Xenorhina ophiodon Anura DD Ground-dwelling 27.058861 35.37061 31.30478 39.90818
Xenorhina ophiodon Anura DD Ground-dwelling 28.831284 35.62626 31.49641 40.10045
Xenorhina oxycephala Anura LC Ground-dwelling 26.935683 35.41356 31.02638 39.27457
Xenorhina oxycephala Anura LC Ground-dwelling 26.251103 35.31282 30.95261 39.16790
Xenorhina oxycephala Anura LC Ground-dwelling 28.110720 35.58648 31.45529 39.78167
Xenorhina parkerorum Anura LC Ground-dwelling 26.357511 35.26958 31.45033 39.57419
Xenorhina parkerorum Anura LC Ground-dwelling 25.593818 35.16090 31.13520 39.25143
Xenorhina parkerorum Anura LC Ground-dwelling 27.964069 35.49820 31.52182 39.69636
Xenorhina rostrata Anura LC Ground-dwelling 26.676998 35.31675 31.38074 39.28002
Xenorhina rostrata Anura LC Ground-dwelling 25.846611 35.19743 31.27312 39.08594
Xenorhina rostrata Anura LC Ground-dwelling 27.912483 35.49428 31.47671 39.47191
Xenorhina scheepstrai Anura DD Ground-dwelling 26.125432 35.26118 30.81471 39.45573
Xenorhina scheepstrai Anura DD Ground-dwelling 25.451791 35.16373 30.54904 39.13712
Xenorhina scheepstrai Anura DD Ground-dwelling 27.548851 35.46710 31.02463 39.72997
Xenorhina schiefenhoeveli Anura LC Ground-dwelling 25.363952 35.23230 31.16134 39.56556
Xenorhina schiefenhoeveli Anura LC Ground-dwelling 24.632364 35.12615 31.04351 39.45683
Xenorhina schiefenhoeveli Anura LC Ground-dwelling 26.831311 35.44521 31.44166 39.85140
Xenorhina similis Anura LC Ground-dwelling 26.914237 35.40689 31.23329 39.47565
Xenorhina similis Anura LC Ground-dwelling 26.262769 35.31062 31.37610 39.61715
Xenorhina similis Anura LC Ground-dwelling 28.453821 35.63438 31.42124 39.68399
Xenorhina subcrocea Anura DD Ground-dwelling 26.741891 35.20342 31.03163 39.17336
Xenorhina subcrocea Anura DD Ground-dwelling 25.723890 35.05817 30.92428 38.98804
Xenorhina subcrocea Anura DD Ground-dwelling 28.017132 35.38537 31.28669 39.44844
Xenorhina tumulus Anura LC Fossorial 26.625927 36.35169 31.92761 40.56755
Xenorhina tumulus Anura LC Fossorial 25.766730 36.22735 31.85607 40.49928
Xenorhina tumulus Anura LC Fossorial 27.893214 36.53507 32.12396 40.77527
Xenorhina varia Anura DD Ground-dwelling 26.229018 35.33573 31.58473 40.26578
Xenorhina varia Anura DD Ground-dwelling 25.905818 35.28915 31.53052 40.18607
Xenorhina varia Anura DD Ground-dwelling 26.983440 35.44446 31.47206 40.24360
Xenorhina zweifeli Anura LC Ground-dwelling 27.394496 35.42436 31.45920 39.84483
Xenorhina zweifeli Anura LC Ground-dwelling 26.605255 35.31104 31.26485 39.56206
Xenorhina zweifeli Anura LC Ground-dwelling 28.613086 35.59933 31.49974 39.93683
Austrochaperina adamantina Anura NT Ground-dwelling 26.509275 35.33494 31.13516 39.33185
Austrochaperina adamantina Anura NT Ground-dwelling 25.870527 35.24306 31.04401 39.22700
Austrochaperina adamantina Anura NT Ground-dwelling 27.662209 35.50078 31.31517 39.55648
Austrochaperina adelphe Anura LC Ground-dwelling 28.261634 35.54253 31.29877 39.55192
Austrochaperina adelphe Anura LC Ground-dwelling 27.377443 35.41480 31.17405 39.41766
Austrochaperina adelphe Anura LC Ground-dwelling 29.977912 35.79045 31.53278 39.85922
Austrochaperina aquilonia Anura NT Ground-dwelling 26.509275 35.39452 30.85249 39.47671
Austrochaperina aquilonia Anura NT Ground-dwelling 25.870527 35.30129 30.84025 39.39857
Austrochaperina aquilonia Anura NT Ground-dwelling 27.662209 35.56281 31.03326 39.75343
Austrochaperina archboldi Anura DD Ground-dwelling 27.336178 35.46603 31.10156 39.23456
Austrochaperina archboldi Anura DD Ground-dwelling 26.230340 35.30724 30.92591 39.04904
Austrochaperina archboldi Anura DD Ground-dwelling 28.646228 35.65415 31.43753 39.67765
Austrochaperina basipalmata Anura LC Stream-dwelling 26.576100 34.77408 30.87809 39.26869
Austrochaperina basipalmata Anura LC Stream-dwelling 25.927430 34.67951 30.76108 39.10808
Austrochaperina basipalmata Anura LC Stream-dwelling 27.696746 34.93747 30.82068 39.25796
Austrochaperina blumi Anura LC Ground-dwelling 25.363952 35.20925 31.01600 39.34489
Austrochaperina blumi Anura LC Ground-dwelling 24.632364 35.10487 30.89609 39.19720
Austrochaperina blumi Anura LC Ground-dwelling 26.831311 35.41861 31.10448 39.58616
Austrochaperina brevipes Anura DD Ground-dwelling 26.640378 35.41711 31.25887 39.99892
Austrochaperina brevipes Anura DD Ground-dwelling 25.627491 35.27101 31.15547 39.87565
Austrochaperina brevipes Anura DD Ground-dwelling 28.501219 35.68551 31.24423 40.13115
Austrochaperina derongo Anura LC Ground-dwelling 26.344015 35.13474 30.42879 39.23654
Austrochaperina derongo Anura LC Ground-dwelling 25.603859 35.02923 30.37265 39.18536
Austrochaperina derongo Anura LC Ground-dwelling 27.803029 35.34274 30.52868 39.42636
Austrochaperina fryi Anura LC Ground-dwelling 26.307461 35.30429 31.25587 39.50948
Austrochaperina fryi Anura LC Ground-dwelling 25.172109 35.14023 31.04199 39.26241
Austrochaperina fryi Anura LC Ground-dwelling 28.384483 35.60442 31.48415 39.86209
Austrochaperina gracilipes Anura LC Ground-dwelling 27.577874 35.44446 30.83183 39.52000
Austrochaperina gracilipes Anura LC Ground-dwelling 26.767598 35.32791 30.70984 39.37384
Austrochaperina gracilipes Anura LC Ground-dwelling 29.331306 35.69666 31.09581 39.85065
Austrochaperina hooglandi Anura LC Ground-dwelling 27.012638 35.43066 31.12308 39.67717
Austrochaperina hooglandi Anura LC Ground-dwelling 25.952951 35.27830 31.12418 39.61386
Austrochaperina hooglandi Anura LC Ground-dwelling 28.236402 35.60660 31.39915 39.95537
Austrochaperina kosarek Anura DD Ground-dwelling 26.125432 35.28360 31.55196 39.78717
Austrochaperina kosarek Anura DD Ground-dwelling 25.451791 35.18706 31.32715 39.52964
Austrochaperina kosarek Anura DD Ground-dwelling 27.548851 35.48759 31.86523 40.11251
Austrochaperina macrorhyncha Anura LC Stream-dwelling 26.661617 34.67749 29.89944 38.36979
Austrochaperina macrorhyncha Anura LC Stream-dwelling 26.026861 34.58622 29.85050 38.30962
Austrochaperina macrorhyncha Anura LC Stream-dwelling 27.922017 34.85874 30.25828 38.67847
Austrochaperina mehelyi Anura LC Ground-dwelling 26.444758 35.26000 31.23660 39.33108
Austrochaperina mehelyi Anura LC Ground-dwelling 25.440192 35.11574 31.33817 39.33993
Austrochaperina mehelyi Anura LC Ground-dwelling 27.672605 35.43631 31.46249 39.57017
Austrochaperina minutissima Anura DD Ground-dwelling 27.845401 35.59803 31.56635 39.83317
Austrochaperina minutissima Anura DD Ground-dwelling 27.169969 35.49905 31.36621 39.59801
Austrochaperina minutissima Anura DD Ground-dwelling 29.078135 35.77867 31.80544 40.13900
Austrochaperina novaebritanniae Anura VU Ground-dwelling 27.986561 35.50757 31.29525 39.66931
Austrochaperina novaebritanniae Anura VU Ground-dwelling 27.327108 35.41214 31.20455 39.56505
Austrochaperina novaebritanniae Anura VU Ground-dwelling 29.079477 35.66573 31.36616 39.76395
Austrochaperina palmipes Anura LC Stream-dwelling 26.973782 34.71546 30.63232 39.55467
Austrochaperina palmipes Anura LC Stream-dwelling 26.198077 34.60394 30.52087 39.44602
Austrochaperina palmipes Anura LC Stream-dwelling 28.335850 34.91128 30.81159 39.81488
Austrochaperina parkeri Anura DD Ground-dwelling 26.912160 35.40185 31.44289 39.99249
Austrochaperina parkeri Anura DD Ground-dwelling 25.976728 35.26523 31.18893 39.63536
Austrochaperina parkeri Anura DD Ground-dwelling 28.347255 35.61144 31.61308 40.23287
Austrochaperina pluvialis Anura LC Ground-dwelling 25.879276 35.22084 31.02653 39.41488
Austrochaperina pluvialis Anura LC Ground-dwelling 24.864983 35.07365 30.98588 39.32423
Austrochaperina pluvialis Anura LC Ground-dwelling 27.725747 35.48878 31.20352 39.67639
Austrochaperina polysticta Anura DD Ground-dwelling 26.147605 35.19059 31.13167 39.39117
Austrochaperina polysticta Anura DD Ground-dwelling 25.217439 35.05592 31.06021 39.26919
Austrochaperina polysticta Anura DD Ground-dwelling 27.388036 35.37017 31.25008 39.64146
Austrochaperina rivularis Anura LC Semi-aquatic 27.202656 35.68143 31.20413 39.77703
Austrochaperina rivularis Anura LC Semi-aquatic 26.450502 35.57079 31.12023 39.64509
Austrochaperina rivularis Anura LC Semi-aquatic 28.716475 35.90412 31.46248 40.09160
Austrochaperina robusta Anura LC Ground-dwelling 25.185191 35.04913 31.06418 38.85697
Austrochaperina robusta Anura LC Ground-dwelling 24.174823 34.90705 30.86089 38.61031
Austrochaperina robusta Anura LC Ground-dwelling 26.996457 35.30384 31.23078 39.17031
Austrochaperina septentrionalis Anura LC Ground-dwelling 26.334787 35.33444 30.81801 39.13233
Austrochaperina septentrionalis Anura LC Ground-dwelling 25.727820 35.24786 30.76790 39.06981
Austrochaperina septentrionalis Anura LC Ground-dwelling 27.356221 35.48014 30.90529 39.25883
Austrochaperina yelaensis Anura LC Ground-dwelling 27.383830 35.55542 31.27475 39.65883
Austrochaperina yelaensis Anura LC Ground-dwelling 26.980179 35.49680 31.24288 39.59725
Austrochaperina yelaensis Anura LC Ground-dwelling 28.297311 35.68808 31.41397 39.80452
Barygenys atra Anura LC Ground-dwelling 26.939898 35.37923 31.79251 40.04253
Barygenys atra Anura LC Ground-dwelling 26.089113 35.25806 31.59933 39.83494
Barygenys atra Anura LC Ground-dwelling 28.481419 35.59878 31.80517 40.13895
Barygenys cheesmanae Anura DD Ground-dwelling 25.503722 35.18301 30.92674 39.17910
Barygenys cheesmanae Anura DD Ground-dwelling 24.403102 35.02203 30.62242 38.91282
Barygenys cheesmanae Anura DD Ground-dwelling 27.519884 35.47792 31.22762 39.52866
Barygenys exsul Anura LC Ground-dwelling 27.383830 35.44940 31.33301 39.33889
Barygenys exsul Anura LC Ground-dwelling 26.980179 35.38965 31.29142 39.26324
Barygenys exsul Anura LC Ground-dwelling 28.297311 35.58461 31.42489 39.53317
Barygenys flavigularis Anura DD Ground-dwelling 27.114008 35.44612 31.16385 40.07458
Barygenys flavigularis Anura DD Ground-dwelling 25.920481 35.27408 30.93592 39.81702
Barygenys flavigularis Anura DD Ground-dwelling 28.336682 35.62236 31.45419 40.32560
Barygenys maculata Anura LC Ground-dwelling 27.346472 35.53757 31.07421 39.43577
Barygenys maculata Anura LC Ground-dwelling 26.794731 35.45632 31.02859 39.32517
Barygenys maculata Anura LC Ground-dwelling 28.681968 35.73426 31.34989 39.79180
Barygenys nana Anura LC Ground-dwelling 25.996649 35.25902 31.44829 39.74428
Barygenys nana Anura LC Ground-dwelling 25.021959 35.11704 31.34656 39.64216
Barygenys nana Anura LC Ground-dwelling 27.259877 35.44304 31.48398 39.93390
Barygenys parvula Anura NT Ground-dwelling 26.877863 35.38216 31.21135 39.77702
Barygenys parvula Anura NT Ground-dwelling 25.717515 35.21446 30.84414 39.36360
Barygenys parvula Anura NT Ground-dwelling 28.114896 35.56093 31.16082 39.83688
Callulops boettgeri Anura DD Ground-dwelling 27.574569 35.41594 30.75335 39.45495
Callulops boettgeri Anura DD Ground-dwelling 27.092805 35.34641 30.70383 39.38314
Callulops boettgeri Anura DD Ground-dwelling 28.751121 35.58574 30.58279 39.40658
Callulops comptus Anura LC Ground-dwelling 25.416480 35.16655 31.11346 39.32331
Callulops comptus Anura LC Ground-dwelling 24.481569 35.03065 30.99120 39.25482
Callulops comptus Anura LC Ground-dwelling 26.902441 35.38255 31.29458 39.54960
Callulops doriae Anura LC Fossorial 27.100759 36.29805 32.08051 41.09314
Callulops doriae Anura LC Fossorial 26.332622 36.18875 32.05899 41.05657
Callulops doriae Anura LC Fossorial 28.509417 36.49850 32.11997 41.16584
Callulops dubius Anura DD Ground-dwelling 27.453651 35.49552 31.11809 39.39259
Callulops dubius Anura DD Ground-dwelling 26.981340 35.42788 31.11838 39.39462
Callulops dubius Anura DD Ground-dwelling 28.629463 35.66388 31.21455 39.57503
Callulops fuscus Anura DD Ground-dwelling 27.303782 35.34130 31.25957 39.16697
Callulops fuscus Anura DD Ground-dwelling 26.893669 35.28256 31.20008 39.09608
Callulops fuscus Anura DD Ground-dwelling 28.312933 35.48585 31.36723 39.34190
Callulops glandulosus Anura DD Ground-dwelling 24.975843 35.04162 30.86060 39.45740
Callulops glandulosus Anura DD Ground-dwelling 24.070584 34.91207 30.82256 39.41566
Callulops glandulosus Anura DD Ground-dwelling 26.621819 35.27718 31.26999 39.84771
Callulops humicola Anura LC Ground-dwelling 26.040089 35.17274 30.77396 39.10449
Callulops humicola Anura LC Ground-dwelling 25.096472 35.03324 30.35772 38.65482
Callulops humicola Anura LC Ground-dwelling 27.361400 35.36807 31.02686 39.35504
Callulops kopsteini Anura DD Ground-dwelling 27.233429 35.45552 31.03963 39.66608
Callulops kopsteini Anura DD Ground-dwelling 26.820458 35.39507 30.99959 39.59687
Callulops kopsteini Anura DD Ground-dwelling 28.129383 35.58666 31.10251 39.73926
Callulops marmoratus Anura DD Ground-dwelling 25.635729 35.08149 30.87690 39.18156
Callulops marmoratus Anura DD Ground-dwelling 24.759954 34.95353 30.73764 39.09390
Callulops marmoratus Anura DD Ground-dwelling 27.136743 35.30081 31.08808 39.50987
Callulops personatus Anura LC Ground-dwelling 26.457449 35.20607 31.24561 39.49095
Callulops personatus Anura LC Ground-dwelling 25.726752 35.10151 31.14314 39.36309
Callulops personatus Anura LC Ground-dwelling 27.595071 35.36885 31.29732 39.60112
Callulops robustus Anura LC Ground-dwelling 27.862835 35.49592 31.08532 39.61872
Callulops robustus Anura LC Ground-dwelling 27.297700 35.41387 31.03960 39.49175
Callulops robustus Anura LC Ground-dwelling 29.000054 35.66103 31.31206 39.95255
Callulops sagittatus Anura DD Ground-dwelling 27.502423 35.38360 30.97779 39.48854
Callulops sagittatus Anura DD Ground-dwelling 26.907733 35.29801 30.90574 39.42940
Callulops sagittatus Anura DD Ground-dwelling 29.052931 35.60676 31.18217 39.79092
Callulops stictogaster Anura LC Ground-dwelling 26.008136 35.22222 31.37250 39.72790
Callulops stictogaster Anura LC Ground-dwelling 25.023553 35.08006 31.39870 39.74115
Callulops stictogaster Anura LC Ground-dwelling 27.374806 35.41954 31.64499 40.03404
Callulops wilhelmanus Anura LC Ground-dwelling 25.685340 35.08007 30.81943 39.35822
Callulops wilhelmanus Anura LC Ground-dwelling 24.754509 34.94533 30.66042 39.21422
Callulops wilhelmanus Anura LC Ground-dwelling 27.114873 35.28698 30.93394 39.56348
Cophixalus ateles Anura LC Ground-dwelling 27.989421 35.51508 31.48424 40.18712
Cophixalus ateles Anura LC Ground-dwelling 27.053955 35.37935 31.42007 40.08331
Cophixalus ateles Anura LC Ground-dwelling 29.717549 35.76580 31.58425 40.32799
Cophixalus balbus Anura LC Ground-dwelling 26.637695 35.45263 31.30147 39.54390
Cophixalus balbus Anura LC Ground-dwelling 25.991369 35.35951 31.22436 39.45442
Cophixalus balbus Anura LC Ground-dwelling 27.817338 35.62257 31.44283 39.73596
Cophixalus bewaniensis Anura DD Ground-dwelling 27.261563 35.42907 31.24246 39.90883
Cophixalus bewaniensis Anura DD Ground-dwelling 26.565708 35.32951 31.11726 39.70091
Cophixalus bewaniensis Anura DD Ground-dwelling 28.478084 35.60312 31.07782 39.87402
Cophixalus biroi Anura LC Arboreal 26.759981 35.16032 30.95829 39.53720
Cophixalus biroi Anura LC Arboreal 25.889589 35.03485 31.04713 39.54895
Cophixalus biroi Anura LC Arboreal 27.923612 35.32806 30.98370 39.58470
Cophixalus cheesmanae Anura LC Arboreal 26.808469 35.24882 30.65873 39.26665
Cophixalus cheesmanae Anura LC Arboreal 25.879384 35.11329 30.53543 39.08760
Cophixalus cheesmanae Anura LC Arboreal 28.172906 35.44785 30.88466 39.63076
Cophixalus crepitans Anura LC Ground-dwelling 27.348775 35.43946 30.59047 39.43446
Cophixalus crepitans Anura LC Ground-dwelling 26.621133 35.33305 30.76339 39.56144
Cophixalus crepitans Anura LC Ground-dwelling 29.170020 35.70581 30.71408 39.65511
Cophixalus cryptotympanum Anura LC Arboreal 27.445192 35.28789 30.90538 39.36538
Cophixalus cryptotympanum Anura LC Arboreal 26.825280 35.19786 31.05438 39.52668
Cophixalus cryptotympanum Anura LC Arboreal 28.763956 35.47941 31.00617 39.50788
Cophixalus daymani Anura DD Ground-dwelling 27.445192 35.51287 31.53073 39.70734
Cophixalus daymani Anura DD Ground-dwelling 26.825280 35.42427 31.43277 39.57284
Cophixalus daymani Anura DD Ground-dwelling 28.763956 35.70137 31.49217 39.76453
Cophixalus humicola Anura LC Ground-dwelling 27.203477 35.45116 31.42692 39.90975
Cophixalus humicola Anura LC Ground-dwelling 26.661107 35.37290 31.38776 39.84353
Cophixalus humicola Anura LC Ground-dwelling 28.395787 35.62321 31.51301 40.05534
Cophixalus kaindiensis Anura NT Ground-dwelling 27.114008 35.41739 31.11277 39.88581
Cophixalus kaindiensis Anura NT Ground-dwelling 25.920481 35.24845 30.92792 39.70718
Cophixalus kaindiensis Anura NT Ground-dwelling 28.336682 35.59045 31.33465 40.18695
Cophixalus misimae Anura CR Ground-dwelling 27.862835 35.55417 31.30138 39.91755
Cophixalus misimae Anura CR Ground-dwelling 27.297700 35.47174 30.92014 39.52539
Cophixalus misimae Anura CR Ground-dwelling 29.000054 35.72004 31.42263 40.06752
Cophixalus montanus Anura DD Ground-dwelling 27.574569 35.45182 30.98771 39.03611
Cophixalus montanus Anura DD Ground-dwelling 27.092805 35.38215 31.07176 39.04901
Cophixalus montanus Anura DD Ground-dwelling 28.751121 35.62198 31.04250 39.15570
Cophixalus nubicola Anura VU Ground-dwelling 25.101049 35.25234 31.32086 39.70617
Cophixalus nubicola Anura VU Ground-dwelling 24.199899 35.12256 31.36323 39.70735
Cophixalus nubicola Anura VU Ground-dwelling 26.607518 35.46929 31.67259 40.10873
Cophixalus parkeri Anura LC Arboreal 26.435090 35.25988 30.97310 39.33403
Cophixalus parkeri Anura LC Arboreal 25.422784 35.11315 30.88450 39.26522
Cophixalus parkeri Anura LC Arboreal 27.738085 35.44874 31.10468 39.51911
Cophixalus peninsularis Anura DD Arboreal 27.348775 35.34301 31.31059 39.58609
Cophixalus peninsularis Anura DD Arboreal 26.621133 35.23979 31.17108 39.38698
Cophixalus peninsularis Anura DD Arboreal 29.170020 35.60139 31.34578 39.72405
Cophixalus pipilans Anura LC Ground-dwelling 26.392705 35.28031 31.15077 39.66218
Cophixalus pipilans Anura LC Ground-dwelling 25.555766 35.16351 30.73740 39.23114
Cophixalus pipilans Anura LC Ground-dwelling 27.464108 35.42982 31.27161 39.83231
Cophixalus pulchellus Anura DD Arboreal 27.527429 35.46494 30.92831 39.50931
Cophixalus pulchellus Anura DD Arboreal 26.644801 35.33554 30.82423 39.35973
Cophixalus pulchellus Anura DD Arboreal 28.748087 35.64390 31.07976 39.73167
Cophixalus riparius Anura LC Ground-dwelling 26.488026 35.25588 31.09722 39.17828
Cophixalus riparius Anura LC Ground-dwelling 25.443340 35.10662 30.91700 38.97838
Cophixalus riparius Anura LC Ground-dwelling 27.752509 35.43655 31.17547 39.32133
Cophixalus shellyi Anura LC Arboreal 26.489586 35.16735 30.81685 39.34011
Cophixalus shellyi Anura LC Arboreal 25.472779 35.02070 30.67665 39.17371
Cophixalus shellyi Anura LC Arboreal 27.775780 35.35286 30.98015 39.58793
Cophixalus sphagnicola Anura EN Ground-dwelling 27.114008 35.34053 31.15049 39.29300
Cophixalus sphagnicola Anura EN Ground-dwelling 25.920481 35.16690 30.84096 38.92585
Cophixalus sphagnicola Anura EN Ground-dwelling 28.336682 35.51840 31.29103 39.49869
Cophixalus tagulensis Anura DD Stream-dwelling 27.211163 34.76731 30.09899 38.78608
Cophixalus tagulensis Anura DD Stream-dwelling 26.781256 34.70580 30.59961 39.25116
Cophixalus tagulensis Anura DD Stream-dwelling 28.187362 34.90697 30.51142 39.21191
Cophixalus tetzlaffi Anura DD Arboreal 26.915565 35.17497 31.30382 39.50430
Cophixalus tetzlaffi Anura DD Arboreal 26.462172 35.10987 31.27161 39.43095
Cophixalus tetzlaffi Anura DD Arboreal 27.731312 35.29210 31.31999 39.58397
Cophixalus timidus Anura CR Arboreal 27.247752 35.27167 30.99751 39.49222
Cophixalus timidus Anura CR Arboreal 26.764181 35.20163 30.92654 39.43278
Cophixalus timidus Anura CR Arboreal 28.599980 35.46752 31.12127 39.66279
Cophixalus tridactylus Anura DD Ground-dwelling 27.845401 35.45781 31.68519 39.92799
Cophixalus tridactylus Anura DD Ground-dwelling 27.169969 35.36131 31.64170 39.85707
Cophixalus tridactylus Anura DD Ground-dwelling 29.078135 35.63395 31.76457 40.01986
Cophixalus variabilis Anura LC Ground-dwelling 27.518252 35.39350 31.27197 40.11560
Cophixalus variabilis Anura LC Ground-dwelling 26.946462 35.31175 31.25984 39.99340
Cophixalus variabilis Anura LC Ground-dwelling 28.834286 35.58164 31.41438 40.30980
Cophixalus verecundus Anura LC Ground-dwelling 27.777034 35.40470 31.08826 39.30523
Cophixalus verecundus Anura LC Ground-dwelling 26.851879 35.27147 30.95973 39.14866
Cophixalus verecundus Anura LC Ground-dwelling 29.482554 35.65032 31.24230 39.58037
Cophixalus verrucosus Anura LC Arboreal 27.190697 35.38227 31.30964 39.66244
Cophixalus verrucosus Anura LC Arboreal 26.515616 35.28420 31.20354 39.53661
Cophixalus verrucosus Anura LC Arboreal 28.517214 35.57498 31.41504 39.83253
Cophixalus zweifeli Anura LC Ground-dwelling 27.394686 35.43602 31.53585 39.99414
Cophixalus zweifeli Anura LC Ground-dwelling 26.655439 35.32875 31.49595 39.90461
Cophixalus zweifeli Anura LC Ground-dwelling 29.322171 35.71570 31.69418 40.16759
Copiula exspectata Anura DD Ground-dwelling 26.229018 35.27869 31.06430 39.31138
Copiula exspectata Anura DD Ground-dwelling 25.905818 35.23216 31.03675 39.26883
Copiula exspectata Anura DD Ground-dwelling 26.983440 35.38732 31.16990 39.46224
Copiula fistulans Anura LC Ground-dwelling 26.865273 35.44531 31.29952 39.72268
Copiula fistulans Anura LC Ground-dwelling 25.906809 35.30642 31.32394 39.70955
Copiula fistulans Anura LC Ground-dwelling 28.228001 35.64278 31.58479 40.09379
Copiula major Anura DD Ground-dwelling 27.845401 35.47553 31.22883 39.58998
Copiula major Anura DD Ground-dwelling 27.169969 35.37765 31.07682 39.41815
Copiula major Anura DD Ground-dwelling 29.078135 35.65417 31.34350 39.75085
Copiula minor Anura LC Ground-dwelling 27.178121 35.46194 31.49273 39.81855
Copiula minor Anura LC Ground-dwelling 26.725102 35.39813 31.41009 39.75545
Copiula minor Anura LC Ground-dwelling 28.236662 35.61105 31.57886 40.00056
Copiula obsti Anura DD Ground-dwelling 27.845401 35.47676 30.84114 39.39026
Copiula obsti Anura DD Ground-dwelling 27.169969 35.38026 30.91866 39.41769
Copiula obsti Anura DD Ground-dwelling 29.078135 35.65288 31.05019 39.65831
Copiula oxyrhina Anura LC Ground-dwelling 27.862835 35.60198 31.90283 40.24455
Copiula oxyrhina Anura LC Ground-dwelling 27.297700 35.52056 31.85922 40.14970
Copiula oxyrhina Anura LC Ground-dwelling 29.000054 35.76583 31.25805 39.68961
Copiula pipiens Anura LC Ground-dwelling 26.921851 35.42051 31.05859 39.57275
Copiula pipiens Anura LC Ground-dwelling 26.169587 35.31129 30.94250 39.46647
Copiula pipiens Anura LC Ground-dwelling 28.064298 35.58639 31.34274 39.98059
Copiula tyleri Anura LC Ground-dwelling 26.770277 35.50028 31.33911 39.62436
Copiula tyleri Anura LC Ground-dwelling 25.940420 35.38097 31.30151 39.53081
Copiula tyleri Anura LC Ground-dwelling 27.966992 35.67234 31.78977 40.08348
Hylophorbus picoides Anura LC Ground-dwelling 27.380483 35.53893 31.64215 40.30248
Hylophorbus picoides Anura LC Ground-dwelling 26.816070 35.45569 31.01186 39.65658
Hylophorbus picoides Anura LC Ground-dwelling 28.404724 35.68999 31.75426 40.48899
Hylophorbus tetraphonus Anura LC Ground-dwelling 27.495006 35.52741 31.54404 40.30223
Hylophorbus tetraphonus Anura LC Ground-dwelling 26.931191 35.44547 31.54492 40.26975
Hylophorbus tetraphonus Anura LC Ground-dwelling 28.587127 35.68612 31.42237 40.23477
Hylophorbus sextus Anura LC Ground-dwelling 27.593026 35.53872 31.32636 40.29900
Hylophorbus sextus Anura LC Ground-dwelling 27.026354 35.45556 30.84635 39.76736
Hylophorbus sextus Anura LC Ground-dwelling 28.743322 35.70753 31.50066 40.53968
Hylophorbus rainerguentheri Anura LC Ground-dwelling 26.471024 35.38051 31.34154 39.46272
Hylophorbus rainerguentheri Anura LC Ground-dwelling 25.448283 35.23339 31.21706 39.26599
Hylophorbus rainerguentheri Anura LC Ground-dwelling 27.767099 35.56696 31.31468 39.50874
Hylophorbus richardsi Anura LC Ground-dwelling 26.381235 35.36740 31.36379 39.68352
Hylophorbus richardsi Anura LC Ground-dwelling 25.559568 35.24962 31.10189 39.43742
Hylophorbus richardsi Anura LC Ground-dwelling 27.943061 35.59129 31.50100 39.90879
Hylophorbus wondiwoi Anura LC Ground-dwelling 27.845401 35.64505 31.34522 39.64356
Hylophorbus wondiwoi Anura LC Ground-dwelling 27.169969 35.54693 31.25396 39.52359
Hylophorbus wondiwoi Anura LC Ground-dwelling 29.078135 35.82412 31.42526 39.87038
Hylophorbus rufescens Anura DD Ground-dwelling 27.496269 35.59589 31.29116 39.78239
Hylophorbus rufescens Anura DD Ground-dwelling 26.574102 35.46308 31.21355 39.62909
Hylophorbus rufescens Anura DD Ground-dwelling 29.191411 35.84002 31.42458 40.02045
Hylophorbus nigrinus Anura LC Ground-dwelling 24.803924 35.11569 30.62572 39.11587
Hylophorbus nigrinus Anura LC Ground-dwelling 24.189073 35.02797 30.39435 38.87528
Hylophorbus nigrinus Anura LC Ground-dwelling 25.975074 35.28276 31.40134 39.91351
Mantophryne louisiadensis Anura LC Ground-dwelling 27.383830 35.38952 31.23568 39.60694
Mantophryne louisiadensis Anura LC Ground-dwelling 26.980179 35.33160 31.17820 39.53870
Mantophryne louisiadensis Anura LC Ground-dwelling 28.297311 35.52059 31.34395 39.76137
Mantophryne lateralis Anura LC Ground-dwelling 26.981808 35.37161 31.35887 39.54118
Mantophryne lateralis Anura LC Ground-dwelling 26.204559 35.25879 31.29779 39.45955
Mantophryne lateralis Anura LC Ground-dwelling 28.350264 35.57023 31.46642 39.68657
Oreophryne albopunctata Anura LC Arboreal 27.219466 35.28695 30.95054 39.33816
Oreophryne albopunctata Anura LC Arboreal 26.545465 35.18918 31.04425 39.34699
Oreophryne albopunctata Anura LC Arboreal 28.539073 35.47838 31.55333 39.98968
Oreophryne alticola Anura DD Ground-dwelling 25.363952 35.20780 30.80097 39.19696
Oreophryne alticola Anura DD Ground-dwelling 24.632364 35.10276 30.70998 39.11864
Oreophryne alticola Anura DD Ground-dwelling 26.831311 35.41848 31.03480 39.49509
Oreophryne anthonyi Anura LC Arboreal 27.231939 35.29307 31.08136 39.75148
Oreophryne anthonyi Anura LC Arboreal 26.334073 35.16434 30.99005 39.64081
Oreophryne anthonyi Anura LC Arboreal 28.929734 35.53648 31.33469 40.05077
Oreophryne anulata Anura LC Arboreal 27.507106 35.38761 31.59061 39.53007
Oreophryne anulata Anura LC Arboreal 26.968265 35.31053 31.48678 39.43812
Oreophryne anulata Anura LC Arboreal 28.626665 35.54776 31.75769 39.74492
Oreophryne asplenicola Anura DD Arboreal 26.229018 35.09340 30.72617 38.94682
Oreophryne asplenicola Anura DD Arboreal 25.905818 35.04669 30.67598 38.90203
Oreophryne asplenicola Anura DD Arboreal 26.983440 35.20241 30.83259 39.07385
Oreophryne pseudasplenicola Anura DD Arboreal 26.229018 35.10290 31.36560 39.58353
Oreophryne pseudasplenicola Anura DD Arboreal 25.905818 35.05583 31.23083 39.42602
Oreophryne pseudasplenicola Anura DD Arboreal 26.983440 35.21276 31.47833 39.71108
Oreophryne atrigularis Anura DD Arboreal 26.822005 35.35760 31.23242 39.45130
Oreophryne atrigularis Anura DD Arboreal 26.281715 35.27987 30.69871 38.90435
Oreophryne atrigularis Anura DD Arboreal 27.992418 35.52601 31.37516 39.63831
Oreophryne biroi Anura LC Arboreal 26.668075 35.15591 30.97642 38.80681
Oreophryne biroi Anura LC Arboreal 25.809498 35.03212 30.93361 38.67156
Oreophryne biroi Anura LC Arboreal 27.827739 35.32311 31.29867 39.14413
Oreophryne brachypus Anura LC Arboreal 27.432098 35.21479 30.39848 39.05243
Oreophryne brachypus Anura LC Arboreal 26.804252 35.12432 30.29669 38.90901
Oreophryne brachypus Anura LC Arboreal 28.499417 35.36857 30.54248 39.26914
Oreophryne brevicrus Anura DD Arboreal 25.980655 35.13069 30.94256 39.37167
Oreophryne brevicrus Anura DD Arboreal 25.299772 35.03130 30.86198 39.23926
Oreophryne brevicrus Anura DD Arboreal 27.417968 35.34049 31.06456 39.60769
Oreophryne brevirostris Anura VU Ground-dwelling 25.363952 35.29817 31.11337 39.43125
Oreophryne brevirostris Anura VU Ground-dwelling 24.632364 35.19223 31.03985 39.34108
Oreophryne brevirostris Anura VU Ground-dwelling 26.831311 35.51064 31.27291 39.67245
Oreophryne celebensis Anura VU Arboreal 27.268793 35.23642 31.34384 39.72485
Oreophryne celebensis Anura VU Arboreal 26.829377 35.17247 30.95043 39.30580
Oreophryne celebensis Anura VU Arboreal 28.234574 35.37697 31.16338 39.59882
Oreophryne clamata Anura DD Arboreal 27.845401 35.45514 31.62218 39.73221
Oreophryne clamata Anura DD Arboreal 27.169969 35.35589 31.48184 39.58289
Oreophryne clamata Anura DD Arboreal 29.078135 35.63629 31.72786 39.90766
Oreophryne crucifer Anura LC Arboreal 26.793287 35.27665 31.26738 39.54846
Oreophryne crucifer Anura LC Arboreal 26.137173 35.18136 31.48976 39.74337
Oreophryne crucifer Anura LC Arboreal 28.152891 35.47412 31.35333 39.68308
Oreophryne flava Anura DD Arboreal 25.766822 35.01906 30.79618 38.88361
Oreophryne flava Anura DD Arboreal 25.032848 34.91458 30.69059 38.76334
Oreophryne flava Anura DD Arboreal 27.118529 35.21148 30.92757 39.04815
Oreophryne frontifasciata Anura DD Arboreal 26.973444 35.25402 31.23075 39.60173
Oreophryne frontifasciata Anura DD Arboreal 26.572501 35.19646 31.24721 39.62932
Oreophryne frontifasciata Anura DD Arboreal 27.925720 35.39072 31.29577 39.73419
Oreophryne geislerorum Anura LC Arboreal 27.008257 35.22783 30.62353 39.15588
Oreophryne geislerorum Anura LC Arboreal 26.073967 35.09432 30.54569 39.00291
Oreophryne geislerorum Anura LC Arboreal 28.473400 35.43719 31.14267 39.73476
Oreophryne geminus Anura DD Arboreal 27.502423 35.44148 30.42745 39.16654
Oreophryne geminus Anura DD Arboreal 26.907733 35.35531 30.34246 39.07786
Oreophryne geminus Anura DD Arboreal 29.052931 35.66617 30.63088 39.43733
Oreophryne habbemensis Anura DD Arboreal 27.214059 35.27739 31.09166 39.82328
Oreophryne habbemensis Anura DD Arboreal 26.634587 35.19421 30.92849 39.58574
Oreophryne habbemensis Anura DD Arboreal 28.591282 35.47509 31.26157 40.09087
Oreophryne hypsiops Anura LC Arboreal 26.888262 35.30030 31.04134 39.39005
Oreophryne hypsiops Anura LC Arboreal 25.989501 35.17006 30.94933 39.30850
Oreophryne hypsiops Anura LC Arboreal 28.089676 35.47440 31.07309 39.39292
Oreophryne idenburgensis Anura LC Arboreal 28.154814 35.37970 30.86815 39.55308
Oreophryne idenburgensis Anura LC Arboreal 27.593367 35.29816 31.08451 39.70961
Oreophryne idenburgensis Anura LC Arboreal 29.270349 35.54171 30.87727 39.60834
Oreophryne inornata Anura LC Arboreal 27.178121 35.22089 31.39478 39.79201
Oreophryne inornata Anura LC Arboreal 26.725102 35.15483 31.30231 39.66904
Oreophryne inornata Anura LC Arboreal 28.236662 35.37527 31.49277 39.99633
Oreophryne insulana Anura VU Arboreal 27.178121 35.29790 31.11702 39.57054
Oreophryne insulana Anura VU Arboreal 26.725102 35.23222 31.06187 39.48744
Oreophryne insulana Anura VU Arboreal 28.236662 35.45135 30.94499 39.45252
Oreophryne jeffersoniana Anura LC Arboreal 27.287651 35.23073 30.88762 39.36824
Oreophryne jeffersoniana Anura LC Arboreal 26.701152 35.14598 30.77118 39.25988
Oreophryne jeffersoniana Anura LC Arboreal 28.412526 35.39329 30.91206 39.43638
Oreophryne kampeni Anura DD Arboreal 27.777034 35.31716 31.18694 39.64512
Oreophryne kampeni Anura DD Arboreal 26.851879 35.18382 31.05902 39.47834
Oreophryne kampeni Anura DD Arboreal 29.482554 35.56297 31.42276 39.96436
Oreophryne kapisa Anura LC Arboreal 26.694751 35.16423 31.08695 39.51276
Oreophryne kapisa Anura LC Arboreal 26.281601 35.10362 31.01997 39.43868
Oreophryne kapisa Anura LC Arboreal 27.702190 35.31201 31.15480 39.52895
Oreophryne loriae Anura DD Arboreal 27.777034 35.39140 31.20779 39.68644
Oreophryne loriae Anura DD Arboreal 26.851879 35.25719 31.07626 39.45113
Oreophryne loriae Anura DD Arboreal 29.482554 35.63883 31.31669 39.99365
Oreophryne minuta Anura LC Arboreal 23.777654 34.69610 30.40764 38.84036
Oreophryne minuta Anura LC Arboreal 22.879292 34.56701 30.37463 38.68690
Oreophryne minuta Anura LC Arboreal 25.403142 34.92966 30.82484 39.42986
Oreophryne moluccensis Anura LC Arboreal 27.398548 35.40461 31.21147 39.71812
Oreophryne moluccensis Anura LC Arboreal 26.932215 35.33747 31.19842 39.67823
Oreophryne moluccensis Anura LC Arboreal 28.405925 35.54965 31.40797 39.95335
Oreophryne monticola Anura EN Arboreal 27.448992 35.37365 31.35108 40.10274
Oreophryne monticola Anura EN Arboreal 26.901087 35.29376 31.46676 40.18433
Oreophryne monticola Anura EN Arboreal 28.757779 35.56449 31.56063 40.40936
Oreophryne notata Anura LC Arboreal 26.043316 35.18221 30.88358 39.45641
Oreophryne notata Anura LC Arboreal 25.233607 35.06426 30.53254 39.05801
Oreophryne notata Anura LC Arboreal 27.636538 35.41429 31.08448 39.75607
Oreophryne rookmaakeri Anura EN Arboreal 26.786266 35.24730 31.17988 39.41088
Oreophryne rookmaakeri Anura EN Arboreal 26.285892 35.17656 31.12785 39.30791
Oreophryne rookmaakeri Anura EN Arboreal 27.729346 35.38063 31.23162 39.55089
Oreophryne sibilans Anura DD Arboreal 27.845401 35.37566 30.61970 39.72501
Oreophryne sibilans Anura DD Arboreal 27.169969 35.27674 30.66971 39.74918
Oreophryne sibilans Anura DD Arboreal 29.078135 35.55620 31.32061 40.55113
Oreophryne terrestris Anura DD Arboreal 27.502423 35.36720 31.33317 39.80918
Oreophryne terrestris Anura DD Arboreal 26.907733 35.28185 31.20939 39.65952
Oreophryne terrestris Anura DD Arboreal 29.052931 35.58974 31.63811 40.24446
Oreophryne unicolor Anura DD Arboreal 27.302994 35.23724 31.17620 39.78941
Oreophryne unicolor Anura DD Arboreal 26.755648 35.15789 31.09895 39.69814
Oreophryne unicolor Anura DD Arboreal 28.357958 35.39016 31.34719 39.98436
Oreophryne variabilis Anura VU Arboreal 27.055844 35.34320 30.52324 39.20959
Oreophryne variabilis Anura VU Arboreal 26.608549 35.27818 30.47021 39.11413
Oreophryne variabilis Anura VU Arboreal 28.148244 35.50200 31.50883 40.25319
Oreophryne waira Anura DD Arboreal 26.229018 35.20217 30.77880 39.21380
Oreophryne waira Anura DD Arboreal 25.905818 35.15460 30.74288 39.18280
Oreophryne waira Anura DD Arboreal 26.983440 35.31322 30.86265 39.34178
Oreophryne wapoga Anura DD Arboreal 25.574513 35.01714 30.87344 39.19997
Oreophryne wapoga Anura DD Arboreal 25.037509 34.93949 30.92663 39.17426
Oreophryne wapoga Anura DD Arboreal 26.655764 35.17349 31.02164 39.44716
Sphenophryne cornuta Anura LC Ground-dwelling 26.977163 35.38578 31.54357 39.72785
Sphenophryne cornuta Anura LC Ground-dwelling 26.237909 35.27878 31.35505 39.55888
Sphenophryne cornuta Anura LC Ground-dwelling 28.314545 35.57935 31.70769 39.96028
Gastrophrynoides borneensis Anura LC Fossorial 27.817745 37.49115 32.77561 41.56591
Gastrophrynoides borneensis Anura LC Fossorial 27.227945 37.40759 32.91595 41.67690
Gastrophrynoides borneensis Anura LC Fossorial 29.064576 37.66780 32.91295 41.73222
Glyphoglossus molossus Anura NT Fossorial 28.177162 39.33792 34.69206 43.56015
Glyphoglossus molossus Anura NT Fossorial 27.291267 39.21444 34.58557 43.42870
Glyphoglossus molossus Anura NT Fossorial 29.911327 39.57964 34.90170 43.87767
Microhyla achatina Anura LC Ground-dwelling 27.378116 38.00496 34.41175 41.79685
Microhyla achatina Anura LC Ground-dwelling 26.753950 37.91637 34.34629 41.69707
Microhyla achatina Anura LC Ground-dwelling 28.613796 38.18036 34.57992 42.05124
Microhyla borneensis Anura LC Ground-dwelling 28.415681 38.13511 34.41880 41.80731
Microhyla borneensis Anura LC Ground-dwelling 27.803645 38.05013 34.26993 41.60896
Microhyla borneensis Anura LC Ground-dwelling 29.770827 38.32326 34.59594 42.05787
Microhyla berdmorei Anura LC Ground-dwelling 27.176788 38.53025 34.60353 42.26440
Microhyla berdmorei Anura LC Ground-dwelling 26.310018 38.40923 34.58859 42.19495
Microhyla berdmorei Anura LC Ground-dwelling 28.907954 38.77198 34.79463 42.58573
Microhyla pulchra Anura LC Ground-dwelling 27.192679 38.50410 34.61520 42.87619
Microhyla pulchra Anura LC Ground-dwelling 26.045162 38.34379 34.46867 42.59448
Microhyla pulchra Anura LC Ground-dwelling 29.222134 38.78761 34.78740 43.30764
Microhyla rubra Anura LC Ground-dwelling 26.948454 38.42714 34.77001 42.39655
Microhyla rubra Anura LC Ground-dwelling 25.970531 38.28968 34.53892 42.11616
Microhyla rubra Anura LC Ground-dwelling 29.224183 38.74702 35.13571 42.83983
Microhyla maculifera Anura DD Ground-dwelling 28.020276 38.63493 35.18926 41.74179
Microhyla maculifera Anura DD Ground-dwelling 27.481036 38.55957 35.07853 41.60940
Microhyla maculifera Anura DD Ground-dwelling 29.285741 38.81177 35.21894 41.88690
Microhyla chakrapanii Anura DD Ground-dwelling 28.433477 38.62004 34.45523 42.31523
Microhyla chakrapanii Anura DD Ground-dwelling 27.775285 38.52876 34.41911 42.22230
Microhyla chakrapanii Anura DD Ground-dwelling 29.813372 38.81141 34.56933 42.54808
Microhyla karunaratnei Anura EN Ground-dwelling 27.155513 38.56514 34.77295 42.58063
Microhyla karunaratnei Anura EN Ground-dwelling 26.400558 38.45918 34.76558 42.54107
Microhyla karunaratnei Anura EN Ground-dwelling 29.086524 38.83618 35.12455 43.08737
Microhyla palmipes Anura LC Ground-dwelling 27.929706 38.64255 34.66325 42.56120
Microhyla palmipes Anura LC Ground-dwelling 27.317477 38.55788 34.60844 42.48310
Microhyla palmipes Anura LC Ground-dwelling 29.211018 38.81976 34.68558 42.71032
Microhyla mixtura Anura LC Ground-dwelling 24.493283 38.05618 34.18621 42.11156
Microhyla mixtura Anura LC Ground-dwelling 21.819669 37.68362 33.83463 41.68246
Microhyla mixtura Anura LC Ground-dwelling 27.662491 38.49781 34.80886 42.98184
Microhyla okinavensis Anura LC Ground-dwelling 27.398651 38.53504 34.91508 42.80930
Microhyla okinavensis Anura LC Ground-dwelling 26.569599 38.41813 34.82537 42.65694
Microhyla okinavensis Anura LC Ground-dwelling 28.425063 38.67979 35.07403 43.06066
Microhyla superciliaris Anura LC Ground-dwelling 28.172595 38.69323 34.66084 42.75585
Microhyla superciliaris Anura LC Ground-dwelling 27.509213 38.59846 34.59673 42.63725
Microhyla superciliaris Anura LC Ground-dwelling 29.519663 38.88567 34.81353 43.06541
Microhyla picta Anura DD Ground-dwelling 27.738562 38.67377 34.17243 42.40916
Microhyla picta Anura DD Ground-dwelling 26.846457 38.54936 34.09644 42.22368
Microhyla picta Anura DD Ground-dwelling 29.381932 38.90295 34.57681 43.03455
Microhyla pulverata Anura DD Ground-dwelling 27.001410 38.48410 34.90961 42.71595
Microhyla pulverata Anura DD Ground-dwelling 26.005306 38.34338 34.80238 42.54223
Microhyla pulverata Anura DD Ground-dwelling 28.753804 38.73165 35.02603 43.05605
Microhyla sholigari Anura EN Ground-dwelling 27.093701 38.41652 34.74674 42.20810
Microhyla sholigari Anura EN Ground-dwelling 25.947438 38.25457 34.60841 42.05568
Microhyla sholigari Anura EN Ground-dwelling 29.609423 38.77197 34.99717 42.62384
Microhyla zeylanica Anura EN Semi-aquatic 27.155513 38.64749 35.05081 42.77102
Microhyla zeylanica Anura EN Semi-aquatic 26.400558 38.54224 34.89834 42.63456
Microhyla zeylanica Anura EN Semi-aquatic 29.086524 38.91669 35.21419 43.08664
Micryletta inornata Anura LC Ground-dwelling 28.222927 38.03330 33.74980 42.89732
Micryletta inornata Anura LC Ground-dwelling 27.585494 37.94312 33.66773 42.78046
Micryletta inornata Anura LC Ground-dwelling 29.525959 38.21766 33.90631 43.12814
Micryletta steinegeri Anura VU Ground-dwelling 27.830572 38.01503 33.53135 42.63411
Micryletta steinegeri Anura VU Ground-dwelling 27.162324 37.92093 33.54646 42.57066
Micryletta steinegeri Anura VU Ground-dwelling 29.012632 38.18148 33.48110 42.65096
Chaperina fusca Anura LC Ground-dwelling 27.862947 37.93733 33.05785 42.05755
Chaperina fusca Anura LC Ground-dwelling 27.240890 37.84669 33.61578 42.56003
Chaperina fusca Anura LC Ground-dwelling 29.157758 38.12598 33.24487 42.27645
Kaloula assamensis Anura LC Arboreal 25.985769 38.17660 34.42711 41.62329
Kaloula assamensis Anura LC Arboreal 25.295046 38.08017 34.38234 41.54908
Kaloula assamensis Anura LC Arboreal 27.427739 38.37790 34.55812 41.77188
Kaloula aureata Anura DD Arboreal 28.241012 38.35462 34.92979 42.24196
Kaloula aureata Anura DD Arboreal 27.534343 38.25447 34.92070 42.17251
Kaloula aureata Anura DD Arboreal 30.018221 38.60647 35.06610 42.52114
Kaloula baleata Anura LC Arboreal 27.275423 38.26931 34.89361 41.72308
Kaloula baleata Anura LC Arboreal 26.657741 38.17936 34.54159 41.34377
Kaloula baleata Anura LC Arboreal 28.512588 38.44948 34.90498 41.80089
Kaloula mediolineata Anura NT Ground-dwelling 28.454066 38.51579 35.08249 41.85505
Kaloula mediolineata Anura NT Ground-dwelling 27.525827 38.38238 34.93742 41.71907
Kaloula mediolineata Anura NT Ground-dwelling 30.207615 38.76781 35.29454 42.14530
Kaloula conjuncta Anura LC Ground-dwelling 27.466524 38.24857 35.21688 41.52537
Kaloula conjuncta Anura LC Ground-dwelling 26.955859 38.17579 35.16109 41.43154
Kaloula conjuncta Anura LC Ground-dwelling 28.503860 38.39641 35.32551 41.73032
Kaloula rigida Anura LC Ground-dwelling 27.851477 38.15801 35.11558 41.30261
Kaloula rigida Anura LC Ground-dwelling 27.340335 38.08607 34.92970 41.08361
Kaloula rigida Anura LC Ground-dwelling 28.781554 38.28892 35.15886 41.42465
Kaloula kokacii Anura LC Arboreal 27.719892 37.80090 34.66198 40.83465
Kaloula kokacii Anura LC Arboreal 27.254276 37.73509 34.63858 40.78272
Kaloula kokacii Anura LC Arboreal 28.665494 37.93457 34.67330 40.93713
Kaloula picta Anura LC Ground-dwelling 27.562607 38.23111 34.77901 41.59050
Kaloula picta Anura LC Ground-dwelling 27.065278 38.16078 34.71737 41.48914
Kaloula picta Anura LC Ground-dwelling 28.585089 38.37570 34.84215 41.71374
Kaloula borealis Anura LC Ground-dwelling 23.109940 37.91727 34.26145 41.72380
Kaloula borealis Anura LC Ground-dwelling 19.999996 37.48274 33.68317 40.96621
Kaloula borealis Anura LC Ground-dwelling 26.678721 38.41592 34.67833 42.24585
Kaloula rugifera Anura LC Ground-dwelling 21.335897 37.68231 34.00238 41.24535
Kaloula rugifera Anura LC Ground-dwelling 19.042130 37.35112 33.70428 40.88754
Kaloula rugifera Anura LC Ground-dwelling 23.900153 38.05255 34.31632 41.62434
Kaloula verrucosa Anura LC Ground-dwelling 21.361032 37.72431 34.31366 41.47022
Kaloula verrucosa Anura LC Ground-dwelling 20.158832 37.55466 34.15418 41.32322
Kaloula verrucosa Anura LC Ground-dwelling 23.479573 38.02327 34.62391 41.81360
Uperodon globulosus Anura LC Fossorial 26.992147 39.22193 35.46079 43.44009
Uperodon globulosus Anura LC Fossorial 25.985155 39.07808 35.37821 43.30658
Uperodon globulosus Anura LC Fossorial 29.122401 39.52624 35.77862 43.87981
Uperodon systoma Anura LC Fossorial 26.572107 39.07833 35.41977 43.41077
Uperodon systoma Anura LC Fossorial 25.360500 38.90966 35.28459 43.22476
Uperodon systoma Anura LC Fossorial 28.689765 39.37313 35.78110 43.80425
Metaphrynella pollicaris Anura LC Arboreal 28.129488 38.04880 33.71231 42.57326
Metaphrynella pollicaris Anura LC Arboreal 27.450139 37.95285 33.61544 42.41062
Metaphrynella pollicaris Anura LC Arboreal 29.507214 38.24336 33.72788 42.64551
Metaphrynella sundana Anura LC Arboreal 27.828043 37.99540 33.77750 42.63173
Metaphrynella sundana Anura LC Arboreal 27.215376 37.90737 33.20340 42.02279
Metaphrynella sundana Anura LC Arboreal 29.093282 38.17720 33.45135 42.41359
Phrynella pulchra Anura LC Arboreal 28.226119 38.19189 33.74954 42.52288
Phrynella pulchra Anura LC Arboreal 27.598927 38.10263 33.73080 42.47876
Phrynella pulchra Anura LC Arboreal 29.548987 38.38016 33.95687 42.88845
Dyscophus insularis Anura LC Ground-dwelling 26.542159 37.64449 33.37549 42.28295
Dyscophus insularis Anura LC Ground-dwelling 25.674898 37.52218 32.98010 41.90656
Dyscophus insularis Anura LC Ground-dwelling 28.125559 37.86779 33.73016 42.66090
Dyscophus antongilii Anura LC Ground-dwelling 25.730559 37.42830 33.08435 42.66046
Dyscophus antongilii Anura LC Ground-dwelling 24.785176 37.29291 32.99723 42.40651
Dyscophus antongilii Anura LC Ground-dwelling 27.213399 37.64067 32.65863 42.36640
Dyscophus guineti Anura LC Ground-dwelling 25.737089 37.39470 32.54984 42.25828
Dyscophus guineti Anura LC Ground-dwelling 24.842030 37.26760 32.37121 42.08939
Dyscophus guineti Anura LC Ground-dwelling 27.131667 37.59273 32.72100 42.50048
Hildebrandtia macrotympanum Anura LC Fossorial 24.975628 38.51023 33.01964 44.07341
Hildebrandtia macrotympanum Anura LC Fossorial 24.233630 38.40961 33.00986 44.05585
Hildebrandtia macrotympanum Anura LC Fossorial 26.367303 38.69896 32.97546 44.01746
Hildebrandtia ornatissima Anura DD Fossorial 24.225516 38.44086 32.61565 44.39309
Hildebrandtia ornatissima Anura DD Fossorial 22.922554 38.26432 32.35464 44.16273
Hildebrandtia ornatissima Anura DD Fossorial 26.459734 38.74357 32.83922 44.72192
Hildebrandtia ornata Anura LC Fossorial 25.119061 38.68559 32.21644 43.64886
Hildebrandtia ornata Anura LC Fossorial 24.116271 38.54844 32.10123 43.53976
Hildebrandtia ornata Anura LC Fossorial 27.190689 38.96891 32.39346 43.95295
Lanzarana largeni Anura LC Ground-dwelling 25.507663 37.73965 32.09700 43.02122
Lanzarana largeni Anura LC Ground-dwelling 24.732881 37.63598 31.80783 42.69768
Lanzarana largeni Anura LC Ground-dwelling 27.014343 37.94125 32.20720 43.15580
Ptychadena aequiplicata Anura LC Semi-aquatic 27.272190 38.21484 32.79286 44.16789
Ptychadena aequiplicata Anura LC Semi-aquatic 26.541724 38.11561 32.72035 44.03416
Ptychadena aequiplicata Anura LC Semi-aquatic 28.857842 38.43024 33.01594 44.46097
Ptychadena obscura Anura LC Ground-dwelling 23.649534 37.43049 32.18666 43.23779
Ptychadena obscura Anura LC Ground-dwelling 22.735129 37.30736 32.06498 43.10663
Ptychadena obscura Anura LC Ground-dwelling 25.723779 37.70982 32.50865 43.64897
Ptychadena mahnerti Anura LC Semi-aquatic 21.148543 37.44013 31.57068 42.54966
Ptychadena mahnerti Anura LC Semi-aquatic 20.268628 37.31966 31.40388 42.37006
Ptychadena mahnerti Anura LC Semi-aquatic 22.951524 37.68698 31.88275 42.88846
Ptychadena uzungwensis Anura LC Semi-aquatic 24.063804 37.82424 32.52625 43.54093
Ptychadena uzungwensis Anura LC Semi-aquatic 23.118099 37.69618 32.59164 43.63325
Ptychadena uzungwensis Anura LC Semi-aquatic 26.156065 38.10756 32.72170 43.81683
Ptychadena porosissima Anura LC Ground-dwelling 23.504276 37.50554 32.12002 43.04989
Ptychadena porosissima Anura LC Ground-dwelling 22.526147 37.37425 31.96095 42.87896
Ptychadena porosissima Anura LC Ground-dwelling 25.588543 37.78531 32.38766 43.40185
Ptychadena perreti Anura LC Ground-dwelling 27.302217 37.90141 32.52439 43.87882
Ptychadena perreti Anura LC Ground-dwelling 26.533698 37.79744 32.44093 43.75017
Ptychadena perreti Anura LC Ground-dwelling 28.946558 38.12386 32.61288 43.98630
Ptychadena anchietae Anura LC Semi-aquatic 23.988810 37.70707 32.09532 42.87163
Ptychadena anchietae Anura LC Semi-aquatic 23.041766 37.57714 31.93096 42.67483
Ptychadena anchietae Anura LC Semi-aquatic 25.941464 37.97496 32.44577 43.19556
Ptychadena oxyrhynchus Anura LC Ground-dwelling 25.256933 37.68902 31.85769 43.24557
Ptychadena oxyrhynchus Anura LC Ground-dwelling 24.349637 37.56744 32.09675 43.41339
Ptychadena oxyrhynchus Anura LC Ground-dwelling 27.175888 37.94616 31.96733 43.40471
Ptychadena tellinii Anura LC Ground-dwelling 26.925017 37.94675 32.39270 43.20352
Ptychadena tellinii Anura LC Ground-dwelling 26.066808 37.83022 32.28465 43.01190
Ptychadena tellinii Anura LC Ground-dwelling 28.839099 38.20666 32.24024 43.15572
Ptychadena longirostris Anura LC Ground-dwelling 27.549540 37.94516 32.68009 43.41177
Ptychadena longirostris Anura LC Ground-dwelling 26.927995 37.85895 32.28784 42.98864
Ptychadena longirostris Anura LC Ground-dwelling 28.885605 38.13047 32.84907 43.62178
Ptychadena bunoderma Anura LC Ground-dwelling 24.665865 37.62773 32.67238 43.21795
Ptychadena bunoderma Anura LC Ground-dwelling 23.730351 37.50009 32.36853 42.87753
Ptychadena bunoderma Anura LC Ground-dwelling 26.829208 37.92289 32.76629 43.38240
Ptychadena upembae Anura LC Semi-aquatic 24.024196 37.82853 32.69150 43.68427
Ptychadena upembae Anura LC Semi-aquatic 23.088830 37.70238 32.39168 43.41764
Ptychadena upembae Anura LC Semi-aquatic 26.157763 38.11629 33.06803 44.04472
Ptychadena ansorgii Anura LC Semi-aquatic 24.135549 37.86620 32.08070 43.80489
Ptychadena ansorgii Anura LC Semi-aquatic 23.162948 37.73566 31.97129 43.69506
Ptychadena ansorgii Anura LC Semi-aquatic 26.305206 38.15740 32.32476 44.18091
Ptychadena arnei Anura DD Ground-dwelling 27.327738 37.96941 32.18022 43.59053
Ptychadena arnei Anura DD Ground-dwelling 26.649769 37.87919 32.10875 43.51883
Ptychadena arnei Anura DD Ground-dwelling 28.758064 38.15976 32.28542 43.70647
Ptychadena pumilio Anura LC Semi-aquatic 27.052530 38.12940 32.44026 43.67844
Ptychadena pumilio Anura LC Semi-aquatic 26.221871 38.01665 32.54747 43.71228
Ptychadena pumilio Anura LC Semi-aquatic 28.841595 38.37224 32.63817 43.94340
Ptychadena retropunctata Anura LC Semi-aquatic 27.329956 38.19226 31.95983 43.36650
Ptychadena retropunctata Anura LC Semi-aquatic 26.495621 38.07807 31.97197 43.30167
Ptychadena retropunctata Anura LC Semi-aquatic 29.258116 38.45615 32.45069 43.90075
Ptychadena bibroni Anura LC Ground-dwelling 27.245140 37.88253 32.28186 43.59809
Ptychadena bibroni Anura LC Ground-dwelling 26.458026 37.77572 32.17398 43.45333
Ptychadena bibroni Anura LC Ground-dwelling 29.004106 38.12122 32.44000 43.89893
Ptychadena christyi Anura LC Ground-dwelling 24.409417 37.45427 32.36257 43.53427
Ptychadena christyi Anura LC Ground-dwelling 23.708436 37.36032 32.29371 43.42049
Ptychadena christyi Anura LC Ground-dwelling 25.971336 37.66360 32.48878 43.67128
Ptychadena stenocephala Anura LC Ground-dwelling 25.738501 37.61168 32.15733 43.17800
Ptychadena stenocephala Anura LC Ground-dwelling 25.010310 37.51329 32.19705 43.24507
Ptychadena stenocephala Anura LC Ground-dwelling 27.383050 37.83388 32.48930 43.58652
Ptychadena broadleyi Anura NT Ground-dwelling 25.582109 37.61431 32.10548 43.15007
Ptychadena broadleyi Anura NT Ground-dwelling 24.484506 37.46686 32.05243 43.12742
Ptychadena broadleyi Anura NT Ground-dwelling 27.641894 37.89101 32.42528 43.44478
Ptychadena keilingi Anura LC Ground-dwelling 24.485195 37.43458 31.90411 43.01204
Ptychadena keilingi Anura LC Ground-dwelling 23.664369 37.32373 31.75524 42.90695
Ptychadena keilingi Anura LC Ground-dwelling 26.636057 37.72505 32.15178 43.34498
Ptychadena chrysogaster Anura LC Ground-dwelling 21.961072 37.08841 31.33584 42.49502
Ptychadena chrysogaster Anura LC Ground-dwelling 21.297542 36.99747 31.23179 42.39084
Ptychadena chrysogaster Anura LC Ground-dwelling 23.310389 37.27332 31.68562 42.91173
Ptychadena harenna Anura DD Ground-dwelling 20.132346 36.87476 31.27961 42.50237
Ptychadena harenna Anura DD Ground-dwelling 19.211996 36.74987 30.82072 42.03780
Ptychadena harenna Anura DD Ground-dwelling 21.359748 37.04130 31.64937 42.82983
Ptychadena cooperi Anura LC Semi-aquatic 19.750731 37.22298 31.51527 42.99914
Ptychadena cooperi Anura LC Semi-aquatic 18.856488 37.10077 31.09215 42.59234
Ptychadena cooperi Anura LC Semi-aquatic 21.240207 37.42652 31.44961 42.93237
Ptychadena erlangeri Anura NT Ground-dwelling 21.164735 37.16759 31.64921 43.13498
Ptychadena erlangeri Anura NT Ground-dwelling 20.300004 37.05075 31.22804 42.69929
Ptychadena erlangeri Anura NT Ground-dwelling 22.844425 37.39455 31.62121 43.06862
Ptychadena nana Anura EN Ground-dwelling 18.971614 36.87051 30.88798 42.33348
Ptychadena nana Anura EN Ground-dwelling 18.034702 36.74290 30.74703 42.24671
Ptychadena nana Anura EN Ground-dwelling 20.396658 37.06461 31.00722 42.45686
Ptychadena wadei Anura DD Ground-dwelling 23.030078 37.44152 31.91100 43.29313
Ptychadena wadei Anura DD Ground-dwelling 22.020236 37.30777 31.79831 43.19511
Ptychadena wadei Anura DD Ground-dwelling 25.466633 37.76423 32.45994 43.96558
Ptychadena filwoha Anura DD Semi-aquatic 19.886092 37.10386 31.63599 43.20537
Ptychadena filwoha Anura DD Semi-aquatic 19.110801 36.99815 31.55215 43.09473
Ptychadena filwoha Anura DD Semi-aquatic 21.649636 37.34432 31.52997 43.16704
Ptychadena subpunctata Anura LC Aquatic 24.226415 37.62204 32.06785 43.75811
Ptychadena subpunctata Anura LC Aquatic 23.186029 37.47992 31.81011 43.45999
Ptychadena subpunctata Anura LC Aquatic 26.431595 37.92327 32.69468 44.38116
Ptychadena gansi Anura LC Ground-dwelling 26.165743 37.75488 32.08882 43.44043
Ptychadena gansi Anura LC Ground-dwelling 25.487552 37.66327 32.16070 43.45148
Ptychadena gansi Anura LC Ground-dwelling 27.381596 37.91911 32.31796 43.70294
Ptychadena grandisonae Anura LC Ground-dwelling 24.030374 37.45675 32.06042 43.15966
Ptychadena grandisonae Anura LC Ground-dwelling 23.086623 37.32865 31.99274 43.08411
Ptychadena grandisonae Anura LC Ground-dwelling 26.110102 37.73903 32.41184 43.70968
Ptychadena guibei Anura LC Ground-dwelling 24.615759 37.57045 31.82362 42.75231
Ptychadena guibei Anura LC Ground-dwelling 23.644338 37.43664 31.94516 42.92292
Ptychadena guibei Anura LC Ground-dwelling 26.729773 37.86165 32.19365 43.16894
Ptychadena neumanni Anura LC Semi-aquatic 21.331237 37.39762 32.34029 43.15723
Ptychadena neumanni Anura LC Semi-aquatic 20.472127 37.27995 32.28683 43.14695
Ptychadena neumanni Anura LC Semi-aquatic 23.017854 37.62863 32.38986 43.24500
Ptychadena ingeri Anura DD Semi-aquatic 26.370345 37.98861 32.67760 43.68508
Ptychadena ingeri Anura DD Semi-aquatic 25.546184 37.87772 32.57590 43.56223
Ptychadena ingeri Anura DD Semi-aquatic 27.990002 38.20655 32.30657 43.44380
Ptychadena submascareniensis Anura DD Ground-dwelling 27.321113 37.90227 32.80726 43.41656
Ptychadena submascareniensis Anura DD Ground-dwelling 26.551229 37.79781 32.69754 43.30519
Ptychadena submascareniensis Anura DD Ground-dwelling 28.999608 38.13001 33.11503 43.75781
Ptychadena mapacha Anura DD Ground-dwelling 24.523745 37.52569 32.20364 43.29594
Ptychadena mapacha Anura DD Ground-dwelling 23.385089 37.37079 32.01135 43.07697
Ptychadena mapacha Anura DD Ground-dwelling 26.760769 37.83000 32.06329 43.22486
Ptychadena straeleni Anura LC Ground-dwelling 26.807505 37.84629 32.36997 43.09176
Ptychadena straeleni Anura LC Ground-dwelling 25.940036 37.72613 32.33856 43.02470
Ptychadena straeleni Anura LC Ground-dwelling 28.620859 38.09749 32.68686 43.35720
Ptychadena mascareniensis Anura LC Semi-aquatic 25.593142 37.92922 31.64697 43.33363
Ptychadena mascareniensis Anura LC Semi-aquatic 24.676346 37.80436 31.53781 43.24857
Ptychadena mascareniensis Anura LC Semi-aquatic 27.454304 38.18271 31.86858 43.59648
Ptychadena newtoni Anura EN Semi-aquatic 26.962622 38.16965 32.56076 43.31892
Ptychadena newtoni Anura EN Semi-aquatic 26.447166 38.09798 32.50891 43.24925
Ptychadena newtoni Anura EN Semi-aquatic 27.902257 38.30030 32.72770 43.49653
Ptychadena nilotica Anura LC Semi-aquatic 23.898387 37.68269 32.30177 43.52692
Ptychadena nilotica Anura LC Semi-aquatic 22.989256 37.55898 32.13049 43.40841
Ptychadena nilotica Anura LC Semi-aquatic 25.744587 37.93391 32.38093 43.72768
Ptychadena taenioscelis Anura LC Ground-dwelling 24.467514 37.43242 31.87300 43.11504
Ptychadena taenioscelis Anura LC Ground-dwelling 23.532159 37.30521 31.69421 42.97614
Ptychadena taenioscelis Anura LC Ground-dwelling 26.515354 37.71094 31.92877 43.24746
Ptychadena trinodis Anura LC Ground-dwelling 27.239698 37.84528 32.34728 43.42987
Ptychadena trinodis Anura LC Ground-dwelling 26.366108 37.72711 32.28986 43.36213
Ptychadena trinodis Anura LC Ground-dwelling 29.199946 38.11044 32.52110 43.70946
Ptychadena mossambica Anura LC Ground-dwelling 23.973279 37.38731 31.78704 43.15386
Ptychadena mossambica Anura LC Ground-dwelling 22.947109 37.24724 31.71201 43.02219
Ptychadena mossambica Anura LC Ground-dwelling 26.020380 37.66673 32.00417 43.56132
Ptychadena tournieri Anura LC Semi-aquatic 27.495397 38.11833 32.01642 43.47529
Ptychadena tournieri Anura LC Semi-aquatic 26.716207 38.01228 31.93042 43.37036
Ptychadena tournieri Anura LC Semi-aquatic 29.197567 38.34999 32.26584 43.99656
Ptychadena perplicata Anura LC Ground-dwelling 24.365031 37.52894 31.89620 42.87186
Ptychadena perplicata Anura LC Ground-dwelling 23.457735 37.40284 31.77966 42.73829
Ptychadena perplicata Anura LC Ground-dwelling 26.516490 37.82797 32.20416 43.24722
Ptychadena schillukorum Anura LC Ground-dwelling 25.476659 37.65477 32.19797 43.16891
Ptychadena schillukorum Anura LC Ground-dwelling 24.596875 37.53303 32.06852 42.99451
Ptychadena schillukorum Anura LC Ground-dwelling 27.386727 37.91908 32.26720 43.37250
Ptychadena pujoli Anura DD Ground-dwelling 27.410974 37.89083 32.31433 43.49434
Ptychadena pujoli Anura DD Ground-dwelling 26.604538 37.78041 32.23589 43.36632
Ptychadena pujoli Anura DD Ground-dwelling 29.266951 38.14496 32.22906 43.51435
Ptychadena superciliaris Anura LC Ground-dwelling 27.417447 37.94039 32.88324 43.85987
Ptychadena superciliaris Anura LC Ground-dwelling 26.769532 37.85221 32.79250 43.77327
Ptychadena superciliaris Anura LC Ground-dwelling 28.785386 38.12659 32.79262 43.85253
Odontobatrachus natator Anura LC Stream-dwelling 27.379190 37.14671 31.20361 42.43587
Odontobatrachus natator Anura LC Stream-dwelling 26.658713 37.04693 30.86516 42.11571
Odontobatrachus natator Anura LC Stream-dwelling 28.967572 37.36669 31.31829 42.57921
Phrynobatrachus latifrons Anura LC Ground-dwelling 27.467079 37.82826 32.31607 43.22600
Phrynobatrachus latifrons Anura LC Ground-dwelling 26.704510 37.72549 32.30693 43.17562
Phrynobatrachus latifrons Anura LC Ground-dwelling 29.249954 38.06854 32.35460 43.30034
Phrynobatrachus asper Anura VU Semi-aquatic 23.942704 37.69558 31.84577 42.41645
Phrynobatrachus asper Anura VU Semi-aquatic 23.230154 37.59761 31.79246 42.30076
Phrynobatrachus asper Anura VU Semi-aquatic 25.735535 37.94208 32.55860 43.17266
Phrynobatrachus acridoides Anura LC Semi-aquatic 24.194696 37.64388 32.48259 43.04775
Phrynobatrachus acridoides Anura LC Semi-aquatic 23.299486 37.52396 32.37740 42.93199
Phrynobatrachus acridoides Anura LC Semi-aquatic 26.030331 37.88978 32.80549 43.37093
Phrynobatrachus pakenhami Anura EN Semi-aquatic 25.270144 37.85164 32.28040 42.84930
Phrynobatrachus pakenhami Anura EN Semi-aquatic 24.690553 37.77354 32.22628 42.77110
Phrynobatrachus pakenhami Anura EN Semi-aquatic 26.277953 37.98743 32.36592 42.96750
Phrynobatrachus bullans Anura LC Semi-aquatic 21.706633 37.31702 32.44244 42.88954
Phrynobatrachus bullans Anura LC Semi-aquatic 20.814877 37.19472 32.32289 42.77905
Phrynobatrachus bullans Anura LC Semi-aquatic 23.717262 37.59276 32.80547 43.21912
Phrynobatrachus francisci Anura LC Ground-dwelling 27.429725 37.72343 32.74331 43.30013
Phrynobatrachus francisci Anura LC Ground-dwelling 26.587795 37.60977 32.59171 43.14960
Phrynobatrachus francisci Anura LC Ground-dwelling 29.280664 37.97329 33.13969 43.77209
Phrynobatrachus natalensis Anura LC Ground-dwelling 24.852439 37.53217 32.30797 42.61058
Phrynobatrachus natalensis Anura LC Ground-dwelling 23.882636 37.39955 32.29250 42.50354
Phrynobatrachus natalensis Anura LC Ground-dwelling 26.807929 37.79958 32.73845 43.08278
Phrynobatrachus bequaerti Anura LC Semi-aquatic 22.841422 37.40341 31.85241 42.29083
Phrynobatrachus bequaerti Anura LC Semi-aquatic 22.192000 37.31475 31.71213 42.18895
Phrynobatrachus bequaerti Anura LC Semi-aquatic 24.292990 37.60159 32.11633 42.55889
Phrynobatrachus africanus Anura LC Semi-aquatic 27.135654 38.10534 32.94379 43.87595
Phrynobatrachus africanus Anura LC Semi-aquatic 26.406612 38.00473 32.83338 43.75270
Phrynobatrachus africanus Anura LC Semi-aquatic 28.732569 38.32572 33.08605 43.98304
Phrynobatrachus elberti Anura DD Ground-dwelling 26.929643 37.81477 32.07270 42.71229
Phrynobatrachus elberti Anura DD Ground-dwelling 26.075198 37.70005 31.91370 42.54158
Phrynobatrachus elberti Anura DD Ground-dwelling 28.505136 38.02629 32.06084 42.73075
Phrynobatrachus brevipalmatus Anura DD Ground-dwelling 26.300291 37.69868 32.29339 42.43311
Phrynobatrachus brevipalmatus Anura DD Ground-dwelling 25.435372 37.58225 32.14478 42.29400
Phrynobatrachus brevipalmatus Anura DD Ground-dwelling 28.045141 37.93357 32.68030 42.84062
Phrynobatrachus albomarginatus Anura DD Ground-dwelling 26.584696 37.75112 33.02463 43.61690
Phrynobatrachus albomarginatus Anura DD Ground-dwelling 25.706014 37.63062 32.96856 43.56499
Phrynobatrachus albomarginatus Anura DD Ground-dwelling 28.283994 37.98417 33.25629 43.80333
Phrynobatrachus mababiensis Anura LC Semi-aquatic 23.854869 37.57229 31.26215 42.71948
Phrynobatrachus mababiensis Anura LC Semi-aquatic 22.745396 37.41937 31.40859 42.83070
Phrynobatrachus mababiensis Anura LC Semi-aquatic 26.004033 37.86852 32.41027 43.89704
Phrynobatrachus alleni Anura LC Semi-aquatic 27.456303 38.02215 32.93293 44.44733
Phrynobatrachus alleni Anura LC Semi-aquatic 26.815376 37.93285 32.28302 43.78305
Phrynobatrachus alleni Anura LC Semi-aquatic 28.851389 38.21654 33.15144 44.66456
Phrynobatrachus phyllophilus Anura LC Ground-dwelling 27.423763 37.77517 32.51462 43.27624
Phrynobatrachus phyllophilus Anura LC Ground-dwelling 26.810424 37.69226 32.30548 43.06300
Phrynobatrachus phyllophilus Anura LC Ground-dwelling 28.708333 37.94882 32.59451 43.37323
Phrynobatrachus ghanensis Anura NT Ground-dwelling 27.377000 37.70690 32.40376 43.10337
Phrynobatrachus ghanensis Anura NT Ground-dwelling 26.849559 37.63678 32.41293 43.03272
Phrynobatrachus ghanensis Anura NT Ground-dwelling 28.507691 37.85721 32.52452 43.29107
Phrynobatrachus guineensis Anura LC Arboreal 27.385856 37.62481 32.41749 42.96939
Phrynobatrachus guineensis Anura LC Arboreal 26.725991 37.53454 32.38383 42.92881
Phrynobatrachus guineensis Anura LC Arboreal 28.792322 37.81724 32.59243 43.20500
Phrynobatrachus annulatus Anura LC Semi-aquatic 27.432500 38.08671 32.41574 43.22194
Phrynobatrachus annulatus Anura LC Semi-aquatic 26.830920 38.00536 32.33859 43.11746
Phrynobatrachus annulatus Anura LC Semi-aquatic 28.669592 38.25399 32.57439 43.45155
Phrynobatrachus calcaratus Anura LC Semi-aquatic 27.248224 38.02303 32.83165 43.54781
Phrynobatrachus calcaratus Anura LC Semi-aquatic 26.537214 37.92549 32.63236 43.37187
Phrynobatrachus calcaratus Anura LC Semi-aquatic 28.797552 38.23557 32.96964 43.68954
Phrynobatrachus villiersi Anura LC Ground-dwelling 27.420563 37.87765 32.44626 43.51702
Phrynobatrachus villiersi Anura LC Ground-dwelling 26.840079 37.79824 32.31240 43.39123
Phrynobatrachus villiersi Anura LC Ground-dwelling 28.636487 38.04400 32.56864 43.66314
Phrynobatrachus cornutus Anura LC Ground-dwelling 27.232853 37.80902 32.28683 42.93954
Phrynobatrachus cornutus Anura LC Ground-dwelling 26.486967 37.70855 32.22853 42.85192
Phrynobatrachus cornutus Anura LC Ground-dwelling 28.841268 38.02568 32.47762 43.22600
Phrynobatrachus anotis Anura DD Ground-dwelling 24.875041 37.35713 31.90964 43.00850
Phrynobatrachus anotis Anura DD Ground-dwelling 23.987706 37.23713 31.82542 42.91289
Phrynobatrachus anotis Anura DD Ground-dwelling 26.945121 37.63708 32.39769 43.74462
Phrynobatrachus nanus Anura DD Ground-dwelling 26.929643 37.62562 32.21176 43.38540
Phrynobatrachus nanus Anura DD Ground-dwelling 26.075198 37.51002 32.27400 43.44094
Phrynobatrachus nanus Anura DD Ground-dwelling 28.505136 37.83878 32.44924 43.62001
Phrynobatrachus auritus Anura LC Ground-dwelling 27.136103 37.69685 31.60081 42.57345
Phrynobatrachus auritus Anura LC Ground-dwelling 26.390169 37.59600 31.56453 42.53229
Phrynobatrachus auritus Anura LC Ground-dwelling 28.758974 37.91626 31.84081 42.85221
Phrynobatrachus plicatus Anura LC Semi-aquatic 27.597663 38.07268 32.44072 43.68297
Phrynobatrachus plicatus Anura LC Semi-aquatic 26.997449 37.99118 32.39372 43.57100
Phrynobatrachus plicatus Anura LC Semi-aquatic 28.880316 38.24683 32.64113 43.92226
Phrynobatrachus gastoni Anura DD Ground-dwelling 27.525575 37.82432 32.38801 43.51718
Phrynobatrachus gastoni Anura DD Ground-dwelling 26.819979 37.72877 32.18956 43.28254
Phrynobatrachus gastoni Anura DD Ground-dwelling 29.021698 38.02691 32.49805 43.73691
Phrynobatrachus batesii Anura LC Ground-dwelling 26.908678 37.68642 32.29713 42.65481
Phrynobatrachus batesii Anura LC Ground-dwelling 26.260927 37.59920 32.23518 42.55130
Phrynobatrachus batesii Anura LC Ground-dwelling 28.358980 37.88168 32.48509 42.88657
Phrynobatrachus werneri Anura LC Stream-dwelling 26.364077 36.99593 31.80209 42.79422
Phrynobatrachus werneri Anura LC Stream-dwelling 25.677902 36.90450 31.73560 42.69778
Phrynobatrachus werneri Anura LC Stream-dwelling 27.796225 37.18676 31.51888 42.56630
Phrynobatrachus cricogaster Anura NT Semi-aquatic 26.711430 37.91632 32.89185 43.77831
Phrynobatrachus cricogaster Anura NT Semi-aquatic 26.082844 37.83122 32.93473 43.81617
Phrynobatrachus cricogaster Anura NT Semi-aquatic 28.073502 38.10071 32.93269 43.85123
Phrynobatrachus steindachneri Anura CR Semi-aquatic 25.797540 37.82141 32.42790 43.09683
Phrynobatrachus steindachneri Anura CR Semi-aquatic 25.033748 37.71848 32.38151 43.00938
Phrynobatrachus steindachneri Anura CR Semi-aquatic 27.461922 38.04572 32.57635 43.24982
Phrynobatrachus chukuchuku Anura CR Semi-aquatic 25.529022 37.74764 32.07026 43.00856
Phrynobatrachus chukuchuku Anura CR Semi-aquatic 24.726769 37.63654 31.71871 42.64878
Phrynobatrachus chukuchuku Anura CR Semi-aquatic 27.197252 37.97866 32.46798 43.37619
Phrynobatrachus breviceps Anura DD Ground-dwelling 21.407079 36.89892 31.75267 42.30228
Phrynobatrachus breviceps Anura DD Ground-dwelling 20.534143 36.78183 31.65631 42.16482
Phrynobatrachus breviceps Anura DD Ground-dwelling 23.114784 37.12796 31.71193 42.31903
Phrynobatrachus hylaios Anura LC Semi-aquatic 27.032015 37.96095 32.94655 43.54448
Phrynobatrachus hylaios Anura LC Semi-aquatic 26.291097 37.86023 32.89051 43.49502
Phrynobatrachus hylaios Anura LC Semi-aquatic 28.657137 38.18186 33.09435 43.72760
Phrynobatrachus graueri Anura LC Semi-aquatic 22.529553 37.56614 32.61528 43.25314
Phrynobatrachus graueri Anura LC Semi-aquatic 21.796567 37.46635 32.51044 43.16612
Phrynobatrachus graueri Anura LC Semi-aquatic 24.109980 37.78131 32.82793 43.45689
Phrynobatrachus kinangopensis Anura VU Semi-aquatic 21.132444 37.30797 32.27498 43.08785
Phrynobatrachus kinangopensis Anura VU Semi-aquatic 20.271533 37.19176 31.56990 42.36326
Phrynobatrachus kinangopensis Anura VU Semi-aquatic 22.863109 37.54160 32.64972 43.42333
Phrynobatrachus cryptotis Anura DD Ground-dwelling 24.875041 37.49700 32.66052 43.29358
Phrynobatrachus cryptotis Anura DD Ground-dwelling 23.987706 37.37879 32.51422 43.17738
Phrynobatrachus cryptotis Anura DD Ground-dwelling 26.945121 37.77277 32.64292 43.38275
Phrynobatrachus irangi Anura CR Ground-dwelling 21.604114 37.03773 30.89100 41.62937
Phrynobatrachus irangi Anura CR Ground-dwelling 20.748344 36.92133 30.74314 41.48827
Phrynobatrachus irangi Anura CR Ground-dwelling 23.379651 37.27922 31.26778 41.99284
Phrynobatrachus dalcqi Anura DD Ground-dwelling 24.955931 37.44187 32.27647 42.74851
Phrynobatrachus dalcqi Anura DD Ground-dwelling 24.197975 37.33771 32.21870 42.67630
Phrynobatrachus dalcqi Anura DD Ground-dwelling 26.974012 37.71919 32.55547 43.13112
Phrynobatrachus intermedius Anura CR Semi-aquatic 27.430034 38.09139 32.96793 43.80807
Phrynobatrachus intermedius Anura CR Semi-aquatic 26.951094 38.02657 32.89947 43.72938
Phrynobatrachus intermedius Anura CR Semi-aquatic 28.364550 38.21788 33.09932 43.94391
Phrynobatrachus liberiensis Anura LC Semi-aquatic 27.423763 38.02691 31.99699 43.00165
Phrynobatrachus liberiensis Anura LC Semi-aquatic 26.810424 37.94314 31.89780 42.90026
Phrynobatrachus liberiensis Anura LC Semi-aquatic 28.708333 38.20237 33.08940 44.18756
Phrynobatrachus tokba Anura LC Ground-dwelling 27.377488 37.81862 32.71401 43.31502
Phrynobatrachus tokba Anura LC Ground-dwelling 26.697159 37.72530 32.71285 43.24001
Phrynobatrachus tokba Anura LC Ground-dwelling 28.822872 38.01689 32.71648 43.33023
Phrynobatrachus dispar Anura LC Semi-aquatic 27.154492 37.96166 32.78581 43.70681
Phrynobatrachus dispar Anura LC Semi-aquatic 26.573730 37.88385 32.70778 43.64591
Phrynobatrachus dispar Anura LC Semi-aquatic 28.071748 38.08455 32.90904 43.80298
Phrynobatrachus leveleve Anura LC Semi-aquatic 26.962622 37.93910 32.64009 43.25971
Phrynobatrachus leveleve Anura LC Semi-aquatic 26.447166 37.86977 32.65079 43.25086
Phrynobatrachus leveleve Anura LC Semi-aquatic 27.902257 38.06549 32.73657 43.45850
Phrynobatrachus inexpectatus Anura DD Ground-dwelling 19.601740 36.72768 31.21283 41.91114
Phrynobatrachus inexpectatus Anura DD Ground-dwelling 18.728317 36.60729 31.38468 42.07249
Phrynobatrachus inexpectatus Anura DD Ground-dwelling 21.017766 36.92286 31.51699 42.25587
Phrynobatrachus minutus Anura LC Semi-aquatic 20.966474 37.20567 32.05143 42.55694
Phrynobatrachus minutus Anura LC Semi-aquatic 20.113596 37.08708 31.98309 42.45491
Phrynobatrachus minutus Anura LC Semi-aquatic 22.625456 37.43633 32.34814 42.97705
Phrynobatrachus scheffleri Anura LC Semi-aquatic 22.818299 37.45257 31.72822 42.60571
Phrynobatrachus scheffleri Anura LC Semi-aquatic 22.024321 37.34219 31.73789 42.60608
Phrynobatrachus scheffleri Anura LC Semi-aquatic 24.502986 37.68676 31.85308 42.74352
Phrynobatrachus rungwensis Anura LC Semi-aquatic 23.231342 37.43185 32.25288 42.63037
Phrynobatrachus rungwensis Anura LC Semi-aquatic 22.326536 37.30820 32.15916 42.54397
Phrynobatrachus rungwensis Anura LC Semi-aquatic 25.200687 37.70098 32.45687 42.86502
Phrynobatrachus uzungwensis Anura NT Stream-dwelling 22.907733 36.55430 31.08880 41.51639
Phrynobatrachus uzungwensis Anura NT Stream-dwelling 22.176691 36.45455 31.01525 41.40737
Phrynobatrachus uzungwensis Anura NT Stream-dwelling 24.569435 36.78103 31.95870 42.36545
Phrynobatrachus parvulus Anura LC Ground-dwelling 23.882439 37.32580 32.57429 43.04357
Phrynobatrachus parvulus Anura LC Ground-dwelling 22.881479 37.18855 32.45284 42.92430
Phrynobatrachus parvulus Anura LC Ground-dwelling 26.005776 37.61696 32.73849 43.25988
Phrynobatrachus keniensis Anura LC Semi-aquatic 21.024880 37.21257 31.74477 42.31311
Phrynobatrachus keniensis Anura LC Semi-aquatic 20.146531 37.09158 31.63525 42.15139
Phrynobatrachus keniensis Anura LC Semi-aquatic 22.791154 37.45587 31.88079 42.48529
Phrynobatrachus fraterculus Anura LC Semi-aquatic 27.402735 37.96232 32.59842 43.23395
Phrynobatrachus fraterculus Anura LC Semi-aquatic 26.727854 37.87111 32.50116 43.09653
Phrynobatrachus fraterculus Anura LC Semi-aquatic 28.840554 38.15663 32.79275 43.40712
Phrynobatrachus gutturosus Anura LC Semi-aquatic 27.601280 38.04115 32.21033 43.67589
Phrynobatrachus gutturosus Anura LC Semi-aquatic 26.924136 37.94908 31.99922 43.41692
Phrynobatrachus gutturosus Anura LC Semi-aquatic 29.111145 38.24644 32.33142 43.86778
Phrynobatrachus pintoi Anura EN Ground-dwelling 27.528684 37.73896 32.93455 43.70441
Phrynobatrachus pintoi Anura EN Ground-dwelling 26.539829 37.60300 32.70320 43.40245
Phrynobatrachus pintoi Anura EN Ground-dwelling 29.995306 38.07812 33.12768 44.05205
Phrynobatrachus kakamikro Anura DD Ground-dwelling 22.399394 37.04644 31.85406 42.16638
Phrynobatrachus kakamikro Anura DD Ground-dwelling 21.547124 36.92946 31.83899 42.13334
Phrynobatrachus kakamikro Anura DD Ground-dwelling 24.407608 37.32210 32.01549 42.38388
Phrynobatrachus taiensis Anura DD Ground-dwelling 27.383034 37.86017 32.66915 43.40434
Phrynobatrachus taiensis Anura DD Ground-dwelling 26.826832 37.78412 32.63385 43.29555
Phrynobatrachus taiensis Anura DD Ground-dwelling 28.509345 38.01416 32.72899 43.49185
Phrynobatrachus giorgii Anura DD Ground-dwelling 27.975086 37.87561 32.39965 43.06873
Phrynobatrachus giorgii Anura DD Ground-dwelling 27.181114 37.76663 32.83374 43.47385
Phrynobatrachus giorgii Anura DD Ground-dwelling 29.796180 38.12558 32.74953 43.45259
Phrynobatrachus scapularis Anura LC Semi-aquatic 26.731862 37.87646 32.57926 43.18852
Phrynobatrachus scapularis Anura LC Semi-aquatic 25.998834 37.77698 32.46187 43.07832
Phrynobatrachus scapularis Anura LC Semi-aquatic 28.248023 38.08222 32.79672 43.45876
Phrynobatrachus ogoensis Anura DD Ground-dwelling 28.500678 38.03091 32.61370 43.01644
Phrynobatrachus ogoensis Anura DD Ground-dwelling 27.707785 37.92275 32.52575 42.89614
Phrynobatrachus ogoensis Anura DD Ground-dwelling 30.192685 38.26172 32.80014 43.43366
Phrynobatrachus perpalmatus Anura LC Semi-aquatic 25.360747 37.72113 32.37649 42.95339
Phrynobatrachus perpalmatus Anura LC Semi-aquatic 24.496307 37.60432 32.06938 42.62540
Phrynobatrachus perpalmatus Anura LC Semi-aquatic 27.255450 37.97716 32.49975 43.10188
Phrynobatrachus pallidus Anura LC Semi-aquatic 25.385792 37.84588 32.45185 43.23881
Phrynobatrachus pallidus Anura LC Semi-aquatic 24.752530 37.75942 32.35766 43.14504
Phrynobatrachus pallidus Anura LC Semi-aquatic 26.400448 37.98442 32.60278 43.43394
Phrynobatrachus rouxi Anura DD Ground-dwelling 20.753210 36.95941 31.64889 42.59111
Phrynobatrachus rouxi Anura DD Ground-dwelling 20.197015 36.88491 31.59614 42.56805
Phrynobatrachus rouxi Anura DD Ground-dwelling 22.102730 37.14016 31.77687 42.64705
Phrynobatrachus parkeri Anura LC Ground-dwelling 27.488918 37.78418 32.15892 43.11306
Phrynobatrachus parkeri Anura LC Ground-dwelling 26.722970 37.68171 32.10954 43.02890
Phrynobatrachus parkeri Anura LC Ground-dwelling 29.108736 38.00089 32.34186 43.34854
Phrynobatrachus sternfeldi Anura DD Ground-dwelling 27.261500 37.70057 32.14310 42.93968
Phrynobatrachus sternfeldi Anura DD Ground-dwelling 26.381103 37.58173 32.03452 42.77288
Phrynobatrachus sternfeldi Anura DD Ground-dwelling 29.092843 37.94779 32.74979 43.62812
Phrynobatrachus pygmaeus Anura DD Ground-dwelling 26.929643 37.62657 31.57899 42.57440
Phrynobatrachus pygmaeus Anura DD Ground-dwelling 26.075198 37.51137 31.42878 42.45071
Phrynobatrachus pygmaeus Anura DD Ground-dwelling 28.505136 37.83899 31.78159 42.84349
Phrynobatrachus sulfureogularis Anura VU Ground-dwelling 22.868668 37.12126 31.77944 42.23173
Phrynobatrachus sulfureogularis Anura VU Ground-dwelling 22.244298 37.03795 31.60499 42.04028
Phrynobatrachus sulfureogularis Anura VU Ground-dwelling 24.006892 37.27313 31.70087 42.15988
Phrynobatrachus stewartae Anura LC Semi-aquatic 22.730026 37.28484 32.19214 42.81446
Phrynobatrachus stewartae Anura LC Semi-aquatic 21.864481 37.16807 32.10929 42.70407
Phrynobatrachus stewartae Anura LC Semi-aquatic 24.775766 37.56083 32.44338 43.16276
Phrynobatrachus ukingensis Anura LC Semi-aquatic 22.822168 37.36035 31.88082 42.57992
Phrynobatrachus ukingensis Anura LC Semi-aquatic 21.986275 37.24744 31.77524 42.41503
Phrynobatrachus ukingensis Anura LC Semi-aquatic 24.305862 37.56076 32.31407 43.12226
Phrynobatrachus ungujae Anura EN Ground-dwelling 25.208823 37.45651 31.90265 42.56586
Phrynobatrachus ungujae Anura EN Ground-dwelling 24.606120 37.37480 31.88458 42.51704
Phrynobatrachus ungujae Anura EN Ground-dwelling 26.248684 37.59749 32.05485 42.74695
Phrynobatrachus acutirostris Anura NT Stream-dwelling 22.763005 36.60941 31.66522 42.31079
Phrynobatrachus acutirostris Anura NT Stream-dwelling 22.081281 36.51660 31.50102 42.10580
Phrynobatrachus acutirostris Anura NT Stream-dwelling 24.429182 36.83622 31.72676 42.46569
Phrynobatrachus dendrobates Anura LC Ground-dwelling 24.678445 37.40076 31.92202 42.82849
Phrynobatrachus dendrobates Anura LC Ground-dwelling 23.991734 37.30843 31.82903 42.75091
Phrynobatrachus dendrobates Anura LC Ground-dwelling 26.255270 37.61276 32.13553 43.11557
Phrynobatrachus petropedetoides Anura DD Ground-dwelling 24.320764 37.38661 32.38993 43.44910
Phrynobatrachus petropedetoides Anura DD Ground-dwelling 23.579763 37.28666 32.23552 43.31925
Phrynobatrachus petropedetoides Anura DD Ground-dwelling 26.380765 37.66447 32.65634 43.72312
Phrynobatrachus versicolor Anura LC Ground-dwelling 22.022972 37.14241 31.98215 42.45373
Phrynobatrachus versicolor Anura LC Ground-dwelling 21.379117 37.05518 31.99071 42.46351
Phrynobatrachus versicolor Anura LC Ground-dwelling 23.360656 37.32365 32.16796 42.65558
Phrynobatrachus krefftii Anura EN Ground-dwelling 24.969464 37.52031 32.53527 43.22583
Phrynobatrachus krefftii Anura EN Ground-dwelling 24.301742 37.42847 32.26723 42.91478
Phrynobatrachus krefftii Anura EN Ground-dwelling 25.986178 37.66014 32.72380 43.40594
Phrynobatrachus sandersoni Anura LC Ground-dwelling 26.614433 37.92648 32.96414 43.90737
Phrynobatrachus sandersoni Anura LC Ground-dwelling 26.007117 37.84294 32.90139 43.81584
Phrynobatrachus sandersoni Anura LC Ground-dwelling 28.001310 38.11723 33.22854 44.21346
Conraua alleni Anura LC Stream-dwelling 27.394504 37.11735 32.14655 42.64266
Conraua alleni Anura LC Stream-dwelling 26.731473 37.02722 32.07978 42.52630
Conraua alleni Anura LC Stream-dwelling 28.809585 37.30971 31.89897 42.44972
Conraua robusta Anura VU Stream-dwelling 26.520896 37.10445 32.33223 43.11026
Conraua robusta Anura VU Stream-dwelling 25.891618 37.01834 32.27356 43.03265
Conraua robusta Anura VU Stream-dwelling 27.859116 37.28756 32.45400 43.27530
Conraua derooi Anura CR Stream-dwelling 28.318602 37.33602 32.26816 42.77282
Conraua derooi Anura CR Stream-dwelling 27.675794 37.24826 32.14892 42.61791
Conraua derooi Anura CR Stream-dwelling 29.593907 37.51015 32.53653 43.09016
Conraua beccarii Anura LC Aquatic 22.384594 37.23640 31.84453 42.14091
Conraua beccarii Anura LC Aquatic 21.423158 37.10584 31.65533 42.02247
Conraua beccarii Anura LC Aquatic 24.269606 37.49237 32.01726 42.39855
Conraua crassipes Anura LC Stream-dwelling 27.175509 37.12805 32.00820 42.69794
Conraua crassipes Anura LC Stream-dwelling 26.456741 37.03011 31.97979 42.61834
Conraua crassipes Anura LC Stream-dwelling 28.742822 37.34161 32.16479 42.86324
Conraua goliath Anura EN Stream-dwelling 26.640493 37.00577 32.11089 42.83312
Conraua goliath Anura EN Stream-dwelling 26.024001 36.92244 32.01877 42.72096
Conraua goliath Anura EN Stream-dwelling 28.072728 37.19937 31.94373 42.78057
Micrixalus elegans Anura DD Stream-dwelling 26.485775 37.06484 31.45059 41.99136
Micrixalus elegans Anura DD Stream-dwelling 25.652340 36.95227 31.35554 41.85263
Micrixalus elegans Anura DD Stream-dwelling 28.489556 37.33549 31.60467 42.28577
Micrixalus nudis Anura VU Semi-aquatic 27.498273 38.01528 32.25409 42.85999
Micrixalus nudis Anura VU Semi-aquatic 26.640644 37.89985 32.14180 42.71501
Micrixalus nudis Anura VU Semi-aquatic 29.201790 38.24455 32.42943 43.11673
Micrixalus fuscus Anura NT Stream-dwelling 27.241991 37.11190 31.55877 42.16587
Micrixalus fuscus Anura NT Stream-dwelling 26.359461 36.99094 31.45475 42.03932
Micrixalus fuscus Anura NT Stream-dwelling 29.088427 37.36496 31.64097 42.37295
Micrixalus kottigeharensis Anura CR Semi-aquatic 26.485775 37.91147 32.56510 43.10211
Micrixalus kottigeharensis Anura CR Semi-aquatic 25.652340 37.79787 32.40304 42.94056
Micrixalus kottigeharensis Anura CR Semi-aquatic 28.489556 38.18460 32.95474 43.63452
Micrixalus saxicola Anura VU Stream-dwelling 26.599433 37.11954 31.05834 41.99294
Micrixalus saxicola Anura VU Stream-dwelling 25.687741 36.99291 30.93207 41.90948
Micrixalus saxicola Anura VU Stream-dwelling 28.870211 37.43494 31.86953 42.83112
Micrixalus phyllophilus Anura VU Stream-dwelling 27.337254 37.09193 31.90170 42.31954
Micrixalus phyllophilus Anura VU Stream-dwelling 26.356023 36.95961 31.66224 42.05884
Micrixalus phyllophilus Anura VU Stream-dwelling 29.334946 37.36132 32.15308 42.71839
Micrixalus swamianus Anura DD Ground-dwelling 26.485775 37.62610 31.65765 42.34620
Micrixalus swamianus Anura DD Ground-dwelling 25.652340 37.51348 31.44753 42.07933
Micrixalus swamianus Anura DD Ground-dwelling 28.489556 37.89686 31.75339 42.54739
Micrixalus silvaticus Anura DD Stream-dwelling 27.331012 37.18505 31.81915 42.53133
Micrixalus silvaticus Anura DD Stream-dwelling 26.468056 37.06737 31.73271 42.38779
Micrixalus silvaticus Anura DD Stream-dwelling 29.095879 37.42572 31.70215 42.52538
Micrixalus thampii Anura DD Stream-dwelling 26.793491 37.08653 32.00699 42.63759
Micrixalus thampii Anura DD Stream-dwelling 25.581038 36.92092 31.88542 42.47660
Micrixalus thampii Anura DD Stream-dwelling 29.313470 37.43074 31.92243 42.65325
Micrixalus gadgili Anura EN Stream-dwelling 27.239182 37.16129 32.68437 43.12411
Micrixalus gadgili Anura EN Stream-dwelling 26.398986 37.04664 32.57785 42.97493
Micrixalus gadgili Anura EN Stream-dwelling 28.937049 37.39297 32.76422 43.26380
Micrixalus narainensis Anura DD Stream-dwelling 26.485775 37.06539 31.67466 42.10753
Micrixalus narainensis Anura DD Stream-dwelling 25.652340 36.95304 31.59677 42.05932
Micrixalus narainensis Anura DD Stream-dwelling 28.489556 37.33550 31.84002 42.38070
Arthroleptides martiensseni Anura EN Stream-dwelling 24.969464 36.74406 31.06147 41.69134
Arthroleptides martiensseni Anura EN Stream-dwelling 24.301742 36.65409 31.08561 41.70583
Arthroleptides martiensseni Anura EN Stream-dwelling 25.986178 36.88106 31.14436 41.78677
Arthroleptides yakusini Anura EN Stream-dwelling 23.310953 36.56872 31.23202 41.61172
Arthroleptides yakusini Anura EN Stream-dwelling 22.579449 36.47051 31.10025 41.44523
Arthroleptides yakusini Anura EN Stream-dwelling 24.941410 36.78761 31.38055 41.80304
Petropedetes cameronensis Anura LC Stream-dwelling 26.772448 36.93622 31.83313 42.33928
Petropedetes cameronensis Anura LC Stream-dwelling 26.152415 36.85195 31.73136 42.22598
Petropedetes cameronensis Anura LC Stream-dwelling 28.132315 37.12105 32.05634 42.59648
Petropedetes parkeri Anura DD Semi-aquatic 26.667321 37.80933 32.30155 43.08291
Petropedetes parkeri Anura DD Semi-aquatic 26.016769 37.72032 32.18394 42.92921
Petropedetes parkeri Anura DD Semi-aquatic 28.107488 38.00637 32.47413 43.32620
Petropedetes perreti Anura CR Stream-dwelling 26.406869 36.94888 31.27875 41.77363
Petropedetes perreti Anura CR Stream-dwelling 25.779143 36.86145 31.18314 41.69843
Petropedetes perreti Anura CR Stream-dwelling 27.748605 37.13574 31.56942 42.08498
Petropedetes johnstoni Anura LC Ground-dwelling 26.778665 37.61027 32.52837 43.03896
Petropedetes johnstoni Anura LC Ground-dwelling 26.192335 37.53041 32.48038 42.93308
Petropedetes johnstoni Anura LC Ground-dwelling 28.144218 37.79625 32.94993 43.50918
Petropedetes palmipes Anura VU Semi-aquatic 26.781259 37.91688 32.88305 43.41057
Petropedetes palmipes Anura VU Semi-aquatic 26.131297 37.82628 32.82487 43.37615
Petropedetes palmipes Anura VU Semi-aquatic 28.287769 38.12688 33.08067 43.64984
Ericabatrachus baleensis Anura CR Stream-dwelling 20.132346 36.07489 30.92841 41.25330
Ericabatrachus baleensis Anura CR Stream-dwelling 19.211996 35.94827 30.72936 41.07870
Ericabatrachus baleensis Anura CR Stream-dwelling 21.359748 36.24376 31.06359 41.45077
Aubria masako Anura LC Semi-aquatic 27.591129 38.05814 32.61238 43.22774
Aubria masako Anura LC Semi-aquatic 26.841929 37.95766 32.55685 43.10403
Aubria masako Anura LC Semi-aquatic 29.244577 38.27990 33.04782 43.75115
Aubria occidentalis Anura LC Semi-aquatic 27.453630 38.07648 32.88652 43.21237
Aubria occidentalis Anura LC Semi-aquatic 26.856356 37.99630 33.12066 43.37081
Aubria occidentalis Anura LC Semi-aquatic 28.769657 38.25313 33.18203 43.48937
Aubria subsigillata Anura LC Semi-aquatic 27.354408 38.12684 32.71314 43.14693
Aubria subsigillata Anura LC Semi-aquatic 26.611841 38.02510 32.63751 43.06405
Aubria subsigillata Anura LC Semi-aquatic 28.926118 38.34220 32.85113 43.34229
Pyxicephalus adspersus Anura LC Fossorial 22.772357 38.17630 32.74638 43.57299
Pyxicephalus adspersus Anura LC Fossorial 21.495836 38.00475 32.52181 43.38219
Pyxicephalus adspersus Anura LC Fossorial 25.128484 38.49293 32.75928 43.64929
Pyxicephalus edulis Anura LC Fossorial 24.925612 38.39569 33.29635 44.07338
Pyxicephalus edulis Anura LC Fossorial 23.912165 38.25594 32.73116 43.44065
Pyxicephalus edulis Anura LC Fossorial 26.971641 38.67783 33.30262 44.12093
Pyxicephalus angusticeps Anura LC Semi-aquatic 25.603350 37.83397 31.73499 42.53224
Pyxicephalus angusticeps Anura LC Semi-aquatic 24.789606 37.72313 31.99735 42.71669
Pyxicephalus angusticeps Anura LC Semi-aquatic 27.301439 38.06525 31.96160 42.85340
Pyxicephalus obbianus Anura LC Fossorial 25.250983 38.51576 32.92068 43.63987
Pyxicephalus obbianus Anura LC Fossorial 24.409653 38.39987 32.78451 43.47012
Pyxicephalus obbianus Anura LC Fossorial 26.826811 38.73282 33.14032 43.88496
Amietia tenuoplicata Anura LC Stream-dwelling 23.319541 36.62273 31.33493 41.66104
Amietia tenuoplicata Anura LC Stream-dwelling 22.555550 36.51883 31.28910 41.57536
Amietia tenuoplicata Anura LC Stream-dwelling 24.784693 36.82199 31.51950 41.89048
Amietia angolensis Anura LC Semi-aquatic 24.422997 37.59465 31.81728 42.41984
Amietia angolensis Anura LC Semi-aquatic 23.237900 37.43441 31.69042 42.23936
Amietia angolensis Anura LC Semi-aquatic 26.689464 37.90111 32.43841 43.16670
Amietia desaegeri Anura LC Semi-aquatic 23.774461 37.55519 32.07687 42.42828
Amietia desaegeri Anura LC Semi-aquatic 23.083747 37.46019 31.98947 42.35436
Amietia desaegeri Anura LC Semi-aquatic 25.442304 37.78461 32.28791 42.63602
Amietia inyangae Anura EN Stream-dwelling 23.996436 36.71557 31.78069 42.20219
Amietia inyangae Anura EN Stream-dwelling 22.773987 36.54727 31.49814 41.85639
Amietia inyangae Anura EN Stream-dwelling 26.339431 37.03814 31.78805 42.23195
Amietia johnstoni Anura EN Stream-dwelling 25.582109 36.87995 31.14497 41.61276
Amietia johnstoni Anura EN Stream-dwelling 24.484506 36.73237 31.15984 41.53209
Amietia johnstoni Anura EN Stream-dwelling 27.641894 37.15690 31.70395 42.20155
Amietia vertebralis Anura LC Aquatic 20.767960 37.02555 31.72230 42.59469
Amietia vertebralis Anura LC Aquatic 19.290785 36.82199 31.45456 42.28700
Amietia vertebralis Anura LC Aquatic 23.050584 37.34009 32.00903 43.00063
Amietia ruwenzorica Anura LC Stream-dwelling 23.894401 36.61145 31.59689 42.23863
Amietia ruwenzorica Anura LC Stream-dwelling 23.242897 36.52308 31.53316 42.12466
Amietia ruwenzorica Anura LC Stream-dwelling 25.460038 36.82381 31.69769 42.44739
Amietia wittei Anura LC Stream-dwelling 21.460774 36.30338 30.72869 41.55182
Amietia wittei Anura LC Stream-dwelling 20.593377 36.18426 30.50704 41.23425
Amietia wittei Anura LC Stream-dwelling 23.229140 36.54622 30.92442 41.84506
Amietia fuscigula Anura LC Semi-aquatic 20.587071 37.18600 32.31602 42.78427
Amietia fuscigula Anura LC Semi-aquatic 19.120139 36.98973 32.19635 42.67061
Amietia fuscigula Anura LC Semi-aquatic 23.139670 37.52751 32.48364 42.92628
Amietia vandijki Anura LC Stream-dwelling 21.133131 36.39310 30.84709 41.28778
Amietia vandijki Anura LC Stream-dwelling 19.514219 36.17797 30.58667 41.04340
Amietia vandijki Anura LC Stream-dwelling 23.753483 36.74131 31.13860 41.70433
Strongylopus bonaespei Anura LC Semi-aquatic 20.382974 37.13419 31.96406 42.65162
Strongylopus bonaespei Anura LC Semi-aquatic 18.968416 36.94464 31.80650 42.45582
Strongylopus bonaespei Anura LC Semi-aquatic 22.940996 37.47695 32.24481 42.83409
Strongylopus fuelleborni Anura LC Semi-aquatic 22.863353 37.54241 31.92751 42.54540
Strongylopus fuelleborni Anura LC Semi-aquatic 22.028036 37.42764 31.82180 42.41392
Strongylopus fuelleborni Anura LC Semi-aquatic 24.533832 37.77192 32.10908 42.79804
Strongylopus kilimanjaro Anura DD Stream-dwelling 22.426127 36.43854 31.27120 41.81055
Strongylopus kilimanjaro Anura DD Stream-dwelling 21.661742 36.33655 31.32789 41.85412
Strongylopus kilimanjaro Anura DD Stream-dwelling 23.922486 36.63819 31.69152 42.22430
Strongylopus fasciatus Anura LC Semi-aquatic 22.548774 37.39595 32.15151 43.25850
Strongylopus fasciatus Anura LC Semi-aquatic 21.241383 37.21853 32.30353 43.35653
Strongylopus fasciatus Anura LC Semi-aquatic 24.854723 37.70889 31.78820 42.88574
Strongylopus springbokensis Anura LC Semi-aquatic 19.973318 37.03785 31.67333 42.31550
Strongylopus springbokensis Anura LC Semi-aquatic 18.846253 36.88552 31.61437 42.30219
Strongylopus springbokensis Anura LC Semi-aquatic 22.580622 37.39024 32.15537 42.77866
Strongylopus rhodesianus Anura VU Stream-dwelling 24.451116 36.78894 31.62789 42.35901
Strongylopus rhodesianus Anura VU Stream-dwelling 23.328692 36.63860 31.46335 42.20299
Strongylopus rhodesianus Anura VU Stream-dwelling 26.759293 37.09810 31.91649 42.74730
Strongylopus kitumbeine Anura VU Semi-aquatic 20.767650 37.17227 31.90934 42.32785
Strongylopus kitumbeine Anura VU Semi-aquatic 19.741422 37.03438 31.64607 42.06628
Strongylopus kitumbeine Anura VU Semi-aquatic 22.947186 37.46514 32.31664 42.70715
Strongylopus wageri Anura LC Semi-aquatic 21.997267 37.37757 32.09652 42.68180
Strongylopus wageri Anura LC Semi-aquatic 20.687492 37.20120 31.71720 42.26073
Strongylopus wageri Anura LC Semi-aquatic 24.068998 37.65655 32.31705 42.95932
Strongylopus merumontanus Anura LC Stream-dwelling 21.490461 36.41235 30.97049 41.87555
Strongylopus merumontanus Anura LC Stream-dwelling 20.567203 36.28718 30.80214 41.72930
Strongylopus merumontanus Anura LC Stream-dwelling 23.752746 36.71907 31.24676 42.13517
Strongylopus grayii Anura LC Semi-aquatic 21.330740 37.23604 32.10289 42.32503
Strongylopus grayii Anura LC Semi-aquatic 19.951899 37.05112 31.86133 42.14568
Strongylopus grayii Anura LC Semi-aquatic 23.753895 37.56102 32.45743 42.71812
Arthroleptella bicolor Anura LC Ground-dwelling 19.964134 36.88293 31.17327 41.62958
Arthroleptella bicolor Anura LC Ground-dwelling 18.636018 36.70783 31.09501 41.48602
Arthroleptella bicolor Anura LC Ground-dwelling 22.404846 37.20471 31.38532 41.89341
Arthroleptella subvoce Anura CR Ground-dwelling 20.274302 36.89584 31.69297 42.43598
Arthroleptella subvoce Anura CR Ground-dwelling 18.848606 36.70063 31.39755 42.20155
Arthroleptella subvoce Anura CR Ground-dwelling 23.128252 37.28662 32.02672 42.80946
Arthroleptella drewesii Anura NT Stream-dwelling 19.822954 36.32928 30.86635 41.14918
Arthroleptella drewesii Anura NT Stream-dwelling 18.587732 36.16101 30.76842 40.99353
Arthroleptella drewesii Anura NT Stream-dwelling 21.833034 36.60309 31.12667 41.43890
Arthroleptella landdrosia Anura NT Ground-dwelling 20.324283 36.96819 31.48364 42.02499
Arthroleptella landdrosia Anura NT Ground-dwelling 19.000076 36.78693 31.16783 41.78995
Arthroleptella landdrosia Anura NT Ground-dwelling 22.957017 37.32856 32.09613 42.61591
Arthroleptella lightfooti Anura NT Ground-dwelling 20.684432 37.04936 31.81381 42.43166
Arthroleptella lightfooti Anura NT Ground-dwelling 19.364134 36.86908 31.64686 42.22773
Arthroleptella lightfooti Anura NT Ground-dwelling 23.509188 37.43505 32.03803 42.75231
Arthroleptella villiersi Anura LC Ground-dwelling 20.324283 36.94349 31.64898 42.47444
Arthroleptella villiersi Anura LC Ground-dwelling 19.000076 36.76956 31.44911 42.31205
Arthroleptella villiersi Anura LC Ground-dwelling 22.957017 37.28930 31.81004 42.64663
Arthroleptella rugosa Anura CR Ground-dwelling 19.822954 36.90879 31.87091 42.39791
Arthroleptella rugosa Anura CR Ground-dwelling 18.587732 36.74231 31.67635 42.22627
Arthroleptella rugosa Anura CR Ground-dwelling 21.833034 37.17972 32.11741 42.66088
Natalobatrachus bonebergi Anura EN Stream-dwelling 22.171241 36.53978 31.09606 41.63615
Natalobatrachus bonebergi Anura EN Stream-dwelling 20.957672 36.37505 31.00286 41.42021
Natalobatrachus bonebergi Anura EN Stream-dwelling 24.026486 36.79161 31.52405 42.13608
Nothophryne broadleyi Anura EN Stream-dwelling 25.582109 37.12349 32.19993 42.31100
Nothophryne broadleyi Anura EN Stream-dwelling 24.484506 36.97295 32.04728 42.17259
Nothophryne broadleyi Anura EN Stream-dwelling 27.641894 37.40598 32.43521 42.60934
Cacosternum leleupi Anura DD Ground-dwelling 24.213327 37.39434 32.00187 42.76519
Cacosternum leleupi Anura DD Ground-dwelling 23.320403 37.27339 31.83358 42.64195
Cacosternum leleupi Anura DD Ground-dwelling 26.329439 37.68097 32.33511 43.18026
Cacosternum boettgeri Anura LC Ground-dwelling 22.185000 37.18296 31.56668 42.53195
Cacosternum boettgeri Anura LC Ground-dwelling 20.784231 36.99264 31.42689 42.43043
Cacosternum boettgeri Anura LC Ground-dwelling 24.639873 37.51651 32.13254 43.07963
Cacosternum kinangopensis Anura LC Ground-dwelling 19.525231 36.81419 31.24061 42.62619
Cacosternum kinangopensis Anura LC Ground-dwelling 18.588528 36.68644 31.08688 42.43990
Cacosternum kinangopensis Anura LC Ground-dwelling 21.272946 37.05256 30.84193 42.30370
Cacosternum plimptoni Anura LC Ground-dwelling 21.094163 37.03005 31.28210 42.43884
Cacosternum plimptoni Anura LC Ground-dwelling 20.259440 36.91364 31.11477 42.24079
Cacosternum plimptoni Anura LC Ground-dwelling 22.898884 37.28173 31.58248 42.83609
Cacosternum striatum Anura LC Ground-dwelling 22.449149 37.13906 31.32045 42.53145
Cacosternum striatum Anura LC Ground-dwelling 21.174274 36.96499 31.59108 42.78459
Cacosternum striatum Anura LC Ground-dwelling 24.439178 37.41077 31.64941 42.77757
Cacosternum parvum Anura LC Ground-dwelling 22.214324 37.19132 32.14808 43.25607
Cacosternum parvum Anura LC Ground-dwelling 20.893775 37.00838 31.17870 42.35336
Cacosternum parvum Anura LC Ground-dwelling 24.429864 37.49824 32.44393 43.53919
Cacosternum nanum Anura LC Ground-dwelling 21.500935 37.05413 31.18128 42.73434
Cacosternum nanum Anura LC Ground-dwelling 20.108571 36.86353 30.94741 42.44297
Cacosternum nanum Anura LC Ground-dwelling 23.748454 37.36179 31.45875 43.06416
Cacosternum capense Anura NT Fossorial 20.329402 37.86184 32.66149 43.65856
Cacosternum capense Anura NT Fossorial 18.958042 37.67556 32.35811 43.34583
Cacosternum capense Anura NT Fossorial 23.234216 38.25644 32.82146 43.76731
Cacosternum namaquense Anura LC Ground-dwelling 19.814521 36.74831 31.02150 41.66796
Cacosternum namaquense Anura LC Ground-dwelling 18.629339 36.58764 30.85985 41.52070
Cacosternum namaquense Anura LC Ground-dwelling 22.539951 37.11776 31.58907 42.25885
Cacosternum karooicum Anura LC Ground-dwelling 20.232442 36.82921 30.97088 41.83004
Cacosternum karooicum Anura LC Ground-dwelling 18.703971 36.61943 30.70163 41.53484
Cacosternum karooicum Anura LC Ground-dwelling 23.034525 37.21381 31.19404 42.14757
Cacosternum platys Anura NT Ground-dwelling 20.684432 36.88619 31.72551 42.68460
Cacosternum platys Anura NT Ground-dwelling 19.364134 36.70830 31.45069 42.44521
Cacosternum platys Anura NT Ground-dwelling 23.509188 37.26678 31.98357 43.02014
Microbatrachella capensis Anura CR Semi-aquatic 20.397272 37.15612 31.86260 42.88331
Microbatrachella capensis Anura CR Semi-aquatic 19.105333 36.98298 31.70542 42.70139
Microbatrachella capensis Anura CR Semi-aquatic 22.950470 37.49830 32.00089 43.11752
Poyntonia paludicola Anura NT Stream-dwelling 20.324283 36.35812 30.85830 41.80664
Poyntonia paludicola Anura NT Stream-dwelling 19.000076 36.18013 30.59689 41.59326
Poyntonia paludicola Anura NT Stream-dwelling 22.957017 36.71199 31.20746 42.12631
Anhydrophryne hewitti Anura LC Ground-dwelling 22.116458 37.00354 31.33945 42.36042
Anhydrophryne hewitti Anura LC Ground-dwelling 20.847811 36.83389 31.16473 42.22011
Anhydrophryne hewitti Anura LC Ground-dwelling 24.063303 37.26387 31.61856 42.67201
Anhydrophryne ngongoniensis Anura EN Ground-dwelling 21.558750 36.99823 31.54385 42.28392
Anhydrophryne ngongoniensis Anura EN Ground-dwelling 20.236435 36.81894 31.51573 42.26845
Anhydrophryne ngongoniensis Anura EN Ground-dwelling 23.484683 37.25935 31.88964 42.62639
Anhydrophryne rattrayi Anura VU Ground-dwelling 20.359510 36.79213 30.60897 41.74347
Anhydrophryne rattrayi Anura VU Ground-dwelling 18.811550 36.58337 30.39928 41.40965
Anhydrophryne rattrayi Anura VU Ground-dwelling 22.663297 37.10284 31.52334 42.65312
Tomopterna cryptotis Anura LC Ground-dwelling 25.019559 37.41002 32.23764 42.54130
Tomopterna cryptotis Anura LC Ground-dwelling 23.771067 37.23873 32.01609 42.30116
Tomopterna cryptotis Anura LC Ground-dwelling 27.424792 37.74001 32.76499 43.12708
Tomopterna tandyi Anura LC Ground-dwelling 22.013264 36.95909 31.44812 41.98316
Tomopterna tandyi Anura LC Ground-dwelling 20.581697 36.76734 31.21414 41.82091
Tomopterna tandyi Anura LC Ground-dwelling 24.498942 37.29204 31.73422 42.22020
Tomopterna damarensis Anura DD Fossorial 23.354408 38.19233 32.44576 43.26568
Tomopterna damarensis Anura DD Fossorial 21.380231 37.92469 32.19832 42.97483
Tomopterna damarensis Anura DD Fossorial 25.796200 38.52336 32.98684 43.74303
Tomopterna delalandii Anura LC Semi-aquatic 20.288898 37.07820 31.03852 42.01566
Tomopterna delalandii Anura LC Semi-aquatic 18.890314 36.88611 30.81048 41.76251
Tomopterna delalandii Anura LC Semi-aquatic 22.949219 37.44358 31.39620 42.35854
Tomopterna gallmanni Anura LC Ground-dwelling 21.723130 37.02736 31.75326 42.07546
Tomopterna gallmanni Anura LC Ground-dwelling 20.859341 36.91094 31.63502 41.95861
Tomopterna gallmanni Anura LC Ground-dwelling 23.515399 37.26893 31.89359 42.25829
Tomopterna tuberculosa Anura LC Semi-aquatic 23.463453 37.48811 32.28286 42.69608
Tomopterna tuberculosa Anura LC Semi-aquatic 22.436552 37.34993 32.15491 42.55537
Tomopterna tuberculosa Anura LC Semi-aquatic 25.584304 37.77347 32.72385 43.27980
Tomopterna elegans Anura LC Ground-dwelling 25.705473 37.53370 32.04600 42.65480
Tomopterna elegans Anura LC Ground-dwelling 24.729591 37.40085 31.80743 42.38245
Tomopterna elegans Anura LC Ground-dwelling 27.435232 37.76920 32.18515 42.79961
Tomopterna wambensis Anura LC Semi-aquatic 22.385930 37.29809 32.39881 43.24178
Tomopterna wambensis Anura LC Semi-aquatic 21.553917 37.18714 32.01892 42.83704
Tomopterna wambensis Anura LC Semi-aquatic 23.969807 37.50929 32.37376 43.21898
Tomopterna kachowskii Anura LC Ground-dwelling 21.467487 37.02947 31.15671 41.74387
Tomopterna kachowskii Anura LC Ground-dwelling 20.600126 36.91074 31.03543 41.63485
Tomopterna kachowskii Anura LC Ground-dwelling 23.259570 37.27477 31.28048 41.85797
Tomopterna krugerensis Anura LC Ground-dwelling 23.393704 37.22497 31.93578 42.62826
Tomopterna krugerensis Anura LC Ground-dwelling 21.950085 37.03004 31.70535 42.37748
Tomopterna krugerensis Anura LC Ground-dwelling 25.831272 37.55411 32.17807 42.82365
Tomopterna luganga Anura LC Semi-aquatic 21.929974 37.22793 31.84470 42.25268
Tomopterna luganga Anura LC Semi-aquatic 21.014423 37.10133 31.77117 42.11111
Tomopterna luganga Anura LC Semi-aquatic 23.998407 37.51394 32.22877 42.75128
Tomopterna marmorata Anura LC Ground-dwelling 23.728794 37.26387 31.50304 42.02266
Tomopterna marmorata Anura LC Ground-dwelling 22.578833 37.10725 31.60432 42.04333
Tomopterna marmorata Anura LC Ground-dwelling 25.942904 37.56541 32.14278 42.80472
Tomopterna milletihorsini Anura DD Ground-dwelling 27.374228 37.72109 31.96505 42.56709
Tomopterna milletihorsini Anura DD Ground-dwelling 26.536306 37.61022 31.87586 42.47906
Tomopterna milletihorsini Anura DD Ground-dwelling 29.566533 38.01115 32.23294 42.88189
Tomopterna natalensis Anura LC Ground-dwelling 22.131726 37.10014 31.67351 42.07365
Tomopterna natalensis Anura LC Ground-dwelling 20.828982 36.92216 31.41324 41.84399
Tomopterna natalensis Anura LC Ground-dwelling 24.399969 37.41005 32.08132 42.49192
Platymantis levigatus Anura EN Ground-dwelling 27.473534 36.30012 31.42559 40.15885
Platymantis levigatus Anura EN Ground-dwelling 27.067989 36.24388 31.35583 40.08025
Platymantis levigatus Anura EN Ground-dwelling 28.250304 36.40784 31.55921 40.30939
Platymantis mimulus Anura LC Ground-dwelling 27.706067 35.00696 31.51208 38.82990
Platymantis mimulus Anura LC Ground-dwelling 27.199350 34.93726 31.51752 38.78538
Platymantis mimulus Anura LC Ground-dwelling 28.675393 35.14030 31.50571 38.88756
Platymantis naomii Anura NT Ground-dwelling 27.300462 34.93528 31.43095 38.78289
Platymantis naomii Anura NT Ground-dwelling 26.857937 34.87371 31.63422 38.93097
Platymantis naomii Anura NT Ground-dwelling 28.156659 35.05440 31.48973 38.86622
Platymantis panayensis Anura EN Arboreal 27.278237 35.76146 32.64227 38.99837
Platymantis panayensis Anura EN Arboreal 26.901959 35.70895 32.59430 38.93783
Platymantis panayensis Anura EN Arboreal 28.116520 35.87844 32.72314 39.13325
Platymantis rabori Anura LC Arboreal 27.442038 36.01081 31.99747 40.81123
Platymantis rabori Anura LC Arboreal 26.944996 35.94356 31.92123 40.75824
Platymantis rabori Anura LC Arboreal 28.567511 36.16307 32.07345 40.99453
Platymantis isarog Anura LC Arboreal 27.692333 36.06398 31.50060 40.33329
Platymantis isarog Anura LC Arboreal 27.179908 35.99256 31.58948 40.39612
Platymantis isarog Anura LC Arboreal 28.646470 36.19696 31.74037 40.58390
Platymantis cornutus Anura LC Arboreal 27.851477 36.13248 31.51259 40.91115
Platymantis cornutus Anura LC Arboreal 27.340335 36.06107 31.44754 40.83485
Platymantis cornutus Anura LC Arboreal 28.781554 36.26242 31.13288 40.61195
Platymantis cagayanensis Anura NT Ground-dwelling 27.723616 36.20805 31.39795 40.74512
Platymantis cagayanensis Anura NT Ground-dwelling 27.228446 36.14010 31.33077 40.66170
Platymantis cagayanensis Anura NT Ground-dwelling 28.631165 36.33261 31.52106 40.89802
Platymantis diesmosi Anura EN Ground-dwelling 27.692333 36.18465 31.53440 40.77663
Platymantis diesmosi Anura EN Ground-dwelling 27.179908 36.11481 31.48326 40.65478
Platymantis diesmosi Anura EN Ground-dwelling 28.646470 36.31469 31.51510 40.85532
Platymantis lawtoni Anura EN Arboreal 27.473534 36.04622 30.79242 40.27517
Platymantis lawtoni Anura EN Arboreal 27.067989 35.99081 30.75992 40.21563
Platymantis lawtoni Anura EN Arboreal 28.250304 36.15235 30.85468 40.38922
Platymantis guentheri Anura LC Arboreal 27.488331 35.98959 31.00429 39.94637
Platymantis guentheri Anura LC Arboreal 26.947770 35.91518 30.92473 39.87022
Platymantis guentheri Anura LC Arboreal 28.599812 36.14259 31.16787 40.17164
Platymantis subterrestris Anura EN Arboreal 27.934264 36.05437 31.74467 40.49747
Platymantis subterrestris Anura EN Arboreal 27.417482 35.98233 31.70299 40.42788
Platymantis subterrestris Anura EN Arboreal 28.922353 36.19212 31.82438 40.58990
Platymantis hazelae Anura VU Arboreal 27.141048 35.41963 32.05128 38.41469
Platymantis hazelae Anura VU Arboreal 26.666658 35.35429 31.94526 38.28545
Platymantis hazelae Anura VU Arboreal 28.227957 35.56936 32.11574 38.57940
Platymantis pygmaeus Anura LC Ground-dwelling 27.885410 35.68102 32.51247 38.75568
Platymantis pygmaeus Anura LC Ground-dwelling 27.379283 35.61036 32.40655 38.67175
Platymantis pygmaeus Anura LC Ground-dwelling 28.783076 35.80633 32.62081 38.90454
Platymantis indeprensus Anura NT Ground-dwelling 27.300462 36.08438 31.66527 40.89687
Platymantis indeprensus Anura NT Ground-dwelling 26.857937 36.02232 31.62358 40.82577
Platymantis indeprensus Anura NT Ground-dwelling 28.156659 36.20446 31.82018 41.03967
Platymantis paengi Anura EN Ground-dwelling 27.327106 36.07838 31.84603 40.79706
Platymantis paengi Anura EN Ground-dwelling 26.940217 36.02424 31.30087 40.25498
Platymantis paengi Anura EN Ground-dwelling 28.192445 36.19948 31.59378 40.57288
Platymantis insulatus Anura CR Ground-dwelling 27.142546 35.95890 31.45533 40.64012
Platymantis insulatus Anura CR Ground-dwelling 26.677595 35.89500 31.35595 40.48239
Platymantis insulatus Anura CR Ground-dwelling 28.343377 36.12392 31.49610 40.63873
Platymantis taylori Anura VU Ground-dwelling 27.819778 36.14006 31.74630 40.77843
Platymantis taylori Anura VU Ground-dwelling 27.308976 36.07031 31.66032 40.69015
Platymantis taylori Anura VU Ground-dwelling 28.704512 36.26086 31.84601 41.03950
Platymantis negrosensis Anura NT Arboreal 27.209642 36.12247 31.87440 41.15102
Platymantis negrosensis Anura NT Arboreal 26.784309 36.06324 31.42977 40.66494
Platymantis negrosensis Anura NT Arboreal 28.172238 36.25653 31.46146 40.74159
Platymantis pseudodorsalis Anura NT Ground-dwelling 27.300462 36.08085 31.47463 40.52613
Platymantis pseudodorsalis Anura NT Ground-dwelling 26.857937 36.01995 31.76592 40.81725
Platymantis pseudodorsalis Anura NT Ground-dwelling 28.156659 36.19866 31.92002 40.98902
Platymantis polillensis Anura LC Arboreal 27.769171 36.01488 31.11424 40.18327
Platymantis polillensis Anura LC Arboreal 27.289578 35.94948 31.01748 40.10318
Platymantis polillensis Anura LC Arboreal 28.619206 36.13080 31.37012 40.41638
Platymantis sierramadrensis Anura VU Arboreal 28.019440 36.13503 31.57257 40.72848
Platymantis sierramadrensis Anura VU Arboreal 27.511354 36.06498 31.50405 40.62047
Platymantis sierramadrensis Anura VU Arboreal 28.872181 36.25258 31.81043 40.96170
Platymantis spelaeus Anura EN Ground-dwelling 27.695959 36.26223 31.76284 41.01119
Platymantis spelaeus Anura EN Ground-dwelling 27.266915 36.20329 31.69293 40.93515
Platymantis spelaeus Anura EN Ground-dwelling 28.548102 36.37930 31.87236 41.16623
Lankanectes corrugatus Anura NT Ground-dwelling 27.662834 37.24688 31.99028 42.39397
Lankanectes corrugatus Anura NT Ground-dwelling 26.894204 37.14161 31.93178 42.31546
Lankanectes corrugatus Anura NT Ground-dwelling 29.593339 37.51128 32.21726 42.70432
Nyctibatrachus sylvaticus Anura DD Stream-dwelling 26.781316 36.52192 31.41652 41.78512
Nyctibatrachus sylvaticus Anura DD Stream-dwelling 26.036271 36.42145 31.38689 41.69039
Nyctibatrachus sylvaticus Anura DD Stream-dwelling 28.329553 36.73070 31.45621 41.83340
Nyctibatrachus major Anura VU Stream-dwelling 27.072533 36.56483 31.65085 41.68834
Nyctibatrachus major Anura VU Stream-dwelling 26.181863 36.44297 31.56770 41.58423
Nyctibatrachus major Anura VU Stream-dwelling 28.980735 36.82593 32.05576 42.13669
Nyctibatrachus dattatreyaensis Anura CR Stream-dwelling 26.190234 36.42812 31.61771 41.96118
Nyctibatrachus dattatreyaensis Anura CR Stream-dwelling 25.268410 36.30229 31.54286 41.85750
Nyctibatrachus dattatreyaensis Anura CR Stream-dwelling 28.649558 36.76383 31.77346 42.21478
Nyctibatrachus karnatakaensis Anura EN Stream-dwelling 26.190234 36.37431 31.28586 41.78100
Nyctibatrachus karnatakaensis Anura EN Stream-dwelling 25.268410 36.24839 31.21268 41.67969
Nyctibatrachus karnatakaensis Anura EN Stream-dwelling 28.649558 36.71025 30.89282 41.54800
Nyctibatrachus sanctipalustris Anura EN Semi-aquatic 26.421968 37.26303 32.33263 43.18579
Nyctibatrachus sanctipalustris Anura EN Semi-aquatic 25.572415 37.14763 32.22355 42.97459
Nyctibatrachus sanctipalustris Anura EN Semi-aquatic 28.581294 37.55634 32.50966 43.51649
Nyctibatrachus kempholeyensis Anura DD Stream-dwelling 26.781316 36.54303 31.24278 41.31266
Nyctibatrachus kempholeyensis Anura DD Stream-dwelling 26.036271 36.43983 30.81297 40.82699
Nyctibatrachus kempholeyensis Anura DD Stream-dwelling 28.329553 36.75751 31.30195 41.38729
Nyctibatrachus humayuni Anura VU Stream-dwelling 26.454491 36.58054 31.46179 42.16282
Nyctibatrachus humayuni Anura VU Stream-dwelling 25.581347 36.46101 31.34839 42.04671
Nyctibatrachus humayuni Anura VU Stream-dwelling 28.570901 36.87028 31.54145 42.34201
Nyctibatrachus petraeus Anura NT Stream-dwelling 26.689315 36.57499 31.50915 42.07525
Nyctibatrachus petraeus Anura NT Stream-dwelling 25.816044 36.45569 31.29614 41.83364
Nyctibatrachus petraeus Anura NT Stream-dwelling 28.966493 36.88608 31.48029 42.09946
Nyctibatrachus aliciae Anura EN Semi-aquatic 26.976945 37.34702 32.07606 42.72544
Nyctibatrachus aliciae Anura EN Semi-aquatic 26.116342 37.23203 32.10672 42.74510
Nyctibatrachus aliciae Anura EN Semi-aquatic 28.865176 37.59932 32.46526 43.12598
Nyctibatrachus vasanthi Anura EN Stream-dwelling 27.573236 36.64860 31.26072 41.37014
Nyctibatrachus vasanthi Anura EN Stream-dwelling 26.914010 36.55717 31.19190 41.27107
Nyctibatrachus vasanthi Anura EN Stream-dwelling 28.939685 36.83813 31.37241 41.63516
Nyctibatrachus deccanensis Anura VU Semi-aquatic 27.214563 37.36908 31.81625 42.11316
Nyctibatrachus deccanensis Anura VU Semi-aquatic 26.272814 37.24176 31.75230 41.99819
Nyctibatrachus deccanensis Anura VU Semi-aquatic 29.205387 37.63823 32.52162 42.93884
Nyctibatrachus minor Anura EN Semi-aquatic 27.183363 37.40096 31.55233 41.85967
Nyctibatrachus minor Anura EN Semi-aquatic 26.247524 37.27450 31.56195 41.81257
Nyctibatrachus minor Anura EN Semi-aquatic 29.126577 37.66353 31.81069 42.21205
Nyctibatrachus beddomii Anura EN Semi-aquatic 27.533330 37.48210 31.75398 42.30928
Nyctibatrachus beddomii Anura EN Semi-aquatic 26.606822 37.35576 31.44225 41.96711
Nyctibatrachus beddomii Anura EN Semi-aquatic 29.362240 37.73149 32.06821 42.61930
Nyctibatrachus minimus Anura DD Ground-dwelling 27.292479 37.18135 32.36356 42.50269
Nyctibatrachus minimus Anura DD Ground-dwelling 26.570303 37.08405 31.95644 42.06441
Nyctibatrachus minimus Anura DD Ground-dwelling 28.916568 37.40016 32.52993 42.72655
Indirana beddomii Anura LC Ground-dwelling 27.006183 38.26764 33.43041 43.47663
Indirana beddomii Anura LC Ground-dwelling 26.147259 38.15423 33.33728 43.36582
Indirana beddomii Anura LC Ground-dwelling 28.983993 38.52878 33.61588 43.80632
Indirana brachytarsus Anura EN Stream-dwelling 27.128468 37.67565 32.80054 42.76226
Indirana brachytarsus Anura EN Stream-dwelling 26.212772 37.55272 32.76539 42.63394
Indirana brachytarsus Anura EN Stream-dwelling 29.096128 37.93980 32.49595 42.62822
Indirana leithii Anura VU Ground-dwelling 26.795314 38.29165 33.88150 43.40973
Indirana leithii Anura VU Ground-dwelling 25.975258 38.18312 33.76904 43.28834
Indirana leithii Anura VU Ground-dwelling 28.721160 38.54654 34.06996 43.69120
Indirana semipalmata Anura LC Stream-dwelling 27.270873 37.69277 32.58859 42.45861
Indirana semipalmata Anura LC Stream-dwelling 26.402361 37.57696 32.54718 42.36521
Indirana semipalmata Anura LC Stream-dwelling 29.059384 37.93127 33.17406 43.21920
Indirana gundia Anura CR Stream-dwelling 26.781316 37.60717 32.60808 42.48704
Indirana gundia Anura CR Stream-dwelling 26.036271 37.50919 32.50345 42.38073
Indirana gundia Anura CR Stream-dwelling 28.329553 37.81079 32.82550 42.73866
Indirana longicrus Anura DD Stream-dwelling 26.485775 37.52140 32.39812 42.49212
Indirana longicrus Anura DD Stream-dwelling 25.652340 37.41126 32.80118 42.86322
Indirana longicrus Anura DD Stream-dwelling 28.489556 37.78621 32.91152 43.12822
Indirana diplosticta Anura EN Stream-dwelling 27.742707 37.60638 32.63035 42.63518
Indirana diplosticta Anura EN Stream-dwelling 26.960018 37.50222 32.57396 42.53707
Indirana diplosticta Anura EN Stream-dwelling 29.248683 37.80678 32.61253 42.74094
Indirana leptodactyla Anura EN Ground-dwelling 27.533330 38.19580 33.11464 43.16363
Indirana leptodactyla Anura EN Ground-dwelling 26.606822 38.07445 32.82646 42.89262
Indirana leptodactyla Anura EN Ground-dwelling 29.362240 38.43535 33.73477 43.87540
Indirana phrynoderma Anura CR Ground-dwelling 27.974551 38.20538 33.55821 43.23870
Indirana phrynoderma Anura CR Ground-dwelling 26.918577 38.06514 33.33038 42.94548
Indirana phrynoderma Anura CR Ground-dwelling 30.000028 38.47437 33.68424 43.44707
Ingerana borealis Anura LC Semi-aquatic 24.543592 38.26617 33.71790 43.07264
Ingerana borealis Anura LC Semi-aquatic 23.516267 38.13036 33.56471 42.89883
Ingerana borealis Anura LC Semi-aquatic 26.324957 38.50166 33.96804 43.28726
Ingerana tenasserimensis Anura LC Ground-dwelling 27.640659 38.48717 34.13723 43.55746
Ingerana tenasserimensis Anura LC Ground-dwelling 26.825530 38.37872 34.00986 43.48055
Ingerana tenasserimensis Anura LC Ground-dwelling 29.362694 38.71630 34.33865 43.82302
Ingerana charlesdarwini Anura CR Arboreal 28.432263 38.35586 33.51112 42.89426
Ingerana charlesdarwini Anura CR Arboreal 27.796089 38.27261 33.39793 42.76396
Ingerana charlesdarwini Anura CR Arboreal 29.962546 38.55611 33.77377 43.22452
Ingerana reticulata Anura DD Stream-dwelling 16.274470 36.24814 31.45475 40.83689
Ingerana reticulata Anura DD Stream-dwelling 14.438870 36.00628 31.07771 40.48709
Ingerana reticulata Anura DD Stream-dwelling 18.508255 36.54248 31.60766 40.91778
Occidozyga baluensis Anura LC Aquatic 27.771863 38.32698 33.99206 42.68865
Occidozyga baluensis Anura LC Aquatic 27.137202 38.24374 33.96147 42.64141
Occidozyga baluensis Anura LC Aquatic 29.088050 38.49959 34.16673 42.92324
Occidozyga celebensis Anura LC Semi-aquatic 26.824312 38.20719 34.01301 42.32269
Occidozyga celebensis Anura LC Semi-aquatic 26.344757 38.14098 33.93941 42.24607
Occidozyga celebensis Anura LC Semi-aquatic 27.929021 38.35971 34.14364 42.51507
Occidozyga lima Anura LC Semi-aquatic 27.391924 38.24092 34.21876 42.81076
Occidozyga lima Anura LC Semi-aquatic 26.524395 38.12491 34.10911 42.64387
Occidozyga lima Anura LC Semi-aquatic 29.108759 38.47048 34.32107 43.02693
Occidozyga magnapustulosa Anura LC Aquatic 27.552881 38.05981 33.58018 42.82064
Occidozyga magnapustulosa Anura LC Aquatic 26.610830 37.93338 33.31239 42.47389
Occidozyga magnapustulosa Anura LC Aquatic 29.440183 38.31311 33.78302 43.14731
Occidozyga martensii Anura LC Aquatic 27.301051 37.99403 33.79027 42.06379
Occidozyga martensii Anura LC Aquatic 26.396933 37.87170 33.60092 41.85577
Occidozyga martensii Anura LC Aquatic 29.081319 38.23490 33.92128 42.30153
Occidozyga semipalmata Anura LC Aquatic 26.860564 38.01310 34.13073 42.52873
Occidozyga semipalmata Anura LC Aquatic 26.384643 37.95032 34.05512 42.44946
Occidozyga semipalmata Anura LC Aquatic 27.929490 38.15411 33.88130 42.35299
Occidozyga sumatrana Anura LC Semi-aquatic 27.598089 38.20351 33.46867 42.63565
Occidozyga sumatrana Anura LC Semi-aquatic 26.993504 38.12351 33.43601 42.58015
Occidozyga sumatrana Anura LC Semi-aquatic 28.836129 38.36733 33.67008 42.89270
Occidozyga floresiana Anura VU Semi-aquatic 26.978847 37.48508 33.77759 41.23553
Occidozyga floresiana Anura VU Semi-aquatic 26.418764 37.40787 33.67394 41.13311
Occidozyga floresiana Anura VU Semi-aquatic 28.259761 37.66166 33.82447 41.38055
Occidozyga diminutiva Anura NT Stream-dwelling 27.036207 37.23682 32.75615 41.78861
Occidozyga diminutiva Anura NT Stream-dwelling 26.712392 37.19357 32.72670 41.74453
Occidozyga diminutiva Anura NT Stream-dwelling 27.934527 37.35679 32.79568 41.90872
Allopaa hazarensis Anura LC Semi-aquatic 14.237908 38.03408 33.17552 42.36375
Allopaa hazarensis Anura LC Semi-aquatic 11.828419 37.71660 33.13048 42.28408
Allopaa hazarensis Anura LC Semi-aquatic 17.703455 38.49071 33.75485 42.78477
Chrysopaa sternosignata Anura LC Aquatic 21.472925 38.82169 34.65123 43.29898
Chrysopaa sternosignata Anura LC Aquatic 19.669400 38.58448 34.10444 42.80016
Chrysopaa sternosignata Anura LC Aquatic 24.378524 39.20385 35.10845 43.73883
Ombrana sikimensis Anura LC Stream-dwelling 20.184299 37.98466 33.91199 42.42984
Ombrana sikimensis Anura LC Stream-dwelling 18.918588 37.81648 33.82190 42.29534
Ombrana sikimensis Anura LC Stream-dwelling 22.001359 38.22608 34.26005 42.73176
Euphlyctis hexadactylus Anura LC Semi-aquatic 27.665118 40.75952 36.76608 44.79252
Euphlyctis hexadactylus Anura LC Semi-aquatic 26.696515 40.63696 36.63956 44.64550
Euphlyctis hexadactylus Anura LC Semi-aquatic 29.760671 41.02466 37.17099 45.29906
Euphlyctis cyanophlyctis Anura LC Semi-aquatic 25.972047 40.66493 36.75090 44.53337
Euphlyctis cyanophlyctis Anura LC Semi-aquatic 24.700752 40.50019 36.71104 44.42675
Euphlyctis cyanophlyctis Anura LC Semi-aquatic 28.241007 40.95896 36.95930 44.81635
Euphlyctis ehrenbergii Anura LC Semi-aquatic 24.551145 40.45222 36.31717 44.62544
Euphlyctis ehrenbergii Anura LC Semi-aquatic 23.594725 40.32590 36.16171 44.43087
Euphlyctis ehrenbergii Anura LC Semi-aquatic 26.396171 40.69589 36.60923 44.98098
Euphlyctis ghoshi Anura DD Semi-aquatic 28.910609 41.09776 36.61022 44.87469
Euphlyctis ghoshi Anura DD Semi-aquatic 28.102788 40.99232 37.28285 45.54687
Euphlyctis ghoshi Anura DD Semi-aquatic 30.449565 41.29862 36.75815 45.12177
Hoplobatrachus crassus Anura LC Fossorial 27.275274 42.21399 38.42299 46.28572
Hoplobatrachus crassus Anura LC Fossorial 26.198222 42.07527 38.27849 46.06144
Hoplobatrachus crassus Anura LC Fossorial 29.429990 42.49152 38.71207 46.73443
Hoplobatrachus tigerinus Anura LC Semi-aquatic 26.477236 41.54451 37.84612 45.02258
Hoplobatrachus tigerinus Anura LC Semi-aquatic 25.270738 41.38940 37.66563 44.72578
Hoplobatrachus tigerinus Anura LC Semi-aquatic 28.649644 41.82381 38.05592 45.39661
Hoplobatrachus occipitalis Anura LC Ground-dwelling 26.364553 40.67511 36.30175 44.60751
Hoplobatrachus occipitalis Anura LC Ground-dwelling 25.446693 40.55759 36.28361 44.51882
Hoplobatrachus occipitalis Anura LC Ground-dwelling 28.393487 40.93487 36.30137 44.78555
Nannophrys ceylonensis Anura VU Aquatic 27.311256 40.56443 36.36457 45.13833
Nannophrys ceylonensis Anura VU Aquatic 26.578946 40.46905 36.25485 45.03360
Nannophrys ceylonensis Anura VU Aquatic 29.131810 40.80154 36.54474 45.42486
Nannophrys marmorata Anura EN Semi-aquatic 27.311256 40.60773 36.44840 44.85846
Nannophrys marmorata Anura EN Semi-aquatic 26.578946 40.51406 36.37160 44.81879
Nannophrys marmorata Anura EN Semi-aquatic 29.131810 40.84060 36.54772 44.98911
Nannophrys naeyakai Anura EN Stream-dwelling 28.037441 39.93329 35.80398 44.81341
Nannophrys naeyakai Anura EN Stream-dwelling 27.226686 39.82581 35.61228 44.64072
Nannophrys naeyakai Anura EN Stream-dwelling 30.094095 40.20596 36.09443 45.28825
Fejervarya iskandari Anura LC Ground-dwelling 27.998314 40.18917 35.93370 44.20228
Fejervarya iskandari Anura LC Ground-dwelling 27.225793 40.08892 36.27918 44.45298
Fejervarya iskandari Anura LC Ground-dwelling 29.639961 40.40221 35.95621 44.33284
Fejervarya orissaensis Anura LC Ground-dwelling 27.945045 40.26589 36.48773 44.14118
Fejervarya orissaensis Anura LC Ground-dwelling 26.828421 40.12018 36.42214 43.98128
Fejervarya orissaensis Anura LC Ground-dwelling 29.977872 40.53116 36.97264 44.74918
Fejervarya moodiei Anura LC Semi-aquatic 27.963945 40.54507 36.30309 44.90936
Fejervarya moodiei Anura LC Semi-aquatic 27.344908 40.46412 36.21510 44.82157
Fejervarya moodiei Anura LC Semi-aquatic 29.276102 40.71667 36.45485 45.02209
Fejervarya multistriata Anura DD Semi-aquatic 27.409068 40.37615 36.35604 44.45280
Fejervarya multistriata Anura DD Semi-aquatic 26.657677 40.27853 36.26466 44.29394
Fejervarya multistriata Anura DD Semi-aquatic 28.852586 40.56368 36.69119 44.89013
Fejervarya triora Anura LC Ground-dwelling 28.757981 40.29625 36.36859 44.45599
Fejervarya triora Anura LC Ground-dwelling 27.647547 40.15139 36.38465 44.46531
Fejervarya triora Anura LC Ground-dwelling 30.790423 40.56138 36.60041 44.80057
Fejervarya verruculosa Anura LC Ground-dwelling 27.305552 40.08786 35.73765 44.05210
Fejervarya verruculosa Anura LC Ground-dwelling 26.735238 40.01371 35.70513 43.98315
Fejervarya verruculosa Anura LC Ground-dwelling 28.436888 40.23496 35.89964 44.28700
Fejervarya vittigera Anura LC Ground-dwelling 27.561339 40.16196 36.08737 44.62528
Fejervarya vittigera Anura LC Ground-dwelling 27.075210 40.09870 36.06118 44.54652
Fejervarya vittigera Anura LC Ground-dwelling 28.581351 40.29469 36.14232 44.75891
Sphaerotheca breviceps Anura LC Ground-dwelling 27.017795 40.04633 35.70738 43.68563
Sphaerotheca breviceps Anura LC Ground-dwelling 25.821835 39.89110 35.70284 43.63130
Sphaerotheca breviceps Anura LC Ground-dwelling 29.198812 40.32940 36.01326 44.16130
Sphaerotheca dobsonii Anura LC Fossorial 27.479726 41.12708 36.45641 45.08461
Sphaerotheca dobsonii Anura LC Fossorial 26.547199 41.00779 36.38554 44.93794
Sphaerotheca dobsonii Anura LC Fossorial 29.535965 41.39012 37.30033 46.01954
Sphaerotheca leucorhynchus Anura DD Fossorial 26.870883 41.02848 37.05844 45.34334
Sphaerotheca leucorhynchus Anura DD Fossorial 25.920847 40.90625 36.79916 45.02421
Sphaerotheca leucorhynchus Anura DD Fossorial 28.911091 41.29097 37.40002 45.87048
Sphaerotheca maskeyi Anura LC Fossorial 22.153699 40.37637 35.96788 44.28485
Sphaerotheca maskeyi Anura LC Fossorial 21.010926 40.22980 35.80091 44.14921
Sphaerotheca maskeyi Anura LC Fossorial 23.686004 40.57290 36.18322 44.56793
Sphaerotheca rolandae Anura LC Fossorial 28.096623 41.19857 37.16381 45.99634
Sphaerotheca rolandae Anura LC Fossorial 27.091353 41.06877 36.77380 45.55027
Sphaerotheca rolandae Anura LC Fossorial 30.193948 41.46937 37.03619 46.09033
Sphaerotheca swani Anura DD Fossorial 25.718021 40.84173 35.99814 44.51682
Sphaerotheca swani Anura DD Fossorial 24.884280 40.73315 35.94707 44.42132
Sphaerotheca swani Anura DD Fossorial 27.258757 41.04239 36.36584 44.88819
Limnonectes acanthi Anura NT Stream-dwelling 27.724965 38.15449 34.69809 42.20524
Limnonectes acanthi Anura NT Stream-dwelling 27.280459 38.09501 34.65856 42.14111
Limnonectes acanthi Anura NT Stream-dwelling 28.714498 38.28693 34.81153 42.35242
Limnonectes arathooni Anura VU Ground-dwelling 26.995195 38.64228 34.59648 42.63887
Limnonectes arathooni Anura VU Ground-dwelling 26.556956 38.58504 34.48072 42.54066
Limnonectes arathooni Anura VU Ground-dwelling 28.016889 38.77573 34.65234 42.78112
Limnonectes microtympanum Anura EN Stream-dwelling 26.639294 37.93723 34.19063 41.96771
Limnonectes microtympanum Anura EN Stream-dwelling 26.286033 37.89086 34.15802 41.91790
Limnonectes microtympanum Anura EN Stream-dwelling 27.659920 38.07117 34.28589 42.13438
Limnonectes asperatus Anura LC Ground-dwelling 28.366507 38.88602 34.20546 42.40803
Limnonectes asperatus Anura LC Ground-dwelling 27.614805 38.78742 34.70233 42.87722
Limnonectes asperatus Anura LC Ground-dwelling 29.856694 39.08149 34.48127 42.73364
Limnonectes kuhlii Anura LC Stream-dwelling 27.275423 38.00794 33.82415 41.72161
Limnonectes kuhlii Anura LC Stream-dwelling 26.657741 37.92783 33.77647 41.62355
Limnonectes kuhlii Anura LC Stream-dwelling 28.512588 38.16840 34.02824 41.96462
Limnonectes fujianensis Anura LC Semi-aquatic 27.362215 39.00771 34.88464 42.95934
Limnonectes fujianensis Anura LC Semi-aquatic 26.060290 38.83514 35.05751 43.04887
Limnonectes fujianensis Anura LC Semi-aquatic 29.599941 39.30431 35.10391 43.29531
Limnonectes namiyei Anura EN Stream-dwelling 27.508538 38.04999 34.12539 42.02012
Limnonectes namiyei Anura EN Stream-dwelling 26.808429 37.95669 33.99445 41.87444
Limnonectes namiyei Anura EN Stream-dwelling 28.598246 38.19521 34.02826 42.00035
Limnonectes poilani Anura LC Stream-dwelling 28.218021 37.47090 34.23179 40.68385
Limnonectes poilani Anura LC Stream-dwelling 27.244467 37.33963 34.06002 40.49239
Limnonectes poilani Anura LC Stream-dwelling 30.051218 37.71807 34.49246 41.08028
Limnonectes dabanus Anura LC Semi-aquatic 28.257899 39.14828 35.03555 43.20212
Limnonectes dabanus Anura LC Semi-aquatic 27.264316 39.01574 34.97775 43.08454
Limnonectes dabanus Anura LC Semi-aquatic 30.092127 39.39297 35.00968 43.27086
Limnonectes gyldenstolpei Anura LC Ground-dwelling 27.838643 38.78055 34.95376 42.78481
Limnonectes gyldenstolpei Anura LC Ground-dwelling 26.921021 38.66133 34.89614 42.69450
Limnonectes gyldenstolpei Anura LC Ground-dwelling 29.665814 39.01793 35.04455 43.03745
Limnonectes dammermani Anura LC Stream-dwelling 27.227550 38.10827 34.21138 42.40799
Limnonectes dammermani Anura LC Stream-dwelling 26.670896 38.03436 33.95236 42.13016
Limnonectes dammermani Anura LC Stream-dwelling 28.350405 38.25735 34.26078 42.45212
Limnonectes diuatus Anura VU Stream-dwelling 27.578204 38.15079 34.10486 42.12107
Limnonectes diuatus Anura VU Stream-dwelling 26.898940 38.06285 34.03367 42.04201
Limnonectes diuatus Anura VU Stream-dwelling 28.946926 38.32798 34.29008 42.38366
Limnonectes doriae Anura LC Ground-dwelling 27.755593 38.76245 34.88577 42.63140
Limnonectes doriae Anura LC Ground-dwelling 26.971935 38.66007 34.80195 42.55197
Limnonectes doriae Anura LC Ground-dwelling 29.433288 38.98162 35.06289 42.95637
Limnonectes hascheanus Anura LC Ground-dwelling 27.411570 38.64124 34.61725 42.24435
Limnonectes hascheanus Anura LC Ground-dwelling 26.632643 38.54052 34.51363 42.11755
Limnonectes hascheanus Anura LC Ground-dwelling 29.037879 38.85154 34.89821 42.63735
Limnonectes limborgi Anura LC Ground-dwelling 26.902288 38.60421 34.95633 42.72013
Limnonectes limborgi Anura LC Ground-dwelling 25.977717 38.48165 34.85937 42.64376
Limnonectes limborgi Anura LC Ground-dwelling 28.749545 38.84908 35.07463 42.91418
Limnonectes plicatellus Anura LC Stream-dwelling 28.211627 38.16211 34.16943 42.37291
Limnonectes plicatellus Anura LC Stream-dwelling 27.524926 38.07080 34.06187 42.23304
Limnonectes plicatellus Anura LC Stream-dwelling 29.604125 38.34726 34.03479 42.31517
Limnonectes kohchangae Anura LC Ground-dwelling 28.763054 38.89936 34.82866 42.90115
Limnonectes kohchangae Anura LC Ground-dwelling 27.877537 38.78314 35.11406 43.13781
Limnonectes kohchangae Anura LC Ground-dwelling 30.540541 39.13263 34.99273 43.14816
Limnonectes finchi Anura LC Ground-dwelling 27.701335 38.37455 35.01741 41.76381
Limnonectes finchi Anura LC Ground-dwelling 27.060880 38.28910 34.96447 41.66187
Limnonectes finchi Anura LC Ground-dwelling 29.023813 38.55101 35.06397 41.92771
Limnonectes ingeri Anura LC Stream-dwelling 27.517277 37.75887 34.55526 41.22761
Limnonectes ingeri Anura LC Stream-dwelling 26.932930 37.68019 34.53039 41.15779
Limnonectes ingeri Anura LC Stream-dwelling 28.780339 37.92894 34.48588 41.20513
Limnonectes fragilis Anura VU Stream-dwelling 27.983220 38.10091 33.90442 41.83709
Limnonectes fragilis Anura VU Stream-dwelling 27.369547 38.02009 34.06261 41.95609
Limnonectes fragilis Anura VU Stream-dwelling 29.121736 38.25083 34.11215 42.07364
Limnonectes grunniens Anura LC Semi-aquatic 26.964790 38.93820 35.00540 43.01964
Limnonectes grunniens Anura LC Semi-aquatic 26.386449 38.86097 35.02019 42.97233
Limnonectes grunniens Anura LC Semi-aquatic 28.201995 39.10341 35.06423 43.15591
Limnonectes ibanorum Anura LC Semi-aquatic 27.898434 38.97568 34.96932 42.96495
Limnonectes ibanorum Anura LC Semi-aquatic 27.204884 38.88355 35.02649 42.99874
Limnonectes ibanorum Anura LC Semi-aquatic 29.291845 39.16080 35.13658 43.13921
Limnonectes heinrichi Anura VU Stream-dwelling 27.268793 37.44758 34.08523 41.11752
Limnonectes heinrichi Anura VU Stream-dwelling 26.829377 37.38820 33.66057 40.66066
Limnonectes heinrichi Anura VU Stream-dwelling 28.234574 37.57807 34.19014 41.29703
Limnonectes modestus Anura LC Semi-aquatic 27.017380 38.30731 34.79717 41.99145
Limnonectes modestus Anura LC Semi-aquatic 26.550149 38.24519 34.73116 41.88534
Limnonectes modestus Anura LC Semi-aquatic 28.096988 38.45085 34.85572 42.11825
Limnonectes macrocephalus Anura NT Semi-aquatic 27.806311 38.17368 34.55202 41.28353
Limnonectes macrocephalus Anura NT Semi-aquatic 27.297847 38.10606 34.54214 41.26341
Limnonectes macrocephalus Anura NT Semi-aquatic 28.780176 38.30319 34.58810 41.42137
Limnonectes visayanus Anura NT Stream-dwelling 27.211410 37.26410 33.88812 40.68368
Limnonectes visayanus Anura NT Stream-dwelling 26.782281 37.20687 33.83390 40.61937
Limnonectes visayanus Anura NT Stream-dwelling 28.200588 37.39602 33.96018 40.83941
Limnonectes magnus Anura NT Stream-dwelling 27.370942 37.40996 34.32118 41.11046
Limnonectes magnus Anura NT Stream-dwelling 26.860372 37.34095 34.31883 41.01149
Limnonectes magnus Anura NT Stream-dwelling 28.453171 37.55622 34.56070 41.44995
Limnonectes kadarsani Anura LC Stream-dwelling 27.403319 38.09345 34.14526 42.22057
Limnonectes kadarsani Anura LC Stream-dwelling 26.821651 38.01615 34.08988 42.18281
Limnonectes kadarsani Anura LC Stream-dwelling 28.594547 38.25175 34.30023 42.42210
Limnonectes microdiscus Anura LC Ground-dwelling 27.523986 38.61655 34.57920 42.67912
Limnonectes microdiscus Anura LC Ground-dwelling 26.888960 38.53385 34.38883 42.44943
Limnonectes microdiscus Anura LC Ground-dwelling 28.809029 38.78389 34.78070 42.92291
Limnonectes kenepaiensis Anura VU Ground-dwelling 27.731968 38.96912 35.04793 42.97741
Limnonectes kenepaiensis Anura VU Ground-dwelling 27.241321 38.90231 35.00425 42.91335
Limnonectes kenepaiensis Anura VU Ground-dwelling 28.733798 39.10554 35.18063 43.15744
Limnonectes khammonensis Anura DD Ground-dwelling 28.303951 38.99512 34.99240 42.77371
Limnonectes khammonensis Anura DD Ground-dwelling 27.377110 38.87212 35.00142 42.72591
Limnonectes khammonensis Anura DD Ground-dwelling 30.366965 39.26890 35.13209 42.97232
Limnonectes khasianus Anura LC Ground-dwelling 25.605456 38.43091 34.55287 42.47512
Limnonectes khasianus Anura LC Ground-dwelling 24.726405 38.31582 34.44744 42.35709
Limnonectes khasianus Anura LC Ground-dwelling 27.264789 38.64815 34.78349 42.80981
Limnonectes leporinus Anura LC Ground-dwelling 27.853447 38.86226 34.75217 42.48764
Limnonectes leporinus Anura LC Ground-dwelling 27.220732 38.77880 34.74778 42.41992
Limnonectes leporinus Anura LC Ground-dwelling 29.170079 39.03594 34.78605 42.59175
Limnonectes leytensis Anura LC Stream-dwelling 27.373434 38.13310 34.41526 41.93771
Limnonectes leytensis Anura LC Stream-dwelling 26.890113 38.06841 34.33733 41.82157
Limnonectes leytensis Anura LC Stream-dwelling 28.424691 38.27380 34.57715 42.18241
Limnonectes macrodon Anura LC Semi-aquatic 27.600141 38.96991 34.65376 42.41723
Limnonectes macrodon Anura LC Semi-aquatic 26.958813 38.88482 34.57466 42.31819
Limnonectes macrodon Anura LC Semi-aquatic 28.876242 39.13923 34.82846 42.69312
Limnonectes shompenorum Anura LC Ground-dwelling 27.452763 38.68320 34.76222 42.78547
Limnonectes shompenorum Anura LC Ground-dwelling 26.914395 38.61176 34.72560 42.70639
Limnonectes shompenorum Anura LC Ground-dwelling 28.593511 38.83458 34.86471 42.96111
Limnonectes paramacrodon Anura LC Semi-aquatic 28.031207 38.99533 35.08746 43.29910
Limnonectes paramacrodon Anura LC Semi-aquatic 27.395893 38.91136 34.80414 43.01001
Limnonectes paramacrodon Anura LC Semi-aquatic 29.394164 39.17547 35.21667 43.45114
Limnonectes macrognathus Anura LC Ground-dwelling 27.786626 38.79230 34.32139 42.21948
Limnonectes macrognathus Anura LC Ground-dwelling 27.030414 38.69362 34.25738 42.12501
Limnonectes macrognathus Anura LC Ground-dwelling 29.428365 39.00655 34.78619 42.82205
Limnonectes mawlyndipi Anura DD Ground-dwelling 22.878119 38.18490 34.65751 41.97727
Limnonectes mawlyndipi Anura DD Ground-dwelling 21.570552 38.01165 34.50474 41.78924
Limnonectes mawlyndipi Anura DD Ground-dwelling 25.033585 38.47051 34.93012 42.32456
Limnonectes micrixalus Anura DD Stream-dwelling 26.723445 38.10491 34.47764 42.09924
Limnonectes micrixalus Anura DD Stream-dwelling 26.446530 38.06757 34.43335 42.05236
Limnonectes micrixalus Anura DD Stream-dwelling 27.565855 38.21851 34.47683 42.14768
Limnonectes nitidus Anura EN Stream-dwelling 27.573696 38.16110 34.18374 42.18033
Limnonectes nitidus Anura EN Stream-dwelling 26.813863 38.06114 34.10456 42.09261
Limnonectes nitidus Anura EN Stream-dwelling 28.996984 38.34834 34.30377 42.41281
Limnonectes palavanensis Anura LC Stream-dwelling 27.664924 38.18619 34.37076 42.16026
Limnonectes palavanensis Anura LC Stream-dwelling 27.084097 38.10972 34.28397 42.08170
Limnonectes palavanensis Anura LC Stream-dwelling 28.903927 38.34932 34.43116 42.29795
Limnonectes parvus Anura LC Stream-dwelling 27.446727 38.12589 33.80672 42.11480
Limnonectes parvus Anura LC Stream-dwelling 26.906173 38.05548 33.73794 41.99386
Limnonectes parvus Anura LC Stream-dwelling 28.598672 38.27594 34.33163 42.72552
Limnonectes tweediei Anura LC Ground-dwelling 28.122771 38.79341 34.99382 42.73707
Limnonectes tweediei Anura LC Ground-dwelling 27.434236 38.70283 34.91271 42.61245
Limnonectes tweediei Anura LC Ground-dwelling 29.539728 38.97984 35.16231 43.08443
Nanorana aenea Anura LC Ground-dwelling 25.007362 41.46956 37.09973 45.12220
Nanorana aenea Anura LC Ground-dwelling 24.049355 41.34818 37.03918 45.01655
Nanorana aenea Anura LC Ground-dwelling 26.965939 41.71770 37.23243 45.38919
Nanorana unculuanus Anura VU Stream-dwelling 23.126176 40.65236 36.33944 44.01911
Nanorana unculuanus Anura VU Stream-dwelling 22.080291 40.52031 36.37025 44.02184
Nanorana unculuanus Anura VU Stream-dwelling 25.220601 40.91681 36.85058 44.56728
Nanorana annandalii Anura NT Stream-dwelling 19.565867 40.23733 36.17554 44.14425
Nanorana annandalii Anura NT Stream-dwelling 18.339023 40.08267 36.05623 43.96910
Nanorana annandalii Anura NT Stream-dwelling 21.358728 40.46335 36.34989 44.32805
Nanorana arnoldi Anura DD Stream-dwelling 16.773094 39.82674 35.66218 43.18120
Nanorana arnoldi Anura DD Stream-dwelling 15.340870 39.64217 35.65920 43.15534
Nanorana arnoldi Anura DD Stream-dwelling 19.054769 40.12076 35.91687 43.38706
Nanorana maculosa Anura VU Stream-dwelling 22.537233 40.54468 36.55140 44.39880
Nanorana maculosa Anura VU Stream-dwelling 21.553350 40.42084 36.46179 44.23383
Nanorana maculosa Anura VU Stream-dwelling 24.556818 40.79888 36.97812 44.89770
Nanorana medogensis Anura EN Stream-dwelling 16.274470 39.80525 36.26686 43.90603
Nanorana medogensis Anura EN Stream-dwelling 14.438870 39.56805 35.92149 43.59058
Nanorana medogensis Anura EN Stream-dwelling 18.508255 40.09390 36.58570 44.22879
Nanorana blanfordii Anura LC Stream-dwelling 18.865073 40.04087 36.23128 44.06109
Nanorana blanfordii Anura LC Stream-dwelling 16.953321 39.79709 36.09952 43.93740
Nanorana blanfordii Anura LC Stream-dwelling 20.944022 40.30596 36.53443 44.43154
Nanorana conaensis Anura DD Stream-dwelling 18.123993 39.89616 36.27102 44.03762
Nanorana conaensis Anura DD Stream-dwelling 16.919588 39.73959 36.07966 43.80691
Nanorana conaensis Anura DD Stream-dwelling 20.034315 40.14449 36.05262 43.89865
Nanorana ercepeae Anura NT Stream-dwelling 20.643088 40.32694 36.50960 44.08836
Nanorana ercepeae Anura NT Stream-dwelling 18.866951 40.09972 36.25784 43.77892
Nanorana ercepeae Anura NT Stream-dwelling 22.793637 40.60205 36.86806 44.47827
Nanorana taihangnica Anura LC Stream-dwelling 22.575038 40.54413 36.89190 44.58800
Nanorana taihangnica Anura LC Stream-dwelling 19.980073 40.21481 36.38564 44.03726
Nanorana taihangnica Anura LC Stream-dwelling 26.210517 41.00550 37.35867 45.19984
Nanorana liebigii Anura LC Stream-dwelling 16.715152 39.83180 35.78846 43.52509
Nanorana liebigii Anura LC Stream-dwelling 14.903685 39.60111 35.54209 43.33113
Nanorana liebigii Anura LC Stream-dwelling 19.118218 40.13783 36.19874 43.89661
Nanorana minica Anura LC Stream-dwelling 17.789425 39.94441 36.45471 44.11004
Nanorana minica Anura LC Stream-dwelling 15.620371 39.66523 35.98798 43.62594
Nanorana minica Anura LC Stream-dwelling 20.261152 40.26255 36.29218 43.91232
Nanorana mokokchungensis Anura DD Stream-dwelling 26.428880 40.96881 37.09323 44.86924
Nanorana mokokchungensis Anura DD Stream-dwelling 25.647236 40.87010 36.98096 44.72394
Nanorana mokokchungensis Anura DD Stream-dwelling 28.107161 41.18076 37.00007 44.92288
Nanorana parkeri Anura LC Ground-dwelling 11.016543 39.70561 35.62298 43.40788
Nanorana parkeri Anura LC Ground-dwelling 8.948305 39.43840 35.51839 43.26334
Nanorana parkeri Anura LC Ground-dwelling 13.752554 40.05910 36.07502 43.80202
Nanorana pleskei Anura LC Aquatic 13.699426 40.11980 35.91907 43.67741
Nanorana pleskei Anura LC Aquatic 11.270339 39.80502 35.62446 43.31110
Nanorana pleskei Anura LC Aquatic 16.563161 40.49090 36.65118 44.42482
Nanorana ventripunctata Anura LC Semi-aquatic 16.274528 40.57701 36.64169 44.44415
Nanorana ventripunctata Anura LC Semi-aquatic 14.858923 40.39714 36.48960 44.32346
Nanorana ventripunctata Anura LC Semi-aquatic 18.530362 40.86364 37.25057 45.04143
Nanorana polunini Anura LC Stream-dwelling 17.472125 39.97378 36.37846 43.35665
Nanorana polunini Anura LC Stream-dwelling 15.888175 39.77252 36.48460 43.45722
Nanorana polunini Anura LC Stream-dwelling 19.632302 40.24825 36.69637 43.68119
Nanorana quadranus Anura NT Stream-dwelling 23.494118 40.67900 36.46196 44.47085
Nanorana quadranus Anura NT Stream-dwelling 20.879571 40.34991 36.56995 44.45881
Nanorana quadranus Anura NT Stream-dwelling 26.762139 41.09034 37.00409 45.02716
Nanorana rarica Anura DD Semi-aquatic 12.257130 40.12666 36.39918 44.17461
Nanorana rarica Anura DD Semi-aquatic 9.625352 39.78777 36.16125 44.06600
Nanorana rarica Anura DD Semi-aquatic 15.282354 40.51622 36.80879 44.46436
Nanorana rostandi Anura VU Stream-dwelling 16.243126 39.73757 36.00423 43.67028
Nanorana rostandi Anura VU Stream-dwelling 14.305865 39.49088 35.64684 43.31408
Nanorana rostandi Anura VU Stream-dwelling 19.135171 40.10585 36.35045 44.04444
Nanorana vicina Anura LC Stream-dwelling 15.514905 39.62636 35.92309 43.72476
Nanorana vicina Anura LC Stream-dwelling 13.058761 39.31880 35.26028 43.11095
Nanorana vicina Anura LC Stream-dwelling 18.314223 39.97690 36.27745 43.99696
Nanorana yunnanensis Anura EN Stream-dwelling 22.767181 40.59079 36.85274 44.37584
Nanorana yunnanensis Anura EN Stream-dwelling 21.491979 40.42830 36.69289 44.24078
Nanorana yunnanensis Anura EN Stream-dwelling 24.936567 40.86721 37.09772 44.62753
Quasipaa boulengeri Anura VU Stream-dwelling 24.444253 41.98772 38.86930 45.77545
Quasipaa boulengeri Anura VU Stream-dwelling 22.535309 41.74385 38.18408 45.02569
Quasipaa boulengeri Anura VU Stream-dwelling 27.006346 42.31504 39.01476 46.11561
Quasipaa verrucospinosa Anura LC Stream-dwelling 25.774213 42.11561 38.63950 46.01573
Quasipaa verrucospinosa Anura LC Stream-dwelling 24.819417 41.99562 38.03747 45.35198
Quasipaa verrucospinosa Anura LC Stream-dwelling 27.673070 42.35424 38.86511 46.41935
Quasipaa jiulongensis Anura VU Stream-dwelling 26.796261 42.22534 38.68041 45.41068
Quasipaa jiulongensis Anura VU Stream-dwelling 25.215259 42.02341 38.64066 45.28409
Quasipaa jiulongensis Anura VU Stream-dwelling 29.375743 42.55479 38.94278 45.85477
Quasipaa shini Anura EN Stream-dwelling 26.633452 42.25893 38.76057 46.14120
Quasipaa shini Anura EN Stream-dwelling 25.366177 42.09840 38.63940 45.92390
Quasipaa shini Anura EN Stream-dwelling 28.901591 42.54625 38.65335 46.20626
Quasipaa exilispinosa Anura LC Stream-dwelling 27.376992 42.71709 39.33498 45.86439
Quasipaa exilispinosa Anura LC Stream-dwelling 26.060565 42.55491 39.19087 45.66113
Quasipaa exilispinosa Anura LC Stream-dwelling 29.752883 43.00979 39.63098 46.32904
Quasipaa yei Anura VU Stream-dwelling 27.724204 42.20993 38.37960 46.12037
Quasipaa yei Anura VU Stream-dwelling 24.926582 41.85503 37.86726 45.51373
Quasipaa yei Anura VU Stream-dwelling 30.789178 42.59873 38.50897 46.57916
Quasipaa delacouri Anura LC Stream-dwelling 26.204096 41.49676 37.52356 45.01541
Quasipaa delacouri Anura LC Stream-dwelling 25.183716 41.36840 37.40479 44.85875
Quasipaa delacouri Anura LC Stream-dwelling 28.147432 41.74122 37.77759 45.45854
Quasipaa fasciculispina Anura LC Stream-dwelling 29.003605 41.89902 38.05565 45.38456
Quasipaa fasciculispina Anura LC Stream-dwelling 28.049291 41.77914 37.92728 45.21063
Quasipaa fasciculispina Anura LC Stream-dwelling 30.902969 42.13764 38.07794 45.59641
Amolops archotaphus Anura DD Stream-dwelling 25.466407 36.49570 31.80941 40.69265
Amolops archotaphus Anura DD Stream-dwelling 24.424144 36.35569 32.11521 40.99174
Amolops archotaphus Anura DD Stream-dwelling 27.514201 36.77078 32.00288 40.99968
Amolops aniqiaoensis Anura VU Stream-dwelling 16.274470 35.32776 31.68451 39.93035
Amolops aniqiaoensis Anura VU Stream-dwelling 14.438870 35.08547 31.39833 39.71181
Amolops aniqiaoensis Anura VU Stream-dwelling 18.508255 35.62262 32.02206 40.22868
Amolops assamensis Anura DD Stream-dwelling 26.220454 36.70865 32.39366 41.01959
Amolops assamensis Anura DD Stream-dwelling 25.541192 36.61728 32.20981 40.80346
Amolops assamensis Anura DD Stream-dwelling 27.727905 36.91142 32.61585 41.26979
Amolops bellulus Anura NT Stream-dwelling 19.727425 35.79637 31.15010 39.81533
Amolops bellulus Anura NT Stream-dwelling 18.633451 35.64851 31.07096 39.75095
Amolops bellulus Anura NT Stream-dwelling 21.562968 36.04446 31.78770 40.53457
Amolops chakrataensis Anura DD Stream-dwelling 21.322882 35.98224 31.70186 40.09008
Amolops chakrataensis Anura DD Stream-dwelling 19.688684 35.76248 31.47089 39.84341
Amolops chakrataensis Anura DD Stream-dwelling 22.921071 36.19715 31.86844 40.28537
Amolops chunganensis Anura LC Ground-dwelling 23.960706 37.01724 32.93569 41.36150
Amolops chunganensis Anura LC Ground-dwelling 21.942787 36.75300 32.72464 41.07174
Amolops chunganensis Anura LC Ground-dwelling 26.612427 37.36447 33.26201 41.84756
Amolops compotrix Anura LC Stream-dwelling 27.965701 36.92294 32.46372 41.28209
Amolops compotrix Anura LC Stream-dwelling 27.058481 36.79803 32.31027 41.09265
Amolops compotrix Anura LC Stream-dwelling 29.743221 37.16768 32.67144 41.53513
Amolops cucae Anura EN Stream-dwelling 25.770069 36.53254 31.79784 40.37965
Amolops cucae Anura EN Stream-dwelling 24.729135 36.39274 31.61425 40.20417
Amolops cucae Anura EN Stream-dwelling 27.661013 36.78651 32.12379 40.70038
Amolops vitreus Anura VU Stream-dwelling 24.510928 36.39329 32.40268 40.82856
Amolops vitreus Anura VU Stream-dwelling 23.498034 36.25989 32.23771 40.69655
Amolops vitreus Anura VU Stream-dwelling 26.508575 36.65638 32.57597 41.03298
Amolops cremnobatus Anura LC Stream-dwelling 27.149555 36.82415 32.09267 41.02005
Amolops cremnobatus Anura LC Stream-dwelling 26.219971 36.70427 32.36749 41.22588
Amolops cremnobatus Anura LC Stream-dwelling 29.029989 37.06666 32.23151 41.24407
Amolops daiyunensis Anura NT Stream-dwelling 27.017174 36.67972 32.34813 41.07731
Amolops daiyunensis Anura NT Stream-dwelling 25.847703 36.52285 32.23913 40.94940
Amolops daiyunensis Anura NT Stream-dwelling 29.414927 37.00135 32.56463 41.39315
Amolops iriodes Anura DD Ground-dwelling 26.309342 37.42383 32.75941 41.52038
Amolops iriodes Anura DD Ground-dwelling 25.260109 37.28430 32.84107 41.55670
Amolops iriodes Anura DD Ground-dwelling 28.080535 37.65938 33.12100 42.02085
Amolops formosus Anura LC Stream-dwelling 19.471509 35.78397 31.43064 40.04094
Amolops formosus Anura LC Stream-dwelling 17.915356 35.57621 31.30805 39.91400
Amolops formosus Anura LC Stream-dwelling 21.615463 36.07022 31.83584 40.46673
Amolops gerbillus Anura LC Stream-dwelling 20.593910 35.91928 31.98049 40.26587
Amolops gerbillus Anura LC Stream-dwelling 19.313420 35.74951 31.91861 40.21613
Amolops gerbillus Anura LC Stream-dwelling 22.561743 36.18017 32.32906 40.57289
Amolops granulosus Anura LC Ground-dwelling 21.560593 36.58512 32.53615 40.53214
Amolops granulosus Anura LC Ground-dwelling 19.057451 36.25559 32.31184 40.24767
Amolops granulosus Anura LC Ground-dwelling 24.498670 36.97191 32.82104 40.96805
Amolops lifanensis Anura LC Stream-dwelling 19.006161 35.66260 31.70012 39.62688
Amolops lifanensis Anura LC Stream-dwelling 16.550090 35.32491 31.33575 39.15732
Amolops lifanensis Anura LC Stream-dwelling 21.708454 36.03414 31.87596 39.81340
Amolops hainanensis Anura EN Stream-dwelling 27.983220 36.83808 32.54961 41.07291
Amolops hainanensis Anura EN Stream-dwelling 27.369547 36.75707 32.63941 41.11033
Amolops hainanensis Anura EN Stream-dwelling 29.121736 36.98836 32.66547 41.23975
Amolops hongkongensis Anura EN Stream-dwelling 27.409068 36.82603 32.12289 41.48359
Amolops hongkongensis Anura EN Stream-dwelling 26.657677 36.72380 32.06115 41.32874
Amolops hongkongensis Anura EN Stream-dwelling 28.852586 37.02241 32.10870 41.57680
Amolops jaunsari Anura DD Stream-dwelling 21.488480 36.02790 31.47964 40.41615
Amolops jaunsari Anura DD Stream-dwelling 19.378597 35.74480 31.25651 40.07797
Amolops jaunsari Anura DD Stream-dwelling 23.270639 36.26702 31.67844 40.60715
Amolops jinjiangensis Anura LC Stream-dwelling 16.622172 35.34688 31.16985 39.85109
Amolops jinjiangensis Anura LC Stream-dwelling 15.033584 35.13463 30.98151 39.64422
Amolops jinjiangensis Anura LC Stream-dwelling 18.844124 35.64374 31.64750 40.38891
Amolops tuberodepressus Anura VU Stream-dwelling 22.537233 36.13638 31.96809 40.65974
Amolops tuberodepressus Anura VU Stream-dwelling 21.553350 36.00599 31.81948 40.52563
Amolops tuberodepressus Anura VU Stream-dwelling 24.556818 36.40402 32.23957 40.98498
Amolops loloensis Anura VU Stream-dwelling 20.402796 35.83800 31.50278 40.17903
Amolops loloensis Anura VU Stream-dwelling 18.828296 35.62654 31.50992 40.19028
Amolops loloensis Anura VU Stream-dwelling 22.585950 36.13120 31.87038 40.48510
Amolops mantzorum Anura LC Stream-dwelling 18.050190 35.55001 31.27562 39.71909
Amolops mantzorum Anura LC Stream-dwelling 16.162066 35.29678 31.05448 39.44754
Amolops mantzorum Anura LC Stream-dwelling 20.509253 35.87982 31.24306 39.75753
Amolops kaulbacki Anura DD Stream-dwelling 18.902632 35.64055 31.26621 39.66577
Amolops kaulbacki Anura DD Stream-dwelling 17.678012 35.47266 31.03095 39.43759
Amolops kaulbacki Anura DD Stream-dwelling 20.816900 35.90300 31.60085 39.90839
Amolops larutensis Anura LC Stream-dwelling 28.010226 36.93980 32.89818 41.65071
Amolops larutensis Anura LC Stream-dwelling 27.326858 36.84647 32.78187 41.56396
Amolops larutensis Anura LC Stream-dwelling 29.425141 37.13302 32.98283 41.83231
Amolops longimanus Anura DD Ground-dwelling 22.253983 36.76203 32.81579 41.17701
Amolops longimanus Anura DD Ground-dwelling 21.309989 36.63311 32.63766 41.02650
Amolops longimanus Anura DD Ground-dwelling 24.030407 37.00465 32.92365 41.37197
Amolops marmoratus Anura LC Stream-dwelling 22.929813 36.28306 31.70120 40.46008
Amolops marmoratus Anura LC Stream-dwelling 21.807970 36.13254 31.61136 40.35683
Amolops marmoratus Anura LC Stream-dwelling 24.784247 36.53189 31.91114 40.73785
Amolops medogensis Anura EN Stream-dwelling 16.274470 35.40192 31.26886 40.04212
Amolops medogensis Anura EN Stream-dwelling 14.438870 35.15574 30.86547 39.70888
Amolops medogensis Anura EN Stream-dwelling 18.508255 35.70152 31.54048 40.31917
Amolops mengyangensis Anura DD Stream-dwelling 22.925496 36.15542 31.99281 40.53891
Amolops mengyangensis Anura DD Stream-dwelling 21.932124 36.01984 31.88870 40.47998
Amolops mengyangensis Anura DD Stream-dwelling 24.998979 36.43842 32.19500 40.84933
Amolops minutus Anura EN Stream-dwelling 25.386180 36.58447 32.42799 41.41215
Amolops minutus Anura EN Stream-dwelling 24.362627 36.44774 32.19234 41.12117
Amolops minutus Anura EN Stream-dwelling 27.369961 36.84947 32.56281 41.61501
Amolops monticola Anura LC Stream-dwelling 17.157859 35.37552 31.32458 39.74605
Amolops monticola Anura LC Stream-dwelling 15.446903 35.14253 31.12020 39.50111
Amolops monticola Anura LC Stream-dwelling 19.388678 35.67931 31.54167 39.97866
Amolops panhai Anura LC Stream-dwelling 28.238657 36.90296 32.22459 40.72507
Amolops panhai Anura LC Stream-dwelling 27.515200 36.80870 32.11582 40.56372
Amolops panhai Anura LC Stream-dwelling 29.857943 37.11393 32.47626 41.13643
Amolops ricketti Anura LC Stream-dwelling 27.064811 36.80908 32.50700 41.24853
Amolops ricketti Anura LC Stream-dwelling 25.654354 36.61848 32.37792 41.11585
Amolops ricketti Anura LC Stream-dwelling 29.437106 37.12965 32.59408 41.37887
Amolops wuyiensis Anura LC Stream-dwelling 26.811613 36.78398 32.65976 41.36861
Amolops wuyiensis Anura LC Stream-dwelling 25.195182 36.57117 32.51933 41.10717
Amolops wuyiensis Anura LC Stream-dwelling 29.238532 37.10349 32.95919 41.80214
Amolops spinapectoralis Anura LC Stream-dwelling 27.809515 36.89242 32.40868 41.17135
Amolops spinapectoralis Anura LC Stream-dwelling 26.870861 36.76619 32.12453 40.87160
Amolops spinapectoralis Anura LC Stream-dwelling 29.564709 37.12847 32.58041 41.41473
Amolops splendissimus Anura VU Stream-dwelling 25.209311 36.57554 31.74538 40.50113
Amolops splendissimus Anura VU Stream-dwelling 24.193130 36.44090 31.65282 40.40968
Amolops splendissimus Anura VU Stream-dwelling 27.169630 36.83529 32.54763 41.35700
Amolops torrentis Anura VU Stream-dwelling 27.983220 36.84583 32.76749 41.40201
Amolops torrentis Anura VU Stream-dwelling 27.369547 36.76308 32.72059 41.34386
Amolops torrentis Anura VU Stream-dwelling 29.121736 36.99936 32.89555 41.57902
Amolops viridimaculatus Anura LC Stream-dwelling 20.758119 35.98108 31.42580 40.24552
Amolops viridimaculatus Anura LC Stream-dwelling 19.621641 35.82565 31.28294 40.08020
Amolops viridimaculatus Anura LC Stream-dwelling 22.689564 36.24524 31.84764 40.67120
Babina holsti Anura EN Semi-aquatic 27.471030 37.13144 32.88953 41.04494
Babina holsti Anura EN Semi-aquatic 26.758684 37.03525 32.81747 40.92594
Babina holsti Anura EN Semi-aquatic 28.510642 37.27182 33.10937 41.33478
Babina subaspera Anura EN Ground-dwelling 27.202498 36.84550 32.87103 40.69760
Babina subaspera Anura EN Ground-dwelling 26.297523 36.72218 32.89357 40.67114
Babina subaspera Anura EN Ground-dwelling 28.150634 36.97470 33.02372 40.91862
Odorrana absita Anura LC Stream-dwelling 27.796495 36.27250 32.30704 40.28580
Odorrana absita Anura LC Stream-dwelling 26.864557 36.14847 32.13586 40.03817
Odorrana absita Anura LC Stream-dwelling 29.545363 36.50526 32.46771 40.59857
Odorrana khalam Anura LC Stream-dwelling 28.040920 36.31602 32.25340 39.86681
Odorrana khalam Anura LC Stream-dwelling 27.104234 36.19115 32.24748 39.83497
Odorrana khalam Anura LC Stream-dwelling 29.821524 36.55339 32.41392 40.15869
Odorrana amamiensis Anura EN Stream-dwelling 27.264420 36.28430 32.34286 40.14635
Odorrana amamiensis Anura EN Stream-dwelling 26.360691 36.16424 32.06532 39.83086
Odorrana amamiensis Anura EN Stream-dwelling 28.196021 36.40807 32.41170 40.20718
Odorrana narina Anura EN Stream-dwelling 27.508538 36.30670 32.42785 40.55773
Odorrana narina Anura EN Stream-dwelling 26.808429 36.21192 32.34401 40.44819
Odorrana narina Anura EN Stream-dwelling 28.598246 36.45423 32.56045 40.72823
Odorrana supranarina Anura EN Stream-dwelling 27.938607 36.30495 32.36121 40.00509
Odorrana supranarina Anura EN Stream-dwelling 27.237240 36.21136 32.25695 39.87506
Odorrana supranarina Anura EN Stream-dwelling 29.033540 36.45106 32.50009 40.20043
Odorrana jingdongensis Anura VU Stream-dwelling 22.922182 35.69745 32.17427 39.75878
Odorrana jingdongensis Anura VU Stream-dwelling 21.891184 35.55814 32.02500 39.59750
Odorrana jingdongensis Anura VU Stream-dwelling 25.043830 35.98414 32.40988 40.11873
Odorrana grahami Anura VU Stream-dwelling 21.272411 35.45275 31.60282 39.23904
Odorrana grahami Anura VU Stream-dwelling 19.937391 35.27589 31.74518 39.32664
Odorrana grahami Anura VU Stream-dwelling 23.405338 35.73533 32.11955 39.81603
Odorrana junlianensis Anura LC Stream-dwelling 23.936746 35.85305 31.91518 39.87644
Odorrana junlianensis Anura LC Stream-dwelling 22.565718 35.66945 31.71267 39.66893
Odorrana junlianensis Anura LC Stream-dwelling 26.131941 36.14703 32.06668 40.14215
Odorrana anlungensis Anura EN Stream-dwelling 24.074792 35.83705 32.23506 39.75131
Odorrana anlungensis Anura EN Stream-dwelling 22.845305 35.67404 32.08497 39.55376
Odorrana anlungensis Anura EN Stream-dwelling 26.192038 36.11775 32.20000 39.74104
Odorrana aureola Anura LC Stream-dwelling 27.294275 36.29042 32.73469 40.21063
Odorrana aureola Anura LC Stream-dwelling 26.310768 36.15807 32.69945 40.15355
Odorrana aureola Anura LC Stream-dwelling 29.194803 36.54616 32.91765 40.52080
Odorrana livida Anura DD Stream-dwelling 28.143149 36.45313 32.39080 40.32236
Odorrana livida Anura DD Stream-dwelling 27.160259 36.31849 32.36034 40.22588
Odorrana livida Anura DD Stream-dwelling 29.857786 36.68799 32.57850 40.59346
Odorrana chloronota Anura LC Stream-dwelling 26.808310 36.23261 32.46540 40.23255
Odorrana chloronota Anura LC Stream-dwelling 25.686424 36.07964 31.96892 39.75211
Odorrana chloronota Anura LC Stream-dwelling 28.808949 36.50541 32.62811 40.49830
Odorrana leporipes Anura DD Stream-dwelling 28.195252 36.32000 31.93308 40.05642
Odorrana leporipes Anura DD Stream-dwelling 27.230849 36.18958 31.78262 39.79556
Odorrana leporipes Anura DD Stream-dwelling 30.005757 36.56485 32.17235 40.35104
Odorrana graminea Anura LC Stream-dwelling 27.929724 36.36427 32.38884 40.49653
Odorrana graminea Anura LC Stream-dwelling 27.064899 36.24777 32.39120 40.43228
Odorrana graminea Anura LC Stream-dwelling 29.590298 36.58798 32.51742 40.72885
Odorrana bacboensis Anura LC Stream-dwelling 26.192503 36.12453 31.95282 39.82874
Odorrana bacboensis Anura LC Stream-dwelling 25.138893 35.98246 31.86562 39.69321
Odorrana bacboensis Anura LC Stream-dwelling 28.164631 36.39047 32.05816 40.16781
Odorrana hainanensis Anura VU Stream-dwelling 27.973108 36.39744 32.74673 40.76496
Odorrana hainanensis Anura VU Stream-dwelling 27.367922 36.31646 32.69232 40.67353
Odorrana hainanensis Anura VU Stream-dwelling 29.095461 36.54763 32.84974 40.93864
Odorrana banaorum Anura LC Stream-dwelling 28.218021 36.30304 32.53162 39.96363
Odorrana banaorum Anura LC Stream-dwelling 27.244467 36.17410 32.43197 39.83081
Odorrana banaorum Anura LC Stream-dwelling 30.051218 36.54581 32.56414 40.05593
Odorrana morafkai Anura LC Stream-dwelling 28.260179 36.36432 32.79487 40.63649
Odorrana morafkai Anura LC Stream-dwelling 27.277442 36.23365 32.08318 39.89495
Odorrana morafkai Anura LC Stream-dwelling 30.129706 36.61289 33.07847 41.07004
Odorrana bolavensis Anura EN Stream-dwelling 28.429363 36.38537 32.29258 40.36505
Odorrana bolavensis Anura EN Stream-dwelling 27.427371 36.25116 32.18132 40.25093
Odorrana bolavensis Anura EN Stream-dwelling 30.308497 36.63707 32.58276 40.77460
Odorrana chapaensis Anura LC Stream-dwelling 25.664715 36.08480 32.06441 39.53731
Odorrana chapaensis Anura LC Stream-dwelling 24.659701 35.94810 32.02933 39.36715
Odorrana chapaensis Anura LC Stream-dwelling 27.578222 36.34507 32.25804 39.84822
Odorrana geminata Anura VU Stream-dwelling 25.551597 35.97657 32.18083 40.03245
Odorrana geminata Anura VU Stream-dwelling 24.468624 35.83156 32.00784 39.85096
Odorrana geminata Anura VU Stream-dwelling 27.471804 36.23367 32.22660 40.23938
Odorrana exiliversabilis Anura LC Stream-dwelling 27.061869 36.33841 32.09938 39.99859
Odorrana exiliversabilis Anura LC Stream-dwelling 25.256305 36.09705 31.91220 39.74868
Odorrana exiliversabilis Anura LC Stream-dwelling 29.695910 36.69053 32.36709 40.45349
Odorrana nasuta Anura LC Stream-dwelling 27.983220 36.41896 32.51232 40.18748
Odorrana nasuta Anura LC Stream-dwelling 27.369547 36.33707 32.48797 40.10489
Odorrana nasuta Anura LC Stream-dwelling 29.121736 36.57089 33.06441 40.78105
Odorrana versabilis Anura LC Stream-dwelling 26.831427 36.33765 32.70584 40.13618
Odorrana versabilis Anura LC Stream-dwelling 25.488642 36.15707 32.65141 39.98436
Odorrana versabilis Anura LC Stream-dwelling 29.249445 36.66283 33.24750 40.76069
Odorrana gigatympana Anura LC Stream-dwelling 28.027437 36.38318 32.41469 40.51562
Odorrana gigatympana Anura LC Stream-dwelling 27.043389 36.25007 32.24389 40.28991
Odorrana gigatympana Anura LC Stream-dwelling 29.817040 36.62526 32.67936 40.85459
Odorrana hejiangensis Anura VU Stream-dwelling 24.772382 35.90693 32.16364 40.04234
Odorrana hejiangensis Anura VU Stream-dwelling 22.393874 35.58720 31.69409 39.49622
Odorrana hejiangensis Anura VU Stream-dwelling 27.589531 36.28562 32.59561 40.58087
Odorrana hosii Anura LC Stream-dwelling 27.995492 36.30605 32.37796 40.51780
Odorrana hosii Anura LC Stream-dwelling 27.366398 36.22206 32.24279 40.34359
Odorrana hosii Anura LC Stream-dwelling 29.329414 36.48414 32.29526 40.49492
Odorrana schmackeri Anura LC Stream-dwelling 25.655823 36.06292 32.44587 39.82101
Odorrana schmackeri Anura LC Stream-dwelling 23.693956 35.79743 32.29682 39.56348
Odorrana schmackeri Anura LC Stream-dwelling 28.267428 36.41635 32.45708 39.94891
Odorrana indeprensa Anura VU Stream-dwelling 28.891752 36.50177 32.59936 40.58010
Odorrana indeprensa Anura VU Stream-dwelling 27.953121 36.37686 32.64858 40.55346
Odorrana indeprensa Anura VU Stream-dwelling 30.694826 36.74174 32.78557 40.82606
Odorrana ishikawae Anura EN Stream-dwelling 27.508538 36.29930 32.26520 40.11613
Odorrana ishikawae Anura EN Stream-dwelling 26.808429 36.20417 32.19312 39.98098
Odorrana ishikawae Anura EN Stream-dwelling 28.598246 36.44736 32.37161 40.31548
Odorrana kuangwuensis Anura VU Stream-dwelling 23.654003 35.75533 31.97661 39.39054
Odorrana kuangwuensis Anura VU Stream-dwelling 20.988610 35.40052 31.59472 39.00544
Odorrana kuangwuensis Anura VU Stream-dwelling 26.743395 36.16658 32.09190 39.77581
Odorrana margaretae Anura LC Stream-dwelling 24.117725 35.91027 32.10242 39.75884
Odorrana margaretae Anura LC Stream-dwelling 22.195553 35.64799 31.76478 39.37149
Odorrana margaretae Anura LC Stream-dwelling 26.636290 36.25392 32.23399 39.93684
Odorrana lungshengensis Anura LC Stream-dwelling 26.218523 36.10504 32.48657 40.30284
Odorrana lungshengensis Anura LC Stream-dwelling 24.787444 35.91331 32.29507 39.98675
Odorrana lungshengensis Anura LC Stream-dwelling 28.631244 36.42827 32.64736 40.61301
Odorrana mawphlangensis Anura DD Stream-dwelling 24.495122 35.87103 32.49935 40.32068
Odorrana mawphlangensis Anura DD Stream-dwelling 23.356764 35.71574 32.18786 39.95707
Odorrana mawphlangensis Anura DD Stream-dwelling 26.219962 36.10631 32.37671 40.26205
Odorrana monjerai Anura DD Stream-dwelling 28.529251 36.34318 32.47731 40.41786
Odorrana monjerai Anura DD Stream-dwelling 27.924333 36.26244 32.45237 40.32426
Odorrana monjerai Anura DD Stream-dwelling 30.019938 36.54214 32.75448 40.79271
Odorrana nasica Anura LC Stream-dwelling 27.432476 36.30500 32.47298 39.91514
Odorrana nasica Anura LC Stream-dwelling 26.553667 36.18928 32.36673 39.73894
Odorrana nasica Anura LC Stream-dwelling 29.223820 36.54088 32.71464 40.25873
Odorrana orba Anura LC Stream-dwelling 27.884935 36.31777 32.26885 40.05487
Odorrana orba Anura LC Stream-dwelling 27.019294 36.20103 32.18243 39.91533
Odorrana orba Anura LC Stream-dwelling 29.650641 36.55588 32.35354 40.28349
Odorrana splendida Anura EN Stream-dwelling 27.202498 36.24545 32.36451 40.08769
Odorrana splendida Anura EN Stream-dwelling 26.297523 36.12246 32.25584 39.97926
Odorrana splendida Anura EN Stream-dwelling 28.150634 36.37431 32.50081 40.26241
Odorrana utsunomiyaorum Anura EN Stream-dwelling 27.938607 36.30563 32.99025 39.32078
Odorrana utsunomiyaorum Anura EN Stream-dwelling 27.237240 36.21047 32.73765 39.00829
Odorrana utsunomiyaorum Anura EN Stream-dwelling 29.033540 36.45420 33.14875 39.54459
Odorrana tiannanensis Anura LC Stream-dwelling 26.300716 36.11064 32.19461 39.73394
Odorrana tiannanensis Anura LC Stream-dwelling 25.399129 35.98951 32.13807 39.57700
Odorrana tiannanensis Anura LC Stream-dwelling 28.038789 36.34414 32.74936 40.40767
Odorrana tormota Anura LC Stream-dwelling 27.248838 36.34096 32.23219 40.28849
Odorrana tormota Anura LC Stream-dwelling 24.706081 35.99271 32.09027 40.05704
Odorrana tormota Anura LC Stream-dwelling 30.217387 36.74752 32.56323 40.79021
Odorrana trankieni Anura NT Stream-dwelling 27.178957 36.25287 32.13967 40.18220
Odorrana trankieni Anura NT Stream-dwelling 26.128114 36.11008 32.06642 40.06629
Odorrana trankieni Anura NT Stream-dwelling 29.022643 36.50339 32.48282 40.60741
Odorrana wuchuanensis Anura VU Stream-dwelling 25.702710 36.05296 32.53911 39.85610
Odorrana wuchuanensis Anura VU Stream-dwelling 24.008746 35.82816 32.29647 39.56688
Odorrana wuchuanensis Anura VU Stream-dwelling 27.999739 36.35780 32.66681 40.07456
Odorrana yentuensis Anura EN Stream-dwelling 27.506654 36.30705 31.90372 40.05367
Odorrana yentuensis Anura EN Stream-dwelling 26.474634 36.16849 31.82776 39.93866
Odorrana yentuensis Anura EN Stream-dwelling 29.260779 36.54256 32.10965 40.36631
Rana amurensis Anura LC Semi-aquatic 16.328611 35.15458 31.87946 38.60002
Rana amurensis Anura LC Semi-aquatic 11.962901 34.57878 31.16465 37.91912
Rana amurensis Anura LC Semi-aquatic 21.571157 35.84603 32.40478 39.08401
Rana coreana Anura LC Semi-aquatic 23.320064 36.14206 32.90639 39.61500
Rana coreana Anura LC Semi-aquatic 20.553881 35.77242 32.57370 39.25384
Rana coreana Anura LC Semi-aquatic 26.359371 36.54821 33.05258 39.92803
Rana sakuraii Anura LC Stream-dwelling 24.761382 35.49468 31.74650 38.91812
Rana sakuraii Anura LC Stream-dwelling 21.919096 35.10485 31.32561 38.36954
Rana sakuraii Anura LC Stream-dwelling 27.610036 35.88538 32.11217 39.44688
Rana tagoi Anura LC Ground-dwelling 24.849723 36.13080 32.95128 39.61552
Rana tagoi Anura LC Ground-dwelling 22.097647 35.76292 32.66126 39.22537
Rana tagoi Anura LC Ground-dwelling 27.530517 36.48915 33.28134 40.09533
Rana pyrenaica Anura EN Stream-dwelling 20.165167 34.50683 32.10506 36.74550
Rana pyrenaica Anura EN Stream-dwelling 17.833458 34.19685 31.94741 36.48817
Rana pyrenaica Anura EN Stream-dwelling 23.591681 34.96237 32.50019 37.32587
Rana italica Anura LC Stream-dwelling 22.545589 34.75813 32.11456 37.52202
Rana italica Anura LC Stream-dwelling 19.858732 34.39797 31.80860 37.08688
Rana italica Anura LC Stream-dwelling 26.301036 35.26154 32.50562 38.17983
Rana asiatica Anura LC Semi-aquatic 15.512037 34.74382 32.20354 37.22760
Rana asiatica Anura LC Semi-aquatic 13.379545 34.45788 31.89683 36.89768
Rana asiatica Anura LC Semi-aquatic 18.693691 35.17044 32.79812 37.87074
Rana macrocnemis Anura LC Semi-aquatic 20.016354 35.31685 32.46753 37.77904
Rana macrocnemis Anura LC Semi-aquatic 17.873614 35.02980 32.39540 37.51736
Rana macrocnemis Anura LC Semi-aquatic 23.067251 35.72555 32.91976 38.48223
Rana tavasensis Anura EN Stream-dwelling 21.490171 34.70092 31.79436 37.67374
Rana tavasensis Anura EN Stream-dwelling 19.594163 34.45234 31.46507 37.22953
Rana tavasensis Anura EN Stream-dwelling 24.295345 35.06869 32.20449 38.25233
Rana pseudodalmatina Anura LC Semi-aquatic 19.774314 35.35917 32.62836 37.98525
Rana pseudodalmatina Anura LC Semi-aquatic 18.174706 35.14610 32.35999 37.72625
Rana pseudodalmatina Anura LC Semi-aquatic 21.964085 35.65086 32.53899 38.11301
Rana aurora Anura LC Semi-aquatic 16.404796 34.55410 31.96548 37.02603
Rana aurora Anura LC Semi-aquatic 14.272303 34.27166 31.72382 36.78901
Rana aurora Anura LC Semi-aquatic 19.802466 35.00411 32.48268 37.59813
Rana muscosa Anura EN Stream-dwelling 19.885307 34.18343 31.49950 36.84436
Rana muscosa Anura EN Stream-dwelling 18.161438 33.95172 31.22422 36.49750
Rana muscosa Anura EN Stream-dwelling 22.651540 34.55526 31.91715 37.31150
Rana sierrae Anura VU Semi-aquatic 17.609670 34.78357 32.34166 37.45515
Rana sierrae Anura VU Semi-aquatic 16.039696 34.57027 31.98240 37.03279
Rana sierrae Anura VU Semi-aquatic 20.407391 35.16369 32.64552 37.80909
Rana draytonii Anura NT Semi-aquatic 19.365479 35.06222 32.46000 37.38904
Rana draytonii Anura NT Semi-aquatic 17.910787 34.86047 32.29916 37.14075
Rana draytonii Anura NT Semi-aquatic 21.771255 35.39587 32.71652 37.75574
Rana chaochiaoensis Anura LC Ground-dwelling 21.121714 35.78473 32.96849 38.79257
Rana chaochiaoensis Anura LC Ground-dwelling 19.853529 35.61611 32.67367 38.41876
Rana chaochiaoensis Anura LC Ground-dwelling 23.239685 36.06634 33.12333 39.02745
Rana zhenhaiensis Anura LC Semi-aquatic 27.142783 36.79179 33.72231 39.70032
Rana zhenhaiensis Anura LC Semi-aquatic 25.372539 36.55603 33.54940 39.39597
Rana zhenhaiensis Anura LC Semi-aquatic 29.643311 37.12480 33.93166 40.08877
Rana omeimontis Anura LC Ground-dwelling 23.379389 35.99927 32.89433 38.73399
Rana omeimontis Anura LC Ground-dwelling 21.254579 35.71906 32.58311 38.31668
Rana omeimontis Anura LC Ground-dwelling 25.962749 36.33996 33.33929 39.35476
Rana hanluica Anura LC Semi-aquatic 26.722333 36.70545 33.74963 39.40329
Rana hanluica Anura LC Semi-aquatic 25.209454 36.50353 33.54662 39.09755
Rana hanluica Anura LC Semi-aquatic 29.242225 37.04177 34.19652 40.08225
Rana japonica Anura LC Semi-aquatic 24.964597 36.49212 33.32138 39.27097
Rana japonica Anura LC Semi-aquatic 22.253970 36.13560 33.15086 38.91322
Rana japonica Anura LC Semi-aquatic 27.597099 36.83836 33.93239 40.01893
Rana kukunoris Anura LC Semi-aquatic 13.376753 32.39580 30.24623 34.54251
Rana kukunoris Anura LC Semi-aquatic 10.835358 32.04070 29.87785 34.22914
Rana kukunoris Anura LC Semi-aquatic 16.741716 32.86597 30.65993 35.03960
Rana huanrensis Anura LC Stream-dwelling 22.334312 32.60514 29.99157 35.25895
Rana huanrensis Anura LC Stream-dwelling 19.158205 32.17039 29.62944 34.79434
Rana huanrensis Anura LC Stream-dwelling 25.604472 33.05276 30.43126 35.89442
Rana pirica Anura LC Ground-dwelling 17.506996 31.81525 29.29838 34.59927
Rana pirica Anura LC Ground-dwelling 14.119150 31.34025 28.68235 33.94330
Rana pirica Anura LC Ground-dwelling 21.198356 32.33281 29.68358 35.11631
Rana ornativentris Anura LC Semi-aquatic 24.783936 33.38336 30.57259 36.03871
Rana ornativentris Anura LC Semi-aquatic 22.009402 32.99511 30.20541 35.39562
Rana ornativentris Anura LC Semi-aquatic 27.508036 33.76455 31.11107 36.70986
Rana dalmatina Anura LC Semi-aquatic 19.460560 35.64432 32.19784 39.17094
Rana dalmatina Anura LC Semi-aquatic 16.944647 35.30604 31.95606 38.86691
Rana dalmatina Anura LC Semi-aquatic 23.584401 36.19879 32.52322 39.67642
Rana latastei Anura VU Ground-dwelling 20.836358 35.62537 32.54733 39.28360
Rana latastei Anura VU Ground-dwelling 18.281790 35.28326 32.30788 38.97400
Rana latastei Anura VU Ground-dwelling 24.572671 36.12573 32.85580 39.75034
Rana graeca Anura LC Aquatic 20.372061 35.67923 32.08356 39.25492
Rana graeca Anura LC Aquatic 18.534537 35.43027 31.92415 39.05726
Rana graeca Anura LC Aquatic 23.666000 36.12553 32.59957 39.84647
Rana johnsi Anura LC Ground-dwelling 25.736824 36.26853 32.92922 39.86438
Rana johnsi Anura LC Ground-dwelling 24.424365 36.09213 32.71682 39.61521
Rana johnsi Anura LC Ground-dwelling 27.861208 36.55407 32.96526 39.98203
Rana tsushimensis Anura NT Semi-aquatic 25.390618 36.37773 32.64823 39.82254
Rana tsushimensis Anura NT Semi-aquatic 22.797802 36.02741 32.51440 39.50766
Rana tsushimensis Anura NT Semi-aquatic 27.992222 36.72924 33.02996 40.35817
Rana sangzhiensis Anura LC Stream-dwelling 26.343107 35.64019 32.27354 39.35432
Rana sangzhiensis Anura LC Stream-dwelling 24.783609 35.43335 32.26705 39.21289
Rana sangzhiensis Anura LC Stream-dwelling 28.659150 35.94738 32.41349 39.61434
Rana shuchinae Anura LC Stream-dwelling 17.200640 34.39598 30.93655 37.65287
Rana shuchinae Anura LC Stream-dwelling 15.781758 34.20511 30.60529 37.36408
Rana shuchinae Anura LC Stream-dwelling 19.327422 34.68209 31.10450 37.88230
Glandirana minima Anura EN Semi-aquatic 26.835754 37.25560 33.21104 41.30523
Glandirana minima Anura EN Semi-aquatic 25.627480 37.09425 33.13761 41.13128
Glandirana minima Anura EN Semi-aquatic 28.967165 37.54023 33.32407 41.55094
Pterorana khare Anura LC Aquatic 25.609534 37.09841 33.13380 41.16110
Pterorana khare Anura LC Aquatic 24.644097 36.96872 33.08626 41.12411
Pterorana khare Anura LC Aquatic 27.332633 37.32988 33.36583 41.56943
Sanguirana everetti Anura NT Stream-dwelling 27.350210 36.35559 32.88949 40.42398
Sanguirana everetti Anura NT Stream-dwelling 26.837937 36.28711 32.82176 40.34166
Sanguirana everetti Anura NT Stream-dwelling 28.560828 36.51743 33.00824 40.53680
Sanguirana igorota Anura VU Stream-dwelling 27.862648 36.40652 32.49442 40.03924
Sanguirana igorota Anura VU Stream-dwelling 27.350302 36.33889 32.44231 39.94851
Sanguirana igorota Anura VU Stream-dwelling 28.834871 36.53486 32.58081 40.21140
Sanguirana sanguinea Anura LC Stream-dwelling 27.697059 36.40696 32.77967 39.95876
Sanguirana sanguinea Anura LC Stream-dwelling 27.224648 36.34420 32.67259 39.83360
Sanguirana sanguinea Anura LC Stream-dwelling 28.695406 36.53958 32.68519 39.98379
Sanguirana tipanan Anura VU Semi-aquatic 28.019440 37.28859 33.59532 40.90928
Sanguirana tipanan Anura VU Semi-aquatic 27.511354 37.22016 33.58190 40.88072
Sanguirana tipanan Anura VU Semi-aquatic 28.872181 37.40343 33.68634 41.01900
Hylarana chitwanensis Anura DD Ground-dwelling 21.857965 36.40839 32.30646 40.02220
Hylarana chitwanensis Anura DD Ground-dwelling 20.811643 36.27090 32.19686 39.88638
Hylarana chitwanensis Anura DD Ground-dwelling 23.316911 36.60009 32.73007 40.47465
Hylarana garoensis Anura LC Ground-dwelling 22.536198 36.57771 32.75124 40.57105
Hylarana garoensis Anura LC Ground-dwelling 21.472644 36.43348 32.62685 40.39012
Hylarana garoensis Anura LC Ground-dwelling 24.354313 36.82426 33.05736 40.94652
Hylarana macrodactyla Anura LC Ground-dwelling 27.765901 37.15104 33.11430 41.38082
Hylarana macrodactyla Anura LC Ground-dwelling 26.877689 37.03297 33.07585 41.26977
Hylarana macrodactyla Anura LC Ground-dwelling 29.518375 37.38399 33.34517 41.73395
Hylarana margariana Anura DD Stream-dwelling 26.112715 36.33281 32.28349 40.07174
Hylarana margariana Anura DD Stream-dwelling 25.241461 36.21630 32.23627 40.01362
Hylarana margariana Anura DD Stream-dwelling 28.014113 36.58708 32.44850 40.33479
Hylarana montivaga Anura EN Stream-dwelling 27.525862 36.62549 33.00662 40.71951
Hylarana montivaga Anura EN Stream-dwelling 26.639648 36.50606 32.81857 40.55086
Hylarana montivaga Anura EN Stream-dwelling 29.009085 36.82536 33.09787 40.84921
Hylarana persimilis Anura DD Ground-dwelling 28.988631 37.43266 33.20516 41.73698
Hylarana persimilis Anura DD Ground-dwelling 28.144858 37.32245 33.13652 41.64079
Hylarana persimilis Anura DD Ground-dwelling 30.837882 37.67421 33.42817 42.10754
Hylarana taipehensis Anura LC Ground-dwelling 27.554368 37.20649 32.96593 41.18289
Hylarana taipehensis Anura LC Ground-dwelling 26.569660 37.07477 33.05710 41.19582
Hylarana taipehensis Anura LC Ground-dwelling 29.405710 37.45413 33.17414 41.47521
Hylarana tytleri Anura LC Ground-dwelling 26.937863 37.20473 33.02384 41.02327
Hylarana tytleri Anura LC Ground-dwelling 26.006357 37.08072 32.93457 40.88677
Hylarana tytleri Anura LC Ground-dwelling 28.672614 37.43566 33.36517 41.42807
Pelophylax bedriagae Anura LC Aquatic 22.595495 37.60101 34.05052 41.38002
Pelophylax bedriagae Anura LC Aquatic 21.036037 37.39476 33.94859 41.33612
Pelophylax bedriagae Anura LC Aquatic 25.208560 37.94661 34.30929 41.68617
Pelophylax caralitanus Anura NT Aquatic 21.186283 37.49488 33.96792 41.38803
Pelophylax caralitanus Anura NT Aquatic 19.174006 37.22904 33.66995 41.05951
Pelophylax caralitanus Anura NT Aquatic 24.423554 37.92255 34.26173 41.66508
Pelophylax cerigensis Anura CR Aquatic 24.477234 37.90900 34.05021 41.87392
Pelophylax cerigensis Anura CR Aquatic 23.032615 37.72034 33.86687 41.69472
Pelophylax cerigensis Anura CR Aquatic 26.183646 38.13186 34.27413 42.18903
Pelophylax kurtmuelleri Anura LC Aquatic 21.960765 37.51939 34.03220 41.19983
Pelophylax kurtmuelleri Anura LC Aquatic 20.104130 37.27803 33.87769 41.03761
Pelophylax kurtmuelleri Anura LC Aquatic 24.952985 37.90838 34.26859 41.51758
Pelophylax ridibundus Anura LC Semi-aquatic 19.302386 37.23100 33.70015 40.96823
Pelophylax ridibundus Anura LC Semi-aquatic 16.666414 36.88373 33.38688 40.60720
Pelophylax ridibundus Anura LC Semi-aquatic 23.504013 37.78455 33.98542 41.40312
Pelophylax bergeri Anura LC Semi-aquatic 23.178926 37.72301 34.63700 40.83910
Pelophylax bergeri Anura LC Semi-aquatic 20.735549 37.40006 34.60410 40.68190
Pelophylax bergeri Anura LC Semi-aquatic 26.566569 38.17077 34.93034 41.28242
Pelophylax shqipericus Anura VU Aquatic 22.153414 37.47166 34.16088 40.51626
Pelophylax shqipericus Anura VU Aquatic 19.788197 37.16083 33.91227 40.20674
Pelophylax shqipericus Anura VU Aquatic 25.282068 37.88283 34.57759 41.04267
Pelophylax chosenicus Anura VU Semi-aquatic 22.976152 37.70928 34.00636 41.50796
Pelophylax chosenicus Anura VU Semi-aquatic 19.444360 37.23864 33.54997 40.93688
Pelophylax chosenicus Anura VU Semi-aquatic 26.119149 38.12811 34.61585 42.40034
Pelophylax plancyi Anura LC Semi-aquatic 24.832794 37.92345 34.15605 41.52474
Pelophylax plancyi Anura LC Semi-aquatic 21.986100 37.55222 33.95548 41.16331
Pelophylax plancyi Anura LC Semi-aquatic 28.408374 38.38973 34.71229 42.31006
Pelophylax nigromaculatus Anura NT Aquatic 22.641696 37.54416 33.73959 41.32926
Pelophylax nigromaculatus Anura NT Aquatic 19.880875 37.18654 33.45296 40.92980
Pelophylax nigromaculatus Anura NT Aquatic 26.015863 37.98124 34.21807 41.99538
Pelophylax hubeiensis Anura LC Aquatic 26.791384 38.24419 34.20262 41.74732
Pelophylax hubeiensis Anura LC Aquatic 24.582095 37.94475 34.01650 41.43969
Pelophylax hubeiensis Anura LC Aquatic 29.521183 38.61419 34.57530 42.30786
Pelophylax cretensis Anura VU Semi-aquatic 24.762404 37.93901 34.31101 41.83775
Pelophylax cretensis Anura VU Semi-aquatic 23.272976 37.74050 34.17535 41.62162
Pelophylax cretensis Anura VU Semi-aquatic 26.601642 38.18413 34.49768 42.11802
Pelophylax epeiroticus Anura NT Aquatic 20.505632 37.31414 33.40082 40.96758
Pelophylax epeiroticus Anura NT Aquatic 18.660087 37.06696 33.54295 40.93147
Pelophylax epeiroticus Anura NT Aquatic 23.182525 37.67266 34.03177 41.80500
Pelophylax fukienensis Anura LC Aquatic 27.127433 38.20154 34.36496 41.81005
Pelophylax fukienensis Anura LC Aquatic 25.381414 37.96943 34.27667 41.64593
Pelophylax fukienensis Anura LC Aquatic 29.492726 38.51598 34.65254 42.28300
Pelophylax porosus Anura LC Semi-aquatic 24.777645 37.91234 34.12485 41.61035
Pelophylax porosus Anura LC Semi-aquatic 21.932166 37.54309 33.73177 41.22225
Pelophylax porosus Anura LC Semi-aquatic 27.597107 38.27821 34.43734 42.14265
Pelophylax tenggerensis Anura EN Aquatic 18.453190 37.00002 33.18759 40.79848
Pelophylax tenggerensis Anura EN Aquatic 16.257496 36.71110 32.89172 40.46464
Pelophylax tenggerensis Anura EN Aquatic 21.854806 37.44762 33.69497 41.35503
Pelophylax terentievi Anura DD Semi-aquatic 14.527116 36.52046 33.12909 40.41270
Pelophylax terentievi Anura DD Semi-aquatic 12.806363 36.29452 32.62917 39.95494
Pelophylax terentievi Anura DD Semi-aquatic 16.972788 36.84157 33.43298 40.77949
Clinotarsus alticola Anura LC Stream-dwelling 26.057144 36.76719 32.51907 41.32927
Clinotarsus alticola Anura LC Stream-dwelling 25.081027 36.63442 32.53557 41.29163
Clinotarsus alticola Anura LC Stream-dwelling 27.825196 37.00768 32.70898 41.60487
Clinotarsus curtipes Anura NT Ground-dwelling 27.086390 37.49043 33.12603 42.11545
Clinotarsus curtipes Anura NT Ground-dwelling 26.162056 37.36674 32.86561 41.82480
Clinotarsus curtipes Anura NT Ground-dwelling 29.079973 37.75719 33.29014 42.26363
Huia cavitympanum Anura LC Ground-dwelling 27.745394 37.57933 33.36603 42.34848
Huia cavitympanum Anura LC Ground-dwelling 27.066991 37.48937 33.40784 42.38388
Huia cavitympanum Anura LC Ground-dwelling 29.081902 37.75656 33.76155 42.83851
Meristogenys amoropalamus Anura LC Stream-dwelling 27.248468 36.92067 32.39749 41.29988
Meristogenys amoropalamus Anura LC Stream-dwelling 26.606125 36.83272 32.18631 41.03696
Meristogenys amoropalamus Anura LC Stream-dwelling 28.505666 37.09280 32.55260 41.49755
Meristogenys orphnocnemis Anura LC Stream-dwelling 27.598368 36.96168 32.21721 41.55527
Meristogenys orphnocnemis Anura LC Stream-dwelling 27.021869 36.88403 32.09428 41.43554
Meristogenys orphnocnemis Anura LC Stream-dwelling 28.864178 37.13216 32.33196 41.68376
Meristogenys whiteheadi Anura LC Stream-dwelling 27.712530 36.89568 32.63153 41.75941
Meristogenys whiteheadi Anura LC Stream-dwelling 27.074604 36.81197 32.57313 41.63720
Meristogenys whiteheadi Anura LC Stream-dwelling 28.989887 37.06331 32.74002 41.98406
Meristogenys poecilus Anura LC Stream-dwelling 28.106922 37.02740 31.71875 41.30672
Meristogenys poecilus Anura LC Stream-dwelling 27.407142 36.93423 32.03242 41.57253
Meristogenys poecilus Anura LC Stream-dwelling 29.515030 37.21489 31.78621 41.43760
Meristogenys macrophthalmus Anura DD Stream-dwelling 28.009915 36.99197 32.46607 41.38491
Meristogenys macrophthalmus Anura DD Stream-dwelling 27.437948 36.91677 32.42998 41.31721
Meristogenys macrophthalmus Anura DD Stream-dwelling 29.203890 37.14894 32.63244 41.66115
Meristogenys jerboa Anura VU Stream-dwelling 28.227657 37.03215 32.88106 41.77385
Meristogenys jerboa Anura VU Stream-dwelling 27.648754 36.95465 32.77114 41.63172
Meristogenys jerboa Anura VU Stream-dwelling 29.438147 37.19420 32.71877 41.65362
Meristogenys phaeomerus Anura LC Stream-dwelling 28.014386 37.00230 32.55960 41.65635
Meristogenys phaeomerus Anura LC Stream-dwelling 27.285540 36.90468 32.45185 41.50357
Meristogenys phaeomerus Anura LC Stream-dwelling 29.429651 37.19186 32.78356 41.99067
Meristogenys kinabaluensis Anura LC Stream-dwelling 27.304737 36.82502 32.87915 41.62282
Meristogenys kinabaluensis Anura LC Stream-dwelling 26.659684 36.74043 32.79681 41.51519
Meristogenys kinabaluensis Anura LC Stream-dwelling 28.598966 36.99474 33.06814 41.83875
Staurois parvus Anura VU Stream-dwelling 27.153735 37.17386 32.71970 42.47827
Staurois parvus Anura VU Stream-dwelling 26.549222 37.09266 32.57872 42.34992
Staurois parvus Anura VU Stream-dwelling 28.381676 37.33878 32.86022 42.58803
Staurois tuberilinguis Anura LC Stream-dwelling 27.758282 37.26767 32.46388 41.97055
Staurois tuberilinguis Anura LC Stream-dwelling 27.132227 37.18277 32.43124 41.93277
Staurois tuberilinguis Anura LC Stream-dwelling 29.086516 37.44777 32.66825 42.21219
Staurois latopalmatus Anura LC Stream-dwelling 27.808160 37.19676 32.27737 42.03446
Staurois latopalmatus Anura LC Stream-dwelling 27.188254 37.11336 32.19591 41.94776
Staurois latopalmatus Anura LC Stream-dwelling 29.121024 37.37340 32.51161 42.27972
Buergeria buergeri Anura LC Stream-dwelling 24.797913 38.78047 34.68157 42.65575
Buergeria buergeri Anura LC Stream-dwelling 22.028832 38.41757 34.62828 42.59243
Buergeria buergeri Anura LC Stream-dwelling 27.511825 39.13613 34.86139 42.99141
Buergeria oxycephala Anura VU Stream-dwelling 27.983220 39.18482 35.26177 43.41188
Buergeria oxycephala Anura VU Stream-dwelling 27.369547 39.10430 35.17962 43.32314
Buergeria oxycephala Anura VU Stream-dwelling 29.121736 39.33419 35.38500 43.60985
Buergeria robusta Anura LC Stream-dwelling 27.514509 39.12294 35.05533 43.38863
Buergeria robusta Anura LC Stream-dwelling 26.761020 39.02242 34.92775 43.26474
Buergeria robusta Anura LC Stream-dwelling 28.703695 39.28160 35.43897 43.87326
Chiromantis kelleri Anura LC Arboreal 23.951203 37.55699 33.47448 41.23668
Chiromantis kelleri Anura LC Arboreal 23.107853 37.44376 33.34141 41.08048
Chiromantis kelleri Anura LC Arboreal 25.546138 37.77112 33.72235 41.53313
Chiromantis petersii Anura LC Arboreal 22.263985 37.24796 33.11152 41.04852
Chiromantis petersii Anura LC Arboreal 21.443081 37.13857 33.03351 40.96051
Chiromantis petersii Anura LC Arboreal 24.010498 37.48067 33.17731 41.23576
Chiromantis xerampelina Anura LC Arboreal 24.282750 37.44128 33.16119 41.34451
Chiromantis xerampelina Anura LC Arboreal 23.244063 37.30595 32.94808 41.23700
Chiromantis xerampelina Anura LC Arboreal 26.360925 37.71205 33.49217 41.87737
Chiromantis rufescens Anura LC Arboreal 27.139446 37.85512 33.52349 42.13927
Chiromantis rufescens Anura LC Arboreal 26.434537 37.76141 33.44887 42.04259
Chiromantis rufescens Anura LC Arboreal 28.692379 38.06155 33.60400 42.35665
Feihyla kajau Anura LC Arboreal 27.783815 37.95704 33.79048 42.05596
Feihyla kajau Anura LC Arboreal 27.125446 37.86877 33.66675 41.92009
Feihyla kajau Anura LC Arboreal 29.119692 38.13616 33.68315 41.97931
Feihyla palpebralis Anura NT Arboreal 26.548561 37.78456 33.58595 41.95947
Feihyla palpebralis Anura NT Arboreal 25.548985 37.65120 33.49410 41.80916
Feihyla palpebralis Anura NT Arboreal 28.385516 38.02962 33.71839 42.23565
Ghatixalus asterops Anura DD Stream-dwelling 27.766641 38.01607 34.19462 42.08893
Ghatixalus asterops Anura DD Stream-dwelling 26.846355 37.89240 33.99565 41.82868
Ghatixalus asterops Anura DD Stream-dwelling 29.519349 38.25161 34.20862 42.25971
Ghatixalus variabilis Anura EN Stream-dwelling 26.793491 37.88312 33.81814 42.06926
Ghatixalus variabilis Anura EN Stream-dwelling 25.581038 37.71664 33.54691 41.70891
Ghatixalus variabilis Anura EN Stream-dwelling 29.313470 38.22913 33.92260 42.26203
Polypedates chlorophthalmus Anura DD Stream-dwelling 27.852353 38.18665 34.29443 41.67617
Polypedates chlorophthalmus Anura DD Stream-dwelling 27.344212 38.11919 34.17215 41.54118
Polypedates chlorophthalmus Anura DD Stream-dwelling 29.128276 38.35604 34.51854 41.95957
Polypedates colletti Anura LC Arboreal 27.893442 38.77152 35.03760 42.38112
Polypedates colletti Anura LC Arboreal 27.261056 38.68656 34.95739 42.28385
Polypedates colletti Anura LC Arboreal 29.197085 38.94666 35.17483 42.58698
Polypedates cruciger Anura LC Arboreal 27.836836 38.65855 35.07323 42.63618
Polypedates cruciger Anura LC Arboreal 27.080005 38.55795 34.97774 42.50813
Polypedates cruciger Anura LC Arboreal 29.708980 38.90739 35.32199 43.00983
Polypedates insularis Anura EN Arboreal 27.695788 38.63618 35.20010 42.63877
Polypedates insularis Anura EN Arboreal 27.210062 38.57260 35.14790 42.55513
Polypedates insularis Anura EN Arboreal 28.809854 38.78199 35.00077 42.52122
Polypedates macrotis Anura LC Arboreal 27.994940 38.65319 35.09417 42.59878
Polypedates macrotis Anura LC Arboreal 27.384976 38.57235 34.95095 42.35875
Polypedates macrotis Anura LC Arboreal 29.285219 38.82419 35.21385 42.78409
Polypedates maculatus Anura LC Arboreal 26.718138 38.56603 34.84544 42.13765
Polypedates maculatus Anura LC Arboreal 25.583265 38.41452 34.69109 41.90249
Polypedates maculatus Anura LC Arboreal 28.884617 38.85525 35.09968 42.56829
Polypedates megacephalus Anura LC Arboreal 26.887184 38.64725 34.95799 42.38868
Polypedates megacephalus Anura LC Arboreal 25.749370 38.49514 34.84065 42.24091
Polypedates megacephalus Anura LC Arboreal 28.908920 38.91753 35.10162 42.64080
Polypedates mutus Anura LC Arboreal 26.545179 38.53446 34.98050 42.29350
Polypedates mutus Anura LC Arboreal 25.515722 38.39793 34.77244 41.98174
Polypedates mutus Anura LC Arboreal 28.476944 38.79067 34.88727 42.30715
Polypedates occidentalis Anura DD Arboreal 28.304066 38.71496 35.03748 42.30844
Polypedates occidentalis Anura DD Arboreal 27.264133 38.57553 35.00911 42.17695
Polypedates occidentalis Anura DD Arboreal 30.248374 38.97566 35.30744 42.63992
Polypedates otilophus Anura LC Arboreal 27.685937 38.64592 34.85436 42.81063
Polypedates otilophus Anura LC Arboreal 27.065292 38.56432 34.78102 42.69882
Polypedates otilophus Anura LC Arboreal 28.970541 38.81482 35.02602 43.03140
Polypedates pseudocruciger Anura LC Arboreal 27.299385 38.62902 34.65310 42.06616
Polypedates pseudocruciger Anura LC Arboreal 26.453069 38.51844 34.86541 42.26144
Polypedates pseudocruciger Anura LC Arboreal 29.028735 38.85499 34.75701 42.20803
Polypedates taeniatus Anura LC Arboreal 24.360837 38.23364 34.79299 41.73448
Polypedates taeniatus Anura LC Arboreal 23.090399 38.06850 34.63128 41.52024
Polypedates taeniatus Anura LC Arboreal 26.054888 38.45385 34.96637 42.03383
Polypedates zed Anura DD Arboreal 21.857965 37.88963 34.52224 41.57129
Polypedates zed Anura DD Arboreal 20.811643 37.75033 34.37415 41.37308
Polypedates zed Anura DD Arboreal 23.316911 38.08387 34.83330 41.90963
Taruga eques Anura EN Arboreal 27.311256 38.53215 34.77455 42.67897
Taruga eques Anura EN Arboreal 26.578946 38.43421 34.72681 42.53380
Taruga eques Anura EN Arboreal 29.131810 38.77562 34.81338 42.82424
Taruga fastigo Anura EN Arboreal 27.155513 38.50985 34.95021 42.39532
Taruga fastigo Anura EN Arboreal 26.400558 38.41063 34.81793 42.25951
Taruga fastigo Anura EN Arboreal 29.086524 38.76366 35.16538 42.66850
Taruga longinasus Anura EN Arboreal 27.311256 38.51529 35.04449 42.87541
Taruga longinasus Anura EN Arboreal 26.578946 38.41803 35.00738 42.78702
Taruga longinasus Anura EN Arboreal 29.131810 38.75709 35.17447 43.11512
Gracixalus ananjevae Anura LC Arboreal 27.606870 37.80468 33.09092 41.84912
Gracixalus ananjevae Anura LC Arboreal 26.713921 37.68756 33.00295 41.69132
Gracixalus ananjevae Anura LC Arboreal 29.401076 38.04000 33.70242 42.51001
Gracixalus jinxiuensis Anura DD Arboreal 27.259361 37.83339 33.49980 42.00482
Gracixalus jinxiuensis Anura DD Arboreal 26.062559 37.67504 33.33737 41.81555
Gracixalus jinxiuensis Anura DD Arboreal 29.398145 38.11636 34.09072 42.66354
Gracixalus medogensis Anura DD Arboreal 16.274470 36.35408 32.29085 40.86294
Gracixalus medogensis Anura DD Arboreal 14.438870 36.11454 31.93763 40.54074
Gracixalus medogensis Anura DD Arboreal 18.508255 36.64558 32.55476 41.09670
Gracixalus gracilipes Anura LC Arboreal 25.625176 37.64374 33.86699 42.64356
Gracixalus gracilipes Anura LC Arboreal 24.575010 37.49951 33.79992 42.47562
Gracixalus gracilipes Anura LC Arboreal 27.623000 37.91811 33.48009 42.38865
Gracixalus quangi Anura LC Arboreal 26.030616 37.62886 33.51143 42.38658
Gracixalus quangi Anura LC Arboreal 25.108357 37.50587 33.25932 42.08367
Gracixalus quangi Anura LC Arboreal 27.883579 37.87596 33.78134 42.77913
Gracixalus supercornutus Anura NT Arboreal 27.796495 37.89588 33.60763 42.17886
Gracixalus supercornutus Anura NT Arboreal 26.864557 37.77209 33.45234 41.95868
Gracixalus supercornutus Anura NT Arboreal 29.545363 38.12819 33.71486 42.38998
Rhacophorus vampyrus Anura EN Arboreal 28.175925 38.07332 33.57690 42.17928
Rhacophorus vampyrus Anura EN Arboreal 27.169330 37.93738 33.38770 42.03071
Rhacophorus vampyrus Anura EN Arboreal 29.908032 38.30723 33.80036 42.44226
Kurixalus appendiculatus Anura LC Arboreal 27.432982 37.34690 33.18556 41.05285
Kurixalus appendiculatus Anura LC Arboreal 26.920809 37.27749 33.15881 40.98535
Kurixalus appendiculatus Anura LC Arboreal 28.493243 37.49058 33.68429 41.57169
Kurixalus baliogaster Anura LC Arboreal 28.052768 37.12617 33.37558 41.07599
Kurixalus baliogaster Anura LC Arboreal 27.083443 36.99921 33.25534 40.84286
Kurixalus baliogaster Anura LC Arboreal 29.829230 37.35884 33.24015 41.07327
Kurixalus banaensis Anura LC Arboreal 27.797727 37.13992 33.46864 40.78854
Kurixalus banaensis Anura LC Arboreal 26.954953 37.02941 33.39673 40.68471
Kurixalus banaensis Anura LC Arboreal 29.474037 37.35971 33.55925 41.05462
Kurixalus bisacculus Anura LC Arboreal 28.186229 37.29930 33.80414 41.56561
Kurixalus bisacculus Anura LC Arboreal 27.273845 37.17851 33.72436 41.40736
Kurixalus bisacculus Anura LC Arboreal 29.968635 37.53527 33.90971 41.79489
Kurixalus odontotarsus Anura LC Arboreal 24.798197 36.78692 33.09448 40.59909
Kurixalus odontotarsus Anura LC Arboreal 23.711157 36.64334 33.17482 40.66672
Kurixalus odontotarsus Anura LC Arboreal 26.856287 37.05874 33.42811 40.97326
Kurixalus verrucosus Anura LC Arboreal 26.955854 36.99216 33.14766 40.62228
Kurixalus verrucosus Anura LC Arboreal 26.026481 36.86958 33.04830 40.47578
Kurixalus verrucosus Anura LC Arboreal 28.744523 37.22809 33.43136 41.05767
Kurixalus naso Anura LC Arboreal 20.613281 36.23615 32.72694 40.20358
Kurixalus naso Anura LC Arboreal 19.393894 36.06975 32.41200 39.91747
Kurixalus naso Anura LC Arboreal 22.483458 36.49135 32.90144 40.45858
Kurixalus idiootocus Anura LC Arboreal 27.514509 36.71353 33.48212 39.91425
Kurixalus idiootocus Anura LC Arboreal 26.761020 36.61125 33.43693 39.79429
Kurixalus idiootocus Anura LC Arboreal 28.703695 36.87494 33.52928 40.16489
Pseudophilautus abundus Anura EN Arboreal 27.311256 37.90260 34.01490 41.80013
Pseudophilautus abundus Anura EN Arboreal 26.578946 37.80475 34.08158 41.91017
Pseudophilautus abundus Anura EN Arboreal 29.131810 38.14588 34.20577 42.04210
Pseudophilautus alto Anura EN Arboreal 27.311256 37.84454 33.39034 42.07010
Pseudophilautus alto Anura EN Arboreal 26.578946 37.74635 33.54793 42.21897
Pseudophilautus alto Anura EN Arboreal 29.131810 38.08865 33.80222 42.46892
Pseudophilautus amboli Anura CR Arboreal 25.972769 37.73680 33.30756 41.53093
Pseudophilautus amboli Anura CR Arboreal 24.906036 37.59431 33.73540 41.83578
Pseudophilautus amboli Anura CR Arboreal 28.600218 38.08779 33.61587 41.86986
Pseudophilautus wynaadensis Anura EN Arboreal 27.183363 37.99320 34.32336 42.80992
Pseudophilautus wynaadensis Anura EN Arboreal 26.247524 37.86622 34.09014 42.51418
Pseudophilautus wynaadensis Anura EN Arboreal 29.126577 38.25687 34.53495 43.11957
Pseudophilautus asankai Anura EN Arboreal 27.311256 37.99376 33.88457 42.18580
Pseudophilautus asankai Anura EN Arboreal 26.578946 37.89390 33.89160 42.17080
Pseudophilautus asankai Anura EN Arboreal 29.131810 38.24202 34.04535 42.44762
Pseudophilautus auratus Anura EN Arboreal 27.155513 37.95002 34.03666 42.47977
Pseudophilautus auratus Anura EN Arboreal 26.400558 37.84767 33.94398 42.36887
Pseudophilautus auratus Anura EN Arboreal 29.086524 38.21180 34.17105 42.78057
Pseudophilautus caeruleus Anura EN Arboreal 27.155513 37.96946 33.83271 41.84951
Pseudophilautus caeruleus Anura EN Arboreal 26.400558 37.86616 33.74214 41.72059
Pseudophilautus caeruleus Anura EN Arboreal 29.086524 38.23366 33.97430 42.18639
Pseudophilautus cavirostris Anura VU Arboreal 27.311256 37.96627 33.69352 41.94537
Pseudophilautus cavirostris Anura VU Arboreal 26.578946 37.86915 33.66953 41.87787
Pseudophilautus cavirostris Anura VU Arboreal 29.131810 38.20772 33.80043 42.23623
Pseudophilautus cuspis Anura EN Ground-dwelling 27.311256 38.11032 33.82323 42.33826
Pseudophilautus cuspis Anura EN Ground-dwelling 26.578946 38.01172 33.70749 42.20050
Pseudophilautus cuspis Anura EN Ground-dwelling 29.131810 38.35545 33.89297 42.55998
Pseudophilautus decoris Anura CR Arboreal 27.155513 37.92468 33.66400 41.82345
Pseudophilautus decoris Anura CR Arboreal 26.400558 37.82317 33.63278 41.70900
Pseudophilautus decoris Anura CR Arboreal 29.086524 38.18431 34.10782 42.38331
Pseudophilautus mittermeieri Anura VU Arboreal 27.311256 37.98296 34.10168 42.43266
Pseudophilautus mittermeieri Anura VU Arboreal 26.578946 37.88480 34.00285 42.34676
Pseudophilautus mittermeieri Anura VU Arboreal 29.131810 38.22700 34.04109 42.44870
Pseudophilautus femoralis Anura EN Arboreal 27.311256 38.05644 33.74723 42.01141
Pseudophilautus femoralis Anura EN Arboreal 26.578946 37.95743 33.64193 41.92999
Pseudophilautus femoralis Anura EN Arboreal 29.131810 38.30258 33.85569 42.28067
Pseudophilautus poppiae Anura CR Arboreal 27.155513 37.96489 33.87229 42.17662
Pseudophilautus poppiae Anura CR Arboreal 26.400558 37.86576 33.76348 42.00949
Pseudophilautus poppiae Anura CR Arboreal 29.086524 38.21843 33.89667 42.41352
Pseudophilautus mooreorum Anura CR Arboreal 27.466999 37.94703 33.99265 42.28814
Pseudophilautus mooreorum Anura CR Arboreal 26.757334 37.85293 33.89715 42.18462
Pseudophilautus mooreorum Anura CR Arboreal 29.177097 38.17379 34.19780 42.55550
Pseudophilautus fergusonianus Anura LC Arboreal 27.714531 37.97058 33.68218 42.22317
Pseudophilautus fergusonianus Anura LC Arboreal 26.942611 37.86710 33.57896 42.07621
Pseudophilautus fergusonianus Anura LC Arboreal 29.621272 38.22617 33.55619 42.24767
Pseudophilautus folicola Anura VU Arboreal 27.311256 37.88683 33.92833 42.22377
Pseudophilautus folicola Anura VU Arboreal 26.578946 37.79001 33.80818 42.07919
Pseudophilautus folicola Anura VU Arboreal 29.131810 38.12752 34.08778 42.46060
Pseudophilautus frankenbergi Anura EN Arboreal 27.537965 37.85444 33.91114 42.10571
Pseudophilautus frankenbergi Anura EN Arboreal 26.783377 37.75588 33.80451 41.94074
Pseudophilautus frankenbergi Anura EN Arboreal 29.426420 38.10110 33.89792 42.20890
Pseudophilautus fulvus Anura EN Arboreal 27.311256 37.85140 33.52242 41.83644
Pseudophilautus fulvus Anura EN Arboreal 26.578946 37.75242 33.64884 41.95154
Pseudophilautus fulvus Anura EN Arboreal 29.131810 38.09746 33.53526 41.91965
Pseudophilautus schmarda Anura EN Arboreal 27.311256 37.94574 33.88629 42.21286
Pseudophilautus schmarda Anura EN Arboreal 26.578946 37.84794 33.78687 42.07656
Pseudophilautus schmarda Anura EN Arboreal 29.131810 38.18888 34.03206 42.51969
Pseudophilautus kani Anura LC Arboreal 27.573236 37.87766 34.07029 42.68464
Pseudophilautus kani Anura LC Arboreal 26.914010 37.78999 33.60271 42.15823
Pseudophilautus kani Anura LC Arboreal 28.939685 38.05939 34.09238 42.84469
Pseudophilautus limbus Anura EN Arboreal 27.311256 37.97538 34.11393 42.37939
Pseudophilautus limbus Anura EN Arboreal 26.578946 37.87663 33.98848 42.25586
Pseudophilautus limbus Anura EN Arboreal 29.131810 38.22087 34.29549 42.63365
Pseudophilautus lunatus Anura CR Arboreal 27.155513 37.92940 33.60158 42.00179
Pseudophilautus lunatus Anura CR Arboreal 26.400558 37.82802 33.88561 42.26895
Pseudophilautus lunatus Anura CR Arboreal 29.086524 38.18871 33.73025 42.21918
Pseudophilautus macropus Anura EN Stream-dwelling 27.466999 37.45309 32.99473 41.27934
Pseudophilautus macropus Anura EN Stream-dwelling 26.757334 37.35775 32.86474 41.11244
Pseudophilautus macropus Anura EN Stream-dwelling 29.177097 37.68282 33.39587 41.76431
Pseudophilautus microtympanum Anura EN Arboreal 27.311256 38.01321 33.88976 41.81107
Pseudophilautus microtympanum Anura EN Arboreal 26.578946 37.91514 33.81129 41.68815
Pseudophilautus microtympanum Anura EN Arboreal 29.131810 38.25702 34.23758 42.21239
Pseudophilautus steineri Anura EN Arboreal 27.466999 37.93334 33.87843 42.06926
Pseudophilautus steineri Anura EN Arboreal 26.757334 37.83830 33.80139 41.95676
Pseudophilautus steineri Anura EN Arboreal 29.177097 38.16237 34.04782 42.33444
Pseudophilautus nemus Anura EN Arboreal 27.311256 37.99314 33.71310 42.00697
Pseudophilautus nemus Anura EN Arboreal 26.578946 37.89500 33.63919 41.88390
Pseudophilautus nemus Anura EN Arboreal 29.131810 38.23711 34.13551 42.54787
Pseudophilautus ocularis Anura CR Arboreal 27.155513 37.91350 33.99743 41.76080
Pseudophilautus ocularis Anura CR Arboreal 26.400558 37.81350 33.91338 41.66012
Pseudophilautus ocularis Anura CR Arboreal 29.086524 38.16928 34.21240 42.03985
Pseudophilautus reticulatus Anura VU Arboreal 27.311256 37.91359 33.67745 42.08987
Pseudophilautus reticulatus Anura VU Arboreal 26.578946 37.81608 33.60575 41.94726
Pseudophilautus reticulatus Anura VU Arboreal 29.131810 38.15601 34.03003 42.57156
Pseudophilautus pleurotaenia Anura VU Arboreal 27.489517 37.95891 33.72847 42.44453
Pseudophilautus pleurotaenia Anura VU Arboreal 26.730738 37.85774 33.66637 42.35925
Pseudophilautus pleurotaenia Anura VU Arboreal 29.328246 38.20407 33.93293 42.68674
Pseudophilautus popularis Anura VU Arboreal 27.710053 38.00867 33.92111 41.95008
Pseudophilautus popularis Anura VU Arboreal 26.959105 37.90796 33.74606 41.77732
Pseudophilautus popularis Anura VU Arboreal 29.525512 38.25213 34.08164 42.15059
Pseudophilautus regius Anura LC Arboreal 27.752668 38.00060 33.44919 41.70425
Pseudophilautus regius Anura LC Arboreal 27.014869 37.90078 33.38121 41.53567
Pseudophilautus regius Anura LC Arboreal 29.584693 38.24846 34.06128 42.56721
Pseudophilautus rus Anura NT Arboreal 27.311256 37.87906 34.07027 42.21244
Pseudophilautus rus Anura NT Arboreal 26.578946 37.78242 34.04297 42.09772
Pseudophilautus rus Anura NT Arboreal 29.131810 38.11931 33.85061 42.11301
Pseudophilautus sarasinorum Anura EN Stream-dwelling 27.553317 37.46717 33.62523 41.64873
Pseudophilautus sarasinorum Anura EN Stream-dwelling 26.794859 37.36627 33.80018 41.79634
Pseudophilautus sarasinorum Anura EN Stream-dwelling 29.452572 37.71984 33.90224 41.99870
Pseudophilautus semiruber Anura EN Ground-dwelling 27.311256 38.13119 33.75824 42.00240
Pseudophilautus semiruber Anura EN Ground-dwelling 26.578946 38.03341 34.20390 42.40926
Pseudophilautus semiruber Anura EN Ground-dwelling 29.131810 38.37426 34.06438 42.37775
Pseudophilautus simba Anura CR Ground-dwelling 27.155513 38.05802 33.93553 42.21551
Pseudophilautus simba Anura CR Ground-dwelling 26.400558 37.95614 33.86144 42.10122
Pseudophilautus simba Anura CR Ground-dwelling 29.086524 38.31859 34.17717 42.51253
Pseudophilautus singu Anura EN Arboreal 27.311256 37.97260 34.02687 42.27283
Pseudophilautus singu Anura EN Arboreal 26.578946 37.87522 33.91712 42.14805
Pseudophilautus singu Anura EN Arboreal 29.131810 38.21470 34.17922 42.46504
Pseudophilautus sordidus Anura VU Arboreal 27.311256 37.99033 33.87859 41.88057
Pseudophilautus sordidus Anura VU Arboreal 26.578946 37.89172 33.82446 41.78823
Pseudophilautus sordidus Anura VU Arboreal 29.131810 38.23548 34.13760 42.19966
Pseudophilautus stellatus Anura CR Arboreal 27.155513 37.94523 33.83435 42.29850
Pseudophilautus stellatus Anura CR Arboreal 26.400558 37.84545 33.55420 41.95572
Pseudophilautus stellatus Anura CR Arboreal 29.086524 38.20045 34.06458 42.63050
Pseudophilautus stictomerus Anura VU Arboreal 27.710053 37.95234 33.66293 42.32646
Pseudophilautus stictomerus Anura VU Arboreal 26.959105 37.85140 33.59412 42.25361
Pseudophilautus stictomerus Anura VU Arboreal 29.525512 38.19634 33.89311 42.62528
Pseudophilautus stuarti Anura CR Arboreal 27.466999 37.94584 34.14122 41.73635
Pseudophilautus stuarti Anura CR Arboreal 26.757334 37.85085 34.05093 41.58253
Pseudophilautus stuarti Anura CR Arboreal 29.177097 38.17476 34.09807 41.76006
Pseudophilautus tanu Anura EN Arboreal 27.155513 37.90905 33.68138 42.08429
Pseudophilautus tanu Anura EN Arboreal 26.400558 37.80844 33.38643 41.76655
Pseudophilautus tanu Anura EN Arboreal 29.086524 38.16639 33.72106 42.16548
Pseudophilautus viridis Anura EN Arboreal 27.311256 37.97281 33.75697 41.90765
Pseudophilautus viridis Anura EN Arboreal 26.578946 37.87526 33.61783 41.72735
Pseudophilautus viridis Anura EN Arboreal 29.131810 38.21532 34.28576 42.53234
Pseudophilautus zorro Anura VU Ground-dwelling 27.311256 38.15445 33.86071 42.17818
Pseudophilautus zorro Anura VU Ground-dwelling 26.578946 38.05572 33.82260 42.13002
Pseudophilautus zorro Anura VU Ground-dwelling 29.131810 38.39990 34.10556 42.48829
Raorchestes akroparallagi Anura LC Arboreal 27.080195 37.86972 33.53408 42.28526
Raorchestes akroparallagi Anura LC Arboreal 26.181409 37.75087 33.48928 42.17788
Raorchestes akroparallagi Anura LC Arboreal 28.998381 38.12335 33.79722 42.53927
Raorchestes bobingeri Anura NT Arboreal 27.573236 37.87003 33.13103 41.65916
Raorchestes bobingeri Anura NT Arboreal 26.914010 37.78210 33.03937 41.54306
Raorchestes bobingeri Anura NT Arboreal 28.939685 38.05230 33.68039 42.27095
Raorchestes glandulosus Anura VU Arboreal 27.033697 37.82793 33.77983 42.23850
Raorchestes glandulosus Anura VU Arboreal 26.150821 37.70778 33.63327 42.10689
Raorchestes glandulosus Anura VU Arboreal 28.951259 38.08889 34.04628 42.58972
Raorchestes anili Anura LC Ground-dwelling 27.391492 38.08066 33.99732 42.51124
Raorchestes anili Anura LC Ground-dwelling 26.520098 37.96407 34.02648 42.44574
Raorchestes anili Anura LC Ground-dwelling 29.151046 38.31610 34.40167 43.05406
Raorchestes kaikatti Anura CR Arboreal 28.304066 38.03899 33.97397 42.28654
Raorchestes kaikatti Anura CR Arboreal 27.264133 37.90122 33.60033 41.85366
Raorchestes kaikatti Anura CR Arboreal 30.248374 38.29659 34.35396 42.80595
Raorchestes sushili Anura CR Arboreal 28.304066 38.04010 33.97699 42.27911
Raorchestes sushili Anura CR Arboreal 27.264133 37.90059 33.86135 42.12280
Raorchestes sushili Anura CR Arboreal 30.248374 38.30094 34.15105 42.51872
Raorchestes beddomii Anura LC Arboreal 27.718290 38.02975 33.29592 42.02461
Raorchestes beddomii Anura LC Arboreal 26.863269 37.91576 33.23712 41.91949
Raorchestes beddomii Anura LC Arboreal 29.374433 38.25055 33.59569 42.41345
Raorchestes munnarensis Anura EN Ground-dwelling 27.766641 38.14019 34.18371 42.52765
Raorchestes munnarensis Anura EN Ground-dwelling 26.846355 38.01687 34.11898 42.46461
Raorchestes munnarensis Anura EN Ground-dwelling 29.519349 38.37507 34.37815 42.74746
Raorchestes resplendens Anura CR Ground-dwelling 27.645036 38.17782 34.14178 42.53017
Raorchestes resplendens Anura CR Ground-dwelling 26.573021 38.03456 34.04339 42.34330
Raorchestes resplendens Anura CR Ground-dwelling 29.751682 38.45933 34.41144 42.93890
Raorchestes dubois Anura VU Arboreal 27.766641 37.97606 33.55989 42.16056
Raorchestes dubois Anura VU Arboreal 26.846355 37.85228 33.47255 42.04294
Raorchestes dubois Anura VU Arboreal 29.519349 38.21180 33.70086 42.42614
Raorchestes bombayensis Anura VU Arboreal 26.598890 37.73380 33.23611 41.66198
Raorchestes bombayensis Anura VU Arboreal 25.757878 37.62576 33.15050 41.54079
Raorchestes bombayensis Anura VU Arboreal 28.608625 37.99198 33.44070 41.93694
Raorchestes tuberohumerus Anura LC Arboreal 26.826753 37.81788 33.11332 41.65750
Raorchestes tuberohumerus Anura LC Arboreal 25.923869 37.69908 33.02489 41.53717
Raorchestes tuberohumerus Anura LC Arboreal 28.991412 38.10272 33.34550 41.98882
Raorchestes charius Anura EN Arboreal 26.485775 37.75379 33.95700 42.73907
Raorchestes charius Anura EN Arboreal 25.652340 37.64460 33.82577 42.59927
Raorchestes charius Anura EN Arboreal 28.489556 38.01629 34.23581 43.17462
Raorchestes griet Anura CR Arboreal 27.645036 37.94882 33.62969 42.25179
Raorchestes griet Anura CR Arboreal 26.573021 37.80634 33.58403 42.21642
Raorchestes griet Anura CR Arboreal 29.751682 38.22881 33.79626 42.51549
Raorchestes coonoorensis Anura LC Arboreal 26.793491 37.91404 33.22075 41.90418
Raorchestes coonoorensis Anura LC Arboreal 25.581038 37.75304 32.84430 41.43329
Raorchestes coonoorensis Anura LC Arboreal 29.313470 38.24867 33.49411 42.23808
Raorchestes chlorosomma Anura EN Arboreal 27.497928 37.97351 33.98884 41.94529
Raorchestes chlorosomma Anura EN Arboreal 26.637465 37.85782 33.87885 41.80047
Raorchestes chlorosomma Anura EN Arboreal 29.154837 38.19629 34.16264 42.21043
Raorchestes luteolus Anura LC Arboreal 26.769555 37.80757 33.45343 41.56865
Raorchestes luteolus Anura LC Arboreal 25.867399 37.68906 33.34860 41.44192
Raorchestes luteolus Anura LC Arboreal 29.099508 38.11364 33.93170 42.13278
Raorchestes travancoricus Anura EN Arboreal 27.350820 37.88169 33.53811 41.80567
Raorchestes travancoricus Anura EN Arboreal 26.701910 37.79635 33.69523 41.94449
Raorchestes travancoricus Anura EN Arboreal 28.557991 38.04044 33.75709 42.08385
Raorchestes chotta Anura DD Arboreal 27.573236 37.91993 33.88237 42.15369
Raorchestes chotta Anura DD Arboreal 26.914010 37.83105 33.81565 42.06952
Raorchestes chotta Anura DD Arboreal 28.939685 38.10418 33.83953 42.13442
Raorchestes chromasynchysi Anura VU Arboreal 26.764380 37.76723 33.65921 42.32972
Raorchestes chromasynchysi Anura VU Arboreal 25.864005 37.64994 33.61081 42.24649
Raorchestes chromasynchysi Anura VU Arboreal 28.802287 38.03270 33.85395 42.62541
Raorchestes signatus Anura EN Arboreal 27.206732 37.96200 33.64938 42.21189
Raorchestes signatus Anura EN Arboreal 26.054875 37.80978 33.56582 42.07900
Raorchestes signatus Anura EN Arboreal 29.684065 38.28938 33.89558 42.55764
Raorchestes tinniens Anura EN Ground-dwelling 26.793491 38.00904 33.75191 42.44354
Raorchestes tinniens Anura EN Ground-dwelling 25.581038 37.84428 33.52461 42.14652
Raorchestes tinniens Anura EN Ground-dwelling 29.313470 38.35146 34.11388 42.93066
Raorchestes graminirupes Anura VU Ground-dwelling 27.573236 38.17442 33.56101 42.38077
Raorchestes graminirupes Anura VU Ground-dwelling 26.914010 38.08486 33.39719 42.18241
Raorchestes graminirupes Anura VU Ground-dwelling 28.939685 38.36006 33.72291 42.66232
Raorchestes gryllus Anura VU Arboreal 27.960153 37.97986 33.67550 42.05136
Raorchestes gryllus Anura VU Arboreal 27.022721 37.85512 33.52344 41.82659
Raorchestes gryllus Anura VU Arboreal 29.618000 38.20045 33.89594 42.34343
Raorchestes menglaensis Anura LC Stream-dwelling 24.390696 36.92145 32.68639 41.00115
Raorchestes menglaensis Anura LC Stream-dwelling 23.434874 36.79413 32.48604 40.80246
Raorchestes menglaensis Anura LC Stream-dwelling 26.218755 37.16498 32.92162 41.33592
Raorchestes longchuanensis Anura LC Arboreal 24.237001 37.42369 33.29131 41.57186
Raorchestes longchuanensis Anura LC Arboreal 23.195216 37.28654 33.11030 41.34481
Raorchestes longchuanensis Anura LC Arboreal 26.202179 37.68242 33.48345 41.87462
Raorchestes marki Anura CR Arboreal 28.304066 37.99040 33.51655 42.41701
Raorchestes marki Anura CR Arboreal 27.264133 37.85294 33.12159 41.96148
Raorchestes marki Anura CR Arboreal 30.248374 38.24740 33.68795 42.58968
Raorchestes nerostagona Anura EN Arboreal 26.793491 37.81731 33.73462 42.04373
Raorchestes nerostagona Anura EN Arboreal 25.581038 37.65350 33.30839 41.58503
Raorchestes nerostagona Anura EN Arboreal 29.313470 38.15778 34.04206 42.38571
Raorchestes ochlandrae Anura LC Arboreal 27.205186 37.93696 33.82032 42.25607
Raorchestes ochlandrae Anura LC Arboreal 26.297845 37.81577 33.79634 42.20862
Raorchestes ochlandrae Anura LC Arboreal 29.104954 38.19072 34.04169 42.46391
Raorchestes parvulus Anura LC Arboreal 27.131255 37.93913 33.39286 42.32880
Raorchestes parvulus Anura LC Arboreal 26.220796 37.81648 33.25474 42.15111
Raorchestes parvulus Anura LC Arboreal 28.932207 38.18175 33.53912 42.58515
Raorchestes ponmudi Anura LC Arboreal 27.358853 37.95091 33.92412 42.45896
Raorchestes ponmudi Anura LC Arboreal 26.480690 37.83192 33.65136 42.14607
Raorchestes ponmudi Anura LC Arboreal 29.137190 38.19188 34.07462 42.68355
Nyctixalus margaritifer Anura LC Arboreal 27.610608 37.65040 33.44869 41.02539
Nyctixalus margaritifer Anura LC Arboreal 26.917000 37.55785 33.37597 40.94196
Nyctixalus margaritifer Anura LC Arboreal 29.077758 37.84617 33.92300 41.59459
Nyctixalus spinosus Anura LC Ground-dwelling 27.348447 37.78131 33.91775 41.81460
Nyctixalus spinosus Anura LC Ground-dwelling 26.844745 37.71324 33.87343 41.75156
Nyctixalus spinosus Anura LC Ground-dwelling 28.433196 37.92790 33.96542 41.95034
Philautus abditus Anura LC Stream-dwelling 27.945777 36.79288 32.53066 40.60228
Philautus abditus Anura LC Stream-dwelling 26.933358 36.65842 32.42506 40.48584
Philautus abditus Anura LC Stream-dwelling 29.780452 37.03654 32.69171 40.82532
Philautus acutirostris Anura LC Arboreal 27.400303 36.00058 32.65412 39.14196
Philautus acutirostris Anura LC Arboreal 26.851423 35.92585 32.57768 39.02211
Philautus acutirostris Anura LC Arboreal 28.558507 36.15827 32.76404 39.36799
Philautus acutus Anura LC Arboreal 27.002711 37.12422 32.85158 41.44174
Philautus acutus Anura LC Arboreal 26.369992 37.03943 32.79419 41.34687
Philautus acutus Anura LC Arboreal 28.309782 37.29939 32.85233 41.47707
Philautus aurantium Anura VU Arboreal 27.355101 37.25908 32.97711 41.29583
Philautus aurantium Anura VU Arboreal 26.788195 37.18115 33.04030 41.32798
Philautus aurantium Anura VU Arboreal 28.477535 37.41336 33.25257 41.64923
Philautus amoenus Anura LC Arboreal 27.024307 37.20566 33.53475 41.17287
Philautus amoenus Anura LC Arboreal 26.595031 37.14781 33.49945 41.09523
Philautus amoenus Anura LC Arboreal 27.949343 37.33034 33.38258 41.10688
Philautus mjobergi Anura LC Arboreal 27.102893 37.25705 33.41302 41.67207
Philautus mjobergi Anura LC Arboreal 26.534412 37.17900 33.35191 41.56769
Philautus mjobergi Anura LC Arboreal 28.250047 37.41455 33.59081 41.93130
Philautus aurifasciatus Anura LC Arboreal 27.645892 37.23956 33.19499 41.33434
Philautus aurifasciatus Anura LC Arboreal 27.026156 37.15518 33.17081 41.25207
Philautus aurifasciatus Anura LC Arboreal 28.904330 37.41090 33.08430 41.28712
Philautus bunitus Anura LC Arboreal 27.451149 37.32105 33.27964 41.21365
Philautus bunitus Anura LC Arboreal 26.903246 37.24747 33.25932 41.13282
Philautus bunitus Anura LC Arboreal 28.618708 37.47785 33.39818 41.37210
Philautus kerangae Anura VU Arboreal 26.797163 37.23084 32.93260 41.00063
Philautus kerangae Anura VU Arboreal 26.278658 37.16043 32.88381 40.91296
Philautus kerangae Anura VU Arboreal 28.133809 37.41236 33.44976 41.59770
Philautus cardamonus Anura EN Arboreal 28.953590 37.48880 33.32985 41.61999
Philautus cardamonus Anura EN Arboreal 28.024487 37.36304 33.33723 41.55276
Philautus cardamonus Anura EN Arboreal 30.890544 37.75098 33.53292 42.02411
Philautus cornutus Anura EN Arboreal 28.891527 37.48834 33.20435 41.42740
Philautus cornutus Anura EN Arboreal 28.270457 37.40408 33.13717 41.32652
Philautus cornutus Anura EN Arboreal 30.176096 37.66260 33.26289 41.59745
Philautus davidlabangi Anura LC Arboreal 27.963074 37.26572 32.82686 40.92989
Philautus davidlabangi Anura LC Arboreal 27.332960 37.18218 32.77019 40.82620
Philautus davidlabangi Anura LC Arboreal 29.230818 37.43380 32.97487 41.15851
Philautus disgregus Anura NT Arboreal 27.979376 37.32735 33.68264 41.73615
Philautus disgregus Anura NT Arboreal 27.469671 37.25895 33.71968 41.74426
Philautus disgregus Anura NT Arboreal 29.213872 37.49300 33.84735 41.93654
Philautus erythrophthalmus Anura EN Arboreal 27.631116 37.25914 33.34055 41.44710
Philautus erythrophthalmus Anura EN Arboreal 27.037922 37.17840 33.25215 41.32075
Philautus erythrophthalmus Anura EN Arboreal 28.870513 37.42783 33.47705 41.56964
Philautus everetti Anura EN Arboreal 27.669291 37.17338 33.08769 40.91805
Philautus everetti Anura EN Arboreal 27.260233 37.11854 33.12246 40.94036
Philautus everetti Anura EN Arboreal 28.619811 37.30080 33.34206 41.20328
Philautus garo Anura DD Arboreal 25.381128 36.81686 32.50221 40.72146
Philautus garo Anura DD Arboreal 24.427616 36.69173 32.48698 40.64793
Philautus garo Anura DD Arboreal 26.997123 37.02894 32.78278 41.08808
Philautus gunungensis Anura LC Arboreal 27.024307 37.18509 33.11982 40.99653
Philautus gunungensis Anura LC Arboreal 26.595031 37.12601 33.07157 40.91549
Philautus gunungensis Anura LC Arboreal 27.949343 37.31240 33.45130 41.39594
Philautus hosii Anura LC Arboreal 27.665117 37.21742 33.17684 41.03004
Philautus hosii Anura LC Arboreal 27.033778 37.13153 33.10257 40.89578
Philautus hosii Anura LC Arboreal 28.959809 37.39356 33.37397 41.34002
Philautus ingeri Anura VU Arboreal 27.125504 37.22720 32.92933 40.76911
Philautus ingeri Anura VU Arboreal 26.575272 37.15305 32.89548 40.69944
Philautus ingeri Anura VU Arboreal 28.301937 37.38573 33.40369 41.32380
Philautus kempiae Anura CR Arboreal 25.381128 36.93361 32.93414 40.93818
Philautus kempiae Anura CR Arboreal 24.427616 36.80441 32.77466 40.76568
Philautus kempiae Anura CR Arboreal 26.997123 37.15258 33.05053 41.19286
Philautus kempii Anura DD Arboreal 17.560163 35.89480 31.77485 39.55872
Philautus kempii Anura DD Arboreal 15.953397 35.67742 31.57906 39.38047
Philautus kempii Anura DD Arboreal 19.738095 36.18945 32.04887 39.84905
Philautus leitensis Anura LC Arboreal 27.411466 37.20678 33.21919 41.19032
Philautus leitensis Anura LC Arboreal 26.886289 37.13719 32.94698 40.91228
Philautus leitensis Anura LC Arboreal 28.518196 37.35342 33.38452 41.41949
Philautus longicrus Anura VU Arboreal 27.474901 37.22419 33.09666 41.45841
Philautus longicrus Anura VU Arboreal 27.063697 37.16830 33.02188 41.34933
Philautus longicrus Anura VU Arboreal 28.399008 37.34978 33.08288 41.53130
Philautus maosonensis Anura DD Arboreal 26.981046 37.09924 32.91436 41.25637
Philautus maosonensis Anura DD Arboreal 25.937273 36.95794 32.77510 41.04426
Philautus maosonensis Anura DD Arboreal 28.818410 37.34798 33.40395 41.83032
Philautus microdiscus Anura CR Arboreal 20.728415 36.26533 32.83598 40.19319
Philautus microdiscus Anura CR Arboreal 19.727354 36.13243 32.68934 40.05260
Philautus microdiscus Anura CR Arboreal 22.414085 36.48910 33.01559 40.40804
Philautus namdaphaensis Anura DD Arboreal 22.075347 36.47299 32.48093 40.89190
Philautus namdaphaensis Anura DD Arboreal 21.132319 36.34551 32.41030 40.81537
Philautus namdaphaensis Anura DD Arboreal 23.819751 36.70879 32.71073 41.16210
Philautus pallidipes Anura LC Arboreal 28.268583 37.38431 33.31484 41.25997
Philautus pallidipes Anura LC Arboreal 27.422313 37.26995 33.18360 41.05786
Philautus pallidipes Anura LC Arboreal 30.172717 37.64160 33.41488 41.50416
Philautus petersi Anura DD Ground-dwelling 27.463377 37.34174 33.42364 41.24506
Philautus petersi Anura DD Ground-dwelling 27.000707 37.28033 33.32526 41.19225
Philautus petersi Anura DD Ground-dwelling 28.247701 37.44585 33.49620 41.40511
Philautus poecilius Anura LC Arboreal 27.427926 37.23891 33.17899 40.83090
Philautus poecilius Anura LC Arboreal 26.826940 37.15806 33.07896 40.70803
Philautus poecilius Anura LC Arboreal 28.741186 37.41559 33.17429 40.81169
Philautus refugii Anura VU Arboreal 27.980788 37.30117 33.35858 41.41352
Philautus refugii Anura VU Arboreal 27.395411 37.22211 33.28802 41.31365
Philautus refugii Anura VU Arboreal 29.127482 37.45605 33.47125 41.59527
Philautus saueri Anura LC Arboreal 27.024307 37.26353 33.27773 41.30631
Philautus saueri Anura LC Arboreal 26.595031 37.20516 33.29997 41.29479
Philautus saueri Anura LC Arboreal 27.949343 37.38931 33.47726 41.52886
Philautus schmackeri Anura EN Arboreal 27.687848 37.24868 33.08388 41.11192
Philautus schmackeri Anura EN Arboreal 27.085516 37.16777 32.95120 40.99724
Philautus schmackeri Anura EN Arboreal 28.658100 37.37902 33.19017 41.22362
Philautus similipalensis Anura DD Ground-dwelling 29.838298 37.71990 33.26830 41.40140
Philautus similipalensis Anura DD Ground-dwelling 28.889868 37.59241 33.13445 41.23437
Philautus similipalensis Anura DD Ground-dwelling 31.731476 37.97440 33.44715 41.69095
Philautus surrufus Anura NT Arboreal 27.395282 37.11314 33.25890 41.23445
Philautus surrufus Anura NT Arboreal 26.775983 37.02812 33.20807 41.12885
Philautus surrufus Anura NT Arboreal 28.709832 37.29361 33.58058 41.68105
Philautus tectus Anura LC Arboreal 27.850977 37.29918 33.12165 41.18982
Philautus tectus Anura LC Arboreal 27.290747 37.22310 33.07874 41.06933
Philautus tectus Anura LC Arboreal 29.101908 37.46906 33.19173 41.38622
Philautus tytthus Anura DD Arboreal 23.871863 36.71780 32.72547 40.78958
Philautus tytthus Anura DD Arboreal 23.018673 36.60441 32.59547 40.63020
Philautus tytthus Anura DD Arboreal 25.579815 36.94479 32.94083 41.01306
Philautus umbra Anura LC Arboreal 27.086462 37.25324 33.02069 41.15129
Philautus umbra Anura LC Arboreal 26.556259 37.18210 33.12127 41.21993
Philautus umbra Anura LC Arboreal 28.322808 37.41915 33.12069 41.31178
Philautus vermiculatus Anura LC Arboreal 28.065994 37.29599 32.79996 41.36972
Philautus vermiculatus Anura LC Arboreal 27.379019 37.20282 32.69710 41.22351
Philautus vermiculatus Anura LC Arboreal 29.476469 37.48730 33.00545 41.67865
Philautus vittiger Anura NT Arboreal 27.829675 37.27817 33.12588 41.53475
Philautus vittiger Anura NT Arboreal 27.084147 37.17778 33.02970 41.38051
Philautus vittiger Anura NT Arboreal 29.480753 37.50051 33.14672 41.69425
Philautus worcesteri Anura LC Arboreal 27.541664 37.42441 33.33735 41.54641
Philautus worcesteri Anura LC Arboreal 26.977030 37.34764 33.25528 41.47485
Philautus worcesteri Anura LC Arboreal 28.701827 37.58214 33.55761 41.85778
Rhacophorus angulirostris Anura NT Arboreal 26.801121 37.82619 33.62341 41.79609
Rhacophorus angulirostris Anura NT Arboreal 26.209815 37.74652 33.58532 41.70428
Rhacophorus angulirostris Anura NT Arboreal 27.867897 37.96991 33.79888 42.03587
Rhacophorus annamensis Anura LC Stream-dwelling 28.214757 37.57439 33.65676 41.99045
Rhacophorus annamensis Anura LC Stream-dwelling 27.253915 37.44374 33.49691 41.73859
Rhacophorus annamensis Anura LC Stream-dwelling 30.051705 37.82418 33.22080 41.67647
Rhacophorus exechopygus Anura LC Arboreal 27.937048 37.97195 33.86374 41.70719
Rhacophorus exechopygus Anura LC Arboreal 27.035297 37.85022 33.77475 41.56309
Rhacophorus exechopygus Anura LC Arboreal 29.685331 38.20794 34.06691 42.02709
Rhacophorus baluensis Anura LC Arboreal 27.287180 37.96743 33.58654 41.75543
Rhacophorus baluensis Anura LC Arboreal 26.669139 37.88467 33.55949 41.68021
Rhacophorus baluensis Anura LC Arboreal 28.538383 38.13496 33.81528 42.04270
Rhacophorus barisani Anura LC Stream-dwelling 28.197935 37.54641 33.09478 41.99585
Rhacophorus barisani Anura LC Stream-dwelling 27.533927 37.45811 33.06471 41.92656
Rhacophorus barisani Anura LC Stream-dwelling 29.465843 37.71503 33.24174 42.23020
Rhacophorus gauni Anura LC Arboreal 27.881298 38.05800 33.96998 42.49303
Rhacophorus gauni Anura LC Arboreal 27.208885 37.96708 33.88883 42.39971
Rhacophorus gauni Anura LC Arboreal 29.224869 38.23966 34.07265 42.65599
Rhacophorus gadingensis Anura LC Arboreal 27.811826 37.99279 33.80157 42.07715
Rhacophorus gadingensis Anura LC Arboreal 27.298663 37.92402 33.75496 41.98984
Rhacophorus gadingensis Anura LC Arboreal 28.868384 38.13439 33.99876 42.32771
Rhacophorus bifasciatus Anura LC Stream-dwelling 27.852341 37.42632 33.11500 41.76096
Rhacophorus bifasciatus Anura LC Stream-dwelling 27.235070 37.34463 33.15102 41.77141
Rhacophorus bifasciatus Anura LC Stream-dwelling 29.019814 37.58083 33.37580 42.06400
Rhacophorus bimaculatus Anura LC Arboreal 27.490312 37.94718 33.85623 42.16976
Rhacophorus bimaculatus Anura LC Arboreal 26.975554 37.87749 33.78666 42.07384
Rhacophorus bimaculatus Anura LC Arboreal 28.545924 38.09010 33.86833 42.28625
Rhacophorus bipunctatus Anura LC Arboreal 25.665733 37.64093 33.22115 41.81730
Rhacophorus bipunctatus Anura LC Arboreal 24.711516 37.51253 33.15231 41.64611
Rhacophorus bipunctatus Anura LC Arboreal 27.413163 37.87608 33.50878 42.18202
Rhacophorus rhodopus Anura LC Arboreal 25.309506 37.60471 33.69158 41.92937
Rhacophorus rhodopus Anura LC Arboreal 24.260384 37.46345 33.40929 41.59850
Rhacophorus rhodopus Anura LC Arboreal 27.261390 37.86750 33.89046 42.21423
Rhacophorus reinwardtii Anura LC Arboreal 27.275423 37.89266 33.76210 41.95309
Rhacophorus reinwardtii Anura LC Arboreal 26.657741 37.80925 33.60454 41.75650
Rhacophorus reinwardtii Anura LC Arboreal 28.512588 38.05972 33.84708 42.15215
Rhacophorus calcadensis Anura EN Arboreal 27.840779 38.01739 33.75027 42.18045
Rhacophorus calcadensis Anura EN Arboreal 26.917055 37.89386 33.65086 42.05981
Rhacophorus calcadensis Anura EN Arboreal 29.646580 38.25887 33.90859 42.48475
Rhacophorus calcaneus Anura EN Arboreal 27.525862 37.81234 33.33250 41.90108
Rhacophorus calcaneus Anura EN Arboreal 26.639648 37.69452 33.30877 41.82601
Rhacophorus calcaneus Anura EN Arboreal 29.009085 38.00952 33.61414 42.26293
Rhacophorus catamitus Anura LC Stream-dwelling 28.133705 37.51409 33.29460 41.70308
Rhacophorus catamitus Anura LC Stream-dwelling 27.441742 37.42239 33.27002 41.64870
Rhacophorus catamitus Anura LC Stream-dwelling 29.405666 37.68265 33.45606 41.92249
Rhacophorus translineatus Anura NT Arboreal 18.121681 36.69838 32.59396 40.38539
Rhacophorus translineatus Anura NT Arboreal 16.622302 36.50072 32.49801 40.25815
Rhacophorus translineatus Anura NT Arboreal 20.066832 36.95482 33.03432 40.69385
Rhacophorus pardalis Anura LC Arboreal 27.648652 37.91122 33.48318 41.75211
Rhacophorus pardalis Anura LC Arboreal 27.077629 37.83535 33.43279 41.72378
Rhacophorus pardalis Anura LC Arboreal 28.836729 38.06908 33.66413 41.96063
Rhacophorus fasciatus Anura LC Arboreal 27.594237 37.81869 33.36583 42.24183
Rhacophorus fasciatus Anura LC Arboreal 26.963303 37.73483 33.67251 42.57209
Rhacophorus fasciatus Anura LC Arboreal 28.853534 37.98608 33.91909 42.89167
Rhacophorus harrissoni Anura LC Arboreal 27.951097 37.94371 33.46669 41.86563
Rhacophorus harrissoni Anura LC Arboreal 27.317751 37.85994 33.37795 41.77456
Rhacophorus harrissoni Anura LC Arboreal 29.249966 38.11552 33.88715 42.40823
Rhacophorus rufipes Anura LC Arboreal 28.090920 37.91896 33.81667 42.19300
Rhacophorus rufipes Anura LC Arboreal 27.438169 37.83322 33.73409 42.09536
Rhacophorus rufipes Anura LC Arboreal 29.438853 38.09603 33.84439 42.38756
Rhacophorus georgii Anura LC Arboreal 26.883158 37.91500 33.41208 41.84996
Rhacophorus georgii Anura LC Arboreal 26.439800 37.85559 33.38385 41.79252
Rhacophorus georgii Anura LC Arboreal 28.031229 38.06885 33.48517 41.99869
Rhacophorus helenae Anura EN Arboreal 29.081685 38.17519 33.40348 42.15497
Rhacophorus helenae Anura EN Arboreal 27.942736 38.02322 33.35646 42.01323
Rhacophorus helenae Anura EN Arboreal 31.279434 38.46845 33.86253 42.78450
Rhacophorus kio Anura LC Arboreal 25.719853 37.69258 33.64457 41.96064
Rhacophorus kio Anura LC Arboreal 24.735228 37.56111 33.48091 41.84648
Rhacophorus kio Anura LC Arboreal 27.643517 37.94943 33.63881 42.19155
Rhacophorus hoanglienensis Anura LC Arboreal 25.395220 37.77048 33.57588 42.37005
Rhacophorus hoanglienensis Anura LC Arboreal 24.324553 37.62668 33.27745 42.02753
Rhacophorus hoanglienensis Anura LC Arboreal 27.328481 38.03014 33.66006 42.57185
Rhacophorus lateralis Anura VU Arboreal 26.803594 37.88257 33.57333 42.06034
Rhacophorus lateralis Anura VU Arboreal 25.852289 37.75537 33.44847 41.87281
Rhacophorus lateralis Anura VU Arboreal 28.940355 38.16828 33.74047 42.36102
Rhacophorus malabaricus Anura LC Arboreal 27.034890 37.89656 33.53986 42.12827
Rhacophorus malabaricus Anura LC Arboreal 26.151061 37.77760 33.45528 42.04205
Rhacophorus malabaricus Anura LC Arboreal 29.096273 38.17400 33.79327 42.50924
Rhacophorus pseudomalabaricus Anura VU Arboreal 27.766641 38.00520 33.84739 42.49420
Rhacophorus pseudomalabaricus Anura VU Arboreal 26.846355 37.88275 33.51716 42.12087
Rhacophorus pseudomalabaricus Anura VU Arboreal 29.519349 38.23843 33.93000 42.70075
Rhacophorus margaritifer Anura LC Stream-dwelling 27.597362 37.44351 33.24299 41.52927
Rhacophorus margaritifer Anura LC Stream-dwelling 26.883526 37.34738 33.26543 41.53481
Rhacophorus margaritifer Anura LC Stream-dwelling 29.056283 37.63998 33.46824 41.80411
Rhacophorus marmoridorsum Anura VU Arboreal 27.677048 37.85799 33.82200 42.41198
Rhacophorus marmoridorsum Anura VU Arboreal 26.812794 37.74538 33.75551 42.28782
Rhacophorus marmoridorsum Anura VU Arboreal 29.355604 38.07670 34.03113 42.73108
Rhacophorus modestus Anura LC Stream-dwelling 28.607019 37.59719 33.51972 41.98919
Rhacophorus modestus Anura LC Stream-dwelling 27.962609 37.50932 33.42567 41.85071
Rhacophorus modestus Anura LC Stream-dwelling 29.777542 37.75680 33.54833 42.10392
Rhacophorus monticola Anura VU Stream-dwelling 26.574272 37.36472 32.87453 41.41243
Rhacophorus monticola Anura VU Stream-dwelling 26.200405 37.31455 32.86089 41.34430
Rhacophorus monticola Anura VU Stream-dwelling 27.546809 37.49523 33.27334 41.83877
Rhacophorus nigropalmatus Anura LC Arboreal 28.115558 37.97061 33.77217 42.14472
Rhacophorus nigropalmatus Anura LC Arboreal 27.470023 37.88316 33.71754 42.04754
Rhacophorus nigropalmatus Anura LC Arboreal 29.484062 38.15598 33.81086 42.20532
Rhacophorus orlovi Anura LC Stream-dwelling 27.980583 37.50414 33.18477 41.93981
Rhacophorus orlovi Anura LC Stream-dwelling 27.012452 37.37659 33.08136 41.78406
Rhacophorus orlovi Anura LC Stream-dwelling 29.823591 37.74695 33.51992 42.41797
Rhacophorus verrucopus Anura NT Arboreal 16.274470 36.47723 32.71323 40.83886
Rhacophorus verrucopus Anura NT Arboreal 14.438870 36.23514 32.56071 40.72830
Rhacophorus verrucopus Anura NT Arboreal 18.508255 36.77185 33.09831 41.20270
Rhacophorus poecilonotus Anura LC Arboreal 27.437897 37.94362 34.10139 42.48782
Rhacophorus poecilonotus Anura LC Arboreal 26.739272 37.85054 33.95892 42.27104
Rhacophorus poecilonotus Anura LC Arboreal 28.736277 38.11660 33.99775 42.47797
Rhacophorus robertingeri Anura LC Stream-dwelling 27.925238 37.47238 33.23811 41.97105
Rhacophorus robertingeri Anura LC Stream-dwelling 27.018206 37.35259 33.12601 41.77229
Rhacophorus robertingeri Anura LC Stream-dwelling 29.688937 37.70530 33.37625 42.19253
Rhacophorus robinsonii Anura LC Arboreal 28.018322 38.01194 33.51137 42.27775
Rhacophorus robinsonii Anura LC Arboreal 27.343295 37.92231 33.45236 42.15279
Rhacophorus robinsonii Anura LC Arboreal 29.421697 38.19827 33.42865 42.31566
Rhacophorus spelaeus Anura VU Arboreal 28.167127 37.99173 33.87879 42.52135
Rhacophorus spelaeus Anura VU Arboreal 27.268118 37.86975 33.55544 42.21599
Rhacophorus spelaeus Anura VU Arboreal 30.222900 38.27066 34.03693 42.84786
Rhacophorus tuberculatus Anura DD Arboreal 20.242946 36.92517 33.01404 40.62834
Rhacophorus tuberculatus Anura DD Arboreal 18.955932 36.75173 32.74124 40.32731
Rhacophorus tuberculatus Anura DD Arboreal 22.077404 37.17238 33.24056 40.94490
Rhacophorus turpes Anura DD Arboreal 23.871863 37.41834 32.89773 41.55940
Rhacophorus turpes Anura DD Arboreal 23.018673 37.30502 32.87810 41.53227
Rhacophorus turpes Anura DD Arboreal 25.579815 37.64520 33.06801 41.72442
Theloderma asperum Anura LC Ground-dwelling 27.827289 38.16278 33.87086 42.34521
Theloderma asperum Anura LC Ground-dwelling 27.135714 38.06844 33.81472 42.25402
Theloderma asperum Anura LC Ground-dwelling 29.396136 38.37679 34.21444 42.81860
Theloderma rhododiscus Anura LC Arboreal 26.371306 37.81811 33.37234 41.87602
Theloderma rhododiscus Anura LC Arboreal 25.161554 37.65448 33.24628 41.67968
Theloderma rhododiscus Anura LC Arboreal 28.643043 38.12537 33.48384 42.17743
Theloderma bicolor Anura LC Ground-dwelling 23.572100 37.69398 33.63080 41.71645
Theloderma bicolor Anura LC Ground-dwelling 22.518210 37.55137 33.58053 41.59980
Theloderma bicolor Anura LC Ground-dwelling 25.592778 37.96741 33.75067 42.05280
Theloderma corticale Anura LC Ground-dwelling 27.249135 38.02406 33.62135 42.10577
Theloderma corticale Anura LC Ground-dwelling 26.132531 37.87543 33.51439 41.95857
Theloderma corticale Anura LC Ground-dwelling 29.258228 38.29149 33.77336 42.27282
Theloderma gordoni Anura LC Ground-dwelling 26.683310 38.01293 34.08623 42.68062
Theloderma gordoni Anura LC Ground-dwelling 25.741015 37.88808 33.97345 42.55817
Theloderma gordoni Anura LC Ground-dwelling 28.538736 38.25875 34.33047 43.00476
Theloderma leporosum Anura LC Arboreal 28.226648 38.06889 33.55447 42.00285
Theloderma leporosum Anura LC Arboreal 27.535734 37.97539 33.40782 41.84831
Theloderma leporosum Anura LC Arboreal 29.632116 38.25908 33.81890 42.31991
Theloderma horridum Anura LC Arboreal 27.845755 38.02211 33.73430 42.11922
Theloderma horridum Anura LC Arboreal 27.209342 37.93642 33.60399 41.95495
Theloderma horridum Anura LC Arboreal 29.180008 38.20175 33.93166 42.41519
Theloderma laeve Anura LC Arboreal 28.085660 37.99932 33.79761 42.06545
Theloderma laeve Anura LC Arboreal 27.118880 37.87174 33.70661 41.92597
Theloderma laeve Anura LC Arboreal 29.869118 38.23467 33.87063 42.32878
Theloderma lateriticum Anura LC Arboreal 26.494364 37.76310 33.72598 41.94701
Theloderma lateriticum Anura LC Arboreal 25.424342 37.62076 33.63572 41.83832
Theloderma lateriticum Anura LC Arboreal 28.393173 38.01568 34.05010 42.32085
Theloderma licin Anura LC Arboreal 27.928559 38.01558 33.48714 42.42548
Theloderma licin Anura LC Arboreal 27.266511 37.92655 33.15659 42.11090
Theloderma licin Anura LC Arboreal 29.350478 38.20680 33.73981 42.68681
Theloderma moloch Anura LC Arboreal 18.060324 36.72451 32.67601 40.93660
Theloderma moloch Anura LC Arboreal 16.736093 36.54686 32.20816 40.45729
Theloderma moloch Anura LC Arboreal 20.208336 37.01267 32.71523 40.89888
Theloderma nagalandense Anura DD Arboreal 25.168744 37.55519 33.46962 41.74740
Theloderma nagalandense Anura DD Arboreal 24.059773 37.40765 33.52913 41.72933
Theloderma nagalandense Anura DD Arboreal 27.014796 37.80078 33.63628 42.02892
Theloderma nebulosum Anura EN Arboreal 27.862376 37.79804 33.76400 42.47339
Theloderma nebulosum Anura EN Arboreal 26.877827 37.66599 33.31487 42.03384
Theloderma nebulosum Anura EN Arboreal 29.653583 38.03829 33.88605 42.64172
Theloderma truongsonense Anura LC Stream-dwelling 27.984193 37.46133 33.25220 41.67821
Theloderma truongsonense Anura LC Stream-dwelling 27.061526 37.33679 33.19023 41.61930
Theloderma truongsonense Anura LC Stream-dwelling 29.721696 37.69585 33.22210 41.67071
Theloderma phrynoderma Anura LC Arboreal 27.677413 37.98706 33.46691 41.84355
Theloderma phrynoderma Anura LC Arboreal 26.814906 37.87140 33.31458 41.69076
Theloderma phrynoderma Anura LC Arboreal 29.397478 38.21771 33.67309 42.08375
Theloderma ryabovi Anura EN Arboreal 27.381646 38.00208 34.15540 42.16697
Theloderma ryabovi Anura EN Arboreal 26.478123 37.87957 34.06167 42.06363
Theloderma ryabovi Anura EN Arboreal 29.024164 38.22479 34.33931 42.49529
Theloderma stellatum Anura LC Arboreal 28.563425 37.97527 34.02209 42.53071
Theloderma stellatum Anura LC Arboreal 27.647166 37.85270 33.89254 42.34821
Theloderma stellatum Anura LC Arboreal 30.321837 38.21051 34.14180 42.82839
Liuixalus hainanus Anura VU Arboreal 27.854635 38.27627 33.26873 42.69065
Liuixalus hainanus Anura VU Arboreal 27.235597 38.19396 33.15745 42.53313
Liuixalus hainanus Anura VU Arboreal 28.998611 38.42838 33.30195 42.75263
Liuixalus ocellatus Anura VU Arboreal 27.983220 38.35160 34.07831 42.77490
Liuixalus ocellatus Anura VU Arboreal 27.369547 38.26890 33.99589 42.65702
Liuixalus ocellatus Anura VU Arboreal 29.121736 38.50503 34.15062 42.84999
Liuixalus romeri Anura EN Arboreal 27.409068 38.17672 33.50849 42.46453
Liuixalus romeri Anura EN Arboreal 26.657677 38.07775 33.41795 42.39792
Liuixalus romeri Anura EN Arboreal 28.852586 38.36687 33.50383 42.54761
Boophis albilabris Anura LC Arboreal 25.896662 37.53089 32.73897 43.00575
Boophis albilabris Anura LC Arboreal 24.912283 37.39912 32.68486 42.90788
Boophis albilabris Anura LC Arboreal 27.469572 37.74144 32.60429 42.92267
Boophis occidentalis Anura LC Stream-dwelling 26.388558 37.13187 31.93870 41.86599
Boophis occidentalis Anura LC Stream-dwelling 25.533891 37.01977 31.84196 41.76115
Boophis occidentalis Anura LC Stream-dwelling 27.923201 37.33315 32.05376 41.96504
Boophis albipunctatus Anura LC Stream-dwelling 25.475841 37.09853 32.15509 42.15201
Boophis albipunctatus Anura LC Stream-dwelling 24.546273 36.97536 32.08914 42.06554
Boophis albipunctatus Anura LC Stream-dwelling 26.998319 37.30025 32.64801 42.63317
Boophis tampoka Anura LC Arboreal 27.263183 37.80377 32.90928 42.87617
Boophis tampoka Anura LC Arboreal 26.467215 37.69758 32.84767 42.75820
Boophis tampoka Anura LC Arboreal 28.839590 38.01408 33.11404 43.10981
Boophis jaegeri Anura EN Arboreal 27.017361 37.81726 32.29890 42.56852
Boophis jaegeri Anura EN Arboreal 26.114116 37.69536 32.18542 42.43567
Boophis jaegeri Anura EN Arboreal 28.461743 38.01219 32.76564 43.09947
Boophis anjanaharibeensis Anura EN Arboreal 26.619944 37.80642 32.30738 42.33410
Boophis anjanaharibeensis Anura EN Arboreal 25.452459 37.64763 32.12779 42.10695
Boophis anjanaharibeensis Anura EN Arboreal 28.354195 38.04229 32.45175 42.56059
Boophis septentrionalis Anura LC Stream-dwelling 26.468223 37.27540 32.10439 42.36239
Boophis septentrionalis Anura LC Stream-dwelling 25.459427 37.13853 31.82382 42.03540
Boophis septentrionalis Anura LC Stream-dwelling 28.070801 37.49284 32.11924 42.43851
Boophis englaenderi Anura VU Stream-dwelling 26.528930 37.28305 32.69083 42.39153
Boophis englaenderi Anura VU Stream-dwelling 25.419726 37.13115 32.53044 42.24104
Boophis englaenderi Anura VU Stream-dwelling 28.243385 37.51784 32.87909 42.66026
Boophis ankaratra Anura LC Stream-dwelling 25.497870 37.10752 31.82963 41.79182
Boophis ankaratra Anura LC Stream-dwelling 24.577429 36.98367 31.68080 41.61120
Boophis ankaratra Anura LC Stream-dwelling 27.095682 37.32252 32.09145 42.13699
Boophis schuboeae Anura EN Stream-dwelling 25.602585 37.16029 32.57684 42.64765
Boophis schuboeae Anura EN Stream-dwelling 24.578700 37.01971 32.45557 42.50933
Boophis schuboeae Anura EN Stream-dwelling 27.455263 37.41465 32.79450 42.93299
Boophis andreonei Anura VU Arboreal 26.546214 37.65361 33.08352 42.72634
Boophis andreonei Anura VU Arboreal 25.367540 37.49556 32.99896 42.59175
Boophis andreonei Anura VU Arboreal 28.327551 37.89249 33.09221 42.76088
Boophis sibilans Anura LC Stream-dwelling 25.867244 37.14474 32.32355 41.97075
Boophis sibilans Anura LC Stream-dwelling 24.870294 37.01180 32.15622 41.84244
Boophis sibilans Anura LC Stream-dwelling 27.466336 37.35797 32.57506 42.37900
Boophis blommersae Anura VU Arboreal 26.391357 37.68413 32.66649 42.92664
Boophis blommersae Anura VU Arboreal 25.436319 37.55486 32.61911 42.89690
Boophis blommersae Anura VU Arboreal 28.033766 37.90644 32.92421 43.20085
Boophis andohahela Anura VU Arboreal 25.774919 37.57267 32.16849 42.26323
Boophis andohahela Anura VU Arboreal 24.871122 37.45508 31.97806 42.07179
Boophis andohahela Anura VU Arboreal 27.311404 37.77257 32.41799 42.50678
Boophis elenae Anura NT Arboreal 25.151522 37.51028 32.67133 42.41123
Boophis elenae Anura NT Arboreal 24.190649 37.38043 32.56994 42.23312
Boophis elenae Anura NT Arboreal 26.805723 37.73383 33.12614 42.87530
Boophis axelmeyeri Anura LC Stream-dwelling 26.474601 37.23470 32.13629 42.18549
Boophis axelmeyeri Anura LC Stream-dwelling 25.400486 37.08845 32.06590 42.11149
Boophis axelmeyeri Anura LC Stream-dwelling 28.135561 37.46085 32.14518 42.20186
Boophis burgeri Anura DD Arboreal 24.729470 37.44937 32.43800 43.00439
Boophis burgeri Anura DD Arboreal 23.657799 37.30421 32.32946 42.87567
Boophis burgeri Anura DD Arboreal 26.293435 37.66122 32.84529 43.36511
Boophis reticulatus Anura LC Stream-dwelling 25.851323 37.13679 32.04609 42.00495
Boophis reticulatus Anura LC Stream-dwelling 24.882914 37.00656 32.00627 41.98486
Boophis reticulatus Anura LC Stream-dwelling 27.402921 37.34546 32.31692 42.26414
Boophis rufioculis Anura NT Stream-dwelling 25.072747 36.98123 31.77387 42.21096
Boophis rufioculis Anura NT Stream-dwelling 24.148189 36.85702 31.66764 42.05803
Boophis rufioculis Anura NT Stream-dwelling 26.550602 37.17978 31.29853 41.75145
Boophis boehmei Anura EN Stream-dwelling 25.435229 37.08109 32.12298 41.90057
Boophis boehmei Anura EN Stream-dwelling 24.536662 36.96098 31.99661 41.73111
Boophis boehmei Anura EN Stream-dwelling 26.941863 37.28247 32.32688 42.22679
Boophis quasiboehmei Anura NT Stream-dwelling 25.774919 37.11444 32.14745 41.78054
Boophis quasiboehmei Anura NT Stream-dwelling 24.871122 36.99254 32.03810 41.65398
Boophis quasiboehmei Anura NT Stream-dwelling 27.311404 37.32166 32.33334 42.03685
Boophis popi Anura VU Stream-dwelling 25.566154 37.08416 31.73561 41.52627
Boophis popi Anura VU Stream-dwelling 24.592758 36.95199 32.25617 41.99635
Boophis popi Anura VU Stream-dwelling 27.269300 37.31541 31.94526 41.72268
Boophis fayi Anura VU Arboreal 26.497739 37.69657 33.01433 43.19556
Boophis fayi Anura VU Arboreal 25.382162 37.54406 32.87230 42.99709
Boophis fayi Anura VU Arboreal 28.185205 37.92727 33.26649 43.43529
Boophis brachychir Anura VU Stream-dwelling 26.513683 37.24105 32.57190 42.57119
Boophis brachychir Anura VU Stream-dwelling 25.554706 37.11432 32.58287 42.60829
Boophis brachychir Anura VU Stream-dwelling 28.075686 37.44746 32.79576 42.83481
Boophis entingae Anura LC Stream-dwelling 26.130041 37.23996 31.83970 42.10123
Boophis entingae Anura LC Stream-dwelling 25.162696 37.11078 32.04639 42.25499
Boophis entingae Anura LC Stream-dwelling 27.702238 37.44993 32.23201 42.48648
Boophis goudotii Anura LC Arboreal 25.817713 37.60432 32.14688 42.50954
Boophis goudotii Anura LC Arboreal 24.863335 37.47541 32.06700 42.38803
Boophis goudotii Anura LC Arboreal 27.380452 37.81539 32.28194 42.70851
Boophis obscurus Anura NT Arboreal 25.830781 37.53760 32.06757 42.31941
Boophis obscurus Anura NT Arboreal 24.867818 37.40956 31.94122 42.03506
Boophis obscurus Anura NT Arboreal 27.526775 37.76313 32.72079 43.13390
Boophis luciae Anura LC Stream-dwelling 25.192832 37.07748 32.36197 42.48220
Boophis luciae Anura LC Stream-dwelling 24.267116 36.95390 32.02811 42.07264
Boophis luciae Anura LC Stream-dwelling 26.725205 37.28205 32.53980 42.67771
Boophis luteus Anura LC Stream-dwelling 25.650597 37.03454 32.36414 42.18654
Boophis luteus Anura LC Stream-dwelling 24.714066 36.90927 32.17646 42.00706
Boophis luteus Anura LC Stream-dwelling 27.179914 37.23909 32.54273 42.47904
Boophis madagascariensis Anura LC Arboreal 25.784129 37.55096 32.79190 42.78354
Boophis madagascariensis Anura LC Arboreal 24.832566 37.42322 32.87421 42.77142
Boophis madagascariensis Anura LC Arboreal 27.331390 37.75868 33.02806 43.01659
Boophis roseipalmatus Anura LC Stream-dwelling 26.514231 37.23135 31.98143 41.95188
Boophis roseipalmatus Anura LC Stream-dwelling 25.570045 37.10174 31.78217 41.74934
Boophis roseipalmatus Anura LC Stream-dwelling 28.013291 37.43712 31.89053 41.79234
Boophis liami Anura CR Stream-dwelling 24.729470 37.07403 31.91840 41.65800
Boophis liami Anura CR Stream-dwelling 23.657799 36.93156 31.84713 41.52525
Boophis liami Anura CR Stream-dwelling 26.293435 37.28196 32.21942 42.06156
Boophis sambirano Anura EN Stream-dwelling 26.375246 37.25490 32.80385 42.32409
Boophis sambirano Anura EN Stream-dwelling 25.218471 37.09870 32.74380 42.19046
Boophis sambirano Anura EN Stream-dwelling 28.241907 37.50697 33.00868 42.54897
Boophis mandraka Anura DD Stream-dwelling 25.675466 37.18665 32.35612 42.17199
Boophis mandraka Anura DD Stream-dwelling 24.907261 37.08516 31.87468 41.65914
Boophis mandraka Anura DD Stream-dwelling 27.038275 37.36671 32.44108 42.27683
Boophis andrangoloaka Anura EN Arboreal 25.675466 37.51886 32.02718 41.86567
Boophis andrangoloaka Anura EN Arboreal 24.907261 37.41562 31.92868 41.75623
Boophis andrangoloaka Anura EN Arboreal 27.038275 37.70200 32.18781 42.08330
Boophis rhodoscelis Anura EN Arboreal 25.277369 37.45230 32.78361 42.36753
Boophis rhodoscelis Anura EN Arboreal 24.368665 37.33140 32.57057 42.17828
Boophis rhodoscelis Anura EN Arboreal 26.813621 37.65670 33.01099 42.58232
Boophis laurenti Anura EN Stream-dwelling 26.085788 37.24624 32.40793 42.16077
Boophis laurenti Anura EN Stream-dwelling 25.201041 37.12747 32.16575 41.89051
Boophis laurenti Anura EN Stream-dwelling 27.693333 37.46206 32.64138 42.43136
Boophis lilianae Anura DD Stream-dwelling 25.602585 37.07790 32.20187 41.76083
Boophis lilianae Anura DD Stream-dwelling 24.578700 36.94212 32.02747 41.60217
Boophis lilianae Anura DD Stream-dwelling 27.455263 37.32358 32.30624 41.97584
Boophis arcanus Anura EN Arboreal 25.225466 37.62410 32.61524 42.78213
Boophis arcanus Anura EN Arboreal 24.377363 37.50879 32.45901 42.67755
Boophis arcanus Anura EN Arboreal 26.827794 37.84194 32.75291 43.07769
Boophis feonnyala Anura EN Arboreal 24.767754 37.48583 32.50703 42.60073
Boophis feonnyala Anura EN Arboreal 23.933069 37.37441 32.33011 42.43665
Boophis feonnyala Anura EN Arboreal 26.123086 37.66674 32.67996 42.71574
Boophis haematopus Anura EN Arboreal 25.470711 37.65068 32.72194 42.56048
Boophis haematopus Anura EN Arboreal 24.638202 37.53913 32.52251 42.34891
Boophis haematopus Anura EN Arboreal 26.815810 37.83090 32.84059 42.71151
Boophis pyrrhus Anura LC Stream-dwelling 25.423294 37.14813 31.95346 42.25013
Boophis pyrrhus Anura LC Stream-dwelling 24.462497 37.02311 31.79944 42.09010
Boophis pyrrhus Anura LC Stream-dwelling 26.954930 37.34742 31.76438 42.14725
Boophis miniatus Anura VU Stream-dwelling 25.774919 37.17185 31.75498 41.76051
Boophis miniatus Anura VU Stream-dwelling 24.871122 37.05188 31.67067 41.68275
Boophis miniatus Anura VU Stream-dwelling 27.311404 37.37582 31.88516 41.94937
Boophis baetkei Anura CR Arboreal 26.423580 37.70112 32.84776 42.64785
Boophis baetkei Anura CR Arboreal 25.872015 37.62736 32.79400 42.59733
Boophis baetkei Anura CR Arboreal 27.617485 37.86079 32.96414 42.80979
Boophis ulftunni Anura VU Stream-dwelling 26.479599 37.29638 32.43488 42.29598
Boophis ulftunni Anura VU Stream-dwelling 25.415257 37.15578 32.23908 42.15600
Boophis ulftunni Anura VU Stream-dwelling 28.128079 37.51413 32.51640 42.49423
Boophis majori Anura VU Stream-dwelling 25.798160 37.18592 32.59796 41.96368
Boophis majori Anura VU Stream-dwelling 24.840228 37.05599 32.35249 41.73042
Boophis majori Anura VU Stream-dwelling 27.496485 37.41628 32.85188 42.17598
Boophis narinsi Anura EN Stream-dwelling 25.602585 37.15722 32.28852 41.77908
Boophis narinsi Anura EN Stream-dwelling 24.578700 37.01882 32.15964 41.65154
Boophis narinsi Anura EN Stream-dwelling 27.455263 37.40765 32.62055 42.13987
Boophis picturatus Anura LC Stream-dwelling 25.381360 37.13793 32.80545 42.35570
Boophis picturatus Anura LC Stream-dwelling 24.458523 37.01227 32.37150 41.92179
Boophis picturatus Anura LC Stream-dwelling 26.934492 37.34940 32.81214 42.33681
Boophis microtympanum Anura LC Stream-dwelling 25.649628 37.09919 31.96233 41.63962
Boophis microtympanum Anura LC Stream-dwelling 24.725974 36.97454 31.94469 41.55105
Boophis microtympanum Anura LC Stream-dwelling 27.274397 37.31845 32.16122 41.84687
Boophis williamsi Anura CR Stream-dwelling 24.836345 36.99984 32.37168 41.71653
Boophis williamsi Anura CR Stream-dwelling 23.792153 36.85964 32.39489 41.64490
Boophis williamsi Anura CR Stream-dwelling 26.512837 37.22493 32.39234 41.84147
Boophis marojezensis Anura LC Stream-dwelling 25.769134 37.20496 31.77506 41.51928
Boophis marojezensis Anura LC Stream-dwelling 24.738928 37.06744 31.67712 41.39488
Boophis marojezensis Anura LC Stream-dwelling 27.392805 37.42171 31.85125 41.67859
Boophis vittatus Anura VU Stream-dwelling 26.553610 37.23208 32.25186 42.26556
Boophis vittatus Anura VU Stream-dwelling 25.434453 37.08536 32.10718 42.07975
Boophis vittatus Anura VU Stream-dwelling 28.279144 37.45831 32.43874 42.53923
Boophis bottae Anura LC Stream-dwelling 25.378486 37.15424 32.06673 42.12056
Boophis bottae Anura LC Stream-dwelling 24.441033 37.02976 31.81577 41.89411
Boophis bottae Anura LC Stream-dwelling 26.892581 37.35529 32.30233 42.34128
Boophis erythrodactylus Anura LC Arboreal 25.309137 37.56597 32.71440 42.13060
Boophis erythrodactylus Anura LC Arboreal 24.373551 37.43875 32.59027 42.00813
Boophis erythrodactylus Anura LC Arboreal 26.906299 37.78316 32.95639 42.37178
Boophis rappiodes Anura LC Stream-dwelling 25.415210 37.07592 32.57796 42.05280
Boophis rappiodes Anura LC Stream-dwelling 24.505779 36.95421 32.23847 41.71967
Boophis rappiodes Anura LC Stream-dwelling 26.933828 37.27917 32.74143 42.21185
Boophis tasymena Anura LC Stream-dwelling 25.553660 37.08708 32.33018 42.08152
Boophis tasymena Anura LC Stream-dwelling 24.623028 36.96356 32.23504 42.04331
Boophis tasymena Anura LC Stream-dwelling 27.068176 37.28810 32.52572 42.27718
Boophis viridis Anura LC Stream-dwelling 25.746618 37.09073 32.58361 41.82450
Boophis viridis Anura LC Stream-dwelling 24.784368 36.96288 32.24296 41.47712
Boophis viridis Anura LC Stream-dwelling 27.307988 37.29817 32.81659 42.05089
Boophis periegetes Anura NT Stream-dwelling 25.774919 37.15198 31.64908 41.70410
Boophis periegetes Anura NT Stream-dwelling 24.871122 37.03001 31.53676 41.60688
Boophis periegetes Anura NT Stream-dwelling 27.311404 37.35932 31.85698 41.94148
Boophis solomaso Anura EN Arboreal 25.303936 37.55287 32.97880 43.41253
Boophis solomaso Anura EN Arboreal 24.287723 37.41438 32.69641 43.06802
Boophis solomaso Anura EN Arboreal 26.785470 37.75478 32.87330 43.42343
Boophis haingana Anura EN Stream-dwelling 25.690591 37.19315 32.10333 41.70748
Boophis haingana Anura EN Stream-dwelling 24.820352 37.07646 32.01747 41.55910
Boophis haingana Anura EN Stream-dwelling 27.041343 37.37426 32.36137 42.06120
Boophis miadana Anura EN Stream-dwelling 25.690591 37.07528 32.34588 41.83808
Boophis miadana Anura EN Stream-dwelling 24.820352 36.96158 32.21468 41.77389
Boophis miadana Anura EN Stream-dwelling 27.041343 37.25176 32.48447 42.00211
Boophis piperatus Anura EN Arboreal 25.602585 37.57935 32.86865 42.53723
Boophis piperatus Anura EN Arboreal 24.578700 37.44331 32.84509 42.48043
Boophis piperatus Anura EN Arboreal 27.455263 37.82552 32.95520 42.68534
Boophis sandrae Anura EN Stream-dwelling 25.602585 37.16952 32.06389 41.92785
Boophis sandrae Anura EN Stream-dwelling 24.578700 37.03587 31.93334 41.77765
Boophis sandrae Anura EN Stream-dwelling 27.455263 37.41135 32.21538 42.09199
Boophis spinophis Anura VU Arboreal 25.639025 37.58516 32.47825 42.31198
Boophis spinophis Anura VU Arboreal 24.742981 37.46666 32.62605 42.41982
Boophis spinophis Anura VU Arboreal 27.246769 37.79780 32.37476 42.26350
Boophis tsilomaro Anura CR Stream-dwelling 26.714144 37.34694 32.94492 42.95019
Boophis tsilomaro Anura CR Stream-dwelling 26.022414 37.25342 32.80466 42.81452
Boophis tsilomaro Anura CR Stream-dwelling 27.874484 37.50383 33.02694 43.10563
Boophis opisthodon Anura LC Arboreal 25.647294 37.56131 32.97425 42.39467
Boophis opisthodon Anura LC Arboreal 24.769106 37.44427 32.83730 42.23854
Boophis opisthodon Anura LC Arboreal 27.109980 37.75625 33.05639 42.56200
Boophis calcaratus Anura LC Stream-dwelling 25.398262 37.06290 31.94972 41.79363
Boophis calcaratus Anura LC Stream-dwelling 24.495032 36.94177 31.79335 41.60973
Boophis calcaratus Anura LC Stream-dwelling 26.886084 37.26243 32.11500 41.99361
Boophis guibei Anura LC Arboreal 25.531364 37.55082 32.77024 42.65432
Boophis guibei Anura LC Arboreal 24.529072 37.41704 32.40281 42.25699
Boophis guibei Anura LC Arboreal 27.157874 37.76792 32.94088 42.87181
Boophis lichenoides Anura LC Arboreal 25.746394 37.59447 32.53490 42.55691
Boophis lichenoides Anura LC Arboreal 24.788256 37.46495 32.54739 42.54263
Boophis lichenoides Anura LC Arboreal 27.279910 37.80175 32.71949 42.72771
Boophis doulioti Anura LC Arboreal 26.270344 37.64306 32.18551 42.05101
Boophis doulioti Anura LC Arboreal 25.433396 37.53102 32.08716 41.93088
Boophis doulioti Anura LC Arboreal 27.787153 37.84612 32.33850 42.29549
Boophis tephraeomystax Anura LC Arboreal 25.990444 37.54994 32.49033 42.47854
Boophis tephraeomystax Anura LC Arboreal 25.048745 37.42637 32.44325 42.42346
Boophis tephraeomystax Anura LC Arboreal 27.521670 37.75087 32.75475 42.73048
Boophis xerophilus Anura LC Arboreal 26.149051 37.64399 32.58838 42.57694
Boophis xerophilus Anura LC Arboreal 25.269872 37.52646 32.54280 42.53193
Boophis xerophilus Anura LC Arboreal 27.693770 37.85048 32.73341 42.76687
Boophis idae Anura LC Arboreal 25.361452 37.53684 32.71662 42.50443
Boophis idae Anura LC Arboreal 24.472376 37.41576 32.47072 42.24222
Boophis idae Anura LC Arboreal 26.881960 37.74392 32.76809 42.57621
Boophis pauliani Anura LC Arboreal 25.395618 37.60060 32.42007 42.44471
Boophis pauliani Anura LC Arboreal 24.486340 37.47697 32.31143 42.31253
Boophis pauliani Anura LC Arboreal 26.914390 37.80711 32.72040 42.80835
Blommersia angolafa Anura LC Arboreal 26.268414 37.68389 32.67459 42.81592
Blommersia angolafa Anura LC Arboreal 25.249860 37.54677 32.61898 42.70963
Blommersia angolafa Anura LC Arboreal 27.841554 37.89568 32.82303 43.09442
Blommersia grandisonae Anura LC Arboreal 25.769712 37.69418 33.04804 43.17538
Blommersia grandisonae Anura LC Arboreal 24.815441 37.56501 32.65523 42.69924
Blommersia grandisonae Anura LC Arboreal 27.304308 37.90191 33.20209 43.36638
Blommersia kely Anura LC Ground-dwelling 25.310096 37.82161 32.75174 43.22189
Blommersia kely Anura LC Ground-dwelling 24.359848 37.69054 32.64939 43.07781
Blommersia kely Anura LC Ground-dwelling 26.898375 38.04069 32.60822 43.09720
Blommersia sarotra Anura LC Ground-dwelling 24.997491 37.71106 32.30406 42.47468
Blommersia sarotra Anura LC Ground-dwelling 24.092207 37.58965 32.26184 42.36165
Blommersia sarotra Anura LC Ground-dwelling 26.488832 37.91105 32.31525 42.53032
Blommersia blommersae Anura LC Arboreal 25.026778 37.47795 32.18899 42.39265
Blommersia blommersae Anura LC Arboreal 24.091698 37.35104 32.29779 42.54976
Blommersia blommersae Anura LC Arboreal 26.580229 37.68879 32.42701 42.63330
Blommersia dejongi Anura LC Ground-dwelling 26.307383 37.79440 32.71902 42.93081
Blommersia dejongi Anura LC Ground-dwelling 25.276805 37.65641 32.54354 42.73412
Blommersia dejongi Anura LC Ground-dwelling 27.869396 38.00353 32.81284 43.13988
Blommersia galani Anura LC Ground-dwelling 26.277662 37.78581 31.99744 42.12815
Blommersia galani Anura LC Ground-dwelling 25.175391 37.63677 31.87278 41.98503
Blommersia galani Anura LC Ground-dwelling 27.933403 38.00970 32.13286 42.33551
Blommersia domerguei Anura LC Ground-dwelling 25.467322 37.70071 31.87830 42.12651
Blommersia domerguei Anura LC Ground-dwelling 24.555209 37.57684 31.73983 42.01190
Blommersia domerguei Anura LC Ground-dwelling 27.045271 37.91499 32.12403 42.37040
Blommersia variabilis Anura LC Arboreal 26.937894 37.75335 32.90493 43.14433
Blommersia variabilis Anura LC Arboreal 25.795704 37.59801 32.61140 42.82659
Blommersia variabilis Anura LC Arboreal 28.688809 37.99149 33.40655 43.75916
Blommersia wittei Anura LC Arboreal 26.605905 37.54357 32.37502 42.81661
Blommersia wittei Anura LC Arboreal 25.751405 37.43134 32.32563 42.71394
Blommersia wittei Anura LC Arboreal 28.102519 37.74013 32.48796 43.03690
Guibemantis albolineatus Anura LC Arboreal 25.549068 37.51325 32.45274 42.18680
Guibemantis albolineatus Anura LC Arboreal 24.634984 37.39227 32.16510 41.89736
Guibemantis albolineatus Anura LC Arboreal 27.011937 37.70687 32.79992 42.53996
Guibemantis bicalcaratus Anura LC Arboreal 25.787076 37.56890 32.35375 41.95191
Guibemantis bicalcaratus Anura LC Arboreal 24.852353 37.44332 32.66294 42.19489
Guibemantis bicalcaratus Anura LC Arboreal 27.308532 37.77330 33.39680 43.00865
Guibemantis methueni Anura LC Arboreal 25.561986 37.54566 32.60348 42.40316
Guibemantis methueni Anura LC Arboreal 24.616713 37.41854 32.55287 42.26516
Guibemantis methueni Anura LC Arboreal 27.056534 37.74664 33.00990 42.85907
Guibemantis annulatus Anura EN Arboreal 25.470711 37.52056 32.86732 42.39388
Guibemantis annulatus Anura EN Arboreal 24.638202 37.41006 32.85034 42.36799
Guibemantis annulatus Anura EN Arboreal 26.815810 37.69910 33.00992 42.60427
Guibemantis flavobrunneus Anura LC Arboreal 25.771201 37.52925 32.63564 42.44730
Guibemantis flavobrunneus Anura LC Arboreal 24.800593 37.39810 32.41019 42.18623
Guibemantis flavobrunneus Anura LC Arboreal 27.342755 37.74159 32.83148 42.69925
Guibemantis pulcher Anura LC Arboreal 25.784281 37.50956 32.76127 42.59453
Guibemantis pulcher Anura LC Arboreal 24.823025 37.38169 32.59330 42.44178
Guibemantis pulcher Anura LC Arboreal 27.328540 37.71498 32.92641 42.76452
Guibemantis tasifotsy Anura VU Arboreal 25.979190 37.60393 32.69919 42.38086
Guibemantis tasifotsy Anura VU Arboreal 25.066433 37.48030 32.61154 42.29354
Guibemantis tasifotsy Anura VU Arboreal 27.619601 37.82614 32.85710 42.69542
Guibemantis punctatus Anura CR Arboreal 25.675466 37.62847 32.84415 42.43209
Guibemantis punctatus Anura CR Arboreal 24.907261 37.52347 32.73602 42.32385
Guibemantis punctatus Anura CR Arboreal 27.038275 37.81476 33.29103 42.86842
Guibemantis wattersoni Anura EN Arboreal 25.470711 37.55743 32.72159 42.68610
Guibemantis wattersoni Anura EN Arboreal 24.638202 37.44472 32.53166 42.49556
Guibemantis wattersoni Anura EN Arboreal 26.815810 37.73954 32.72482 42.74961
Guibemantis liber Anura LC Arboreal 25.892538 37.55015 32.76908 42.65683
Guibemantis liber Anura LC Arboreal 24.946307 37.42495 32.46064 42.32459
Guibemantis liber Anura LC Arboreal 27.444567 37.75551 32.95525 42.91000
Guibemantis timidus Anura LC Arboreal 25.538229 37.47934 32.65630 42.26325
Guibemantis timidus Anura LC Arboreal 24.613275 37.35764 32.55618 42.13475
Guibemantis timidus Anura LC Arboreal 27.049968 37.67824 32.67388 42.35329
Guibemantis depressiceps Anura LC Arboreal 25.746765 37.50460 32.42598 42.37501
Guibemantis depressiceps Anura LC Arboreal 24.801870 37.37896 32.31514 42.20463
Guibemantis depressiceps Anura LC Arboreal 27.292074 37.71009 32.84840 42.89722
Guibemantis kathrinae Anura VU Arboreal 25.515732 37.60776 32.58937 42.77860
Guibemantis kathrinae Anura VU Arboreal 24.383507 37.45269 32.47695 42.60285
Guibemantis kathrinae Anura VU Arboreal 27.156508 37.83249 32.50626 42.80081
Guibemantis tornieri Anura LC Arboreal 25.471019 37.55330 32.56151 42.67812
Guibemantis tornieri Anura LC Arboreal 24.552532 37.42919 32.61524 42.74077
Guibemantis tornieri Anura LC Arboreal 26.983301 37.75765 32.87045 42.96227
Mantella crocea Anura VU Semi-aquatic 25.623238 37.97984 33.08573 43.01629
Mantella crocea Anura VU Semi-aquatic 24.651281 37.85032 32.88509 42.80084
Mantella crocea Anura VU Semi-aquatic 27.120065 38.17932 33.49931 43.49313
Mantella milotympanum Anura CR Ground-dwelling 24.729470 37.60356 33.11680 43.09371
Mantella milotympanum Anura CR Ground-dwelling 23.657799 37.46012 32.98079 42.90269
Mantella milotympanum Anura CR Ground-dwelling 26.293435 37.81288 33.03986 43.06299
Mantella pulchra Anura NT Ground-dwelling 25.820947 37.73516 32.63003 42.66343
Mantella pulchra Anura NT Ground-dwelling 24.758126 37.59371 32.58591 42.58238
Mantella pulchra Anura NT Ground-dwelling 27.415655 37.94739 32.94784 42.99533
Mantella madagascariensis Anura VU Stream-dwelling 25.151522 37.03477 32.04510 41.89655
Mantella madagascariensis Anura VU Stream-dwelling 24.190649 36.90523 32.65876 42.53060
Mantella madagascariensis Anura VU Stream-dwelling 26.805723 37.25779 32.21079 42.10747
Mantella betsileo Anura LC Ground-dwelling 26.321041 37.73236 32.33030 42.33491
Mantella betsileo Anura LC Ground-dwelling 25.487274 37.62102 33.04792 43.01575
Mantella betsileo Anura LC Ground-dwelling 27.834066 37.93440 32.68358 42.73339
Mantella ebenaui Anura LC Ground-dwelling 26.636476 37.79993 32.42568 42.42658
Mantella ebenaui Anura LC Ground-dwelling 25.670327 37.67189 32.21089 42.25925
Mantella ebenaui Anura LC Ground-dwelling 28.189938 38.00580 32.51599 42.62037
Mantella viridis Anura EN Stream-dwelling 26.423580 37.21227 32.33554 42.34356
Mantella viridis Anura EN Stream-dwelling 25.872015 37.13773 32.27909 42.27758
Mantella viridis Anura EN Stream-dwelling 27.617485 37.37362 32.17045 42.20088
Mantella expectata Anura EN Stream-dwelling 26.078978 37.15497 32.19544 42.13383
Mantella expectata Anura EN Stream-dwelling 25.114010 37.02508 31.86164 41.81564
Mantella expectata Anura EN Stream-dwelling 27.601032 37.35984 32.46821 42.44656
Mantella laevigata Anura LC Ground-dwelling 26.190707 37.71308 33.05470 42.75131
Mantella laevigata Anura LC Ground-dwelling 25.140152 37.57256 32.86510 42.50307
Mantella laevigata Anura LC Ground-dwelling 27.785131 37.92635 33.56447 43.32202
Mantella manery Anura VU Ground-dwelling 26.918314 37.82693 32.50547 42.59953
Mantella manery Anura VU Ground-dwelling 25.746346 37.67041 32.35941 42.36427
Mantella manery Anura VU Ground-dwelling 28.625131 38.05488 32.57843 42.77039
Mantella baroni Anura LC Ground-dwelling 25.300021 37.73376 32.88695 42.28532
Mantella baroni Anura LC Ground-dwelling 24.372862 37.60768 32.77462 42.16733
Mantella baroni Anura LC Ground-dwelling 26.887229 37.94959 33.16151 42.58217
Mantella haraldmeieri Anura EN Stream-dwelling 25.770504 37.15881 31.86987 41.67576
Mantella haraldmeieri Anura EN Stream-dwelling 24.923021 37.04442 31.78671 41.58972
Mantella haraldmeieri Anura EN Stream-dwelling 27.165830 37.34715 32.00678 41.81742
Mantella nigricans Anura LC Stream-dwelling 26.391343 37.20625 32.48914 42.20003
Mantella nigricans Anura LC Stream-dwelling 25.324579 37.06400 32.21469 41.93719
Mantella nigricans Anura LC Stream-dwelling 28.032039 37.42503 32.54301 42.23512
Mantella cowanii Anura EN Stream-dwelling 25.304756 37.11969 32.74949 42.51528
Mantella cowanii Anura EN Stream-dwelling 24.297784 36.98466 32.58802 42.33257
Mantella cowanii Anura EN Stream-dwelling 26.985265 37.34504 32.88303 42.73062
Mantella bernhardi Anura VU Ground-dwelling 25.787368 37.73603 32.90508 42.59703
Mantella bernhardi Anura VU Ground-dwelling 24.943500 37.62321 32.83876 42.53410
Mantella bernhardi Anura VU Ground-dwelling 27.336983 37.94319 32.98207 42.76068
Wakea madinika Anura DD Ground-dwelling 27.320578 37.92075 32.76386 42.92622
Wakea madinika Anura DD Ground-dwelling 26.205818 37.77004 32.65015 42.76074
Wakea madinika Anura DD Ground-dwelling 29.049002 38.15443 32.93463 43.23708
Boehmantis microtympanum Anura VU Stream-dwelling 25.578699 37.07394 31.79077 41.82505
Boehmantis microtympanum Anura VU Stream-dwelling 24.709513 36.95531 31.99438 42.01816
Boehmantis microtympanum Anura VU Stream-dwelling 26.984864 37.26586 31.92753 41.99236
Gephyromantis ambohitra Anura VU Stream-dwelling 26.576611 37.15897 32.13102 42.40159
Gephyromantis ambohitra Anura VU Stream-dwelling 25.558240 37.02066 31.95443 42.24188
Gephyromantis ambohitra Anura VU Stream-dwelling 28.227027 37.38312 32.44387 42.77476
Gephyromantis asper Anura LC Ground-dwelling 25.536614 37.67885 32.21081 42.40901
Gephyromantis asper Anura LC Ground-dwelling 24.560241 37.54698 32.11157 42.27447
Gephyromantis asper Anura LC Ground-dwelling 27.091599 37.88885 32.36886 42.64802
Gephyromantis tahotra Anura VU Stream-dwelling 26.546214 37.29670 31.57114 41.86618
Gephyromantis tahotra Anura VU Stream-dwelling 25.367540 37.13653 31.40327 41.68078
Gephyromantis tahotra Anura VU Stream-dwelling 28.327551 37.53876 31.72946 42.18949
Gephyromantis horridus Anura VU Ground-dwelling 26.391357 37.84619 33.11403 42.82111
Gephyromantis horridus Anura VU Ground-dwelling 25.436319 37.71857 33.05479 42.76429
Gephyromantis horridus Anura VU Ground-dwelling 28.033766 38.06566 33.40333 43.16751
Gephyromantis malagasius Anura LC Arboreal 25.591705 37.53003 32.76316 42.62196
Gephyromantis malagasius Anura LC Arboreal 24.699433 37.40836 32.39083 42.25011
Gephyromantis malagasius Anura LC Arboreal 27.057617 37.72991 32.89912 42.72531
Gephyromantis striatus Anura VU Arboreal 26.173851 37.71472 32.86821 42.88875
Gephyromantis striatus Anura VU Arboreal 25.134716 37.57328 32.65978 42.66466
Gephyromantis striatus Anura VU Arboreal 27.818623 37.93859 33.15217 43.24345
Gephyromantis ventrimaculatus Anura LC Ground-dwelling 25.384175 37.71777 33.14528 43.24127
Gephyromantis ventrimaculatus Anura LC Ground-dwelling 24.486006 37.59688 33.03647 43.05003
Gephyromantis ventrimaculatus Anura LC Ground-dwelling 26.871796 37.91800 33.06382 43.25903
Gephyromantis klemmeri Anura EN Ground-dwelling 26.301993 37.85096 32.87430 42.92652
Gephyromantis klemmeri Anura EN Ground-dwelling 25.109214 37.69055 32.76580 42.83477
Gephyromantis klemmeri Anura EN Ground-dwelling 28.019582 38.08196 32.63248 42.80213
Gephyromantis rivicola Anura VU Stream-dwelling 26.359835 37.18866 32.37276 42.53360
Gephyromantis rivicola Anura VU Stream-dwelling 25.360614 37.05478 32.27369 42.39720
Gephyromantis rivicola Anura VU Stream-dwelling 27.914576 37.39697 32.59797 42.83377
Gephyromantis silvanus Anura VU Stream-dwelling 26.604575 37.27337 32.19651 42.14863
Gephyromantis silvanus Anura VU Stream-dwelling 25.523230 37.12730 32.05510 41.91250
Gephyromantis silvanus Anura VU Stream-dwelling 28.317986 37.50482 32.26552 42.32885
Gephyromantis webbi Anura EN Stream-dwelling 26.604575 37.25107 31.97342 42.28712
Gephyromantis webbi Anura EN Stream-dwelling 25.523230 37.10422 32.03305 42.33755
Gephyromantis webbi Anura EN Stream-dwelling 28.317986 37.48376 32.13310 42.47364
Gephyromantis atsingy Anura EN Arboreal 27.071073 37.80153 32.68959 42.46758
Gephyromantis atsingy Anura EN Arboreal 26.258359 37.69063 32.61083 42.40852
Gephyromantis atsingy Anura EN Arboreal 28.680915 38.02122 32.84561 42.71455
Gephyromantis azzurrae Anura EN Stream-dwelling 25.961269 37.11389 32.60768 42.28013
Gephyromantis azzurrae Anura EN Stream-dwelling 24.978178 36.98459 32.59258 42.27990
Gephyromantis azzurrae Anura EN Stream-dwelling 27.647933 37.33574 32.91448 42.59913
Gephyromantis corvus Anura EN Ground-dwelling 26.218902 37.82508 33.07894 43.32171
Gephyromantis corvus Anura EN Ground-dwelling 25.207850 37.68640 32.80872 43.08571
Gephyromantis corvus Anura EN Ground-dwelling 27.941344 38.06135 33.27973 43.60176
Gephyromantis pseudoasper Anura LC Arboreal 26.496016 37.64552 32.60850 42.53140
Gephyromantis pseudoasper Anura LC Arboreal 25.551648 37.51814 32.51436 42.36827
Gephyromantis pseudoasper Anura LC Arboreal 28.012704 37.85010 32.88485 42.81013
Gephyromantis blanci Anura NT Ground-dwelling 25.690033 37.67811 32.15085 42.38881
Gephyromantis blanci Anura NT Ground-dwelling 24.757640 37.55263 32.00842 42.24308
Gephyromantis blanci Anura NT Ground-dwelling 27.299940 37.89476 32.31831 42.69166
Gephyromantis runewsweeki Anura VU Ground-dwelling 25.602585 37.65210 32.56559 42.56705
Gephyromantis runewsweeki Anura VU Ground-dwelling 24.578700 37.51315 32.58132 42.49420
Gephyromantis runewsweeki Anura VU Ground-dwelling 27.455263 37.90352 33.04913 43.19038
Gephyromantis enki Anura VU Ground-dwelling 25.712116 37.67300 32.55371 42.79107
Gephyromantis enki Anura VU Ground-dwelling 24.752880 37.54297 32.42859 42.60417
Gephyromantis enki Anura VU Ground-dwelling 27.420593 37.90459 32.84621 43.19288
Gephyromantis boulengeri Anura LC Arboreal 25.672015 37.57485 32.59197 42.35014
Gephyromantis boulengeri Anura LC Arboreal 24.715716 37.44741 32.41344 42.20355
Gephyromantis boulengeri Anura LC Arboreal 27.155593 37.77256 32.56384 42.41611
Gephyromantis eiselti Anura EN Arboreal 24.739076 37.42110 31.48156 41.82133
Gephyromantis eiselti Anura EN Arboreal 23.834706 37.29868 32.21835 42.50360
Gephyromantis eiselti Anura EN Arboreal 26.202108 37.61915 31.56235 41.96270
Gephyromantis mafy Anura CR Arboreal 25.150122 37.39954 31.77692 42.26722
Gephyromantis mafy Anura CR Arboreal 24.244361 37.27654 32.22416 42.67712
Gephyromantis mafy Anura CR Arboreal 26.459742 37.57738 31.90911 42.43722
Gephyromantis thelenae Anura EN Arboreal 24.739076 37.35286 32.51297 42.63941
Gephyromantis thelenae Anura EN Arboreal 23.834706 37.23340 32.39662 42.51050
Gephyromantis thelenae Anura EN Arboreal 26.202108 37.54610 32.65808 42.85566
Gephyromantis decaryi Anura NT Arboreal 25.690033 37.50849 32.57310 42.43868
Gephyromantis decaryi Anura NT Arboreal 24.757640 37.38065 32.46860 42.40563
Gephyromantis decaryi Anura NT Arboreal 27.299940 37.72922 32.79051 42.75805
Gephyromantis hintelmannae Anura EN Arboreal 25.225466 37.45236 32.73804 42.70221
Gephyromantis hintelmannae Anura EN Arboreal 24.377363 37.33667 32.54099 42.49849
Gephyromantis hintelmannae Anura EN Arboreal 26.827794 37.67093 32.98528 43.00867
Gephyromantis verrucosus Anura LC Arboreal 26.100375 37.57265 32.32252 42.01248
Gephyromantis verrucosus Anura LC Arboreal 25.199325 37.45084 32.24333 41.92480
Gephyromantis verrucosus Anura LC Arboreal 27.715869 37.79103 32.71238 42.33763
Gephyromantis leucocephalus Anura NT Ground-dwelling 25.578699 37.67044 32.56629 42.95363
Gephyromantis leucocephalus Anura NT Ground-dwelling 24.709513 37.55407 32.49774 42.88045
Gephyromantis leucocephalus Anura NT Ground-dwelling 26.984864 37.85869 32.70006 43.08695
Gephyromantis ranjomavo Anura EN Stream-dwelling 26.301993 37.20493 32.88220 42.43163
Gephyromantis ranjomavo Anura EN Stream-dwelling 25.109214 37.04430 32.14204 41.72102
Gephyromantis ranjomavo Anura EN Stream-dwelling 28.019582 37.43623 32.82105 42.32286
Gephyromantis spiniferus Anura VU Ground-dwelling 25.803641 37.75987 33.22142 43.10057
Gephyromantis spiniferus Anura VU Ground-dwelling 24.919859 37.64167 33.13717 42.99208
Gephyromantis spiniferus Anura VU Ground-dwelling 27.287428 37.95831 33.36286 43.33673
Gephyromantis cornutus Anura VU Stream-dwelling 24.997491 36.85826 31.76670 42.01085
Gephyromantis cornutus Anura VU Stream-dwelling 24.092207 36.73674 31.68465 41.91976
Gephyromantis cornutus Anura VU Stream-dwelling 26.488832 37.05845 31.95125 42.28009
Gephyromantis tschenki Anura LC Arboreal 25.532378 37.47081 32.36336 42.71487
Gephyromantis tschenki Anura LC Arboreal 24.599704 37.34510 32.19688 42.58785
Gephyromantis tschenki Anura LC Arboreal 27.135806 37.68692 32.50113 42.83859
Gephyromantis redimitus Anura LC Arboreal 25.806878 37.49936 32.74600 42.90020
Gephyromantis redimitus Anura LC Arboreal 24.857706 37.37033 32.64712 42.78071
Gephyromantis redimitus Anura LC Arboreal 27.338078 37.70749 32.78244 42.98819
Gephyromantis granulatus Anura LC Ground-dwelling 26.468223 37.80528 33.20454 42.80747
Gephyromantis granulatus Anura LC Ground-dwelling 25.459427 37.66750 33.13258 42.76420
Gephyromantis granulatus Anura LC Ground-dwelling 28.070801 38.02415 33.53275 43.09882
Gephyromantis moseri Anura LC Arboreal 25.922686 37.51431 32.49341 42.53861
Gephyromantis moseri Anura LC Arboreal 24.880724 37.37451 32.29681 42.29516
Gephyromantis moseri Anura LC Arboreal 27.523678 37.72912 32.68452 42.77798
Gephyromantis leucomaculatus Anura LC Ground-dwelling 26.332444 37.71995 32.57910 42.53769
Gephyromantis leucomaculatus Anura LC Ground-dwelling 25.298873 37.57961 32.56967 42.52830
Gephyromantis leucomaculatus Anura LC Ground-dwelling 27.920851 37.93563 32.80177 42.80487
Gephyromantis zavona Anura EN Stream-dwelling 26.627621 37.14107 31.65582 42.17659
Gephyromantis zavona Anura EN Stream-dwelling 25.453649 36.98424 31.44541 41.90509
Gephyromantis zavona Anura EN Stream-dwelling 28.430208 37.38186 31.82801 42.49256
Gephyromantis salegy Anura VU Arboreal 26.479599 37.63793 32.68160 42.64472
Gephyromantis salegy Anura VU Arboreal 25.415257 37.49545 32.45153 42.30812
Gephyromantis salegy Anura VU Arboreal 28.128079 37.85860 32.91240 42.97093
Gephyromantis schilfi Anura VU Arboreal 26.717182 37.60886 32.88795 42.71868
Gephyromantis schilfi Anura VU Arboreal 25.516610 37.44678 32.70840 42.48124
Gephyromantis schilfi Anura VU Arboreal 28.413195 37.83782 33.24957 43.17508
Gephyromantis tandroka Anura VU Stream-dwelling 26.546214 37.14180 31.80319 42.01809
Gephyromantis tandroka Anura VU Stream-dwelling 25.367540 36.98375 31.70263 41.83389
Gephyromantis tandroka Anura VU Stream-dwelling 28.327551 37.38066 32.44887 42.72425
Gephyromantis luteus Anura LC Ground-dwelling 25.766551 37.73869 32.64129 42.54778
Gephyromantis luteus Anura LC Ground-dwelling 24.836615 37.61366 32.51080 42.45223
Gephyromantis luteus Anura LC Ground-dwelling 27.269395 37.94074 32.90310 42.84262
Gephyromantis sculpturatus Anura LC Ground-dwelling 25.378486 37.69941 33.08074 42.56778
Gephyromantis sculpturatus Anura LC Ground-dwelling 24.441033 37.57468 32.93775 42.42027
Gephyromantis sculpturatus Anura LC Ground-dwelling 26.892581 37.90087 33.16946 42.80219
Gephyromantis plicifer Anura LC Arboreal 25.730364 37.49884 32.27819 42.09504
Gephyromantis plicifer Anura LC Arboreal 24.809748 37.37398 32.34333 42.08389
Gephyromantis plicifer Anura LC Arboreal 27.290480 37.71043 32.50580 42.37533
Mantidactylus aerumnalis Anura LC Ground-dwelling 25.503851 37.65397 32.82529 42.53246
Mantidactylus aerumnalis Anura LC Ground-dwelling 24.570940 37.52786 32.90353 42.55894
Mantidactylus aerumnalis Anura LC Ground-dwelling 27.063242 37.86476 33.04970 42.68704
Mantidactylus albofrenatus Anura EN Stream-dwelling 24.739076 36.92703 31.70918 41.51439
Mantidactylus albofrenatus Anura EN Stream-dwelling 23.834706 36.80424 31.56682 41.36175
Mantidactylus albofrenatus Anura EN Stream-dwelling 26.202108 37.12568 32.00824 41.88263
Mantidactylus brevipalmatus Anura LC Stream-dwelling 25.675167 37.03215 32.32160 42.25151
Mantidactylus brevipalmatus Anura LC Stream-dwelling 24.773886 36.91047 32.21672 42.06029
Mantidactylus brevipalmatus Anura LC Stream-dwelling 27.262247 37.24643 32.43207 42.47311
Mantidactylus delormei Anura EN Stream-dwelling 25.924720 37.10461 31.74711 42.02257
Mantidactylus delormei Anura EN Stream-dwelling 24.993594 36.98063 31.90911 42.16736
Mantidactylus delormei Anura EN Stream-dwelling 27.613976 37.32956 31.96628 42.31364
Mantidactylus paidroa Anura EN Stream-dwelling 25.602585 36.97834 32.36618 42.19057
Mantidactylus paidroa Anura EN Stream-dwelling 24.578700 36.84427 32.19460 42.00894
Mantidactylus paidroa Anura EN Stream-dwelling 27.455263 37.22094 32.48343 42.43406
Mantidactylus alutus Anura LC Semi-aquatic 25.536642 37.82942 33.10916 43.05100
Mantidactylus alutus Anura LC Semi-aquatic 24.615810 37.70349 33.06947 42.96239
Mantidactylus alutus Anura LC Semi-aquatic 27.145531 38.04944 33.12844 43.10548
Mantidactylus curtus Anura LC Stream-dwelling 26.106733 37.04758 31.93963 42.28938
Mantidactylus curtus Anura LC Stream-dwelling 25.190726 36.92499 31.73356 42.09307
Mantidactylus curtus Anura LC Stream-dwelling 27.656887 37.25503 32.17863 42.56820
Mantidactylus madecassus Anura EN Stream-dwelling 25.846506 37.12295 32.07909 42.45430
Mantidactylus madecassus Anura EN Stream-dwelling 24.935190 36.99973 31.88550 42.19407
Mantidactylus madecassus Anura EN Stream-dwelling 27.501229 37.34668 32.59204 42.97369
Mantidactylus pauliani Anura CR Stream-dwelling 24.836345 36.96559 32.69395 42.28862
Mantidactylus pauliani Anura CR Stream-dwelling 23.792153 36.82341 32.47831 42.12542
Mantidactylus pauliani Anura CR Stream-dwelling 26.512837 37.19387 32.91883 42.53247
Mantidactylus bellyi Anura LC Stream-dwelling 26.573062 37.10463 32.18254 42.06440
Mantidactylus bellyi Anura LC Stream-dwelling 25.679168 36.98553 32.07611 41.90733
Mantidactylus bellyi Anura LC Stream-dwelling 27.973568 37.29123 32.57247 42.47370
Mantidactylus ulcerosus Anura LC Stream-dwelling 26.296132 37.08281 32.33798 41.93911
Mantidactylus ulcerosus Anura LC Stream-dwelling 25.336037 36.95339 32.26087 41.84494
Mantidactylus ulcerosus Anura LC Stream-dwelling 27.852477 37.29259 32.45004 42.08206
Mantidactylus betsileanus Anura LC Stream-dwelling 26.019188 37.03450 31.99790 42.26596
Mantidactylus betsileanus Anura LC Stream-dwelling 25.111837 36.91299 31.93072 42.15597
Mantidactylus betsileanus Anura LC Stream-dwelling 27.539082 37.23803 32.33062 42.65027
Mantidactylus noralottae Anura DD Arboreal 25.961269 37.55949 32.78382 42.64173
Mantidactylus noralottae Anura DD Arboreal 24.978178 37.42576 32.67355 42.47933
Mantidactylus noralottae Anura DD Arboreal 27.647933 37.78893 33.18303 43.02202
Mantidactylus ambohimitombi Anura DD Stream-dwelling 25.418478 37.09522 32.15801 41.97643
Mantidactylus ambohimitombi Anura DD Stream-dwelling 24.380128 36.95548 32.00623 41.80641
Mantidactylus ambohimitombi Anura DD Stream-dwelling 27.144012 37.32744 32.43234 42.31522
Mantidactylus ambreensis Anura LC Stream-dwelling 26.477690 37.19299 31.84505 41.70993
Mantidactylus ambreensis Anura LC Stream-dwelling 25.630003 37.07851 32.10080 41.86864
Mantidactylus ambreensis Anura LC Stream-dwelling 27.932386 37.38945 32.04031 42.07570
Mantidactylus femoralis Anura LC Stream-dwelling 25.945766 37.05437 31.96244 41.89375
Mantidactylus femoralis Anura LC Stream-dwelling 24.999699 36.92499 31.96780 41.87934
Mantidactylus femoralis Anura LC Stream-dwelling 27.498833 37.26677 32.04939 42.09503
Mantidactylus zolitschka Anura CR Stream-dwelling 24.739076 36.92716 32.11133 42.23035
Mantidactylus zolitschka Anura CR Stream-dwelling 23.834706 36.80424 31.92264 42.07527
Mantidactylus zolitschka Anura CR Stream-dwelling 26.202108 37.12602 32.41657 42.49929
Mantidactylus mocquardi Anura LC Stream-dwelling 25.844407 37.09749 32.42942 42.40372
Mantidactylus mocquardi Anura LC Stream-dwelling 24.886954 36.96459 32.38836 42.30062
Mantidactylus mocquardi Anura LC Stream-dwelling 27.402084 37.31370 32.66244 42.68479
Mantidactylus biporus Anura LC Stream-dwelling 25.782653 37.05952 32.05278 41.88101
Mantidactylus biporus Anura LC Stream-dwelling 24.835387 36.93418 32.30852 42.14454
Mantidactylus biporus Anura LC Stream-dwelling 27.324323 37.26350 32.24831 42.05304
Mantidactylus bourgati Anura EN Stream-dwelling 25.785526 37.11804 32.34523 42.26653
Mantidactylus bourgati Anura EN Stream-dwelling 24.846068 36.98977 32.18776 42.04665
Mantidactylus bourgati Anura EN Stream-dwelling 27.489738 37.35074 32.85096 42.80831
Mantidactylus charlotteae Anura LC Stream-dwelling 25.668212 37.06318 32.28904 42.02828
Mantidactylus charlotteae Anura LC Stream-dwelling 24.773673 36.94357 32.23277 41.86930
Mantidactylus charlotteae Anura LC Stream-dwelling 27.135756 37.25942 32.32920 42.16243
Mantidactylus opiparis Anura LC Stream-dwelling 25.972981 37.08271 32.32116 42.34289
Mantidactylus opiparis Anura LC Stream-dwelling 25.010558 36.95201 32.16158 42.03267
Mantidactylus opiparis Anura LC Stream-dwelling 27.512046 37.29174 32.45630 42.53195
Mantidactylus melanopleura Anura LC Stream-dwelling 25.748146 37.01244 32.27709 42.33508
Mantidactylus melanopleura Anura LC Stream-dwelling 24.801522 36.88426 32.16131 42.22123
Mantidactylus melanopleura Anura LC Stream-dwelling 27.284598 37.22049 32.41249 42.52454
Mantidactylus zipperi Anura LC Stream-dwelling 25.422906 37.06192 32.27364 42.06958
Mantidactylus zipperi Anura LC Stream-dwelling 24.571327 36.94695 32.16190 41.99081
Mantidactylus zipperi Anura LC Stream-dwelling 26.868033 37.25703 32.55887 42.28836
Mantidactylus lugubris Anura LC Stream-dwelling 25.758979 37.07742 31.71999 41.57537
Mantidactylus lugubris Anura LC Stream-dwelling 24.827728 36.95177 31.66109 41.48578
Mantidactylus lugubris Anura LC Stream-dwelling 27.272153 37.28160 32.06097 41.88326
Mantidactylus tricinctus Anura VU Stream-dwelling 25.638683 37.02713 31.71662 42.01842
Mantidactylus tricinctus Anura VU Stream-dwelling 24.799889 36.91415 31.69943 41.95486
Mantidactylus tricinctus Anura VU Stream-dwelling 27.020977 37.21330 31.75924 42.03837
Mantidactylus majori Anura LC Stream-dwelling 25.618556 37.06533 32.04901 42.15720
Mantidactylus majori Anura LC Stream-dwelling 24.714944 36.94303 31.62541 41.74060
Mantidactylus majori Anura LC Stream-dwelling 27.110413 37.26726 32.24719 42.39269
Mantidactylus argenteus Anura LC Arboreal 25.627756 37.46927 31.79110 42.03098
Mantidactylus argenteus Anura LC Arboreal 24.659837 37.34152 31.56584 41.81595
Mantidactylus argenteus Anura LC Arboreal 27.225038 37.68008 31.93751 42.16856
Mantidactylus cowanii Anura NT Stream-dwelling 25.310413 36.99354 32.34948 42.23423
Mantidactylus cowanii Anura NT Stream-dwelling 24.403402 36.87330 32.25074 42.12487
Mantidactylus cowanii Anura NT Stream-dwelling 26.841470 37.19652 32.48219 42.40153
Mantidactylus grandidieri Anura LC Stream-dwelling 25.680880 37.00961 31.78347 41.78462
Mantidactylus grandidieri Anura LC Stream-dwelling 24.732898 36.88223 31.80399 41.79479
Mantidactylus grandidieri Anura LC Stream-dwelling 27.223847 37.21695 32.05678 42.08739
Mantidactylus guttulatus Anura LC Stream-dwelling 25.941056 37.10835 32.19262 42.03858
Mantidactylus guttulatus Anura LC Stream-dwelling 24.929788 36.97044 32.00169 41.84779
Mantidactylus guttulatus Anura LC Stream-dwelling 27.561844 37.32938 32.47268 42.33605
Spinomantis aglavei Anura LC Stream-dwelling 25.779100 37.09414 31.93181 41.94978
Spinomantis aglavei Anura LC Stream-dwelling 24.827036 36.96815 31.78533 41.75395
Spinomantis aglavei Anura LC Stream-dwelling 27.314717 37.29735 32.07076 42.27106
Spinomantis fimbriatus Anura LC Arboreal 26.028721 37.59378 32.44081 42.07408
Spinomantis fimbriatus Anura LC Arboreal 25.004396 37.45713 32.33276 41.92990
Spinomantis fimbriatus Anura LC Arboreal 27.617157 37.80567 33.51740 43.22701
Spinomantis tavaratra Anura VU Arboreal 26.717182 37.64475 32.65472 42.18507
Spinomantis tavaratra Anura VU Arboreal 25.516610 37.48480 32.65151 42.14318
Spinomantis tavaratra Anura VU Arboreal 28.413195 37.87071 32.86188 42.53683
Spinomantis phantasticus Anura LC Stream-dwelling 25.929276 37.21698 32.77333 42.66290
Spinomantis phantasticus Anura LC Stream-dwelling 24.924470 37.08032 32.63966 42.49814
Spinomantis phantasticus Anura LC Stream-dwelling 27.484736 37.42854 32.39558 42.41588
Spinomantis bertini Anura NT Stream-dwelling 25.730364 37.18358 32.14260 41.89479
Spinomantis bertini Anura NT Stream-dwelling 24.809748 37.05985 31.98217 41.67791
Spinomantis bertini Anura NT Stream-dwelling 27.290480 37.39325 32.26211 42.23362
Spinomantis guibei Anura VU Stream-dwelling 25.502557 37.14347 32.61896 42.45288
Spinomantis guibei Anura VU Stream-dwelling 24.610707 37.02207 32.53331 42.38226
Spinomantis guibei Anura VU Stream-dwelling 26.900475 37.33375 32.86515 42.75903
Spinomantis microtis Anura EN Stream-dwelling 25.584456 37.08721 31.68785 41.76474
Spinomantis microtis Anura EN Stream-dwelling 24.742056 36.97437 31.60096 41.71643
Spinomantis microtis Anura EN Stream-dwelling 26.930508 37.26751 31.88335 41.93393
Spinomantis brunae Anura EN Stream-dwelling 25.466906 37.06466 32.16889 42.29829
Spinomantis brunae Anura EN Stream-dwelling 24.625422 36.95192 32.09677 42.16454
Spinomantis brunae Anura EN Stream-dwelling 26.813879 37.24514 32.28433 42.47973
Spinomantis elegans Anura NT Stream-dwelling 25.774919 37.18986 32.31387 42.36570
Spinomantis elegans Anura NT Stream-dwelling 24.871122 37.06911 32.23465 42.23765
Spinomantis elegans Anura NT Stream-dwelling 27.311404 37.39516 32.53566 42.66354
Spinomantis peraccae Anura LC Arboreal 25.883523 37.53855 32.53790 42.20394
Spinomantis peraccae Anura LC Arboreal 24.912601 37.40676 32.73340 42.39964
Spinomantis peraccae Anura LC Arboreal 27.455964 37.75198 32.82024 42.58897
Spinomantis massi Anura VU Arboreal 26.546214 37.75666 32.45519 42.46578
Spinomantis massi Anura VU Arboreal 25.367540 37.59620 32.41816 42.45227
Spinomantis massi Anura VU Arboreal 28.327551 37.99916 32.95141 43.01273
Tsingymantis antitra Anura EN Ground-dwelling 26.777976 37.93903 33.20328 42.71794
Tsingymantis antitra Anura EN Ground-dwelling 25.898010 37.82036 33.03923 42.55595
Tsingymantis antitra Anura EN Ground-dwelling 28.212146 38.13244 33.32440 42.91329
Laliostoma labrosum Anura LC Ground-dwelling 26.316188 37.84088 32.93384 42.95855
Laliostoma labrosum Anura LC Ground-dwelling 25.443221 37.72324 32.27218 42.21102
Laliostoma labrosum Anura LC Ground-dwelling 27.868431 38.05005 32.77242 42.76584
Aglyptodactylus securifer Anura LC Ground-dwelling 26.662165 37.85017 32.89946 43.06646
Aglyptodactylus securifer Anura LC Ground-dwelling 25.845356 37.74021 32.48620 42.57928
Aglyptodactylus securifer Anura LC Ground-dwelling 28.181085 38.05465 32.90090 43.13414
Aglyptodactylus laticeps Anura VU Ground-dwelling 26.606275 37.79261 32.51769 42.53287
Aglyptodactylus laticeps Anura VU Ground-dwelling 25.958709 37.70614 32.44637 42.46968
Aglyptodactylus laticeps Anura VU Ground-dwelling 28.049789 37.98536 32.61968 42.77181
Aglyptodactylus madagascariensis Anura LC Ground-dwelling 25.681353 37.69273 32.99810 42.85009
Aglyptodactylus madagascariensis Anura LC Ground-dwelling 24.773713 37.57145 33.01798 42.78586
Aglyptodactylus madagascariensis Anura LC Ground-dwelling 27.181600 37.89319 33.46464 43.35603
Oreobates gemcare Anura LC Ground-dwelling 15.323045 29.21292 27.55093 30.86369
Oreobates gemcare Anura LC Ground-dwelling 11.264668 28.67456 26.81254 30.30896
Oreobates gemcare Anura LC Ground-dwelling 17.134228 29.45319 27.84971 31.18063
Oreobates granulosus Anura LC Ground-dwelling 16.352910 32.36632 29.98707 34.14674
Oreobates granulosus Anura LC Ground-dwelling 14.218975 32.06884 29.86243 34.07058
Oreobates granulosus Anura LC Ground-dwelling 18.036078 32.60095 30.25132 34.36804
Pristimantis pharangobates Anura LC Ground-dwelling 19.200181 29.40335 27.61615 30.97388
Pristimantis pharangobates Anura LC Ground-dwelling 18.021458 29.24175 27.48971 30.87331
Pristimantis pharangobates Anura LC Ground-dwelling 20.549752 29.58838 27.89031 31.25995
Dryophytes walkeri Anura VU Ground-dwelling 25.787055 39.58424 37.64371 41.35655
Dryophytes walkeri Anura VU Ground-dwelling 24.644620 39.43683 37.65094 41.30550
Dryophytes walkeri Anura VU Ground-dwelling 27.866455 39.85255 37.92302 41.81937
Dendropsophus molitor Anura LC Arboreal 22.857619 38.49287 37.52418 39.56680
Dendropsophus molitor Anura LC Arboreal 21.992219 38.39643 37.30945 39.31401
Dendropsophus molitor Anura LC Arboreal 24.550765 38.68157 37.67214 39.77947
Paramesotriton labiatus Caudata CR Aquatic 27.631583 37.12158 34.77820 39.68821
Paramesotriton labiatus Caudata CR Aquatic 26.346214 36.94356 34.68991 39.44892
Paramesotriton labiatus Caudata CR Aquatic 30.128926 37.46746 34.82481 40.14652
Hyloxalus italoi Anura LC Stream-dwelling 24.503623 36.92006 34.84727 39.08964
Hyloxalus italoi Anura LC Stream-dwelling 23.557331 36.78982 34.76117 38.98553
Hyloxalus italoi Anura LC Stream-dwelling 26.208543 37.15470 35.06694 39.51138
Polypedates braueri Anura LC Arboreal 25.034347 39.18997 38.02705 40.56970
Polypedates braueri Anura LC Arboreal 22.851602 38.88510 37.63637 40.19182
Polypedates braueri Anura LC Arboreal 28.012911 39.60599 38.18387 40.81862
Hynobius fucus Caudata NT Ground-dwelling 27.280048 33.32358 31.62748 35.11280
Hynobius fucus Caudata NT Ground-dwelling 26.473775 33.21172 31.55965 34.92628
Hynobius fucus Caudata NT Ground-dwelling 28.570568 33.50262 31.67258 35.34356
Cynops orientalis Caudata LC Aquatic 27.117176 38.40461 37.09093 39.82511
Cynops orientalis Caudata LC Aquatic 24.877928 38.07696 36.91712 39.40851
Cynops orientalis Caudata LC Aquatic 29.894371 38.81096 37.18091 40.25057
Cophixalus australis Anura LC Ground-dwelling 25.496409 36.05861 33.57494 38.52744
Cophixalus australis Anura LC Ground-dwelling 24.644024 35.93354 33.60252 38.45554
Cophixalus australis Anura LC Ground-dwelling 27.008762 36.28051 33.72561 38.83136
Chalcorana labialis Anura LC Stream-dwelling 28.269630 36.68664 34.17343 38.90216
Chalcorana labialis Anura LC Stream-dwelling 27.589447 36.59705 34.15340 38.80894
Chalcorana labialis Anura LC Stream-dwelling 29.681324 36.87259 34.27350 39.12111
Kalophrynus limbooliati Anura NT Ground-dwelling 28.697277 36.99935 34.58953 39.53248
Kalophrynus limbooliati Anura NT Ground-dwelling 28.021171 36.90391 34.53671 39.44440
Kalophrynus limbooliati Anura NT Ground-dwelling 29.951963 37.17646 34.68755 39.72416
Pristimantis matidiktyo Anura LC Ground-dwelling 24.905312 37.47246 35.12816 39.68796
Pristimantis matidiktyo Anura LC Ground-dwelling 23.900087 37.32398 35.09442 39.61280
Pristimantis matidiktyo Anura LC Ground-dwelling 26.646903 37.72971 35.52074 40.14572
Pristimantis festae Anura EN Ground-dwelling 19.805326 33.17275 31.26704 35.49058
Pristimantis festae Anura EN Ground-dwelling 17.198230 32.80636 30.76504 34.96372
Pristimantis festae Anura EN Ground-dwelling 22.861501 33.60225 31.43178 35.73872
# Summarise data at the species level
data_summary <- imputed_data %>%
    group_by(species, order, IUCN_status, ecotype) %>%
    summarise(acclimation_temperature = mean(acclimation_temperature), predicted_CTmax = mean(predicted_CTmax))

# Display data
kable(data_summary, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
species order IUCN_status ecotype acclimation_temperature predicted_CTmax
Acanthixalus sonjae Anura VU Arboreal 27.738310 40.28680
Acanthixalus spinosus Anura LC Arboreal 27.608434 40.30035
Acris crepitans Anura LC Semi-aquatic 25.773274 41.34736
Acris gryllus Anura LC Semi-aquatic 27.125172 40.43394
Adelastes hylonomos Anura DD Ground-dwelling 27.872682 39.94362
Adelophryne adiastola Anura LC Ground-dwelling 28.922331 37.55118
Adelophryne baturitensis Anura VU Ground-dwelling 26.374203 37.27218
Adelophryne gutturosa Anura LC Ground-dwelling 27.440515 37.16846
Adelophryne maranguapensis Anura EN Ground-dwelling 26.677394 37.34379
Adelophryne pachydactyla Anura DD Ground-dwelling 25.133960 36.99328
Adelophryne patamona Anura DD Ground-dwelling 26.912428 37.23610
Adelotus brevis Anura NT Ground-dwelling 23.482815 35.35564
Adelphobates castaneoticus Anura LC Ground-dwelling 27.985162 36.45032
Adelphobates galactonotus Anura LC Ground-dwelling 28.127846 36.32727
Adelphobates quinquevittatus Anura LC Ground-dwelling 28.759664 36.59402
Adenomera ajurauna Anura DD Ground-dwelling 25.741310 38.31598
Adenomera andreae Anura LC Ground-dwelling 27.611502 37.98509
Adenomera araucaria Anura LC Ground-dwelling 24.832390 38.56469
Adenomera bokermanni Anura LC Ground-dwelling 25.749377 38.78708
Adenomera coca Anura LC Ground-dwelling 14.531854 37.27352
Adenomera diptyx Anura LC Ground-dwelling 27.366998 39.03299
Adenomera heyeri Anura LC Ground-dwelling 27.571832 39.16406
Adenomera hylaedactyla Anura LC Ground-dwelling 27.449580 39.01177
Adenomera lutzi Anura EN Ground-dwelling 26.912428 38.99195
Adenomera marmorata Anura LC Ground-dwelling 25.898103 38.81683
Adenomera martinezi Anura NT Ground-dwelling 27.802296 39.03145
Adenomera nana Anura LC Ground-dwelling 24.805488 38.74329
Adenomera thomei Anura LC Ground-dwelling 25.570611 38.73502
Adenomus kandianus Anura EN Stream-dwelling 27.674004 38.53231
Adenomus kelaartii Anura VU Ground-dwelling 27.915921 39.07011
Afrixalus aureus Anura LC Arboreal 24.629277 40.17262
Afrixalus clarkei Anura EN Arboreal 22.928430 39.99125
Afrixalus delicatus Anura LC Arboreal 25.245068 40.27799
Afrixalus dorsalis Anura LC Arboreal 27.669475 40.62888
Afrixalus dorsimaculatus Anura EN Arboreal 25.085794 40.16187
Afrixalus enseticola Anura VU Arboreal 20.737132 39.66511
Afrixalus equatorialis Anura LC Arboreal 28.193266 40.68377
Afrixalus fornasini Anura LC Arboreal 25.314319 40.21980
Afrixalus fulvovittatus Anura LC Arboreal 27.692634 40.65210
Afrixalus knysnae Anura EN Arboreal 21.316819 39.73949
Afrixalus lacteus Anura EN Arboreal 26.644872 40.33627
Afrixalus laevis Anura LC Arboreal 27.218830 40.53338
Afrixalus leucostictus Anura LC Arboreal 26.678241 40.51118
Afrixalus lindholmi Anura DD Arboreal 27.721230 40.46212
Afrixalus morerei Anura VU Arboreal 23.098365 39.87642
Afrixalus nigeriensis Anura LC Arboreal 27.830100 40.62173
Afrixalus orophilus Anura LC Arboreal 23.122838 40.00679
Afrixalus osorioi Anura LC Arboreal 27.211696 40.58621
Afrixalus paradorsalis Anura LC Arboreal 27.206980 40.51636
Afrixalus quadrivittatus Anura LC Arboreal 26.528613 40.45887
Afrixalus schneideri Anura DD Arboreal 27.191396 40.59684
Afrixalus septentrionalis Anura LC Arboreal 23.635249 40.16080
Afrixalus spinifrons Anura LC Arboreal 22.222429 39.81147
Afrixalus stuhlmanni Anura LC Arboreal 25.041008 40.32416
Afrixalus sylvaticus Anura VU Arboreal 25.425752 40.28704
Afrixalus uluguruensis Anura VU Arboreal 22.671316 39.90067
Afrixalus upembae Anura DD Arboreal 25.112742 40.15182
Afrixalus vibekensis Anura LC Arboreal 27.695589 40.61924
Afrixalus vittiger Anura LC Arboreal 27.888935 40.64777
Afrixalus weidholzi Anura LC Arboreal 27.627444 40.48990
Afrixalus wittei Anura LC Arboreal 24.469331 40.19427
Agalychnis annae Anura VU Arboreal 25.355630 38.96983
Agalychnis callidryas Anura LC Arboreal 27.027464 39.19257
Agalychnis dacnicolor Anura LC Arboreal 25.561211 36.47570
Agalychnis hulli Anura LC Arboreal 25.901217 39.52579
Agalychnis lemur Anura CR Arboreal 26.472323 39.07939
Agalychnis moreletii Anura LC Arboreal 26.441680 39.16885
Agalychnis saltator Anura LC Arboreal 25.939451 39.14728
Agalychnis spurrelli Anura LC Arboreal 26.147596 40.93406
Aglyptodactylus laticeps Anura VU Ground-dwelling 26.871591 37.82804
Aglyptodactylus madagascariensis Anura LC Ground-dwelling 25.878889 37.71913
Aglyptodactylus securifer Anura LC Ground-dwelling 26.896202 37.88168
Alexteroon hypsiphonus Anura LC Stream-dwelling 27.509881 40.29299
Alexteroon jynx Anura CR Stream-dwelling 27.191396 40.19051
Alexteroon obstetricans Anura LC Stream-dwelling 27.294083 40.32573
Allobates algorei Anura NT Ground-dwelling 24.754779 37.03970
Allobates bromelicola Anura VU Ground-dwelling 27.121618 37.42698
Allobates brunneus Anura LC Ground-dwelling 28.415909 37.60736
Allobates caeruleodactylus Anura DD Ground-dwelling 28.891242 37.67423
Allobates caribe Anura CR Ground-dwelling 27.162122 37.40443
Allobates chalcopis Anura CR Ground-dwelling 27.317704 37.53737
Allobates conspicuus Anura DD Ground-dwelling 26.742275 36.52354
Allobates crombiei Anura LC Ground-dwelling 28.266142 37.45338
Allobates femoralis Anura LC Ground-dwelling 27.722453 40.01460
Allobates fratisenescus Anura VU Ground-dwelling 24.511831 36.98508
Allobates fuscellus Anura DD Ground-dwelling 29.124621 37.70276
Allobates gasconi Anura DD Ground-dwelling 28.759030 37.57526
Allobates goianus Anura DD Ground-dwelling 26.734517 37.34480
Allobates granti Anura LC Ground-dwelling 27.620083 37.44901
Allobates humilis Anura EN Ground-dwelling 26.905506 37.28300
Allobates insperatus Anura LC Ground-dwelling 25.881928 37.57966
Allobates juanii Anura EN Ground-dwelling 23.473175 36.87043
Allobates kingsburyi Anura EN Ground-dwelling 22.966949 36.85220
Allobates mandelorum Anura EN Ground-dwelling 27.321014 37.49160
Allobates marchesianus Anura LC Ground-dwelling 28.386233 37.63582
Allobates masniger Anura DD Ground-dwelling 28.012140 37.58463
Allobates melanolaemus Anura LC Ground-dwelling 29.154281 37.64444
Allobates myersi Anura LC Ground-dwelling 28.459222 37.63841
Allobates nidicola Anura DD Ground-dwelling 28.828154 37.61843
Allobates niputidea Anura LC Ground-dwelling 26.433010 37.35650
Allobates olfersioides Anura VU Ground-dwelling 25.560209 37.00793
Allobates ornatus Anura DD Ground-dwelling 24.265362 37.05261
Allobates paleovarzensis Anura NT Ground-dwelling 28.770483 37.68163
Allobates pittieri Anura LC Ground-dwelling 26.527844 37.24325
Allobates sanmartini Anura DD Ground-dwelling 26.811162 37.49791
Allobates subfolionidificans Anura VU Ground-dwelling 29.735647 37.34992
Allobates sumtuosus Anura DD Ground-dwelling 27.704698 37.49668
Allobates talamancae Anura LC Ground-dwelling 26.350304 37.27681
Allobates trilineatus Anura LC Ground-dwelling 25.320487 35.53237
Allobates undulatus Anura VU Ground-dwelling 26.985548 37.30944
Allobates vanzolinius Anura LC Ground-dwelling 29.268942 37.74159
Allobates wayuu Anura LC Ground-dwelling 26.947588 37.34352
Allobates zaparo Anura LC Ground-dwelling 25.757528 38.04492
Allopaa hazarensis Anura LC Semi-aquatic 14.589927 38.08046
Allophryne ruthveni Anura LC Arboreal 27.900675 38.52926
Alsodes australis Anura DD Stream-dwelling 10.577743 32.82909
Alsodes barrioi Anura EN Stream-dwelling 18.092293 33.55501
Alsodes gargola Anura LC Semi-aquatic 15.661694 33.37069
Alsodes hugoi Anura VU Stream-dwelling 14.537408 33.22947
Alsodes igneus Anura VU Stream-dwelling 17.368160 33.49634
Alsodes kaweshkari Anura DD Semi-aquatic 7.336478 32.97922
Alsodes montanus Anura VU Stream-dwelling 17.085973 33.58831
Alsodes monticola Anura DD Stream-dwelling 11.515858 32.92579
Alsodes nodosus Anura NT Stream-dwelling 18.981236 34.28596
Alsodes norae Anura EN Semi-aquatic 18.073200 34.40775
Alsodes pehuenche Anura CR Stream-dwelling 12.733881 32.78695
Alsodes tumultuosus Anura VU Stream-dwelling 18.662681 33.79152
Alsodes valdiviensis Anura EN Semi-aquatic 17.192536 34.55965
Alsodes vanzolinii Anura EN Stream-dwelling 17.799914 34.16364
Alsodes verrucosus Anura EN Semi-aquatic 16.381629 34.42344
Alsodes vittatus Anura DD Stream-dwelling 16.557126 33.62020
Altiphrynoides malcolmi Anura EN Ground-dwelling 19.684511 37.72988
Alytes cisternasii Anura LC Ground-dwelling 21.364012 36.49542
Alytes dickhilleni Anura EN Ground-dwelling 22.594227 37.36329
Alytes maurus Anura EN Ground-dwelling 22.121484 37.36057
Alytes muletensis Anura EN Stream-dwelling 23.507478 37.44535
Alytes obstetricans Anura LC Ground-dwelling 19.736880 36.14389
Amazophrynella bokermanni Anura LC Ground-dwelling 28.049575 38.95834
Amazophrynella minuta Anura LC Ground-dwelling 27.623350 38.80588
Ambystoma altamirani Caudata EN Stream-dwelling 20.209526 35.77932
Ambystoma amblycephalum Caudata CR Semi-aquatic 22.433401 37.04337
Ambystoma andersoni Caudata CR Stream-dwelling 22.433401 36.39309
Ambystoma annulatum Caudata LC Fossorial 25.079562 38.13816
Ambystoma barbouri Caudata NT Ground-dwelling 25.604403 37.39327
Ambystoma bishopi Caudata EN Ground-dwelling 28.185000 37.55902
Ambystoma californiense Caudata VU Ground-dwelling 19.999347 36.53515
Ambystoma cingulatum Caudata EN Fossorial 27.264308 38.38339
Ambystoma dumerilii Caudata CR Aquatic 22.433401 37.12875
Ambystoma flavipiperatum Caudata EN Ground-dwelling 24.471010 37.09704
Ambystoma gracile Caudata LC Ground-dwelling 16.224597 35.90710
Ambystoma granulosum Caudata EN Aquatic 22.543758 36.99498
Ambystoma jeffersonianum Caudata LC Aquatic 22.633651 36.60130
Ambystoma laterale Caudata LC Ground-dwelling 18.906708 36.19013
Ambystoma leorae Caudata CR Aquatic 21.930907 36.85315
Ambystoma lermaense Caudata EN Aquatic 22.202700 36.86151
Ambystoma mabeei Caudata LC Ground-dwelling 25.060467 37.67417
Ambystoma macrodactylum Caudata LC Ground-dwelling 15.969546 34.47822
Ambystoma maculatum Caudata LC Ground-dwelling 22.443331 37.36210
Ambystoma mavortium Caudata LC Ground-dwelling 20.563313 36.43171
Ambystoma mexicanum Caudata CR Aquatic 21.070217 36.98694
Ambystoma opacum Caudata LC Ground-dwelling 25.294028 37.75684
Ambystoma ordinarium Caudata EN Ground-dwelling 23.150337 37.03730
Ambystoma rivulare Caudata EN Aquatic 22.038399 37.19838
Ambystoma rosaceum Caudata LC Semi-aquatic 23.974936 37.43089
Ambystoma silvense Caudata DD Aquatic 23.230567 36.23587
Ambystoma talpoideum Caudata LC Semi-aquatic 27.085577 37.97717
Ambystoma taylori Caudata CR Aquatic 21.551792 36.81904
Ambystoma texanum Caudata LC Semi-aquatic 25.610459 37.58264
Ambystoma tigrinum Caudata LC Ground-dwelling 22.098493 37.23356
Ambystoma velasci Caudata LC Ground-dwelling 23.600746 36.89029
Ameerega bassleri Anura VU Ground-dwelling 23.844339 37.82231
Ameerega berohoka Anura LC Ground-dwelling 27.904869 38.46073
Ameerega bilinguis Anura LC Ground-dwelling 26.736616 38.27586
Ameerega boliviana Anura NT Ground-dwelling 20.217030 37.40230
Ameerega braccata Anura LC Ground-dwelling 28.340957 38.50616
Ameerega cainarachi Anura EN Stream-dwelling 24.549794 37.43202
Ameerega flavopicta Anura LC Stream-dwelling 27.083582 37.73705
Ameerega hahneli Anura LC Ground-dwelling 27.792350 38.74487
Ameerega macero Anura LC Ground-dwelling 23.253479 37.79831
Ameerega parvula Anura LC Ground-dwelling 26.551563 38.22459
Ameerega petersi Anura LC Ground-dwelling 24.618155 38.03778
Ameerega picta Anura LC Ground-dwelling 27.754778 38.53271
Ameerega planipaleae Anura CR Stream-dwelling 21.293309 36.94278
Ameerega pongoensis Anura VU Stream-dwelling 25.117167 37.41512
Ameerega pulchripecta Anura LC Ground-dwelling 27.462954 38.45460
Ameerega rubriventris Anura EN Ground-dwelling 23.734104 37.85074
Ameerega silverstonei Anura EN Ground-dwelling 24.078841 37.80190
Ameerega simulans Anura LC Ground-dwelling 20.656135 37.46586
Ameerega smaragdina Anura DD Ground-dwelling 21.293309 37.56870
Ameerega trivittata Anura LC Ground-dwelling 27.930350 39.17997
Ameerega yungicola Anura LC Ground-dwelling 20.255892 37.38366
Amietia angolensis Anura LC Semi-aquatic 24.783454 37.64339
Amietia desaegeri Anura LC Semi-aquatic 24.100171 37.60000
Amietia fuscigula Anura LC Semi-aquatic 20.948960 37.23441
Amietia inyangae Anura EN Stream-dwelling 24.369951 36.76699
Amietia johnstoni Anura EN Stream-dwelling 25.902836 36.92308
Amietia ruwenzorica Anura LC Stream-dwelling 24.199112 36.65278
Amietia tenuoplicata Anura LC Stream-dwelling 23.553261 36.65452
Amietia vandijki Anura LC Stream-dwelling 21.466944 36.43746
Amietia vertebralis Anura LC Aquatic 21.036443 37.06254
Amietia wittei Anura LC Stream-dwelling 21.761097 36.34462
Amolops aniqiaoensis Anura VU Stream-dwelling 16.407198 35.34528
Amolops archotaphus Anura DD Stream-dwelling 25.801584 36.54072
Amolops assamensis Anura DD Stream-dwelling 26.496517 36.74578
Amolops bellulus Anura NT Stream-dwelling 19.974615 35.82978
Amolops chakrataensis Anura DD Stream-dwelling 21.310879 35.98062
Amolops chunganensis Anura LC Ground-dwelling 24.171973 37.04490
Amolops compotrix Anura LC Stream-dwelling 28.255801 36.96288
Amolops cremnobatus Anura LC Stream-dwelling 27.466505 36.86503
Amolops cucae Anura EN Stream-dwelling 26.053406 36.57060
Amolops daiyunensis Anura NT Stream-dwelling 27.426601 36.73464
Amolops formosus Anura LC Stream-dwelling 19.667443 35.81013
Amolops gerbillus Anura LC Stream-dwelling 20.823024 35.94965
Amolops granulosus Anura LC Ground-dwelling 21.705572 36.60420
Amolops hainanensis Anura EN Stream-dwelling 28.158168 36.86117
Amolops hongkongensis Anura EN Stream-dwelling 27.639777 36.85741
Amolops iriodes Anura DD Ground-dwelling 26.549996 37.45584
Amolops jaunsari Anura DD Stream-dwelling 21.379239 36.01324
Amolops jinjiangensis Anura LC Stream-dwelling 16.833293 35.37508
Amolops kaulbacki Anura DD Stream-dwelling 19.132514 35.67207
Amolops larutensis Anura LC Stream-dwelling 28.254075 36.97310
Amolops lifanensis Anura LC Stream-dwelling 19.088235 35.67388
Amolops loloensis Anura VU Stream-dwelling 20.605681 35.86525
Amolops longimanus Anura DD Ground-dwelling 22.531459 36.79993
Amolops mantzorum Anura LC Stream-dwelling 18.240503 35.57553
Amolops marmoratus Anura LC Stream-dwelling 23.174010 36.31583
Amolops medogensis Anura EN Stream-dwelling 16.407198 35.41973
Amolops mengyangensis Anura DD Stream-dwelling 23.285533 36.20456
Amolops minutus Anura EN Stream-dwelling 25.706256 36.62723
Amolops monticola Anura LC Stream-dwelling 17.331147 35.39912
Amolops panhai Anura LC Stream-dwelling 28.537267 36.94186
Amolops ricketti Anura LC Stream-dwelling 27.385424 36.85241
Amolops spinapectoralis Anura LC Stream-dwelling 28.081695 36.92903
Amolops splendissimus Anura VU Stream-dwelling 25.524024 36.61724
Amolops torrentis Anura VU Stream-dwelling 28.158168 36.86942
Amolops tuberodepressus Anura VU Stream-dwelling 22.882467 36.18213
Amolops viridimaculatus Anura LC Stream-dwelling 21.023108 36.01733
Amolops vitreus Anura VU Stream-dwelling 24.839179 36.43652
Amolops wuyiensis Anura LC Stream-dwelling 27.081775 36.81954
Amphiuma means Caudata LC Aquatic 27.051725 36.72320
Amphiuma pholeter Caudata NT Aquatic 28.045080 36.97124
Amphiuma tridactylum Caudata LC Semi-aquatic 27.437190 37.36525
Anaxyrus americanus Anura LC Ground-dwelling 19.437975 38.94980
Anaxyrus boreas Anura LC Ground-dwelling 16.131054 37.09030
Anaxyrus californicus Anura EN Ground-dwelling 21.407108 38.62474
Anaxyrus canorus Anura VU Ground-dwelling 18.475797 37.58671
Anaxyrus cognatus Anura LC Fossorial 21.891636 40.70719
Anaxyrus compactilis Anura LC Fossorial 23.329664 38.31282
Anaxyrus debilis Anura LC Fossorial 23.639236 40.27481
Anaxyrus exsul Anura VU Ground-dwelling 20.008940 37.56700
Anaxyrus fowleri Anura LC Ground-dwelling 24.684565 38.68819
Anaxyrus hemiophrys Anura LC Ground-dwelling 18.890723 38.42907
Anaxyrus houstonensis Anura CR Ground-dwelling 27.255792 39.47409
Anaxyrus kelloggi Anura LC Ground-dwelling 25.305430 39.12746
Anaxyrus mexicanus Anura LC Ground-dwelling 23.971402 38.98031
Anaxyrus microscaphus Anura LC Ground-dwelling 20.570728 38.45710
Anaxyrus nelsoni Anura CR Ground-dwelling 19.670812 37.43562
Anaxyrus punctatus Anura LC Fossorial 22.924643 40.25089
Anaxyrus quercicus Anura LC Ground-dwelling 27.015115 39.34868
Anaxyrus retiformis Anura LC Fossorial 24.132993 40.70314
Anaxyrus speciosus Anura LC Fossorial 24.472267 40.01324
Anaxyrus terrestris Anura LC Fossorial 27.089481 39.24333
Anaxyrus woodhousii Anura LC Fossorial 21.967853 39.76147
Andinobates altobueyensis Anura DD Ground-dwelling 26.784389 37.34244
Andinobates bombetes Anura VU Ground-dwelling 23.588316 36.93904
Andinobates claudiae Anura DD Ground-dwelling 27.943292 37.46307
Andinobates daleswansoni Anura EN Ground-dwelling 24.273090 36.91445
Andinobates dorisswansonae Anura VU Ground-dwelling 23.325958 36.88097
Andinobates fulguritus Anura LC Ground-dwelling 26.380959 37.33823
Andinobates minutus Anura LC Ground-dwelling 26.651260 37.27408
Andinobates opisthomelas Anura VU Ground-dwelling 24.838052 37.13616
Andinobates tolimensis Anura VU Ground-dwelling 23.325958 36.92022
Andinobates virolinensis Anura VU Ground-dwelling 24.077466 36.99981
Andrias davidianus Caudata CR Aquatic 25.555638 36.17504
Andrias japonicus Caudata VU Stream-dwelling 25.277977 35.31699
Aneides aeneus Caudata NT Ground-dwelling 25.307443 34.12264
Aneides ferreus Caudata LC Ground-dwelling 18.268632 33.47621
Aneides flavipunctatus Caudata LC Ground-dwelling 17.799062 33.48912
Aneides hardii Caudata NT Ground-dwelling 21.523079 33.95467
Aneides lugubris Caudata LC Arboreal 19.788891 33.63134
Aneides vagrans Caudata LC Ground-dwelling 16.053921 33.30115
Anhydrophryne hewitti Anura LC Ground-dwelling 22.342524 37.03377
Anhydrophryne ngongoniensis Anura EN Ground-dwelling 21.759956 37.02551
Anhydrophryne rattrayi Anura VU Ground-dwelling 20.611452 36.82611
Anodonthyla boulengerii Anura NT Arboreal 25.855889 37.92700
Anodonthyla emilei Anura EN Arboreal 25.878849 37.95145
Anodonthyla hutchisoni Anura EN Arboreal 26.773003 37.97053
Anodonthyla jeanbai Anura EN Arboreal 25.850762 37.84056
Anodonthyla montana Anura VU Arboreal 26.326721 38.00952
Anodonthyla moramora Anura EN Arboreal 25.878849 37.88613
Anodonthyla nigrigularis Anura EN Arboreal 25.641574 37.85173
Anodonthyla pollicaris Anura DD Arboreal 24.925297 37.74798
Anodonthyla rouxae Anura EN Arboreal 26.004297 37.97428
Anodonthyla theoi Anura CR Arboreal 26.568359 37.96014
Anodonthyla vallani Anura CR Arboreal 25.873667 37.84325
Anomaloglossus ayarzaguenai Anura VU Stream-dwelling 25.633941 36.51181
Anomaloglossus baeobatrachus Anura DD Ground-dwelling 27.782474 37.49277
Anomaloglossus beebei Anura EN Arboreal 26.912428 37.16703
Anomaloglossus breweri Anura NT Semi-aquatic 25.977024 37.47837
Anomaloglossus degranvillei Anura CR Stream-dwelling 27.946998 36.94437
Anomaloglossus guanayensis Anura NT Stream-dwelling 26.985548 36.78979
Anomaloglossus kaiei Anura EN Ground-dwelling 26.912428 37.41780
Anomaloglossus murisipanensis Anura VU Ground-dwelling 25.977024 37.23037
Anomaloglossus parimae Anura DD Stream-dwelling 26.218949 36.69732
Anomaloglossus parkerae Anura DD Ground-dwelling 25.810804 37.17219
Anomaloglossus praderioi Anura EN Ground-dwelling 26.671496 37.40590
Anomaloglossus roraima Anura EN Ground-dwelling 26.671496 37.34000
Anomaloglossus rufulus Anura NT Ground-dwelling 25.619235 37.18781
Anomaloglossus shrevei Anura NT Stream-dwelling 25.966820 36.62712
Anomaloglossus stepheni Anura LC Ground-dwelling 28.695109 37.68629
Anomaloglossus tamacuarensis Anura DD Stream-dwelling 27.246851 36.80795
Anomaloglossus tepuyensis Anura DD Stream-dwelling 26.143635 36.64279
Anomaloglossus triunfo Anura DD Stream-dwelling 26.310247 36.64516
Anomaloglossus wothuja Anura LC Stream-dwelling 27.917613 36.87274
Ansonia albomaculata Anura LC Ground-dwelling 27.632204 39.02128
Ansonia endauensis Anura NT Stream-dwelling 28.737514 38.67313
Ansonia fuliginea Anura LC Ground-dwelling 27.189560 38.98302
Ansonia glandulosa Anura LC Stream-dwelling 28.629805 38.55626
Ansonia hanitschi Anura LC Ground-dwelling 27.625883 38.96231
Ansonia inthanon Anura LC Stream-dwelling 27.603657 38.46262
Ansonia jeetsukumarani Anura VU Stream-dwelling 27.683081 38.42392
Ansonia kraensis Anura LC Stream-dwelling 28.407510 38.44927
Ansonia latidisca Anura EN Arboreal 27.992958 38.89438
Ansonia latiffi Anura NT Stream-dwelling 28.504789 38.54554
Ansonia latirostra Anura DD Arboreal 28.738896 39.10406
Ansonia longidigita Anura LC Ground-dwelling 27.947861 39.07891
Ansonia malayana Anura LC Stream-dwelling 28.105097 38.60781
Ansonia mcgregori Anura LC Stream-dwelling 27.520314 38.49733
Ansonia minuta Anura LC Stream-dwelling 28.311981 38.51637
Ansonia muelleri Anura LC Stream-dwelling 27.694014 38.46792
Ansonia platysoma Anura LC Stream-dwelling 27.138200 38.30799
Ansonia siamensis Anura EN Stream-dwelling 27.716765 38.37112
Ansonia spinulifer Anura LC Ground-dwelling 28.100047 39.00336
Ansonia thinthinae Anura EN Stream-dwelling 27.755283 38.44179
Ansonia tiomanica Anura LC Stream-dwelling 28.772152 38.53174
Ansonia torrentis Anura LC Stream-dwelling 27.227495 38.35259
Aphantophryne minuta Anura LC Ground-dwelling 26.923029 35.35487
Aphantophryne pansa Anura LC Ground-dwelling 26.322432 35.28173
Aphantophryne sabini Anura LC Ground-dwelling 28.037156 35.51209
Aplastodiscus albofrenatus Anura LC Arboreal 26.019422 38.73508
Aplastodiscus albosignatus Anura LC Arboreal 25.461996 39.09573
Aplastodiscus arildae Anura LC Arboreal 25.897058 38.56318
Aplastodiscus callipygius Anura LC Arboreal 25.796172 39.08464
Aplastodiscus cavicola Anura NT Arboreal 25.736999 39.10134
Aplastodiscus cochranae Anura LC Arboreal 24.666127 38.90662
Aplastodiscus ehrhardti Anura LC Arboreal 24.565783 38.88788
Aplastodiscus eugenioi Anura NT Arboreal 25.663609 38.70978
Aplastodiscus flumineus Anura DD Arboreal 26.561451 39.09225
Aplastodiscus ibirapitanga Anura LC Arboreal 25.401274 39.58215
Aplastodiscus leucopygius Anura LC Arboreal 26.020919 39.08469
Aplastodiscus musicus Anura DD Arboreal 26.561451 39.09064
Aplastodiscus perviridis Anura LC Arboreal 26.182734 39.09679
Aplastodiscus sibilatus Anura DD Arboreal 25.142042 37.80260
Aplastodiscus weygoldti Anura NT Arboreal 25.677963 38.20336
Arcovomer passarellii Anura LC Ground-dwelling 25.718208 39.68943
Arenophryne rotunda Anura LC Fossorial 24.341993 37.06564
Arlequinus krebsi Anura EN Arboreal 26.437601 40.43178
Aromobates capurinensis Anura DD Stream-dwelling 25.673615 36.67437
Aromobates duranti Anura CR Stream-dwelling 25.673615 36.59987
Aromobates mayorgai Anura EN Stream-dwelling 26.315006 36.66920
Aromobates meridensis Anura CR Stream-dwelling 25.673615 36.65707
Aromobates molinarii Anura CR Stream-dwelling 25.673615 36.55949
Aromobates orostoma Anura CR Stream-dwelling 25.673615 36.61981
Aromobates saltuensis Anura EN Stream-dwelling 24.801343 36.41331
Arthroleptella bicolor Anura LC Ground-dwelling 20.334999 36.93182
Arthroleptella drewesii Anura NT Stream-dwelling 20.081240 36.36446
Arthroleptella landdrosia Anura NT Ground-dwelling 20.760458 37.02789
Arthroleptella lightfooti Anura NT Ground-dwelling 21.185918 37.11783
Arthroleptella rugosa Anura CR Ground-dwelling 20.081240 36.94361
Arthroleptella subvoce Anura CR Ground-dwelling 20.750387 36.96103
Arthroleptella villiersi Anura LC Ground-dwelling 20.760458 37.00078
Arthroleptides martiensseni Anura EN Stream-dwelling 25.085794 36.75974
Arthroleptides yakusini Anura EN Stream-dwelling 23.610604 36.60895
Arthroleptis adelphus Anura LC Ground-dwelling 27.297887 39.13951
Arthroleptis adolfifriederici Anura LC Ground-dwelling 22.554502 38.45415
Arthroleptis affinis Anura LC Ground-dwelling 23.564158 38.69995
Arthroleptis anotis Anura DD Ground-dwelling 23.549259 38.63458
Arthroleptis aureoli Anura NT Stream-dwelling 27.600884 38.39571
Arthroleptis bioko Anura EN Ground-dwelling 26.388381 39.00536
Arthroleptis bivittatus Anura DD Ground-dwelling 27.571212 39.17814
Arthroleptis brevipes Anura DD Ground-dwelling 28.531313 39.27297
Arthroleptis carquejai Anura DD Ground-dwelling 25.398624 38.80172
Arthroleptis crusculum Anura NT Ground-dwelling 27.693138 39.07995
Arthroleptis fichika Anura EN Ground-dwelling 25.090940 38.80752
Arthroleptis formosus Anura DD Ground-dwelling 28.021273 38.98821
Arthroleptis francei Anura VU Ground-dwelling 26.095628 38.96260
Arthroleptis hematogaster Anura DD Ground-dwelling 24.207253 38.61926
Arthroleptis kidogo Anura CR Ground-dwelling 24.229692 38.76996
Arthroleptis krokosua Anura CR Ground-dwelling 27.827392 39.16161
Arthroleptis kutogundua Anura CR Ground-dwelling 21.612409 38.36600
Arthroleptis lameerei Anura LC Ground-dwelling 25.322604 38.87011
Arthroleptis langeri Anura EN Ground-dwelling 27.537570 39.09239
Arthroleptis lonnbergi Anura DD Ground-dwelling 24.800427 38.76672
Arthroleptis loveridgei Anura DD Ground-dwelling 26.161874 38.96307
Arthroleptis mossoensis Anura DD Ground-dwelling 23.371271 38.58360
Arthroleptis nguruensis Anura VU Ground-dwelling 24.229692 38.82192
Arthroleptis nikeae Anura CR Ground-dwelling 23.164809 38.58320
Arthroleptis nimbaensis Anura DD Ground-dwelling 27.635550 39.10210
Arthroleptis nlonakoensis Anura EN Ground-dwelling 26.446823 38.94580
Arthroleptis palava Anura LC Ground-dwelling 26.519367 39.02444
Arthroleptis perreti Anura EN Ground-dwelling 27.125406 39.10537
Arthroleptis phrynoides Anura DD Ground-dwelling 27.947324 39.13095
Arthroleptis poecilonotus Anura LC Ground-dwelling 27.518019 39.14834
Arthroleptis pyrrhoscelis Anura LC Ground-dwelling 23.921618 38.62490
Arthroleptis reichei Anura LC Ground-dwelling 22.875574 38.47452
Arthroleptis schubotzi Anura LC Ground-dwelling 23.123362 38.55252
Arthroleptis spinalis Anura DD Ground-dwelling 23.463978 38.66552
Arthroleptis stenodactylus Anura LC Ground-dwelling 24.712829 38.75798
Arthroleptis stridens Anura DD Ground-dwelling 25.085794 38.75966
Arthroleptis sylvaticus Anura LC Ground-dwelling 27.557642 39.20348
Arthroleptis taeniatus Anura LC Ground-dwelling 27.500044 39.01982
Arthroleptis tanneri Anura EN Ground-dwelling 25.090940 38.78991
Arthroleptis troglodytes Anura CR Ground-dwelling 25.633273 38.82636
Arthroleptis tuberosus Anura DD Ground-dwelling 27.432377 39.05102
Arthroleptis variabilis Anura LC Ground-dwelling 27.506001 39.10835
Arthroleptis vercammeni Anura DD Ground-dwelling 24.550522 38.66920
Arthroleptis wahlbergii Anura LC Ground-dwelling 22.810637 38.44647
Arthroleptis xenochirus Anura LC Ground-dwelling 24.413328 38.82651
Arthroleptis xenodactyloides Anura LC Ground-dwelling 24.832967 38.86961
Arthroleptis xenodactylus Anura EN Ground-dwelling 25.085794 38.83069
Arthroleptis zimmeri Anura DD Ground-dwelling 27.227980 39.04184
Ascaphus montanus Anura LC Stream-dwelling 17.475081 31.52563
Ascaphus truei Anura LC Stream-dwelling 16.605578 31.05533
Assa darlingtoni Anura LC Ground-dwelling 23.359177 34.75425
Asterophrys leucopus Anura LC Ground-dwelling 27.343824 35.46587
Asterophrys turpicola Anura LC Ground-dwelling 27.293219 35.50532
Astylosternus batesi Anura LC Ground-dwelling 27.595345 39.12875
Astylosternus diadematus Anura LC Stream-dwelling 26.771745 38.38640
Astylosternus fallax Anura VU Stream-dwelling 27.025561 38.49076
Astylosternus laticephalus Anura NT Ground-dwelling 27.566236 39.08498
Astylosternus laurenti Anura EN Stream-dwelling 26.905359 38.49969
Astylosternus montanus Anura LC Stream-dwelling 26.467810 38.34101
Astylosternus nganhanus Anura CR Ground-dwelling 26.479731 38.97767
Astylosternus occidentalis Anura LC Ground-dwelling 27.650950 39.11024
Astylosternus perreti Anura EN Stream-dwelling 26.644872 38.41388
Astylosternus ranoides Anura EN Ground-dwelling 26.186967 38.91237
Astylosternus rheophilus Anura NT Stream-dwelling 26.573552 38.36081
Astylosternus schioetzi Anura EN Stream-dwelling 26.869052 38.41723
Atelognathus ceii Anura DD Semi-aquatic 12.011296 35.38200
Atelognathus nitoi Anura VU Semi-aquatic 15.827908 36.02434
Atelognathus patagonicus Anura CR Semi-aquatic 17.470295 36.22044
Atelognathus praebasalticus Anura EN Ground-dwelling 17.791261 36.07950
Atelognathus reverberii Anura VU Semi-aquatic 16.331137 36.13535
Atelognathus salai Anura LC Semi-aquatic 11.844156 35.48592
Atelognathus solitarius Anura DD Ground-dwelling 15.404470 35.68518
Atelopus andinus Anura EN Stream-dwelling 24.479751 37.22993
Atelopus arsyecue Anura CR Stream-dwelling 25.584086 37.41383
Atelopus balios Anura CR Stream-dwelling 26.948386 37.66224
Atelopus bomolochos Anura CR Stream-dwelling 25.876801 37.44732
Atelopus carauta Anura DD Stream-dwelling 26.439037 37.53638
Atelopus carrikeri Anura EN Stream-dwelling 25.584086 37.42113
Atelopus certus Anura CR Stream-dwelling 26.979060 37.62212
Atelopus chirripoensis Anura DD Ground-dwelling 17.152122 36.89386
Atelopus chrysocorallus Anura CR Stream-dwelling 26.854615 37.53980
Atelopus coynei Anura CR Stream-dwelling 20.760710 36.80661
Atelopus cruciger Anura CR Stream-dwelling 27.121618 37.59342
Atelopus dimorphus Anura DD Stream-dwelling 23.639051 37.08908
Atelopus elegans Anura EN Stream-dwelling 23.729301 36.13381
Atelopus epikeisthos Anura EN Stream-dwelling 23.472623 37.12119
Atelopus exiguus Anura EN Stream-dwelling 24.212864 37.31757
Atelopus famelicus Anura CR Stream-dwelling 25.763603 37.40915
Atelopus flavescens Anura VU Stream-dwelling 27.127543 37.51209
Atelopus franciscus Anura LC Stream-dwelling 27.284011 37.53439
Atelopus galactogaster Anura DD Stream-dwelling 26.170801 37.45271
Atelopus glyphus Anura CR Stream-dwelling 27.251842 37.73344
Atelopus guitarraensis Anura DD Stream-dwelling 23.902018 37.20909
Atelopus ignescens Anura CR Stream-dwelling 21.736140 36.87885
Atelopus laetissimus Anura EN Stream-dwelling 27.127537 37.62669
Atelopus limosus Anura CR Stream-dwelling 27.298692 37.76606
Atelopus longibrachius Anura EN Stream-dwelling 25.851729 37.41471
Atelopus longirostris Anura CR Stream-dwelling 20.760710 36.77902
Atelopus lozanoi Anura EN Stream-dwelling 22.707356 37.08422
Atelopus mandingues Anura DD Stream-dwelling 22.776145 37.05705
Atelopus mittermeieri Anura EN Stream-dwelling 22.327385 36.98341
Atelopus mucubajiensis Anura CR Stream-dwelling 26.956396 37.56652
Atelopus muisca Anura CR Stream-dwelling 22.776145 36.98875
Atelopus nahumae Anura EN Stream-dwelling 26.910833 37.54423
Atelopus nanay Anura CR Stream-dwelling 26.948386 37.59769
Atelopus nepiozomus Anura EN Stream-dwelling 23.017328 37.06648
Atelopus oxapampae Anura EN Stream-dwelling 21.293309 36.88469
Atelopus palmatus Anura CR Stream-dwelling 22.391675 36.94306
Atelopus podocarpus Anura CR Stream-dwelling 23.195043 37.10949
Atelopus pulcher Anura VU Stream-dwelling 23.480464 37.15728
Atelopus pyrodactylus Anura CR Stream-dwelling 22.692835 37.00079
Atelopus reticulatus Anura DD Stream-dwelling 23.639051 37.10944
Atelopus sanjosei Anura CR Stream-dwelling 25.895034 37.47202
Atelopus seminiferus Anura EN Stream-dwelling 23.128864 37.12944
Atelopus simulatus Anura CR Ground-dwelling 22.265123 37.53058
Atelopus siranus Anura DD Stream-dwelling 22.825311 36.95470
Atelopus spumarius Anura VU Stream-dwelling 27.754105 36.97011
Atelopus spurrelli Anura NT Stream-dwelling 25.953687 37.40951
Atelopus tricolor Anura CR Stream-dwelling 21.367657 37.00582
Atelopus varius Anura CR Stream-dwelling 26.140631 37.49324
Atelopus walkeri Anura DD Stream-dwelling 26.018926 37.47385
Atopophrynus syntomopus Anura CR Stream-dwelling 23.046042 33.71120
Aubria masako Anura LC Semi-aquatic 27.892545 38.09856
Aubria occidentalis Anura LC Semi-aquatic 27.693214 38.10864
Aubria subsigillata Anura LC Semi-aquatic 27.630789 38.16471
Austrochaperina adamantina Anura NT Ground-dwelling 26.680670 35.35959
Austrochaperina adelphe Anura LC Ground-dwelling 28.538996 35.58259
Austrochaperina aquilonia Anura NT Ground-dwelling 26.680670 35.41954
Austrochaperina archboldi Anura DD Ground-dwelling 27.404249 35.47581
Austrochaperina basipalmata Anura LC Stream-dwelling 26.733425 34.79702
Austrochaperina blumi Anura LC Ground-dwelling 25.609209 35.24424
Austrochaperina brevipes Anura DD Ground-dwelling 26.923029 35.45788
Austrochaperina derongo Anura LC Ground-dwelling 26.583634 35.16890
Austrochaperina fryi Anura LC Ground-dwelling 26.621351 35.34964
Austrochaperina gracilipes Anura LC Ground-dwelling 27.892259 35.48968
Austrochaperina hooglandi Anura LC Ground-dwelling 27.067330 35.43852
Austrochaperina kosarek Anura DD Ground-dwelling 26.375358 35.31942
Austrochaperina macrorhyncha Anura LC Stream-dwelling 26.870165 34.70748
Austrochaperina mehelyi Anura LC Ground-dwelling 26.519185 35.27069
Austrochaperina minutissima Anura DD Ground-dwelling 28.031168 35.62525
Austrochaperina novaebritanniae Anura VU Ground-dwelling 28.131049 35.52848
Austrochaperina palmipes Anura LC Stream-dwelling 27.169237 34.74356
Austrochaperina parkeri Anura DD Ground-dwelling 27.078714 35.42617
Austrochaperina pluvialis Anura LC Ground-dwelling 26.156668 35.26109
Austrochaperina polysticta Anura DD Ground-dwelling 26.251026 35.20556
Austrochaperina rivularis Anura LC Semi-aquatic 27.456544 35.71878
Austrochaperina robusta Anura LC Ground-dwelling 25.452157 35.08667
Austrochaperina septentrionalis Anura LC Ground-dwelling 26.472942 35.35414
Austrochaperina yelaensis Anura LC Ground-dwelling 27.553773 35.58010
Babina holsti Anura EN Semi-aquatic 27.580119 37.14617
Babina subaspera Anura EN Ground-dwelling 27.216885 36.84746
Balebreviceps hillmani Anura CR Ground-dwelling 20.234697 37.49721
Barbarophryne brongersmai Anura LC Ground-dwelling 22.431698 38.51438
Barbourula busuangensis Anura NT Aquatic 27.846436 37.51143
Barbourula kalimantanensis Anura EN Aquatic 29.336636 37.56042
Barycholos pulcher Anura LC Ground-dwelling 25.221183 32.50409
Barycholos ternetzi Anura LC Ground-dwelling 27.253490 32.71612
Barygenys atra Anura LC Ground-dwelling 27.170143 35.41202
Barygenys cheesmanae Anura DD Ground-dwelling 25.808903 35.22765
Barygenys exsul Anura LC Ground-dwelling 27.553773 35.47455
Barygenys flavigularis Anura DD Ground-dwelling 27.123724 35.44752
Barygenys maculata Anura LC Ground-dwelling 27.607723 35.57605
Barygenys nana Anura LC Ground-dwelling 26.092828 35.27304
Barygenys parvula Anura NT Ground-dwelling 26.903425 35.38585
Batrachoseps attenuatus Caudata LC Ground-dwelling 19.062249 34.54276
Batrachoseps campi Caudata NT Ground-dwelling 18.247349 34.54463
Batrachoseps diabolicus Caudata DD Ground-dwelling 20.474355 34.71138
Batrachoseps gabrieli Caudata DD Ground-dwelling 20.322920 34.67462
Batrachoseps gavilanensis Caudata LC Ground-dwelling 19.834503 34.60404
Batrachoseps gregarius Caudata LC Ground-dwelling 19.282231 34.51679
Batrachoseps incognitus Caudata DD Ground-dwelling 19.514781 34.62037
Batrachoseps kawia Caudata NT Ground-dwelling 16.085801 34.14434
Batrachoseps luciae Caudata LC Ground-dwelling 19.452318 34.54507
Batrachoseps major Caudata LC Ground-dwelling 21.538060 34.84094
Batrachoseps minor Caudata DD Ground-dwelling 20.078065 34.60920
Batrachoseps nigriventris Caudata LC Ground-dwelling 20.731025 34.73768
Batrachoseps pacificus Caudata LC Ground-dwelling 19.481863 34.57037
Batrachoseps regius Caudata VU Ground-dwelling 21.581392 34.81300
Batrachoseps relictus Caudata DD Ground-dwelling 18.025694 34.30858
Batrachoseps robustus Caudata NT Ground-dwelling 19.456212 34.58410
Batrachoseps simatus Caudata VU Ground-dwelling 18.025694 34.35462
Batrachoseps stebbinsi Caudata VU Ground-dwelling 19.427013 34.56965
Batrachoseps wrighti Caudata NT Ground-dwelling 18.189715 34.52751
Batrachuperus karlschmidti Caudata VU Stream-dwelling 16.510075 32.86059
Batrachuperus londongensis Caudata EN Stream-dwelling 20.848232 33.30131
Batrachuperus pinchonii Caudata VU Semi-aquatic 18.469796 33.85586
Batrachuperus tibetanus Caudata VU Semi-aquatic 17.802325 34.18262
Batrachuperus yenyuanensis Caudata EN Semi-aquatic 20.282691 33.93119
Batrachyla antartandica Anura LC Ground-dwelling 13.393199 35.37927
Batrachyla fitzroya Anura VU Ground-dwelling 15.847672 35.70763
Batrachyla leptopus Anura LC Ground-dwelling 14.595775 35.49713
Batrachyla nibaldoi Anura LC Ground-dwelling 9.444704 34.80310
Batrachyla taeniata Anura LC Ground-dwelling 15.000111 35.64217
Blommersia angolafa Anura LC Arboreal 26.453276 37.70878
Blommersia blommersae Anura LC Arboreal 25.232902 37.50593
Blommersia dejongi Anura LC Ground-dwelling 26.484528 37.81811
Blommersia domerguei Anura LC Ground-dwelling 25.689267 37.73085
Blommersia galani Anura LC Ground-dwelling 26.462152 37.81076
Blommersia grandisonae Anura LC Arboreal 25.963154 37.72037
Blommersia kely Anura LC Ground-dwelling 25.522773 37.85095
Blommersia sarotra Anura LC Ground-dwelling 25.192843 37.73725
Blommersia variabilis Anura LC Arboreal 27.140802 37.78095
Blommersia wittei Anura LC Arboreal 26.819943 37.57168
Boana albomarginata Anura LC Arboreal 25.677009 40.44275
Boana albopunctata Anura LC Arboreal 27.136692 38.84520
Boana boans Anura LC Arboreal 27.492211 40.45893
Boana cinerascens Anura LC Arboreal 27.775058 40.02453
Boana crepitans Anura LC Arboreal 26.408906 39.75542
Boana curupi Anura LC Arboreal 27.204028 38.06212
Boana faber Anura LC Arboreal 25.960281 40.91830
Boana fasciata Anura LC Arboreal 27.674729 39.93550
Boana geographica Anura LC Arboreal 27.270378 40.82012
Boana lanciformis Anura LC Arboreal 27.548262 41.40106
Boana pardalis Anura LC Arboreal 25.864258 41.60776
Boana pellucens Anura LC Arboreal 24.528305 40.30949
Boana pulchella Anura LC Arboreal 24.301597 37.43644
Boana punctata Anura LC Arboreal 27.294781 40.69742
Boana raniceps Anura LC Arboreal 27.604656 41.88333
Boana semilineata Anura LC Arboreal 25.643020 39.82591
Boehmantis microtympanum Anura VU Stream-dwelling 25.757692 37.09837
Bokermannohyla ahenea Anura DD Arboreal 26.714437 39.41886
Bokermannohyla alvarengai Anura LC Stream-dwelling 25.599042 38.86556
Bokermannohyla astartea Anura LC Arboreal 25.983974 39.29013
Bokermannohyla caramaschii Anura LC Arboreal 25.732565 39.37966
Bokermannohyla carvalhoi Anura LC Stream-dwelling 25.880419 38.97038
Bokermannohyla circumdata Anura LC Arboreal 25.813035 39.22074
Bokermannohyla diamantina Anura LC Stream-dwelling 25.469777 38.81539
Bokermannohyla feioi Anura DD Arboreal 25.986631 39.40794
Bokermannohyla gouveai Anura DD Arboreal 26.714437 39.47466
Bokermannohyla hylax Anura LC Stream-dwelling 25.259627 38.72696
Bokermannohyla ibitiguara Anura DD Stream-dwelling 25.893387 38.92256
Bokermannohyla ibitipoca Anura DD Ground-dwelling 25.986631 39.46694
Bokermannohyla itapoty Anura LC Stream-dwelling 25.141358 38.86695
Bokermannohyla izecksohni Anura CR Stream-dwelling 26.685256 39.02938
Bokermannohyla langei Anura DD Stream-dwelling 24.076546 38.68242
Bokermannohyla lucianae Anura DD Arboreal 25.575562 39.33023
Bokermannohyla luctuosa Anura LC Stream-dwelling 26.126466 38.96905
Bokermannohyla martinsi Anura LC Stream-dwelling 25.416083 38.90390
Bokermannohyla nanuzae Anura LC Stream-dwelling 25.220967 38.70840
Bokermannohyla oxente Anura LC Stream-dwelling 25.044554 38.80370
Bokermannohyla pseudopseudis Anura LC Stream-dwelling 27.148932 39.05212
Bokermannohyla ravida Anura CR Stream-dwelling 25.896628 38.85506
Bokermannohyla sagarana Anura NT Stream-dwelling 25.448851 38.73576
Bokermannohyla saxicola Anura LC Stream-dwelling 25.647486 38.88290
Bokermannohyla sazimai Anura DD Stream-dwelling 26.051435 38.93204
Bokermannohyla vulcaniae Anura VU Stream-dwelling 26.229490 38.96412
Bolitoglossa adspersa Caudata NT Ground-dwelling 23.375757 35.01615
Bolitoglossa alberchi Caudata VU Arboreal 27.571965 35.41554
Bolitoglossa altamazonica Caudata LC Arboreal 26.928397 35.31727
Bolitoglossa alvaradoi Caudata VU Arboreal 25.166998 35.13810
Bolitoglossa anthracina Caudata EN Ground-dwelling 28.045611 35.62816
Bolitoglossa biseriata Caudata LC Arboreal 26.013559 35.20968
Bolitoglossa borburata Caudata VU Ground-dwelling 26.774814 35.49960
Bolitoglossa bramei Caudata LC Ground-dwelling 24.380342 35.23452
Bolitoglossa capitana Caudata CR Ground-dwelling 25.027891 35.22293
Bolitoglossa carri Caudata CR Arboreal 24.318740 35.02266
Bolitoglossa celaque Caudata CR Ground-dwelling 26.199074 35.39871
Bolitoglossa cerroensis Caudata LC Ground-dwelling 17.152122 34.21138
Bolitoglossa chica Caudata CR Arboreal 24.641474 35.04432
Bolitoglossa colonnea Caudata LC Arboreal 26.327226 35.27273
Bolitoglossa compacta Caudata EN Arboreal 27.994452 35.45897
Bolitoglossa conanti Caudata VU Arboreal 26.473536 35.26234
Bolitoglossa copia Caudata CR Ground-dwelling 27.865817 35.60891
Bolitoglossa cuchumatana Caudata EN Ground-dwelling 25.015983 35.26934
Bolitoglossa cuna Caudata EN Arboreal 27.784908 35.48244
Bolitoglossa decora Caudata CR Arboreal 26.500799 35.22431
Bolitoglossa diaphora Caudata EN Arboreal 25.474466 35.15167
Bolitoglossa digitigrada Caudata DD Ground-dwelling 15.595790 34.12010
Bolitoglossa diminuta Caudata LC Arboreal 17.152122 34.23649
Bolitoglossa dofleini Caudata NT Ground-dwelling 26.510805 35.46937
Bolitoglossa dunni Caudata EN Arboreal 25.474466 35.15033
Bolitoglossa engelhardti Caudata EN Arboreal 25.044144 35.01740
Bolitoglossa epimela Caudata DD Arboreal 22.496670 34.74709
Bolitoglossa equatoriana Caudata LC Arboreal 25.602727 35.08541
Bolitoglossa flavimembris Caudata EN Arboreal 25.619531 35.24712
Bolitoglossa flaviventris Caudata EN Arboreal 25.619531 35.22976
Bolitoglossa franklini Caudata VU Arboreal 25.619531 35.21967
Bolitoglossa gomezi Caudata EN Arboreal 22.598867 34.75931
Bolitoglossa gracilis Caudata LC Arboreal 22.496670 34.70474
Bolitoglossa guaramacalensis Caudata EN Ground-dwelling 26.854615 35.53345
Bolitoglossa hartwegi Caudata VU Ground-dwelling 27.537114 35.56283
Bolitoglossa heiroreias Caudata EN Ground-dwelling 27.418815 35.50751
Bolitoglossa helmrichi Caudata VU Arboreal 26.351315 35.24076
Bolitoglossa hermosa Caudata LC Arboreal 24.338588 35.01215
Bolitoglossa hiemalis Caudata VU Arboreal 24.198867 35.05630
Bolitoglossa hypacra Caudata EN Ground-dwelling 26.189446 35.35404
Bolitoglossa indio Caudata EN Ground-dwelling 27.999336 35.71748
Bolitoglossa insularis Caudata CR Arboreal 27.511979 35.34534
Bolitoglossa jacksoni Caudata CR Ground-dwelling 22.662030 34.88489
Bolitoglossa lignicolor Caudata LC Arboreal 25.625888 35.15869
Bolitoglossa lincolni Caudata NT Arboreal 25.887566 35.22440
Bolitoglossa longissima Caudata CR Arboreal 26.625597 35.32198
Bolitoglossa lozanoi Caudata LC Arboreal 24.298380 35.03017
Bolitoglossa macrinii Caudata EN Ground-dwelling 27.045406 35.50188
Bolitoglossa magnifica Caudata EN Ground-dwelling 28.045611 35.66510
Bolitoglossa marmorea Caudata EN Arboreal 28.045611 35.45565
Bolitoglossa medemi Caudata LC Arboreal 26.620298 35.23989
Bolitoglossa meliana Caudata EN Ground-dwelling 24.928522 35.28320
Bolitoglossa mexicana Caudata LC Arboreal 26.874817 35.34260
Bolitoglossa minutula Caudata EN Arboreal 24.380342 35.02958
Bolitoglossa mombachoensis Caudata VU Arboreal 27.511979 35.41207
Bolitoglossa morio Caudata VU Arboreal 25.230886 35.09370
Bolitoglossa mulleri Caudata VU Ground-dwelling 25.645832 35.30342
Bolitoglossa nicefori Caudata LC Arboreal 23.646500 34.84944
Bolitoglossa nigrescens Caudata DD Ground-dwelling 22.557623 35.01034
Bolitoglossa oaxacensis Caudata EN Ground-dwelling 26.249975 35.35197
Bolitoglossa obscura Caudata DD Ground-dwelling 17.152122 34.28511
Bolitoglossa occidentalis Caudata LC Arboreal 26.906744 35.33661
Bolitoglossa odonnelli Caudata NT Arboreal 26.158443 35.23308
Bolitoglossa oresbia Caudata CR Arboreal 24.318740 34.98574
Bolitoglossa orestes Caudata EN Ground-dwelling 26.494876 35.44109
Bolitoglossa palmata Caudata LC Arboreal 22.977548 34.82095
Bolitoglossa pandi Caudata EN Ground-dwelling 25.264015 35.27981
Bolitoglossa paraensis Caudata DD Arboreal 27.914577 35.40482
Bolitoglossa peruviana Caudata DD Arboreal 24.265362 35.00238
Bolitoglossa pesrubra Caudata LC Ground-dwelling 17.152122 34.35948
Bolitoglossa phalarosoma Caudata NT Ground-dwelling 23.589426 35.05958
Bolitoglossa platydactyla Caudata LC Arboreal 25.449534 35.20336
Bolitoglossa porrasorum Caudata EN Arboreal 26.359827 35.22150
Bolitoglossa ramosi Caudata NT Arboreal 24.136537 34.99442
Bolitoglossa riletti Caudata EN Arboreal 25.492332 35.19302
Bolitoglossa robusta Caudata VU Ground-dwelling 26.203694 35.50123
Bolitoglossa rostrata Caudata NT Arboreal 26.131005 35.22358
Bolitoglossa rufescens Caudata LC Arboreal 26.366490 35.23682
Bolitoglossa salvinii Caudata VU Arboreal 26.839927 35.34877
Bolitoglossa savagei Caudata NT Arboreal 27.127537 35.30799
Bolitoglossa schizodactyla Caudata LC Arboreal 26.505798 35.29822
Bolitoglossa silverstonei Caudata DD Arboreal 25.939855 35.19025
Bolitoglossa sima Caudata LC Arboreal 24.131886 34.96832
Bolitoglossa sombra Caudata NT Arboreal 27.994452 35.51940
Bolitoglossa sooyorum Caudata EN Arboreal 17.152122 34.14158
Bolitoglossa striatula Caudata LC Arboreal 26.749826 35.31878
Bolitoglossa stuarti Caudata VU Arboreal 26.057831 35.14781
Bolitoglossa subpalmata Caudata LC Arboreal 24.241567 34.90223
Bolitoglossa suchitanensis Caudata CR Arboreal 27.418815 35.32682
Bolitoglossa synoria Caudata CR Arboreal 27.418815 35.37934
Bolitoglossa tatamae Caudata EN Arboreal 25.141645 35.15390
Bolitoglossa taylori Caudata EN Arboreal 27.251842 35.34441
Bolitoglossa tica Caudata DD Arboreal 22.557623 34.65574
Bolitoglossa vallecula Caudata LC Arboreal 23.207284 34.96187
Bolitoglossa veracrucis Caudata EN Arboreal 27.658423 35.37501
Bolitoglossa walkeri Caudata NT Arboreal 23.688838 34.92130
Bolitoglossa yucatana Caudata LC Ground-dwelling 27.792904 35.64822
Bolitoglossa zapoteca Caudata EN Ground-dwelling 27.639256 35.53174
Bombina bombina Anura LC Aquatic 19.600839 36.31431
Bombina lichuanensis Anura VU Aquatic 23.860005 36.93560
Bombina orientalis Anura LC Semi-aquatic 21.354441 36.71735
Bombina variegata Anura LC Aquatic 20.134362 36.43913
Boophis albilabris Anura LC Arboreal 26.092839 37.55715
Boophis albipunctatus Anura LC Stream-dwelling 25.673478 37.12471
Boophis andohahela Anura VU Arboreal 25.985815 37.60011
Boophis andrangoloaka Anura EN Arboreal 25.873667 37.54549
Boophis andreonei Anura VU Arboreal 26.747102 37.68055
Boophis anjanaharibeensis Anura EN Arboreal 26.808866 37.83211
Boophis ankaratra Anura LC Stream-dwelling 25.723660 37.13790
Boophis arcanus Anura EN Arboreal 25.476874 37.65828
Boophis axelmeyeri Anura LC Stream-dwelling 26.670216 37.26133
Boophis baetkei Anura CR Arboreal 26.637693 37.72976
Boophis blommersae Anura VU Arboreal 26.620481 37.71514
Boophis boehmei Anura EN Stream-dwelling 25.637918 37.10818
Boophis bottae Anura LC Stream-dwelling 25.570700 37.17976
Boophis brachychir Anura VU Stream-dwelling 26.714692 37.26761
Boophis burgeri Anura DD Arboreal 24.893568 37.47160
Boophis calcaratus Anura LC Stream-dwelling 25.593126 37.08903
Boophis doulioti Anura LC Arboreal 26.496964 37.67340
Boophis elenae Anura NT Arboreal 25.382631 37.54151
Boophis englaenderi Anura VU Stream-dwelling 26.730680 37.31068
Boophis entingae Anura LC Stream-dwelling 26.331658 37.26689
Boophis erythrodactylus Anura LC Arboreal 25.529662 37.59596
Boophis fayi Anura VU Arboreal 26.688369 37.72263
Boophis feonnyala Anura EN Arboreal 24.941303 37.50899
Boophis goudotii Anura LC Arboreal 26.020500 37.63171
Boophis guibei Anura LC Arboreal 25.739437 37.57859
Boophis haematopus Anura EN Arboreal 25.641574 37.67357
Boophis haingana Anura EN Stream-dwelling 25.850762 37.21462
Boophis idae Anura LC Arboreal 25.571929 37.56550
Boophis jaegeri Anura EN Arboreal 27.197740 37.84161
Boophis laurenti Anura EN Stream-dwelling 26.326721 37.27859
Boophis liami Anura CR Stream-dwelling 24.893568 37.09585
Boophis lichenoides Anura LC Arboreal 25.938187 37.62039
Boophis lilianae Anura DD Stream-dwelling 25.878849 37.11453
Boophis luciae Anura LC Stream-dwelling 25.395051 37.10448
Boophis luteus Anura LC Stream-dwelling 25.848192 37.06097
Boophis madagascariensis Anura LC Arboreal 25.982695 37.57762
Boophis majori Anura VU Stream-dwelling 26.044957 37.21940
Boophis mandraka Anura DD Stream-dwelling 25.873667 37.21284
Boophis marojezensis Anura LC Stream-dwelling 25.966956 37.23137
Boophis miadana Anura EN Stream-dwelling 25.850762 37.09621
Boophis microtympanum Anura LC Stream-dwelling 25.883333 37.13072
Boophis miniatus Anura VU Stream-dwelling 25.985815 37.19985
Boophis narinsi Anura EN Stream-dwelling 25.878849 37.19457
Boophis obscurus Anura NT Arboreal 26.075125 37.57010
Boophis occidentalis Anura LC Stream-dwelling 26.615217 37.16160
Boophis opisthodon Anura LC Arboreal 25.842126 37.58728
Boophis pauliani Anura LC Arboreal 25.598783 37.62823
Boophis periegetes Anura NT Stream-dwelling 25.985815 37.18043
Boophis picturatus Anura LC Stream-dwelling 25.591459 37.16653
Boophis piperatus Anura EN Arboreal 25.878849 37.61606
Boophis popi Anura VU Stream-dwelling 25.809404 37.11719
Boophis pyrrhus Anura LC Stream-dwelling 25.613574 37.17289
Boophis quasiboehmei Anura NT Stream-dwelling 25.985815 37.14288
Boophis rappiodes Anura LC Stream-dwelling 25.618272 37.10310
Boophis reticulatus Anura LC Stream-dwelling 26.045719 37.16294
Boophis rhodoscelis Anura EN Arboreal 25.486552 37.48013
Boophis roseipalmatus Anura LC Stream-dwelling 26.699189 37.25674
Boophis rufioculis Anura NT Stream-dwelling 25.257180 37.00601
Boophis sambirano Anura EN Stream-dwelling 26.611874 37.28686
Boophis sandrae Anura EN Stream-dwelling 25.878849 37.20558
Boophis schuboeae Anura EN Stream-dwelling 25.878849 37.19822
Boophis septentrionalis Anura LC Stream-dwelling 26.666151 37.30226
Boophis sibilans Anura LC Stream-dwelling 26.067958 37.17150
Boophis solomaso Anura EN Arboreal 25.459043 37.57401
Boophis spinophis Anura VU Arboreal 25.876258 37.61654
Boophis tampoka Anura LC Arboreal 27.523329 37.83848
Boophis tasymena Anura LC Stream-dwelling 25.748289 37.11291
Boophis tephraeomystax Anura LC Arboreal 26.186953 37.57573
Boophis tsilomaro Anura CR Stream-dwelling 26.870347 37.36806
Boophis ulftunni Anura VU Stream-dwelling 26.674312 37.32210
Boophis viridis Anura LC Stream-dwelling 25.946325 37.11726
Boophis vittatus Anura VU Stream-dwelling 26.755735 37.25858
Boophis williamsi Anura CR Stream-dwelling 25.047111 37.02814
Boophis xerophilus Anura LC Arboreal 26.370898 37.67364
Brachycephalus alipioi Anura DD Ground-dwelling 25.882443 36.86904
Brachycephalus brunneus Anura DD Ground-dwelling 24.076546 36.61716
Brachycephalus didactylus Anura LC Ground-dwelling 25.898882 36.84949
Brachycephalus ephippium Anura LC Ground-dwelling 25.644437 36.75274
Brachycephalus ferruginus Anura DD Ground-dwelling 24.076546 36.59358
Brachycephalus hermogenesi Anura LC Ground-dwelling 25.916037 36.88094
Brachycephalus izecksohni Anura DD Ground-dwelling 24.452954 36.63509
Brachycephalus nodoterga Anura DD Ground-dwelling 26.100808 36.88902
Brachycephalus pernix Anura DD Ground-dwelling 24.076546 36.62105
Brachycephalus pombali Anura DD Ground-dwelling 24.076546 36.63789
Brachycephalus vertebralis Anura DD Ground-dwelling 25.945038 36.89392
Bradytriton silus Caudata EN Ground-dwelling 25.458050 35.25300
Breviceps acutirostris Anura LC Fossorial 20.760336 38.48869
Breviceps adspersus Anura LC Fossorial 23.570948 39.03233
Breviceps bagginsi Anura NT Fossorial 22.656584 38.89477
Breviceps fichus Anura LC Fossorial 22.718272 38.96963
Breviceps fuscus Anura LC Fossorial 21.243853 38.75530
Breviceps gibbosus Anura NT Fossorial 21.001216 38.69188
Breviceps macrops Anura NT Fossorial 19.818320 38.55251
Breviceps montanus Anura LC Fossorial 20.944245 38.68382
Breviceps mossambicus Anura LC Fossorial 24.659477 39.17774
Breviceps namaquensis Anura LC Fossorial 20.504383 38.60059
Breviceps poweri Anura LC Fossorial 24.701932 39.14497
Breviceps rosei Anura LC Fossorial 20.748707 38.67321
Breviceps sopranus Anura LC Fossorial 23.994885 39.08456
Breviceps sylvestris Anura NT Fossorial 23.571001 38.96559
Breviceps verrucosus Anura LC Fossorial 22.082123 38.84260
Bromeliohyla bromeliacia Anura LC Arboreal 25.836263 39.61475
Bromeliohyla dendroscarta Anura EN Arboreal 24.877841 39.60097
Bryophryne bustamantei Anura LC Ground-dwelling 18.526994 29.42924
Bryophryne cophites Anura EN Ground-dwelling 14.573980 28.88458
Bryophryne hanssaueri Anura LC Ground-dwelling 14.573980 26.84399
Bryophryne nubilosus Anura LC Ground-dwelling 14.573980 27.79591
Bryophryne zonalis Anura DD Ground-dwelling 16.124027 29.06804
Buergeria buergeri Anura LC Stream-dwelling 24.779523 38.77806
Buergeria japonica Anura LC Stream-dwelling 27.364566 42.42741
Buergeria oxycephala Anura VU Stream-dwelling 28.158168 39.20777
Buergeria robusta Anura LC Stream-dwelling 27.659741 39.14232
Bufo ailaoanus Anura EN Ground-dwelling 22.776844 38.14185
Bufo aspinius Anura EN Ground-dwelling 19.730674 37.60945
Bufo bankorensis Anura LC Ground-dwelling 27.659741 39.90260
Bufo bufo Anura LC Ground-dwelling 18.399248 36.59578
Bufo cryptotympanicus Anura LC Ground-dwelling 27.141420 38.69097
Bufo eichwaldi Anura VU Ground-dwelling 19.754688 37.70858
Bufo gargarizans Anura LC Ground-dwelling 21.547784 37.45023
Bufo japonicus Anura LC Ground-dwelling 24.583291 38.30057
Bufo pageoti Anura LC Ground-dwelling 24.010444 38.21840
Bufo stejnegeri Anura LC Ground-dwelling 21.922708 37.95689
Bufo torrenticola Anura LC Ground-dwelling 24.922435 38.31224
Bufo tuberculatus Anura NT Ground-dwelling 14.960066 37.13719
Bufo verrucosissimus Anura NT Ground-dwelling 20.046666 37.70461
Bufoides meghalayanus Anura CR Stream-dwelling 23.160752 37.55810
Bufotes balearicus Anura LC Ground-dwelling 23.040906 38.97394
Bufotes boulengeri Anura LC Ground-dwelling 23.570923 39.56118
Bufotes latastii Anura LC Ground-dwelling 11.886503 37.44792
Bufotes luristanicus Anura LC Ground-dwelling 23.843311 39.02069
Bufotes oblongus Anura LC Ground-dwelling 20.317986 38.54715
Bufotes pseudoraddei Anura LC Ground-dwelling 16.716450 38.06262
Bufotes surdus Anura LC Ground-dwelling 24.383117 39.02273
Bufotes turanensis Anura LC Ground-dwelling 20.748044 38.56036
Bufotes variabilis Anura DD Ground-dwelling 20.423317 38.60514
Bufotes viridis Anura LC Ground-dwelling 19.928238 38.54712
Bufotes zamdaensis Anura DD Ground-dwelling 10.162427 37.20107
Bufotes zugmayeri Anura LC Ground-dwelling 20.205191 38.49797
Cacosternum boettgeri Anura LC Ground-dwelling 22.536368 37.23070
Cacosternum capense Anura NT Fossorial 20.840554 37.93128
Cacosternum karooicum Anura LC Ground-dwelling 20.656979 36.88748
Cacosternum kinangopensis Anura LC Ground-dwelling 19.795568 36.85106
Cacosternum leleupi Anura DD Ground-dwelling 24.621056 37.44957
Cacosternum namaquense Anura LC Ground-dwelling 20.327937 36.81791
Cacosternum nanum Anura LC Ground-dwelling 21.785986 37.09315
Cacosternum parvum Anura LC Ground-dwelling 22.512654 37.23265
Cacosternum platys Anura NT Ground-dwelling 21.185918 36.95376
Cacosternum plimptoni Anura LC Ground-dwelling 21.417496 37.07514
Cacosternum striatum Anura LC Ground-dwelling 22.687534 37.17161
Callixalus pictus Anura VU Arboreal 24.207253 40.10604
Callulina dawida Anura CR Ground-dwelling 24.513211 38.13491
Callulina hanseni Anura CR Arboreal 24.229692 37.94445
Callulina kanga Anura CR Arboreal 23.240992 37.85175
Callulina kisiwamsitu Anura EN Arboreal 25.085794 38.11232
Callulina kreffti Anura LC Ground-dwelling 24.120968 38.09435
Callulina laphami Anura CR Ground-dwelling 22.975393 37.80001
Callulina meteora Anura CR Ground-dwelling 24.229692 38.00859
Callulina shengena Anura CR Arboreal 23.549259 37.82283
Callulina stanleyi Anura CR Arboreal 23.549259 37.91939
Callulops boettgeri Anura DD Ground-dwelling 27.806165 35.44936
Callulops comptus Anura LC Ground-dwelling 25.600164 35.19325
Callulops doriae Anura LC Fossorial 27.314266 36.32844
Callulops dubius Anura DD Ground-dwelling 27.688151 35.52909
Callulops fuscus Anura DD Ground-dwelling 27.503461 35.36991
Callulops glandulosus Anura DD Ground-dwelling 25.222749 35.07696
Callulops humicola Anura LC Ground-dwelling 26.165987 35.19135
Callulops kopsteini Anura DD Ground-dwelling 27.394424 35.47908
Callulops marmoratus Anura DD Ground-dwelling 25.844142 35.11194
Callulops personatus Anura LC Ground-dwelling 26.593090 35.22548
Callulops robustus Anura LC Ground-dwelling 28.053530 35.52361
Callulops sagittatus Anura DD Ground-dwelling 27.821029 35.42945
Callulops stictogaster Anura LC Ground-dwelling 26.135498 35.24061
Callulops wilhelmanus Anura LC Ground-dwelling 25.851574 35.10413
Calotriton arnoldi Caudata CR Stream-dwelling 22.618672 36.18668
Calotriton asper Caudata LC Aquatic 20.522739 36.72091
Calyptocephalella gayi Anura VU Semi-aquatic 18.545296 35.48209
Capensibufo rosei Anura CR Ground-dwelling 21.643866 38.17566
Capensibufo tradouwi Anura LC Ground-dwelling 20.902333 38.01483
Cardioglossa alsco Anura EN Stream-dwelling 26.357174 38.38893
Cardioglossa cyaneospila Anura NT Stream-dwelling 22.643923 37.89071
Cardioglossa elegans Anura LC Stream-dwelling 27.261780 38.52308
Cardioglossa escalerae Anura LC Ground-dwelling 27.065792 39.10077
Cardioglossa gracilis Anura LC Stream-dwelling 27.425378 38.44030
Cardioglossa gratiosa Anura LC Stream-dwelling 27.598533 38.54087
Cardioglossa leucomystax Anura LC Stream-dwelling 27.538947 38.58442
Cardioglossa manengouba Anura CR Stream-dwelling 27.125406 38.44336
Cardioglossa melanogaster Anura VU Stream-dwelling 26.848365 38.26790
Cardioglossa nigromaculata Anura LC Ground-dwelling 26.956146 39.12168
Cardioglossa oreas Anura EN Stream-dwelling 26.186967 38.27619
Cardioglossa pulchra Anura EN Stream-dwelling 26.848365 38.40028
Cardioglossa schioetzi Anura VU Ground-dwelling 26.971511 38.94276
Cardioglossa trifasciata Anura CR Stream-dwelling 27.125406 38.50455
Cardioglossa venusta Anura EN Stream-dwelling 26.644872 38.51102
Celsiella revocata Anura VU Stream-dwelling 26.990795 37.15500
Celsiella vozmedianoi Anura EN Stream-dwelling 27.162122 37.21919
Centrolene acanthidiocephalum Anura DD Stream-dwelling 24.655161 36.74271
Centrolene antioquiense Anura NT Stream-dwelling 23.702532 36.58799
Centrolene azulae Anura DD Stream-dwelling 23.639051 36.63404
Centrolene ballux Anura EN Stream-dwelling 20.357864 36.14118
Centrolene buckleyi Anura CR Arboreal 21.772196 36.87032
Centrolene condor Anura EN Stream-dwelling 24.985852 36.82009
Centrolene heloderma Anura VU Stream-dwelling 23.038570 36.56249
Centrolene hybrida Anura LC Stream-dwelling 24.071993 36.72441
Centrolene lemniscatum Anura DD Stream-dwelling 20.676160 36.24785
Centrolene lynchi Anura EN Stream-dwelling 19.955019 36.21787
Centrolene medemi Anura EN Stream-dwelling 24.573686 36.85400
Centrolene muelleri Anura DD Stream-dwelling 21.684497 36.44397
Centrolene paezorum Anura DD Arboreal 22.965861 37.03440
Centrolene petrophilum Anura EN Stream-dwelling 22.672962 36.40842
Centrolene quindianum Anura VU Stream-dwelling 21.976471 36.36312
Centrolene robledoi Anura LC Stream-dwelling 23.732043 36.66538
Centrolene sanchezi Anura EN Stream-dwelling 24.311409 36.73500
Centrolene savagei Anura LC Stream-dwelling 23.651260 36.70811
Centrolene solitaria Anura EN Stream-dwelling 24.984184 36.87386
Centrolene venezuelense Anura LC Arboreal 26.180732 37.42952
Ceratophrys aurita Anura LC Ground-dwelling 25.567487 40.18355
Ceratophrys calcarata Anura LC Fossorial 27.187233 41.26734
Ceratophrys cornuta Anura LC Ground-dwelling 27.581916 40.38829
Ceratophrys cranwelli Anura LC Fossorial 26.543791 41.29429
Ceratophrys joazeirensis Anura LC Fossorial 25.658555 40.94949
Ceratophrys ornata Anura NT Fossorial 22.833026 40.66578
Ceratophrys stolzmanni Anura VU Fossorial 24.489585 40.89575
Ceratophrys testudo Anura DD Ground-dwelling 22.391675 39.69411
Ceuthomantis aracamuni Anura VU Stream-dwelling 27.148514 36.60049
Ceuthomantis cavernibardus Anura DD Ground-dwelling 27.345187 37.13779
Ceuthomantis duellmani Anura NT Ground-dwelling 25.633941 36.94058
Chacophrys pierottii Anura LC Fossorial 25.281818 41.30955
Chalcorana labialis Anura LC Stream-dwelling 28.513467 36.71876
Chaltenobatrachus grandisonae Anura LC Ground-dwelling 9.302062 34.32942
Chaperina fusca Anura LC Ground-dwelling 28.087198 37.97000
Charadrahyla altipotens Anura EN Stream-dwelling 26.750407 39.32493
Charadrahyla chaneque Anura VU Stream-dwelling 27.916913 39.53108
Charadrahyla nephila Anura EN Stream-dwelling 24.877841 39.11710
Charadrahyla taeniopus Anura VU Stream-dwelling 24.292827 38.94413
Charadrahyla trux Anura EN Stream-dwelling 24.898057 39.20608
Chiasmocleis albopunctata Anura LC Ground-dwelling 27.636008 39.15798
Chiasmocleis anatipes Anura LC Ground-dwelling 25.720042 38.93187
Chiasmocleis atlantica Anura LC Ground-dwelling 25.957753 38.89244
Chiasmocleis avilapiresae Anura LC Ground-dwelling 28.598105 39.29131
Chiasmocleis bassleri Anura LC Fossorial 27.977183 39.48638
Chiasmocleis capixaba Anura LC Ground-dwelling 25.482296 38.85121
Chiasmocleis carvalhoi Anura LC Ground-dwelling 28.825682 39.29089
Chiasmocleis centralis Anura DD Fossorial 27.681265 40.22685
Chiasmocleis cordeiroi Anura DD Ground-dwelling 25.290920 38.87725
Chiasmocleis crucis Anura DD Ground-dwelling 25.290920 38.87659
Chiasmocleis devriesi Anura LC Ground-dwelling 29.259139 39.41411
Chiasmocleis gnoma Anura DD Ground-dwelling 25.575562 38.98301
Chiasmocleis leucosticta Anura LC Ground-dwelling 25.613517 38.81315
Chiasmocleis mantiqueira Anura DD Ground-dwelling 25.385011 38.83824
Chiasmocleis mehelyi Anura DD Ground-dwelling 28.424427 39.25723
Chiasmocleis sapiranga Anura DD Ground-dwelling 25.347262 38.83671
Chiasmocleis schubarti Anura LC Ground-dwelling 25.619304 38.91709
Chiasmocleis shudikarensis Anura LC Ground-dwelling 28.309660 39.16878
Chiasmocleis ventrimaculata Anura LC Ground-dwelling 25.287059 39.05689
Chimerella mariaelenae Anura LC Arboreal 23.968092 37.32826
Chioglossa lusitanica Caudata NT Semi-aquatic 19.397356 35.90501
Chiromantis kelleri Anura LC Arboreal 24.201731 37.59062
Chiromantis petersii Anura LC Arboreal 22.572522 37.28907
Chiromantis rufescens Anura LC Arboreal 27.422120 37.89269
Chiromantis xerampelina Anura LC Arboreal 24.629246 37.48643
Chiropterotriton arboreus Caudata CR Arboreal 22.456489 34.25029
Chiropterotriton chiropterus Caudata CR Arboreal 23.670587 34.55569
Chiropterotriton chondrostega Caudata EN Ground-dwelling 22.985598 34.62620
Chiropterotriton cracens Caudata VU Arboreal 23.875739 34.34074
Chiropterotriton dimidiatus Caudata VU Ground-dwelling 22.456489 34.70079
Chiropterotriton lavae Caudata CR Arboreal 23.670587 34.64732
Chiropterotriton magnipes Caudata EN Ground-dwelling 24.768025 34.80108
Chiropterotriton multidentatus Caudata EN Arboreal 23.434675 34.12898
Chiropterotriton orculus Caudata VU Ground-dwelling 22.628670 34.62606
Chiropterotriton priscus Caudata NT Ground-dwelling 23.616357 34.76496
Chiropterotriton terrestris Caudata CR Ground-dwelling 22.456489 34.51213
Choerophryne allisoni Anura DD Ground-dwelling 27.746469 35.43948
Choerophryne burtoni Anura LC Ground-dwelling 26.648279 35.33633
Choerophryne longirostris Anura NT Ground-dwelling 26.680670 35.43326
Choerophryne proboscidea Anura LC Ground-dwelling 26.804713 35.31035
Choerophryne rostellifer Anura LC Ground-dwelling 27.110137 35.51442
Chrysobatrachus cupreonitens Anura EN Ground-dwelling 24.760431 40.32205
Chrysopaa sternosignata Anura LC Aquatic 21.840283 38.87001
Churamiti maridadi Anura CR Arboreal 23.164809 38.45230
Clinotarsus alticola Anura LC Stream-dwelling 26.321123 36.80310
Clinotarsus curtipes Anura NT Ground-dwelling 27.442806 37.53812
Cochranella duidaeana Anura VU Arboreal 25.966820 37.38187
Cochranella euhystrix Anura CR Stream-dwelling 24.501951 36.75748
Cochranella euknemos Anura LC Stream-dwelling 27.173527 37.11358
Cochranella geijskesi Anura LC Stream-dwelling 27.864585 37.18824
Cochranella granulosa Anura LC Stream-dwelling 26.857850 37.10394
Cochranella litoralis Anura VU Arboreal 24.237877 37.21247
Cochranella mache Anura NT Stream-dwelling 25.040235 36.90191
Cochranella nola Anura LC Stream-dwelling 20.474365 36.24395
Cochranella phryxa Anura DD Arboreal 21.367657 36.80487
Cochranella ramirezi Anura NT Stream-dwelling 26.854328 36.97990
Cochranella resplendens Anura LC Arboreal 24.570365 37.23554
Cochranella riveroi Anura VU Arboreal 27.148514 37.53012
Cochranella xanthocheridia Anura VU Stream-dwelling 26.309963 36.95214
Colostethus agilis Anura EN Stream-dwelling 24.488847 36.42008
Colostethus furviventris Anura DD Ground-dwelling 25.897334 37.32270
Colostethus imbricolus Anura EN Stream-dwelling 26.270731 36.70531
Colostethus inguinalis Anura LC Stream-dwelling 26.203944 36.65937
Colostethus jacobuspetersi Anura CR Stream-dwelling 19.955019 33.04428
Colostethus latinasus Anura CR Stream-dwelling 26.419274 36.63794
Colostethus lynchi Anura DD Stream-dwelling 26.170801 36.70192
Colostethus mertensi Anura VU Stream-dwelling 22.973694 36.21107
Colostethus panamansis Anura LC Stream-dwelling 27.267328 36.88392
Colostethus poecilonotus Anura DD Stream-dwelling 20.676160 35.86808
Colostethus pratti Anura LC Ground-dwelling 27.152895 37.40522
Colostethus ruthveni Anura NT Ground-dwelling 27.054234 37.38271
Colostethus thorntoni Anura VU Stream-dwelling 23.702532 36.34465
Colostethus ucumari Anura EN Stream-dwelling 21.387901 35.95434
Conraua alleni Anura LC Stream-dwelling 27.645187 37.15143
Conraua beccarii Anura LC Aquatic 22.692453 37.27820
Conraua crassipes Anura LC Stream-dwelling 27.458357 37.16659
Conraua derooi Anura CR Stream-dwelling 28.529434 37.36481
Conraua goliath Anura EN Stream-dwelling 26.912407 37.04253
Conraua robusta Anura VU Stream-dwelling 26.757210 37.13678
Cophixalus aenigma Anura VU Ground-dwelling 26.770769 31.93758
Cophixalus ateles Anura LC Ground-dwelling 28.253641 35.55341
Cophixalus australis Anura LC Ground-dwelling 25.716398 36.09088
Cophixalus balbus Anura LC Ground-dwelling 26.815468 35.47824
Cophixalus bewaniensis Anura DD Ground-dwelling 27.435119 35.45390
Cophixalus biroi Anura LC Arboreal 26.857727 35.17441
Cophixalus bombiens Anura LC Ground-dwelling 27.142482 35.05508
Cophixalus cheesmanae Anura LC Arboreal 26.953586 35.26999
Cophixalus concinnus Anura CR Ground-dwelling 26.770769 32.54635
Cophixalus crepitans Anura LC Ground-dwelling 27.713309 35.49277
Cophixalus cryptotympanum Anura LC Arboreal 27.678143 35.32172
Cophixalus daymani Anura DD Ground-dwelling 27.678143 35.54617
Cophixalus exiguus Anura LC Ground-dwelling 27.553338 37.00910
Cophixalus hosmeri Anura EN Arboreal 26.770769 34.54901
Cophixalus humicola Anura LC Ground-dwelling 27.420124 35.48242
Cophixalus infacetus Anura LC Ground-dwelling 25.979991 36.23516
Cophixalus kaindiensis Anura NT Ground-dwelling 27.123724 35.41876
Cophixalus mcdonaldi Anura CR Arboreal 25.349393 34.76999
Cophixalus misimae Anura CR Ground-dwelling 28.053530 35.58199
Cophixalus montanus Anura DD Ground-dwelling 27.806165 35.48532
Cophixalus monticola Anura CR Arboreal 26.770769 33.94986
Cophixalus neglectus Anura CR Ground-dwelling 25.057956 33.78706
Cophixalus nubicola Anura VU Ground-dwelling 25.302822 35.28140
Cophixalus ornatus Anura LC Arboreal 25.914362 34.53138
Cophixalus parkeri Anura LC Arboreal 26.531987 35.27392
Cophixalus peninsularis Anura DD Arboreal 27.713309 35.39473
Cophixalus pipilans Anura LC Ground-dwelling 26.470859 35.29121
Cophixalus pulchellus Anura DD Arboreal 27.640106 35.48146
Cophixalus riparius Anura LC Ground-dwelling 26.561291 35.26635
Cophixalus saxatilis Anura LC Ground-dwelling 27.553338 36.29204
Cophixalus shellyi Anura LC Arboreal 26.579382 35.18030
Cophixalus sphagnicola Anura EN Ground-dwelling 27.123724 35.34194
Cophixalus tagulensis Anura DD Stream-dwelling 27.393260 34.79336
Cophixalus tetzlaffi Anura DD Arboreal 27.036350 35.19231
Cophixalus timidus Anura CR Arboreal 27.537304 35.31361
Cophixalus tridactylus Anura DD Ground-dwelling 28.031168 35.48436
Cophixalus variabilis Anura LC Ground-dwelling 27.766333 35.42897
Cophixalus verecundus Anura LC Ground-dwelling 28.037156 35.44217
Cophixalus verrucosus Anura LC Arboreal 27.407842 35.41382
Cophixalus zweifeli Anura LC Ground-dwelling 27.790765 35.49349
Cophyla berara Anura EN Arboreal 26.870347 37.94474
Cophyla occultans Anura VU Arboreal 26.719720 37.90472
Cophyla phyllodactyla Anura LC Arboreal 26.830751 37.97836
Copiula exspectata Anura DD Ground-dwelling 26.372759 35.29939
Copiula fistulans Anura LC Ground-dwelling 27.000028 35.46483
Copiula major Anura DD Ground-dwelling 28.031168 35.50245
Copiula minor Anura LC Ground-dwelling 27.379962 35.49038
Copiula obsti Anura DD Ground-dwelling 28.031168 35.50330
Copiula oxyrhina Anura LC Ground-dwelling 28.053530 35.62946
Copiula pipiens Anura LC Ground-dwelling 27.051912 35.43940
Copiula tyleri Anura LC Ground-dwelling 26.892563 35.51787
Corythomantis greeningi Anura LC Arboreal 26.033842 40.09760
Craugastor alfredi Anura LC Arboreal 27.020193 36.61815
Craugastor amniscola Anura VU Stream-dwelling 25.901343 35.94564
Craugastor angelicus Anura CR Stream-dwelling 27.731359 36.32655
Craugastor aphanus Anura EN Ground-dwelling 25.474466 36.67500
Craugastor augusti Anura LC Ground-dwelling 24.200783 36.31445
Craugastor aurilegulus Anura VU Stream-dwelling 26.278457 36.00591
Craugastor azueroensis Anura EN Stream-dwelling 26.275222 36.13027
Craugastor batrachylus Anura DD Ground-dwelling 23.875739 36.32757
Craugastor berkenbuschii Anura LC Stream-dwelling 25.225505 35.94306
Craugastor bocourti Anura EN Arboreal 26.075416 36.49897
Craugastor bransfordii Anura LC Ground-dwelling 26.786091 36.74854
Craugastor brocchi Anura VU Stream-dwelling 25.462435 35.99055
Craugastor campbelli Anura CR Arboreal 25.474466 36.46219
Craugastor chac Anura LC Ground-dwelling 26.463013 36.66723
Craugastor charadra Anura VU Stream-dwelling 26.473536 36.03417
Craugastor chingopetaca Anura VU Ground-dwelling 27.691165 36.92987
Craugastor coffeus Anura CR Ground-dwelling 26.138128 36.53246
Craugastor crassidigitus Anura LC Ground-dwelling 26.936382 37.54566
Craugastor cuaquero Anura DD Ground-dwelling 27.731359 36.88368
Craugastor cyanochthebius Anura EN Arboreal 25.474466 36.42463
Craugastor daryi Anura EN Stream-dwelling 25.349043 35.57151
Craugastor decoratus Anura LC Arboreal 24.518565 36.30394
Craugastor emcelae Anura CR Ground-dwelling 27.994452 36.90438
Craugastor emleni Anura EN Ground-dwelling 25.576439 36.58345
Craugastor escoces Anura CR Stream-dwelling 27.731359 36.21644
Craugastor fitzingeri Anura LC Ground-dwelling 26.812109 38.46130
Craugastor fleischmanni Anura CR Stream-dwelling 27.731359 36.25573
Craugastor glaucus Anura EN Ground-dwelling 27.194866 36.85722
Craugastor gollmeri Anura LC Ground-dwelling 26.779860 36.76161
Craugastor greggi Anura EN Stream-dwelling 23.968709 35.81130
Craugastor guerreroensis Anura EN Ground-dwelling 25.457526 36.52432
Craugastor gulosus Anura CR Ground-dwelling 24.380342 36.43902
Craugastor hobartsmithi Anura LC Ground-dwelling 25.303696 36.52275
Craugastor inachus Anura CR Stream-dwelling 27.110302 36.23299
Craugastor laevissimus Anura EN Stream-dwelling 26.630581 36.16533
Craugastor laticeps Anura LC Ground-dwelling 26.887605 36.74548
Craugastor lauraster Anura LC Ground-dwelling 26.791078 36.75074
Craugastor lineatus Anura LC Ground-dwelling 26.379870 36.72910
Craugastor loki Anura LC Ground-dwelling 26.652294 35.94649
Craugastor longirostris Anura LC Ground-dwelling 25.857168 40.03914
Craugastor matudai Anura EN Ground-dwelling 26.235202 36.58994
Craugastor megacephalus Anura LC Ground-dwelling 26.911973 36.63022
Craugastor megalotympanum Anura EN Ground-dwelling 27.340327 36.91699
Craugastor melanostictus Anura LC Ground-dwelling 26.440663 36.72010
Craugastor mexicanus Anura LC Ground-dwelling 24.976744 35.92426
Craugastor milesi Anura CR Stream-dwelling 25.474466 35.94533
Craugastor mimus Anura LC Ground-dwelling 26.587873 36.72383
Craugastor monnichorum Anura EN Ground-dwelling 27.067969 36.82566
Craugastor montanus Anura EN Ground-dwelling 26.885462 36.70397
Craugastor nefrens Anura CR Arboreal 25.474466 36.51217
Craugastor noblei Anura LC Ground-dwelling 26.835731 36.83365
Craugastor obesus Anura CR Stream-dwelling 27.994452 36.30467
Craugastor occidentalis Anura LC Ground-dwelling 25.134861 36.47173
Craugastor omiltemanus Anura LC Ground-dwelling 25.559113 36.03844
Craugastor opimus Anura LC Ground-dwelling 26.490708 36.64065
Craugastor palenque Anura VU Stream-dwelling 26.471393 36.11186
Craugastor pechorum Anura EN Stream-dwelling 26.423793 36.18001
Craugastor pelorus Anura VU Stream-dwelling 27.958357 36.36224
Craugastor persimilis Anura LC Ground-dwelling 24.312211 36.48403
Craugastor podiciferus Anura LC Ground-dwelling 25.746687 36.57346
Craugastor polymniae Anura NT Arboreal 22.681874 36.06014
Craugastor polyptychus Anura LC Ground-dwelling 24.312211 36.42835
Craugastor pozo Anura CR Ground-dwelling 27.337554 36.77760
Craugastor psephosypharus Anura NT Ground-dwelling 26.492495 36.69384
Craugastor pygmaeus Anura LC Ground-dwelling 26.071316 36.64900
Craugastor raniformis Anura LC Ground-dwelling 26.108760 37.45439
Craugastor ranoides Anura CR Stream-dwelling 27.409431 36.09250
Craugastor rayo Anura EN Stream-dwelling 17.152122 36.80196
Craugastor rhodopis Anura LC Ground-dwelling 24.732453 34.93023
Craugastor rivulus Anura VU Stream-dwelling 24.937621 35.93491
Craugastor rostralis Anura VU Ground-dwelling 26.473536 36.70978
Craugastor rugosus Anura LC Ground-dwelling 24.985341 36.01946
Craugastor rugulosus Anura LC Stream-dwelling 26.453613 35.97726
Craugastor rupinius Anura LC Ground-dwelling 26.659205 36.60987
Craugastor sabrinus Anura NT Ground-dwelling 26.704409 36.71873
Craugastor sandersoni Anura EN Stream-dwelling 26.512609 36.06845
Craugastor silvicola Anura DD Ground-dwelling 28.096738 36.92681
Craugastor spatulatus Anura EN Ground-dwelling 24.925561 36.48972
Craugastor stadelmani Anura CR Stream-dwelling 26.359827 36.18131
Craugastor stejnegerianus Anura LC Ground-dwelling 23.992746 36.34252
Craugastor stuarti Anura VU Stream-dwelling 25.994708 35.94722
Craugastor tabasarae Anura CR Arboreal 26.711713 38.52725
Craugastor talamancae Anura LC Arboreal 26.902873 37.38187
Craugastor tarahumaraensis Anura LC Ground-dwelling 24.395400 36.39567
Craugastor taurus Anura EN Stream-dwelling 27.413059 35.99851
Craugastor taylori Anura CR Ground-dwelling 28.254069 36.95984
Craugastor underwoodi Anura LC Ground-dwelling 25.746687 36.58874
Craugastor uno Anura VU Ground-dwelling 25.963008 36.65078
Craugastor vocalis Anura LC Arboreal 25.017837 36.45354
Craugastor vulcani Anura EN Stream-dwelling 27.340327 36.16378
Craugastor xucanebi Anura VU Ground-dwelling 25.462435 36.56254
Craugastor yucatanensis Anura NT Ground-dwelling 27.720569 36.83231
Crinia bilingua Anura LC Semi-aquatic 28.059965 36.95912
Crinia deserticola Anura LC Ground-dwelling 25.871326 36.41819
Crinia georgiana Anura LC Ground-dwelling 20.029898 35.58104
Crinia glauerti Anura LC Ground-dwelling 19.782633 35.51285
Crinia insignifera Anura LC Ground-dwelling 20.861641 35.73876
Crinia nimbus Anura LC Ground-dwelling 16.143565 34.69687
Crinia parinsignifera Anura LC Ground-dwelling 22.005880 36.38861
Crinia pseudinsignifera Anura LC Ground-dwelling 20.680445 35.71931
Crinia remota Anura LC Ground-dwelling 27.727604 36.58740
Crinia riparia Anura LC Stream-dwelling 21.635756 35.26242
Crinia signifera Anura LC Ground-dwelling 20.824835 35.75982
Crinia sloanei Anura DD Ground-dwelling 21.643351 35.84259
Crinia subinsignifera Anura LC Ground-dwelling 19.430828 35.55190
Crinia tasmaniensis Anura NT Aquatic 16.572454 34.93300
Crinia tinnula Anura VU Ground-dwelling 23.147243 36.16709
Crossodactylodes bokermanni Anura NT Arboreal 25.848416 39.29806
Crossodactylodes izecksohni Anura NT Ground-dwelling 25.780363 39.40108
Crossodactylodes pintoi Anura DD Ground-dwelling 26.900371 39.58043
Crossodactylus aeneus Anura DD Stream-dwelling 25.971802 36.48206
Crossodactylus bokermanni Anura DD Stream-dwelling 24.594125 36.26222
Crossodactylus caramaschii Anura LC Stream-dwelling 26.224611 36.44698
Crossodactylus cyclospinus Anura DD Ground-dwelling 25.570778 37.06869
Crossodactylus dantei Anura DD Stream-dwelling 25.717618 36.45160
Crossodactylus dispar Anura DD Stream-dwelling 25.884900 36.56237
Crossodactylus gaudichaudii Anura LC Stream-dwelling 25.818289 36.47595
Crossodactylus grandis Anura DD Stream-dwelling 26.714437 36.58624
Crossodactylus lutzorum Anura DD Stream-dwelling 24.908486 36.30559
Crossodactylus schmidti Anura NT Stream-dwelling 26.937501 36.39089
Crossodactylus trachystomus Anura DD Stream-dwelling 25.220967 36.41798
Cruziohyla calcarifer Anura LC Arboreal 25.069627 39.74203
Cruziohyla craspedopus Anura LC Arboreal 27.853871 39.75005
Cryptobatrachus boulengeri Anura VU Stream-dwelling 27.177346 37.37975
Cryptobatrachus fuhrmanni Anura LC Stream-dwelling 24.297754 36.98166
Cryptobranchus alleganiensis Caudata VU Stream-dwelling 24.534220 35.65815
Cryptothylax greshoffii Anura LC Arboreal 28.004166 39.79262
Cryptothylax minutus Anura DD Arboreal 28.365283 39.87188
Cryptotriton alvarezdeltoroi Caudata EN Ground-dwelling 27.958357 35.42940
Cryptotriton monzoni Caudata CR Arboreal 27.418815 35.17119
Cryptotriton nasalis Caudata EN Arboreal 25.474466 34.89288
Cryptotriton sierraminensis Caudata CR Arboreal 26.801790 35.18130
Cryptotriton veraepacis Caudata CR Arboreal 25.349043 34.93650
Ctenophryne aequatorialis Anura EN Ground-dwelling 23.042671 38.45808
Ctenophryne aterrima Anura LC Ground-dwelling 25.500839 38.74449
Ctenophryne barbatula Anura EN Ground-dwelling 21.293309 38.27611
Ctenophryne carpish Anura EN Ground-dwelling 22.692835 38.42140
Ctenophryne geayi Anura LC Fossorial 27.503489 40.16382
Ctenophryne minor Anura DD Ground-dwelling 25.763603 38.78732
Cycloramphus acangatan Anura VU Ground-dwelling 26.230104 37.62665
Cycloramphus asper Anura DD Stream-dwelling 24.666127 36.90611
Cycloramphus bandeirensis Anura DD Stream-dwelling 25.804730 37.04777
Cycloramphus bolitoglossus Anura DD Ground-dwelling 24.968342 37.52467
Cycloramphus boraceiensis Anura LC Stream-dwelling 25.888359 37.05139
Cycloramphus brasiliensis Anura NT Stream-dwelling 26.612447 37.15081
Cycloramphus carvalhoi Anura DD Ground-dwelling 26.714437 37.74655
Cycloramphus catarinensis Anura DD Ground-dwelling 24.890967 37.43949
Cycloramphus cedrensis Anura DD Stream-dwelling 24.923386 36.91333
Cycloramphus diringshofeni Anura DD Ground-dwelling 24.923386 37.57332
Cycloramphus dubius Anura LC Stream-dwelling 26.100808 36.98619
Cycloramphus duseni Anura DD Stream-dwelling 24.264750 36.78580
Cycloramphus eleutherodactylus Anura DD Ground-dwelling 26.100659 37.54010
Cycloramphus faustoi Anura CR Stream-dwelling 24.541828 36.81523
Cycloramphus fuliginosus Anura LC Stream-dwelling 25.653109 36.90669
Cycloramphus granulosus Anura DD Stream-dwelling 25.655903 36.95077
Cycloramphus izecksohni Anura DD Stream-dwelling 24.823516 36.90275
Cycloramphus juimirim Anura DD Stream-dwelling 26.483769 37.00972
Cycloramphus lutzorum Anura DD Stream-dwelling 25.708717 36.95304
Cycloramphus migueli Anura DD Ground-dwelling 25.433241 37.53720
Cycloramphus mirandaribeiroi Anura DD Stream-dwelling 24.076546 36.76392
Cycloramphus ohausi Anura DD Stream-dwelling 26.561451 37.13208
Cycloramphus organensis Anura DD Ground-dwelling 26.222532 37.63898
Cycloramphus rhyakonastes Anura LC Stream-dwelling 24.264750 36.69705
Cycloramphus semipalmatus Anura NT Stream-dwelling 25.842462 36.98936
Cycloramphus stejnegeri Anura DD Ground-dwelling 26.561451 37.71046
Cycloramphus valae Anura DD Stream-dwelling 24.832390 36.77750
Cyclorana alboguttata Anura LC Fossorial 25.245123 40.23933
Cyclorana australis Anura LC Fossorial 27.115732 40.53779
Cyclorana brevipes Anura LC Fossorial 25.024737 40.11857
Cyclorana cryptotis Anura LC Fossorial 27.630825 40.20151
Cyclorana cultripes Anura LC Fossorial 25.210857 39.97785
Cyclorana longipes Anura LC Fossorial 27.757735 40.21860
Cyclorana maculosa Anura LC Fossorial 27.086446 40.12158
Cyclorana maini Anura LC Fossorial 24.139385 39.71855
Cyclorana manya Anura LC Ground-dwelling 27.470148 39.26400
Cyclorana novaehollandiae Anura LC Fossorial 25.263213 40.07103
Cyclorana platycephala Anura LC Fossorial 24.106506 39.66049
Cyclorana vagitus Anura LC Ground-dwelling 27.912414 39.35691
Cyclorana verrucosa Anura LC Ground-dwelling 23.995390 38.70900
Cynops ensicauda Caudata VU Semi-aquatic 27.459041 37.76809
Cynops orientalis Caudata LC Aquatic 27.296492 38.43084
Cynops pyrrhogaster Caudata NT Aquatic 24.831461 37.36820
Dasypops schirchi Anura VU Ground-dwelling 25.440299 39.23137
Dendrobates auratus Anura LC Arboreal 26.872392 36.12723
Dendrobates leucomelas Anura LC Ground-dwelling 27.069394 36.25718
Dendrobates nubeculosus Anura DD Ground-dwelling 27.273349 36.26240
Dendrobates tinctorius Anura LC Ground-dwelling 27.634502 36.27345
Dendrobates truncatus Anura LC Ground-dwelling 26.090033 36.02161
Dendrophryniscus berthalutzae Anura LC Ground-dwelling 24.848540 38.48806
Dendrophryniscus brevipollicatus Anura LC Ground-dwelling 25.731762 38.64234
Dendrophryniscus carvalhoi Anura EN Ground-dwelling 25.780363 38.63662
Dendrophryniscus krausae Anura DD Ground-dwelling 24.675082 38.51068
Dendrophryniscus leucomystax Anura LC Ground-dwelling 25.946098 38.60674
Dendrophryniscus proboscideus Anura DD Ground-dwelling 25.580083 38.66175
Dendrophryniscus stawiarskyi Anura DD Ground-dwelling 25.193051 38.55494
Dendropsophus acreanus Anura LC Arboreal 27.437922 39.59908
Dendropsophus amicorum Anura CR Arboreal 26.512811 39.34266
Dendropsophus anataliasiasi Anura LC Arboreal 28.039030 39.59007
Dendropsophus anceps Anura LC Arboreal 25.783667 38.48105
Dendropsophus aperomeus Anura LC Arboreal 22.215423 38.80584
Dendropsophus araguaya Anura DD Arboreal 28.087613 39.62913
Dendropsophus battersbyi Anura DD Arboreal 26.059239 39.33252
Dendropsophus berthalutzae Anura LC Arboreal 25.724969 39.22320
Dendropsophus bifurcus Anura LC Arboreal 26.612696 40.61988
Dendropsophus bipunctatus Anura LC Arboreal 25.559113 39.17893
Dendropsophus bogerti Anura LC Arboreal 24.667136 39.09452
Dendropsophus bokermanni Anura LC Arboreal 27.068784 39.26777
Dendropsophus branneri Anura LC Arboreal 26.171617 39.21296
Dendropsophus brevifrons Anura LC Arboreal 27.292773 39.04357
Dendropsophus cachimbo Anura DD Arboreal 27.627043 39.43833
Dendropsophus carnifex Anura LC Arboreal 20.357864 39.06586
Dendropsophus cerradensis Anura DD Arboreal 28.495858 39.59927
Dendropsophus columbianus Anura LC Arboreal 23.424122 38.88123
Dendropsophus cruzi Anura LC Arboreal 27.483785 39.40032
Dendropsophus decipiens Anura LC Arboreal 26.000427 37.57455
Dendropsophus delarivai Anura LC Arboreal 21.374359 38.75539
Dendropsophus dutrai Anura DD Arboreal 25.568736 39.21987
Dendropsophus ebraccatus Anura LC Arboreal 26.315557 41.16053
Dendropsophus elegans Anura LC Arboreal 25.642711 38.95188
Dendropsophus elianeae Anura LC Arboreal 27.614484 39.46240
Dendropsophus garagoensis Anura LC Arboreal 21.635496 38.81709
Dendropsophus gaucheri Anura LC Arboreal 27.310570 39.44360
Dendropsophus giesleri Anura LC Arboreal 25.935007 39.35880
Dendropsophus gryllatus Anura EN Arboreal 26.492617 39.38078
Dendropsophus haddadi Anura LC Arboreal 25.452224 37.49919
Dendropsophus haraldschultzi Anura LC Arboreal 28.221121 39.56977
Dendropsophus jimi Anura LC Arboreal 26.204206 39.29304
Dendropsophus joannae Anura DD Arboreal 26.093068 39.34245
Dendropsophus juliani Anura LC Arboreal 28.319663 39.28517
Dendropsophus koechlini Anura LC Arboreal 26.511801 39.88397
Dendropsophus leali Anura LC Arboreal 27.647982 39.47427
Dendropsophus leucophyllatus Anura LC Arboreal 27.682505 40.90721
Dendropsophus limai Anura DD Arboreal 26.100808 39.29183
Dendropsophus luteoocellatus Anura LC Arboreal 26.706239 39.37550
Dendropsophus marmoratus Anura LC Arboreal 27.685951 41.20292
Dendropsophus mathiassoni Anura LC Arboreal 25.902772 39.22489
Dendropsophus melanargyreus Anura LC Arboreal 28.038188 40.34036
Dendropsophus meridensis Anura EN Arboreal 26.315006 39.23188
Dendropsophus meridianus Anura LC Arboreal 26.139322 40.05475
Dendropsophus microcephalus Anura LC Arboreal 27.817589 39.52707
Dendropsophus microps Anura LC Arboreal 25.512886 39.24881
Dendropsophus minimus Anura DD Arboreal 27.713726 39.57622
Dendropsophus minusculus Anura LC Arboreal 26.834742 39.01926
Dendropsophus minutus Anura LC Arboreal 27.146531 36.68436
Dendropsophus miyatai Anura LC Arboreal 28.174783 39.57863
Dendropsophus molitor Anura LC Arboreal 23.133534 38.52362
Dendropsophus nahdereri Anura LC Arboreal 24.676541 39.07518
Dendropsophus nanus Anura LC Arboreal 27.360017 39.50671
Dendropsophus novaisi Anura DD Arboreal 25.265065 40.72616
Dendropsophus oliveirai Anura LC Arboreal 25.429361 39.24590
Dendropsophus padreluna Anura LC Arboreal 25.264015 39.27090
Dendropsophus parviceps Anura LC Arboreal 27.642072 39.23710
Dendropsophus pauiniensis Anura LC Arboreal 29.313518 39.65297
Dendropsophus phlebodes Anura LC Arboreal 26.933782 39.35373
Dendropsophus praestans Anura LC Arboreal 23.532804 38.91484
Dendropsophus pseudomeridianus Anura LC Arboreal 26.283101 39.30081
Dendropsophus reichlei Anura LC Arboreal 24.237789 39.17382
Dendropsophus rhea Anura DD Arboreal 26.255622 39.34419
Dendropsophus rhodopeplus Anura LC Arboreal 26.559980 39.33239
Dendropsophus riveroi Anura LC Arboreal 27.578064 39.53953
Dendropsophus robertmertensi Anura LC Arboreal 27.247135 39.47485
Dendropsophus rossalleni Anura LC Arboreal 27.536702 39.47597
Dendropsophus rubicundulus Anura LC Arboreal 27.808066 39.14474
Dendropsophus ruschii Anura DD Stream-dwelling 25.960155 38.82913
Dendropsophus sanborni Anura LC Arboreal 25.398394 38.66284
Dendropsophus sarayacuensis Anura LC Arboreal 27.479768 40.11249
Dendropsophus sartori Anura LC Arboreal 26.026173 39.33582
Dendropsophus schubarti Anura LC Arboreal 27.194186 38.40187
Dendropsophus seniculus Anura LC Arboreal 25.811706 39.88124
Dendropsophus soaresi Anura LC Arboreal 26.654593 39.29160
Dendropsophus stingi Anura LC Arboreal 22.707356 38.79190
Dendropsophus studerae Anura DD Arboreal 25.646250 39.28343
Dendropsophus subocularis Anura LC Arboreal 26.164225 39.31133
Dendropsophus timbeba Anura LC Arboreal 28.110142 39.58654
Dendropsophus tintinnabulum Anura DD Arboreal 28.702738 39.55289
Dendropsophus triangulum Anura LC Arboreal 27.646987 40.40873
Dendropsophus tritaeniatus Anura LC Arboreal 27.549505 39.11010
Dendropsophus virolinensis Anura LC Arboreal 22.327385 38.81960
Dendropsophus walfordi Anura LC Arboreal 28.413231 39.64983
Dendropsophus werneri Anura LC Arboreal 25.442044 39.19621
Dendropsophus xapuriensis Anura LC Arboreal 28.110142 39.49541
Dendropsophus yaracuyanus Anura EN Arboreal 26.601412 39.37143
Dendrotriton bromeliacius Caudata CR Arboreal 24.928522 35.03750
Dendrotriton chujorum Caudata CR Arboreal 22.662030 34.79236
Dendrotriton cuchumatanus Caudata CR Arboreal 22.662030 34.73941
Dendrotriton kekchiorum Caudata CR Arboreal 25.349043 35.09067
Dendrotriton megarhinus Caudata VU Arboreal 27.337554 35.35586
Dendrotriton rabbi Caudata CR Arboreal 22.662030 34.77409
Dendrotriton sanctibarbarus Caudata CR Arboreal 26.199074 35.22021
Dendrotriton xolocalcae Caudata VU Arboreal 25.275389 35.07660
Dermatonotus muelleri Anura LC Fossorial 27.020960 42.30867
Desmognathus abditus Caudata NT Semi-aquatic 26.356968 35.28367
Desmognathus aeneus Caudata NT Semi-aquatic 27.537673 35.17627
Desmognathus apalachicolae Caudata LC Semi-aquatic 28.062047 35.51204
Desmognathus auriculatus Caudata LC Semi-aquatic 25.298117 35.11676
Desmognathus brimleyorum Caudata LC Semi-aquatic 26.947408 35.82675
Desmognathus carolinensis Caudata LC Semi-aquatic 26.207634 35.13370
Desmognathus folkertsi Caudata DD Semi-aquatic 26.950810 34.67904
Desmognathus fuscus Caudata LC Semi-aquatic 24.023747 35.62162
Desmognathus imitator Caudata NT Semi-aquatic 26.514326 35.28786
Desmognathus marmoratus Caudata LC Semi-aquatic 26.406589 34.67088
Desmognathus monticola Caudata LC Semi-aquatic 25.478165 35.29317
Desmognathus ochrophaeus Caudata LC Ground-dwelling 22.540643 34.13248
Desmognathus ocoee Caudata LC Aquatic 27.101724 35.31309
Desmognathus orestes Caudata LC Ground-dwelling 25.906741 35.23962
Desmognathus quadramaculatus Caudata LC Semi-aquatic 26.070850 33.69661
Desmognathus santeetlah Caudata NT Semi-aquatic 26.591833 35.24782
Desmognathus welteri Caudata LC Semi-aquatic 25.946996 35.29489
Desmognathus wrighti Caudata LC Ground-dwelling 26.248866 34.76759
Diasporus anthrax Anura VU Arboreal 24.378682 37.08018
Diasporus diastema Anura LC Arboreal 26.971043 37.43427
Diasporus gularis Anura LC Arboreal 25.356227 37.26345
Diasporus hylaeformis Anura LC Arboreal 26.112788 37.31997
Diasporus quidditus Anura LC Arboreal 26.490708 37.40321
Diasporus tigrillo Anura NT Arboreal 17.152122 36.12977
Diasporus tinker Anura LC Arboreal 25.914869 37.28944
Diasporus ventrimaculatus Anura LC Arboreal 22.547707 36.87783
Diasporus vocator Anura LC Ground-dwelling 26.018200 37.46944
Dicamptodon aterrimus Caudata LC Semi-aquatic 17.101000 31.37457
Dicamptodon copei Caudata LC Semi-aquatic 17.347847 31.43012
Dicamptodon ensatus Caudata NT Semi-aquatic 18.759912 31.64686
Dicamptodon tenebrosus Caudata LC Semi-aquatic 18.157101 30.64604
Didynamipus sjostedti Anura VU Ground-dwelling 27.149317 38.93885
Dischidodactylus colonnelloi Anura NT Ground-dwelling 25.966820 33.50341
Dischidodactylus duidensis Anura NT Ground-dwelling 25.966820 33.63090
Discoglossus galganoi Anura LC Ground-dwelling 20.978326 36.36188
Discoglossus montalentii Anura NT Stream-dwelling 23.907151 36.47700
Discoglossus pictus Anura LC Ground-dwelling 23.610725 37.67673
Discoglossus sardus Anura LC Semi-aquatic 24.112551 37.70948
Discoglossus scovazzi Anura LC Ground-dwelling 22.242137 37.14216
Dryaderces pearsoni Anura LC Arboreal 24.422344 39.77109
Dryophytes andersonii Anura NT Arboreal 25.245655 41.14011
Dryophytes chrysoscelis Anura LC Arboreal 23.585198 40.72708
Dryophytes cinereus Anura LC Arboreal 26.544490 40.49593
Dryophytes squirellus Anura LC Arboreal 27.010215 39.14930
Dryophytes versicolor Anura LC Arboreal 22.427734 40.18615
Dryophytes walkeri Anura VU Ground-dwelling 26.099377 39.62454
Duellmanohyla chamulae Anura EN Stream-dwelling 27.856972 39.31893
Duellmanohyla ignicolor Anura NT Stream-dwelling 22.681874 38.69132
Duellmanohyla lythrodes Anura EN Stream-dwelling 22.547707 38.67094
Duellmanohyla rufioculis Anura LC Stream-dwelling 26.413149 39.22395
Duellmanohyla salvavida Anura EN Stream-dwelling 26.359827 39.25951
Duellmanohyla schmidtorum Anura NT Arboreal 27.265994 39.76709
Duellmanohyla soralia Anura EN Stream-dwelling 25.474466 39.10842
Duellmanohyla uranochroa Anura VU Stream-dwelling 25.742721 39.12069
Duttaphrynus atukoralei Anura LC Ground-dwelling 28.283385 39.20717
Duttaphrynus beddomii Anura EN Ground-dwelling 27.436624 39.10207
Duttaphrynus brevirostris Anura DD Ground-dwelling 26.875890 38.96001
Duttaphrynus crocus Anura DD Ground-dwelling 28.060554 39.14880
Duttaphrynus dhufarensis Anura LC Ground-dwelling 26.396144 38.98432
Duttaphrynus himalayanus Anura LC Ground-dwelling 17.040383 37.71068
Duttaphrynus hololius Anura DD Ground-dwelling 27.484257 39.10020
Duttaphrynus kotagamai Anura EN Stream-dwelling 27.674004 38.52603
Duttaphrynus melanostictus Anura LC Ground-dwelling 27.297149 39.04040
Duttaphrynus microtympanum Anura VU Ground-dwelling 27.689666 39.06526
Duttaphrynus noellerti Anura CR Ground-dwelling 27.674004 39.12732
Duttaphrynus olivaceus Anura LC Ground-dwelling 25.555449 38.85446
Duttaphrynus parietalis Anura NT Ground-dwelling 27.521169 39.00541
Duttaphrynus scaber Anura LC Ground-dwelling 27.735331 39.12624
Duttaphrynus scorteccii Anura DD Ground-dwelling 24.960146 38.67214
Duttaphrynus silentvalleyensis Anura DD Stream-dwelling 27.229333 38.51447
Duttaphrynus stomaticus Anura LC Ground-dwelling 25.566819 38.86884
Duttaphrynus stuarti Anura DD Ground-dwelling 16.296188 37.60106
Duttaphrynus sumatranus Anura DD Stream-dwelling 28.953653 38.61715
Duttaphrynus valhallae Anura DD Ground-dwelling 27.719854 39.08125
Dyscophus antongilii Anura LC Ground-dwelling 25.909711 37.45396
Dyscophus guineti Anura LC Ground-dwelling 25.903595 37.41835
Dyscophus insularis Anura LC Ground-dwelling 26.780872 37.67815
Echinotriton andersoni Caudata VU Ground-dwelling 27.426915 37.23031
Echinotriton chinhaiensis Caudata CR Semi-aquatic 26.353124 37.28446
Ecnomiohyla fimbrimembra Anura VU Arboreal 27.872730 39.91963
Ecnomiohyla miliaria Anura LC Arboreal 26.366312 39.69064
Ecnomiohyla minera Anura VU Arboreal 25.470278 39.54116
Ecnomiohyla phantasmagoria Anura DD Arboreal 27.116029 39.64954
Ecnomiohyla salvaje Anura EN Arboreal 26.446640 39.59994
Ecnomiohyla thysanota Anura DD Arboreal 28.084410 39.85482
Ecnomiohyla valancifer Anura CR Arboreal 27.246796 39.78186
Edalorhina nasuta Anura DD Ground-dwelling 21.293309 39.11863
Edalorhina perezi Anura LC Ground-dwelling 27.472338 39.87779
Elachistocleis bicolor Anura LC Ground-dwelling 25.444636 40.29163
Elachistocleis bumbameuboi Anura DD Ground-dwelling 28.118040 40.21410
Elachistocleis carvalhoi Anura LC Ground-dwelling 28.115455 40.11957
Elachistocleis erythrogaster Anura NT Fossorial 24.832390 40.69351
Elachistocleis helianneae Anura LC Ground-dwelling 28.506363 40.16861
Elachistocleis matogrosso Anura LC Ground-dwelling 28.346739 40.20173
Elachistocleis ovalis Anura LC Ground-dwelling 27.329532 40.28098
Elachistocleis panamensis Anura LC Ground-dwelling 26.878044 39.95379
Elachistocleis pearsei Anura LC Ground-dwelling 26.579021 39.95016
Elachistocleis piauiensis Anura LC Fossorial 26.992571 41.01712
Elachistocleis skotogaster Anura LC Ground-dwelling 21.207480 39.26198
Elachistocleis surinamensis Anura LC Ground-dwelling 26.865438 40.25495
Elachistocleis surumu Anura DD Ground-dwelling 26.980457 40.00518
Eleutherodactylus abbotti Anura LC Ground-dwelling 27.495746 37.95103
Eleutherodactylus acmonis Anura EN Ground-dwelling 27.562183 37.98041
Eleutherodactylus adelus Anura EN Ground-dwelling 27.366651 38.68829
Eleutherodactylus albipes Anura CR Ground-dwelling 27.614799 38.01530
Eleutherodactylus albolabris Anura LC Arboreal 25.798221 37.55591
Eleutherodactylus alcoae Anura LC Ground-dwelling 27.542308 38.11753
Eleutherodactylus alticola Anura CR Ground-dwelling 27.737137 36.79960
Eleutherodactylus amadeus Anura CR Ground-dwelling 27.822577 37.97878
Eleutherodactylus amplinympha Anura EN Arboreal 26.442520 38.30562
Eleutherodactylus andrewsi Anura EN Stream-dwelling 27.737137 36.13568
Eleutherodactylus angustidigitorum Anura LC Ground-dwelling 24.325483 37.48523
Eleutherodactylus antillensis Anura LC Ground-dwelling 27.179744 45.48420
Eleutherodactylus apostates Anura CR Ground-dwelling 27.822577 38.13406
Eleutherodactylus armstrongi Anura EN Arboreal 27.542308 37.90914
Eleutherodactylus atkinsi Anura LC Ground-dwelling 27.534126 38.04955
Eleutherodactylus audanti Anura VU Ground-dwelling 27.702299 37.97748
Eleutherodactylus auriculatoides Anura VU Arboreal 26.991300 37.75529
Eleutherodactylus auriculatus Anura LC Arboreal 27.520657 37.79129
Eleutherodactylus bakeri Anura CR Arboreal 27.822577 37.94394
Eleutherodactylus barlagnei Anura EN Stream-dwelling 26.795585 37.86941
Eleutherodactylus bartonsmithi Anura CR Arboreal 27.581470 37.89290
Eleutherodactylus blairhedgesi Anura CR Ground-dwelling 27.301388 38.76281
Eleutherodactylus bresslerae Anura CR Ground-dwelling 27.510782 37.98067
Eleutherodactylus brevirostris Anura CR Ground-dwelling 27.822577 38.06947
Eleutherodactylus brittoni Anura LC Ground-dwelling 27.011994 36.51035
Eleutherodactylus caribe Anura CR Ground-dwelling 27.523870 38.00877
Eleutherodactylus casparii Anura EN Ground-dwelling 27.643132 39.03029
Eleutherodactylus cavernicola Anura CR Ground-dwelling 27.504519 36.88949
Eleutherodactylus chlorophenax Anura CR Ground-dwelling 27.822577 38.05001
Eleutherodactylus cochranae Anura LC Arboreal 27.071064 39.37864
Eleutherodactylus cooki Anura EN Ground-dwelling 26.947933 39.39453
Eleutherodactylus coqui Anura LC Ground-dwelling 26.083947 40.90880
Eleutherodactylus corona Anura CR Arboreal 27.523870 37.82462
Eleutherodactylus counouspeus Anura EN Ground-dwelling 27.822577 38.01135
Eleutherodactylus cubanus Anura CR Ground-dwelling 27.614799 38.05333
Eleutherodactylus cundalli Anura VU Ground-dwelling 27.568588 36.69839
Eleutherodactylus cuneatus Anura LC Ground-dwelling 27.630529 37.94503
Eleutherodactylus cystignathoides Anura LC Ground-dwelling 24.513708 37.48011
Eleutherodactylus dennisi Anura LC Ground-dwelling 24.033580 37.46241
Eleutherodactylus dilatus Anura LC Ground-dwelling 25.457526 37.66425
Eleutherodactylus dimidiatus Anura NT Ground-dwelling 27.556167 38.13660
Eleutherodactylus diplasius Anura CR Arboreal 27.822577 37.74976
Eleutherodactylus dolomedes Anura CR Arboreal 27.523870 37.87252
Eleutherodactylus eileenae Anura NT Arboreal 27.486164 37.88846
Eleutherodactylus emiliae Anura EN Ground-dwelling 27.709367 38.17767
Eleutherodactylus etheridgei Anura EN Ground-dwelling 27.886726 38.01219
Eleutherodactylus eunaster Anura CR Arboreal 27.822577 37.85860
Eleutherodactylus flavescens Anura NT Ground-dwelling 27.138011 37.90314
Eleutherodactylus fowleri Anura CR Arboreal 27.582022 37.81730
Eleutherodactylus furcyensis Anura CR Ground-dwelling 27.582022 37.98770
Eleutherodactylus fuscus Anura EN Ground-dwelling 27.491538 36.69654
Eleutherodactylus glamyrus Anura EN Arboreal 27.614799 37.88597
Eleutherodactylus glandulifer Anura CR Stream-dwelling 27.822577 37.27570
Eleutherodactylus glaphycompus Anura EN Ground-dwelling 27.828823 38.07257
Eleutherodactylus glaucoreius Anura EN Ground-dwelling 27.596018 36.75454
Eleutherodactylus goini Anura VU Ground-dwelling 27.440766 38.82233
Eleutherodactylus gossei Anura VU Ground-dwelling 27.545850 35.99394
Eleutherodactylus grabhami Anura EN Ground-dwelling 27.512405 36.95863
Eleutherodactylus grahami Anura EN Ground-dwelling 28.196464 37.94317
Eleutherodactylus grandis Anura EN Ground-dwelling 20.209526 36.85980
Eleutherodactylus greyi Anura EN Ground-dwelling 27.579183 37.90973
Eleutherodactylus griphus Anura EN Ground-dwelling 27.453434 36.80400
Eleutherodactylus gryllus Anura CR Ground-dwelling 26.895578 39.44209
Eleutherodactylus guanahacabibes Anura EN Ground-dwelling 27.455733 38.88408
Eleutherodactylus guantanamera Anura VU Arboreal 27.761412 37.85071
Eleutherodactylus gundlachi Anura EN Ground-dwelling 27.598135 36.97142
Eleutherodactylus guttilatus Anura LC Ground-dwelling 22.967170 37.39208
Eleutherodactylus haitianus Anura EN Ground-dwelling 27.074157 37.91164
Eleutherodactylus hedricki Anura EN Arboreal 26.947933 39.34725
Eleutherodactylus heminota Anura VU Arboreal 27.702299 37.88515
Eleutherodactylus hypostenor Anura EN Fossorial 27.392803 38.83535
Eleutherodactylus iberia Anura CR Ground-dwelling 27.510782 37.96736
Eleutherodactylus inoptatus Anura NT Ground-dwelling 27.399358 37.92958
Eleutherodactylus intermedius Anura EN Ground-dwelling 27.719198 37.92732
Eleutherodactylus interorbitalis Anura LC Ground-dwelling 24.982538 37.69562
Eleutherodactylus ionthus Anura EN Arboreal 27.684286 37.78845
Eleutherodactylus jamaicensis Anura CR Arboreal 27.549902 36.62972
Eleutherodactylus jaumei Anura CR Ground-dwelling 27.614799 38.02875
Eleutherodactylus johnstonei Anura LC Ground-dwelling 26.384983 38.82813
Eleutherodactylus juanariveroi Anura CR Arboreal 27.000287 37.75126
Eleutherodactylus jugans Anura CR Ground-dwelling 27.582022 38.03411
Eleutherodactylus junori Anura CR Ground-dwelling 27.453434 36.69593
Eleutherodactylus klinikowskii Anura EN Arboreal 27.421610 37.78878
Eleutherodactylus lamprotes Anura CR Arboreal 27.822577 37.86821
Eleutherodactylus leberi Anura EN Arboreal 27.592556 37.93930
Eleutherodactylus lentus Anura EN Ground-dwelling 27.053915 37.84754
Eleutherodactylus leoncei Anura EN Ground-dwelling 27.582022 38.03619
Eleutherodactylus leprus Anura LC Ground-dwelling 26.615753 37.73000
Eleutherodactylus limbatus Anura VU Ground-dwelling 27.520337 37.95711
Eleutherodactylus locustus Anura EN Ground-dwelling 26.947933 39.41718
Eleutherodactylus longipes Anura LC Ground-dwelling 23.766035 37.46216
Eleutherodactylus luteolus Anura EN Ground-dwelling 27.491538 36.79565
Eleutherodactylus maestrensis Anura DD Ground-dwelling 27.592556 38.12627
Eleutherodactylus mariposa Anura CR Arboreal 27.652158 37.89949
Eleutherodactylus marnockii Anura LC Ground-dwelling 24.663276 37.70097
Eleutherodactylus martinicensis Anura NT Ground-dwelling 27.054082 38.52126
Eleutherodactylus maurus Anura VU Ground-dwelling 23.760426 37.36942
Eleutherodactylus melacara Anura EN Arboreal 27.570363 37.89638
Eleutherodactylus michaelschmidi Anura EN Ground-dwelling 27.592556 37.90425
Eleutherodactylus minutus Anura EN Ground-dwelling 26.991300 37.87858
Eleutherodactylus modestus Anura LC Ground-dwelling 26.357765 37.83804
Eleutherodactylus monensis Anura VU Ground-dwelling 27.006480 37.77161
Eleutherodactylus montanus Anura EN Arboreal 26.991300 37.77185
Eleutherodactylus nitidus Anura LC Ground-dwelling 24.432589 37.59836
Eleutherodactylus nortoni Anura CR Arboreal 27.702299 37.82596
Eleutherodactylus notidodes Anura EN Ground-dwelling 27.322727 38.00086
Eleutherodactylus nubicola Anura EN Ground-dwelling 27.737137 36.77174
Eleutherodactylus orientalis Anura CR Ground-dwelling 27.510782 37.97474
Eleutherodactylus oxyrhyncus Anura CR Ground-dwelling 27.828823 38.06467
Eleutherodactylus pallidus Anura LC Ground-dwelling 25.520838 37.75386
Eleutherodactylus pantoni Anura VU Ground-dwelling 27.573404 36.82764
Eleutherodactylus parabates Anura EN Ground-dwelling 27.322727 37.90251
Eleutherodactylus paralius Anura NT Ground-dwelling 27.184021 37.99019
Eleutherodactylus parapelates Anura CR Fossorial 27.822577 38.95439
Eleutherodactylus patriciae Anura EN Ground-dwelling 27.074157 37.99647
Eleutherodactylus paulsoni Anura CR Ground-dwelling 27.822577 37.97738
Eleutherodactylus pentasyringos Anura EN Ground-dwelling 27.596018 36.71571
Eleutherodactylus pezopetrus Anura CR Ground-dwelling 27.652158 38.76641
Eleutherodactylus pictissimus Anura LC Ground-dwelling 27.620697 37.94380
Eleutherodactylus pinarensis Anura EN Ground-dwelling 27.443331 38.83706
Eleutherodactylus pinchoni Anura EN Ground-dwelling 26.795585 38.46535
Eleutherodactylus pipilans Anura LC Ground-dwelling 26.793819 37.84489
Eleutherodactylus pituinus Anura EN Ground-dwelling 27.452105 37.95172
Eleutherodactylus planirostris Anura LC Ground-dwelling 27.509882 39.57513
Eleutherodactylus poolei Anura CR Ground-dwelling 27.615665 37.90884
Eleutherodactylus portoricensis Anura EN Arboreal 26.947933 38.01534
Eleutherodactylus principalis Anura EN Arboreal 27.581470 37.78190
Eleutherodactylus probolaeus Anura EN Ground-dwelling 27.333685 37.87787
Eleutherodactylus rhodesi Anura CR Ground-dwelling 27.615665 37.92630
Eleutherodactylus richmondi Anura EN Ground-dwelling 26.967448 36.06096
Eleutherodactylus ricordii Anura VU Ground-dwelling 27.702767 38.01624
Eleutherodactylus riparius Anura LC Ground-dwelling 27.490988 37.92287
Eleutherodactylus rivularis Anura CR Stream-dwelling 27.592556 37.34004
Eleutherodactylus rogersi Anura LC Ground-dwelling 27.514327 38.93096
Eleutherodactylus ronaldi Anura VU Arboreal 27.630529 37.84238
Eleutherodactylus rubrimaculatus Anura LC Arboreal 26.436284 37.69213
Eleutherodactylus rufescens Anura VU Ground-dwelling 24.900279 37.60152
Eleutherodactylus rufifemoralis Anura EN Ground-dwelling 27.322727 38.00513
Eleutherodactylus ruthae Anura EN Ground-dwelling 27.268600 37.80060
Eleutherodactylus saxatilis Anura NT Ground-dwelling 24.339830 37.49418
Eleutherodactylus schwartzi Anura EN Arboreal 27.307342 39.60023
Eleutherodactylus sciagraphus Anura CR Ground-dwelling 27.523870 37.90352
Eleutherodactylus semipalmatus Anura CR Stream-dwelling 27.523870 37.37791
Eleutherodactylus simulans Anura EN Stream-dwelling 27.510782 38.31419
Eleutherodactylus sisyphodemus Anura CR Ground-dwelling 27.453434 36.73614
Eleutherodactylus sommeri Anura EN Arboreal 27.352654 37.83090
Eleutherodactylus symingtoni Anura CR Ground-dwelling 27.420242 37.92649
Eleutherodactylus syristes Anura LC Ground-dwelling 25.730310 37.60785
Eleutherodactylus teretistes Anura VU Ground-dwelling 26.071220 37.78692
Eleutherodactylus tetajulia Anura CR Ground-dwelling 27.510782 37.86862
Eleutherodactylus thomasi Anura EN Ground-dwelling 27.443945 38.83212
Eleutherodactylus thorectes Anura CR Ground-dwelling 27.822577 38.11761
Eleutherodactylus toa Anura EN Stream-dwelling 27.581470 37.40200
Eleutherodactylus tonyi Anura CR Ground-dwelling 27.418378 38.84121
Eleutherodactylus turquinensis Anura CR Stream-dwelling 27.570363 37.20572
Eleutherodactylus unicolor Anura CR Ground-dwelling 26.895578 37.17115
Eleutherodactylus varians Anura VU Arboreal 27.501161 37.82141
Eleutherodactylus varleyi Anura LC Arboreal 27.541721 37.78503
Eleutherodactylus ventrilineatus Anura CR Ground-dwelling 27.822577 37.98980
Eleutherodactylus verrucipes Anura LC Ground-dwelling 23.398189 37.43768
Eleutherodactylus verruculatus Anura DD Ground-dwelling 25.789382 37.02382
Eleutherodactylus warreni Anura CR Ground-dwelling 27.569939 38.05176
Eleutherodactylus weinlandi Anura LC Ground-dwelling 27.284379 37.80637
Eleutherodactylus wetmorei Anura VU Arboreal 27.702299 37.88778
Eleutherodactylus wightmanae Anura EN Ground-dwelling 26.967448 38.44741
Eleutherodactylus zeus Anura EN Ground-dwelling 27.421610 37.83616
Eleutherodactylus zugi Anura EN Ground-dwelling 27.431507 37.96426
Engystomops coloradorum Anura DD Ground-dwelling 23.223818 39.58919
Engystomops freibergi Anura LC Ground-dwelling 27.203910 38.85152
Engystomops guayaco Anura VU Ground-dwelling 25.400340 39.79879
Engystomops montubio Anura LC Ground-dwelling 24.805125 40.03025
Engystomops petersi Anura LC Ground-dwelling 26.307738 39.15097
Engystomops pustulatus Anura LC Ground-dwelling 24.976623 39.80387
Engystomops pustulosus Anura LC Ground-dwelling 26.715957 40.22347
Engystomops randi Anura LC Ground-dwelling 24.012050 40.34653
Ensatina eschscholtzii Caudata LC Ground-dwelling 18.836284 32.91529
Epidalea calamita Anura LC Ground-dwelling 18.946651 37.84349
Epipedobates anthonyi Anura NT Stream-dwelling 24.287714 38.08664
Epipedobates boulengeri Anura LC Ground-dwelling 24.596625 38.45501
Epipedobates espinosai Anura DD Ground-dwelling 26.492617 38.30124
Epipedobates machalilla Anura LC Ground-dwelling 24.205183 38.42124
Epipedobates narinensis Anura DD Ground-dwelling 25.685333 38.35300
Epipedobates tricolor Anura VU Ground-dwelling 24.376884 38.16998
Ericabatrachus baleensis Anura CR Stream-dwelling 20.234697 36.08897
Espadarana andina Anura LC Stream-dwelling 25.196056 36.30884
Espadarana callistomma Anura LC Stream-dwelling 25.022677 36.68396
Espadarana prosoblepon Anura LC Stream-dwelling 25.946623 34.64812
Euparkerella brasiliensis Anura LC Ground-dwelling 26.561451 32.60237
Euparkerella cochranae Anura LC Ground-dwelling 26.139322 32.52436
Euparkerella robusta Anura VU Ground-dwelling 25.062742 32.37005
Euparkerella tridactyla Anura VU Ground-dwelling 25.780363 32.53310
Euphlyctis cyanophlyctis Anura LC Semi-aquatic 26.304602 40.70802
Euphlyctis ehrenbergii Anura LC Semi-aquatic 24.847347 40.49134
Euphlyctis ghoshi Anura DD Semi-aquatic 29.154321 41.12957
Euphlyctis hexadactylus Anura LC Semi-aquatic 28.040768 40.80705
Euproctus montanus Caudata LC Ground-dwelling 23.907151 36.90737
Euproctus platycephalus Caudata VU Semi-aquatic 24.223789 37.05327
Eupsophus calcaratus Anura LC Ground-dwelling 12.642379 34.41997
Eupsophus emiliopugini Anura LC Stream-dwelling 13.959862 33.98838
Eupsophus insularis Anura CR Ground-dwelling 17.600648 35.18766
Eupsophus roseus Anura LC Ground-dwelling 17.544739 35.07897
Eupsophus vertebralis Anura LC Stream-dwelling 16.949035 34.42205
Eurycea bislineata Caudata LC Semi-aquatic 20.187894 35.95183
Eurycea chisholmensis Caudata VU Aquatic 26.949102 37.10387
Eurycea cirrigera Caudata LC Semi-aquatic 25.996266 36.89886
Eurycea guttolineata Caudata LC Semi-aquatic 26.517536 37.18805
Eurycea junaluska Caudata VU Semi-aquatic 26.581556 37.03581
Eurycea longicauda Caudata LC Semi-aquatic 24.434459 36.55944
Eurycea lucifuga Caudata LC Ground-dwelling 25.546638 36.39959
Eurycea multiplicata Caudata LC Semi-aquatic 26.029694 37.69546
Eurycea nana Caudata VU Semi-aquatic 26.983744 37.94661
Eurycea naufragia Caudata CR Semi-aquatic 26.993225 37.19732
Eurycea pterophila Caudata DD Aquatic 26.653134 37.12976
Eurycea quadridigitata Caudata LC Semi-aquatic 27.194656 37.82619
Eurycea sosorum Caudata VU Aquatic 26.993225 36.44107
Eurycea tonkawae Caudata EN Aquatic 26.993225 37.13338
Eurycea tridentifera Caudata VU Aquatic 26.414533 37.05075
Eurycea troglodytes Caudata DD Aquatic 26.391024 37.08305
Eurycea tynerensis Caudata NT Aquatic 24.563444 36.85870
Eurycea waterlooensis Caudata VU Aquatic 26.993225 37.12570
Eurycea wilderae Caudata LC Semi-aquatic 26.288242 36.96612
Excidobates captivus Anura VU Stream-dwelling 24.921417 36.24945
Excidobates mysteriosus Anura EN Arboreal 22.464285 36.34906
Exerodonta abdivita Anura NT Arboreal 25.036151 39.41800
Exerodonta bivocata Anura EN Stream-dwelling 27.856972 39.41679
Exerodonta catracha Anura NT Arboreal 25.258907 39.50650
Exerodonta chimalapa Anura EN Stream-dwelling 27.717146 39.35949
Exerodonta melanomma Anura VU Arboreal 26.427187 39.69618
Exerodonta perkinsi Anura EN Stream-dwelling 24.849453 38.92487
Exerodonta smaragdina Anura LC Arboreal 24.904230 39.51408
Exerodonta sumichrasti Anura LC Arboreal 26.695158 39.72291
Exerodonta xera Anura VU Arboreal 24.564704 39.44796
Feihyla kajau Anura LC Arboreal 28.009651 37.98732
Feihyla palpebralis Anura NT Arboreal 26.827687 37.82180
Fejervarya cancrivora Anura LC Ground-dwelling 27.854868 40.98138
Fejervarya iskandari Anura LC Ground-dwelling 28.288023 40.22677
Fejervarya limnocharis Anura LC Ground-dwelling 26.626652 40.14625
Fejervarya moodiei Anura LC Semi-aquatic 28.194985 40.57529
Fejervarya multistriata Anura DD Semi-aquatic 27.639777 40.40612
Fejervarya orissaensis Anura LC Ground-dwelling 28.250446 40.30574
Fejervarya triora Anura LC Ground-dwelling 29.065317 40.33634
Fejervarya verruculosa Anura LC Ground-dwelling 27.492559 40.11217
Fejervarya vittigera Anura LC Ground-dwelling 27.739300 40.18512
Flectonotus fitzgeraldi Anura LC Arboreal 26.772971 37.59875
Flectonotus pygmaeus Anura LC Arboreal 26.029395 37.56772
Fritziana fissilis Anura LC Arboreal 25.954326 37.57091
Fritziana goeldii Anura LC Arboreal 25.980442 37.63515
Fritziana ohausi Anura LC Arboreal 25.896259 37.62943
Frostius erythrophthalmus Anura DD Ground-dwelling 24.983588 38.52893
Frostius pernambucensis Anura LC Ground-dwelling 25.528334 38.68918
Gabohyla pauloalvini Anura DD Arboreal 25.544068 40.42354
Gastrophryne carolinensis Anura LC Fossorial 26.564516 40.63907
Gastrophryne elegans Anura LC Ground-dwelling 26.471036 39.84661
Gastrophryne olivacea Anura LC Ground-dwelling 24.731973 39.61817
Gastrophrynoides borneensis Anura LC Fossorial 28.036755 37.52218
Gastrotheca abdita Anura DD Arboreal 24.252411 37.66802
Gastrotheca albolineata Anura LC Arboreal 25.965675 37.95137
Gastrotheca andaquiensis Anura LC Arboreal 23.808080 37.61630
Gastrotheca antoniiochoai Anura DD Stream-dwelling 14.573980 35.96970
Gastrotheca argenteovirens Anura LC Stream-dwelling 24.224868 37.68334
Gastrotheca atympana Anura VU Arboreal 19.166548 37.25514
Gastrotheca aureomaculata Anura EN Arboreal 24.159301 38.17772
Gastrotheca bufona Anura VU Arboreal 24.386658 37.82577
Gastrotheca carinaceps Anura DD Arboreal 21.293309 37.36445
Gastrotheca christiani Anura CR Arboreal 23.101751 37.48121
Gastrotheca chrysosticta Anura EN Arboreal 22.724761 37.42706
Gastrotheca cornuta Anura EN Arboreal 25.665134 37.96895
Gastrotheca dendronastes Anura EN Arboreal 24.742392 37.82576
Gastrotheca dunni Anura LC Arboreal 22.164220 37.84086
Gastrotheca ernestoi Anura DD Arboreal 26.253245 38.10717
Gastrotheca espeletia Anura EN Arboreal 23.705943 37.68966
Gastrotheca excubitor Anura VU Arboreal 17.325511 36.76474
Gastrotheca fissipes Anura LC Arboreal 25.456469 37.91740
Gastrotheca flamma Anura DD Arboreal 25.202473 37.86711
Gastrotheca fulvorufa Anura DD Arboreal 25.747012 37.87004
Gastrotheca galeata Anura DD Ground-dwelling 22.881730 37.75790
Gastrotheca gracilis Anura EN Arboreal 21.092690 37.27175
Gastrotheca griswoldi Anura LC Ground-dwelling 17.508487 36.90655
Gastrotheca guentheri Anura DD Arboreal 25.253704 37.90364
Gastrotheca helenae Anura EN Ground-dwelling 22.438970 37.65827
Gastrotheca lateonota Anura VU Arboreal 22.953674 37.55318
Gastrotheca lauzuricae Anura CR Arboreal 14.531854 36.37959
Gastrotheca litonedis Anura CR Arboreal 21.477341 37.57384
Gastrotheca longipes Anura LC Arboreal 24.741573 37.95570
Gastrotheca marsupiata Anura LC Arboreal 17.322826 36.79364
Gastrotheca microdiscus Anura LC Arboreal 25.743180 37.97969
Gastrotheca monticola Anura LC Arboreal 21.986519 37.47620
Gastrotheca nicefori Anura LC Arboreal 24.870699 38.17754
Gastrotheca ochoai Anura EN Arboreal 16.316902 36.63908
Gastrotheca orophylax Anura VU Arboreal 22.982001 37.70836
Gastrotheca ossilaginis Anura DD Arboreal 22.692835 37.53004
Gastrotheca ovifera Anura VU Arboreal 26.774814 38.33549
Gastrotheca pacchamama Anura EN Ground-dwelling 17.796799 37.19578
Gastrotheca peruana Anura LC Ground-dwelling 19.248711 37.17184
Gastrotheca phalarosa Anura DD Arboreal 22.692835 37.84969
Gastrotheca piperata Anura LC Arboreal 18.545793 37.06775
Gastrotheca plumbea Anura VU Arboreal 23.419102 37.80723
Gastrotheca pseustes Anura NT Arboreal 23.476428 37.16514
Gastrotheca psychrophila Anura EN Ground-dwelling 22.745113 37.70889
Gastrotheca rebeccae Anura EN Arboreal 17.117738 36.79893
Gastrotheca riobambae Anura EN Arboreal 21.035801 37.91612
Gastrotheca ruizi Anura NT Arboreal 24.453276 38.14327
Gastrotheca splendens Anura DD Arboreal 22.559731 37.48728
Gastrotheca stictopleura Anura EN Arboreal 20.217487 37.21042
Gastrotheca testudinea Anura LC Arboreal 21.041435 37.51817
Gastrotheca trachyceps Anura EN Arboreal 22.965861 37.97250
Gastrotheca walkeri Anura VU Arboreal 26.774814 38.06015
Gastrotheca weinlandii Anura LC Arboreal 24.245277 37.77473
Gastrotheca williamsoni Anura DD Stream-dwelling 26.940736 37.63482
Gastrotheca zeugocystis Anura DD Ground-dwelling 15.720102 36.75518
Geobatrachus walkeri Anura EN Ground-dwelling 27.127537 33.71332
Geocrinia alba Anura CR Ground-dwelling 20.155529 34.61743
Geocrinia laevis Anura LC Ground-dwelling 17.277954 34.01036
Geocrinia leai Anura LC Ground-dwelling 19.782633 34.48185
Geocrinia lutea Anura LC Ground-dwelling 18.840788 34.42048
Geocrinia rosea Anura LC Ground-dwelling 19.316558 34.50250
Geocrinia victoriana Anura LC Ground-dwelling 18.969221 34.97101
Geocrinia vitellina Anura VU Ground-dwelling 20.090669 34.58972
Gephyromantis ambohitra Anura VU Stream-dwelling 26.787293 37.18758
Gephyromantis asper Anura LC Ground-dwelling 25.729485 37.70489
Gephyromantis atsingy Anura EN Arboreal 27.336782 37.83779
Gephyromantis azzurrae Anura EN Stream-dwelling 26.195793 37.14474
Gephyromantis blanci Anura NT Ground-dwelling 25.915871 37.70850
Gephyromantis boulengeri Anura LC Arboreal 25.847775 37.59827
Gephyromantis cornutus Anura VU Stream-dwelling 25.192843 36.88448
Gephyromantis corvus Anura EN Ground-dwelling 26.456032 37.85761
Gephyromantis decaryi Anura NT Arboreal 25.915871 37.53945
Gephyromantis eiselti Anura EN Arboreal 24.925297 37.44631
Gephyromantis enki Anura VU Ground-dwelling 25.961863 37.70685
Gephyromantis granulatus Anura LC Ground-dwelling 26.666151 37.83231
Gephyromantis hintelmannae Anura EN Arboreal 25.476874 37.48666
Gephyromantis horridus Anura VU Ground-dwelling 26.620481 37.87681
Gephyromantis klemmeri Anura EN Ground-dwelling 26.476930 37.87449
Gephyromantis leucocephalus Anura NT Ground-dwelling 25.757692 37.69440
Gephyromantis leucomaculatus Anura LC Ground-dwelling 26.517390 37.74506
Gephyromantis luteus Anura LC Ground-dwelling 25.957520 37.76436
Gephyromantis mafy Anura CR Arboreal 25.284742 37.41782
Gephyromantis malagasius Anura LC Arboreal 25.782918 37.55610
Gephyromantis moseri Anura LC Arboreal 26.109029 37.53931
Gephyromantis plicifer Anura LC Arboreal 25.943531 37.52775
Gephyromantis pseudoasper Anura LC Arboreal 26.686789 37.67125
Gephyromantis ranjomavo Anura EN Stream-dwelling 26.476930 37.22849
Gephyromantis redimitus Anura LC Arboreal 26.000887 37.52573
Gephyromantis rivicola Anura VU Stream-dwelling 26.545008 37.21347
Gephyromantis runewsweeki Anura VU Ground-dwelling 25.878849 37.68959
Gephyromantis salegy Anura VU Arboreal 26.674312 37.66399
Gephyromantis schilfi Anura VU Arboreal 26.882329 37.63115
Gephyromantis sculpturatus Anura LC Ground-dwelling 25.570700 37.72499
Gephyromantis silvanus Anura VU Stream-dwelling 26.815264 37.30183
Gephyromantis spiniferus Anura VU Ground-dwelling 26.003643 37.78662
Gephyromantis striatus Anura VU Arboreal 26.375730 37.74220
Gephyromantis tahotra Anura VU Stream-dwelling 26.747102 37.32400
Gephyromantis tandroka Anura VU Stream-dwelling 26.747102 37.16873
Gephyromantis thelenae Anura EN Arboreal 24.925297 37.37745
Gephyromantis tschenki Anura LC Arboreal 25.755963 37.50094
Gephyromantis ventrimaculatus Anura LC Ground-dwelling 25.580659 37.74421
Gephyromantis verrucosus Anura LC Arboreal 26.338523 37.60484
Gephyromantis webbi Anura EN Stream-dwelling 26.815264 37.27968
Gephyromantis zavona Anura EN Stream-dwelling 26.837159 37.16906
Ghatixalus asterops Anura DD Stream-dwelling 28.044115 38.05336
Ghatixalus variabilis Anura EN Stream-dwelling 27.229333 37.94296
Ghatophryne ornata Anura EN Stream-dwelling 27.049047 38.33527
Ghatophryne rubigina Anura VU Stream-dwelling 27.917429 38.41084
Glandirana minima Anura EN Semi-aquatic 27.143466 37.29669
Glyphoglossus molossus Anura NT Fossorial 28.459918 39.37733
Gracixalus ananjevae Anura LC Arboreal 27.907289 37.84408
Gracixalus gracilipes Anura LC Arboreal 25.941062 37.68712
Gracixalus jinxiuensis Anura DD Arboreal 27.573355 37.87493
Gracixalus medogensis Anura DD Arboreal 16.407198 36.37140
Gracixalus quangi Anura LC Arboreal 26.340851 37.67023
Gracixalus supercornutus Anura NT Arboreal 28.068805 37.93206
Guibemantis albolineatus Anura LC Arboreal 25.731997 37.53746
Guibemantis annulatus Anura EN Arboreal 25.641574 37.54324
Guibemantis bicalcaratus Anura LC Arboreal 25.982654 37.59517
Guibemantis depressiceps Anura LC Arboreal 25.946903 37.53122
Guibemantis flavobrunneus Anura LC Arboreal 25.971516 37.55631
Guibemantis kathrinae Anura VU Arboreal 25.685249 37.63098
Guibemantis liber Anura LC Arboreal 26.094471 37.57687
Guibemantis methueni Anura LC Arboreal 25.745078 37.57028
Guibemantis pulcher Anura LC Arboreal 25.978615 37.53541
Guibemantis punctatus Anura CR Arboreal 25.873667 37.65557
Guibemantis tasifotsy Anura VU Arboreal 26.221742 37.63679
Guibemantis timidus Anura LC Arboreal 25.733824 37.50507
Guibemantis tornieri Anura LC Arboreal 25.668951 37.58005
Guibemantis wattersoni Anura EN Arboreal 25.641574 37.58057
Gyrinophilus porphyriticus Caudata LC Semi-aquatic 23.391986 34.62786
Haddadus aramunha Anura DD Ground-dwelling 24.806811 35.66519
Haddadus binotatus Anura LC Ground-dwelling 25.665324 35.82294
Haddadus plicifer Anura DD Ground-dwelling 25.850479 35.76821
Hadromophryne natalensis Anura LC Stream-dwelling 22.466979 35.87960
Hamptophryne alios Anura DD Ground-dwelling 24.860802 39.64313
Hamptophryne boliviana Anura LC Ground-dwelling 27.694279 40.04706
Heleioporus albopunctatus Anura LC Fossorial 21.283553 35.54987
Heleioporus australiacus Anura VU Fossorial 20.153778 35.39083
Heleioporus barycragus Anura LC Fossorial 20.659860 35.47031
Heleioporus eyrei Anura LC Fossorial 20.608269 35.39907
Heleioporus inornatus Anura LC Fossorial 19.892446 35.32135
Heleioporus psammophilus Anura LC Fossorial 20.752432 35.41234
Heleophryne hewitti Anura EN Ground-dwelling 21.483726 36.23809
Heleophryne orientalis Anura LC Stream-dwelling 21.600927 35.66479
Heleophryne purcelli Anura LC Stream-dwelling 20.916017 35.55324
Heleophryne regis Anura LC Stream-dwelling 21.326063 35.56354
Heleophryne rosei Anura CR Stream-dwelling 20.727970 35.46003
Hemidactylium scutatum Caudata LC Semi-aquatic 22.980600 36.21887
Hemiphractus bubalus Anura VU Arboreal 24.439397 37.44198
Hemiphractus fasciatus Anura VU Arboreal 24.845811 37.60009
Hemiphractus helioi Anura LC Arboreal 22.580151 37.27196
Hemiphractus johnsoni Anura EN Arboreal 22.605131 37.19378
Hemiphractus proboscideus Anura LC Arboreal 27.366189 37.80487
Hemiphractus scutatus Anura LC Arboreal 26.732934 37.68889
Hemisus barotseensis Anura DD Fossorial 24.981682 39.18983
Hemisus brachydactylus Anura DD Fossorial 22.834772 38.86203
Hemisus guineensis Anura LC Fossorial 25.627906 39.27454
Hemisus guttatus Anura NT Fossorial 22.910338 38.77671
Hemisus marmoratus Anura LC Fossorial 25.737781 39.23957
Hemisus microscaphus Anura LC Fossorial 21.754487 38.73659
Hemisus olivaceus Anura LC Fossorial 26.518532 39.36108
Hemisus perreti Anura LC Fossorial 28.170348 39.56152
Hemisus wittei Anura DD Fossorial 24.264466 39.02948
Heterixalus alboguttatus Anura LC Arboreal 25.523605 40.23995
Heterixalus andrakata Anura LC Arboreal 26.242584 40.33783
Heterixalus betsileo Anura LC Arboreal 25.704377 40.17610
Heterixalus boettgeri Anura LC Arboreal 25.625335 40.27468
Heterixalus carbonei Anura LC Arboreal 27.078569 40.48256
Heterixalus luteostriatus Anura LC Arboreal 26.779964 40.43770
Heterixalus madagascariensis Anura LC Arboreal 25.983766 40.29408
Heterixalus punctatus Anura LC Arboreal 25.983766 40.30600
Heterixalus rutenbergi Anura LC Arboreal 25.733911 40.31226
Heterixalus tricolor Anura LC Arboreal 27.525133 40.43839
Heterixalus variabilis Anura LC Arboreal 27.113784 40.42027
Hildebrandtia macrotympanum Anura LC Fossorial 25.192187 38.53960
Hildebrandtia ornata Anura LC Fossorial 25.475340 38.73432
Hildebrandtia ornatissima Anura DD Fossorial 24.535935 38.48292
Holoaden bradei Anura CR Ground-dwelling 26.714437 32.65022
Holoaden luederwaldti Anura DD Ground-dwelling 25.764576 32.54039
Holoaden pholeter Anura DD Ground-dwelling 26.900371 32.63835
Hoplobatrachus crassus Anura LC Fossorial 27.634495 42.26026
Hoplobatrachus occipitalis Anura LC Ground-dwelling 26.734911 40.72252
Hoplobatrachus rugulosus Anura LC Semi-aquatic 27.274891 42.57358
Hoplobatrachus tigerinus Anura LC Semi-aquatic 26.799206 41.58591
Hoplophryne rogersi Anura EN Arboreal 24.470860 37.98123
Hoplophryne uluguruensis Anura EN Arboreal 24.046750 37.99461
Huia cavitympanum Anura LC Ground-dwelling 27.964762 37.60842
Hyalinobatrachium aureoguttatum Anura LC Stream-dwelling 25.485184 37.10463
Hyalinobatrachium cappellei Anura LC Stream-dwelling 27.895868 37.41936
Hyalinobatrachium chirripoi Anura LC Stream-dwelling 25.731187 37.08370
Hyalinobatrachium colymbiphyllum Anura LC Stream-dwelling 26.028520 37.20024
Hyalinobatrachium duranti Anura EN Stream-dwelling 26.315006 37.20463
Hyalinobatrachium esmeralda Anura EN Stream-dwelling 22.707356 36.71934
Hyalinobatrachium fleischmanni Anura LC Stream-dwelling 26.393427 37.20158
Hyalinobatrachium fragile Anura NT Stream-dwelling 27.028993 37.31220
Hyalinobatrachium guairarepanense Anura EN Stream-dwelling 26.646904 37.21766
Hyalinobatrachium iaspidiense Anura LC Stream-dwelling 28.040612 37.47417
Hyalinobatrachium ibama Anura LC Stream-dwelling 23.935812 36.86736
Hyalinobatrachium orientale Anura VU Stream-dwelling 26.934003 37.24674
Hyalinobatrachium pallidum Anura NT Stream-dwelling 26.930340 37.23915
Hyalinobatrachium pellucidum Anura NT Stream-dwelling 22.906313 36.75067
Hyalinobatrachium talamancae Anura LC Stream-dwelling 22.496670 36.72113
Hyalinobatrachium tatayoi Anura LC Stream-dwelling 26.011047 37.13586
Hyalinobatrachium taylori Anura LC Stream-dwelling 27.033008 37.27075
Hyalinobatrachium valerioi Anura LC Stream-dwelling 25.138066 37.01406
Hyalinobatrachium vireovittatum Anura LC Stream-dwelling 26.190465 37.17706
Hydrolaetare caparu Anura DD Fossorial 28.610797 41.22613
Hydrolaetare dantasi Anura LC Ground-dwelling 28.110142 40.08745
Hydrolaetare schmidti Anura LC Ground-dwelling 28.437003 40.16103
Hydromantes brunus Caudata NT Ground-dwelling 18.342087 33.87436
Hydromantes platycephalus Caudata LC Ground-dwelling 19.152874 33.97885
Hydromantes shastae Caudata NT Ground-dwelling 18.775161 33.91533
Hyla annectans Anura LC Arboreal 23.899955 39.42799
Hyla arborea Anura LC Arboreal 19.275935 38.22310
Hyla chinensis Anura LC Arboreal 27.368700 40.08671
Hyla hallowellii Anura LC Arboreal 27.426915 39.98121
Hyla intermedia Anura LC Arboreal 23.577550 39.47004
Hyla meridionalis Anura LC Arboreal 21.989022 37.69538
Hyla sanchiangensis Anura LC Arboreal 27.616569 39.95835
Hyla sarda Anura LC Arboreal 23.967108 39.53549
Hyla savignyi Anura LC Arboreal 22.141936 39.18959
Hyla simplex Anura LC Arboreal 27.957260 39.95353
Hyla tsinlingensis Anura LC Arboreal 23.301016 39.33340
Hyla zhaopingensis Anura DD Arboreal 28.217679 40.05659
Hylarana chitwanensis Anura DD Ground-dwelling 21.995506 36.42646
Hylarana erythraea Anura LC Ground-dwelling 28.040018 36.18373
Hylarana garoensis Anura LC Ground-dwelling 22.787719 36.61182
Hylarana latouchii Anura LC Ground-dwelling 27.402373 38.41878
Hylarana macrodactyla Anura LC Ground-dwelling 28.053988 37.18933
Hylarana margariana Anura DD Stream-dwelling 26.456096 36.37873
Hylarana montivaga Anura EN Stream-dwelling 27.724865 36.65230
Hylarana persimilis Anura DD Ground-dwelling 29.323791 37.47644
Hylarana taipehensis Anura LC Ground-dwelling 27.843246 37.24513
Hylarana tytleri Anura LC Ground-dwelling 27.205611 37.24037
Hylodes amnicola Anura DD Stream-dwelling 26.222532 36.74766
Hylodes asper Anura LC Stream-dwelling 25.741442 36.66544
Hylodes babax Anura DD Stream-dwelling 25.804730 36.79319
Hylodes cardosoi Anura LC Stream-dwelling 25.509007 36.66268
Hylodes charadranaetes Anura DD Stream-dwelling 26.561451 36.82664
Hylodes dactylocinus Anura DD Stream-dwelling 26.483769 36.65416
Hylodes fredi Anura DD Stream-dwelling 25.175640 36.59261
Hylodes glaber Anura DD Stream-dwelling 26.714437 36.75638
Hylodes heyeri Anura DD Stream-dwelling 25.629717 36.62771
Hylodes lateristrigatus Anura LC Stream-dwelling 25.799146 36.70725
Hylodes magalhaesi Anura DD Stream-dwelling 26.301910 36.78424
Hylodes meridionalis Anura LC Stream-dwelling 24.364029 36.48419
Hylodes mertensi Anura DD Stream-dwelling 25.741310 36.58746
Hylodes nasus Anura LC Stream-dwelling 25.722613 36.72826
Hylodes ornatus Anura LC Stream-dwelling 25.920279 36.64654
Hylodes otavioi Anura DD Stream-dwelling 24.594125 36.60196
Hylodes perplicatus Anura LC Stream-dwelling 24.641106 36.41039
Hylodes phyllodes Anura LC Stream-dwelling 25.946292 36.71082
Hylodes pipilans Anura DD Stream-dwelling 26.900371 36.86921
Hylodes regius Anura DD Stream-dwelling 26.453073 36.71894
Hylodes sazimai Anura DD Stream-dwelling 25.920279 36.59850
Hylodes uai Anura DD Stream-dwelling 25.220967 36.50172
Hylodes vanzolinii Anura DD Stream-dwelling 25.804730 36.69417
Hylomantis aspera Anura LC Arboreal 25.372266 38.64297
Hylomantis granulosa Anura LC Arboreal 25.492189 38.92815
Hylophorbus nigrinus Anura LC Ground-dwelling 24.989357 35.14214
Hylophorbus picoides Anura LC Ground-dwelling 27.533759 35.56154
Hylophorbus rainerguentheri Anura LC Ground-dwelling 26.562135 35.39362
Hylophorbus richardsi Anura LC Ground-dwelling 26.627955 35.40277
Hylophorbus rufescens Anura DD Ground-dwelling 27.753927 35.63299
Hylophorbus sextus Anura LC Ground-dwelling 27.787567 35.56727
Hylophorbus tetraphonus Anura LC Ground-dwelling 27.671108 35.55300
Hylophorbus wondiwoi Anura LC Ground-dwelling 28.031168 35.67204
Hylorina sylvatica Anura LC Semi-aquatic 13.935372 34.81037
Hyloscirtus albopunctulatus Anura LC Arboreal 26.777172 38.58424
Hyloscirtus alytolylax Anura LC Stream-dwelling 24.424816 36.88330
Hyloscirtus armatus Anura NT Stream-dwelling 19.237089 37.18930
Hyloscirtus bogotensis Anura NT Stream-dwelling 23.849641 37.83536
Hyloscirtus callipeza Anura VU Stream-dwelling 24.232290 37.98619
Hyloscirtus caucanus Anura EN Stream-dwelling 24.189077 37.92497
Hyloscirtus charazani Anura CR Stream-dwelling 17.139218 36.92367
Hyloscirtus colymba Anura EN Stream-dwelling 27.366637 38.36247
Hyloscirtus denticulentus Anura VU Stream-dwelling 22.976165 37.76686
Hyloscirtus jahni Anura VU Stream-dwelling 26.494876 38.22595
Hyloscirtus larinopygion Anura LC Arboreal 22.556074 38.05063
Hyloscirtus lascinius Anura LC Arboreal 25.767301 38.57854
Hyloscirtus lindae Anura LC Stream-dwelling 24.050687 36.36176
Hyloscirtus lynchi Anura CR Stream-dwelling 22.135560 37.48349
Hyloscirtus pacha Anura EN Stream-dwelling 23.289544 37.73705
Hyloscirtus palmeri Anura LC Stream-dwelling 25.284997 37.98686
Hyloscirtus pantostictus Anura CR Stream-dwelling 22.211278 37.64195
Hyloscirtus phyllognathus Anura LC Stream-dwelling 22.431215 37.20129
Hyloscirtus piceigularis Anura EN Stream-dwelling 24.841526 37.87700
Hyloscirtus platydactylus Anura VU Stream-dwelling 26.315006 38.13088
Hyloscirtus psarolaimus Anura VU Stream-dwelling 21.819483 37.56242
Hyloscirtus ptychodactylus Anura EN Stream-dwelling 23.223818 37.73577
Hyloscirtus sarampiona Anura EN Stream-dwelling 22.965861 37.61455
Hyloscirtus simmonsi Anura VU Stream-dwelling 24.552956 37.20414
Hyloscirtus staufferorum Anura EN Stream-dwelling 23.970925 37.71305
Hyloscirtus tapichalaca Anura EN Stream-dwelling 24.012885 37.81860
Hyloscirtus torrenticola Anura VU Stream-dwelling 24.291871 37.98210
Hyloxalus aeruginosus Anura DD Stream-dwelling 20.676160 35.68787
Hyloxalus anthracinus Anura CR Ground-dwelling 20.702287 36.23360
Hyloxalus awa Anura LC Ground-dwelling 24.044633 36.98059
Hyloxalus azureiventris Anura EN Ground-dwelling 24.576112 36.87777
Hyloxalus betancuri Anura DD Stream-dwelling 25.897334 36.38850
Hyloxalus bocagei Anura LC Stream-dwelling 24.474489 37.55121
Hyloxalus borjai Anura DD Stream-dwelling 22.164220 35.90748
Hyloxalus breviquartus Anura LC Ground-dwelling 23.972642 36.75082
Hyloxalus cevallosi Anura EN Ground-dwelling 25.683944 36.93211
Hyloxalus chlorocraspedus Anura DD Arboreal 26.115054 36.88841
Hyloxalus chocoensis Anura EN Ground-dwelling 25.515912 37.05394
Hyloxalus craspedoceps Anura DD Stream-dwelling 24.265362 36.15573
Hyloxalus delatorreae Anura CR Stream-dwelling 20.760710 35.66317
Hyloxalus elachyhistus Anura LC Stream-dwelling 23.574579 36.19227
Hyloxalus eleutherodactylus Anura DD Stream-dwelling 24.265362 36.21453
Hyloxalus exasperatus Anura DD Ground-dwelling 23.289544 36.82064
Hyloxalus excisus Anura DD Semi-aquatic 22.164220 36.81090
Hyloxalus faciopunctulatus Anura DD Ground-dwelling 29.379028 37.56153
Hyloxalus fallax Anura DD Ground-dwelling 25.189103 36.99169
Hyloxalus fascianigrus Anura VU Ground-dwelling 24.996510 36.98619
Hyloxalus fuliginosus Anura DD Stream-dwelling 23.837156 36.17270
Hyloxalus idiomelus Anura DD Stream-dwelling 21.684497 35.91485
Hyloxalus infraguttatus Anura NT Ground-dwelling 24.647492 36.98717
Hyloxalus insulatus Anura VU Stream-dwelling 22.438421 35.98734
Hyloxalus italoi Anura LC Stream-dwelling 24.756499 36.95486
Hyloxalus lehmanni Anura NT Ground-dwelling 23.978694 36.76542
Hyloxalus leucophaeus Anura DD Stream-dwelling 22.692835 35.97024
Hyloxalus littoralis Anura LC Ground-dwelling 21.294067 36.55429
Hyloxalus maculosus Anura DD Stream-dwelling 24.037810 36.75119
Hyloxalus mittermeieri Anura DD Stream-dwelling 20.676160 35.67269
Hyloxalus mystax Anura DD Stream-dwelling 25.876801 36.42771
Hyloxalus nexipus Anura LC Stream-dwelling 23.910353 36.91149
Hyloxalus parcus Anura DD Stream-dwelling 24.985852 36.34675
Hyloxalus patitae Anura DD Stream-dwelling 22.825311 36.06213
Hyloxalus pinguis Anura EN Ground-dwelling 22.965861 36.63986
Hyloxalus pulchellus Anura NT Ground-dwelling 23.277277 34.60161
Hyloxalus pulcherrimus Anura DD Stream-dwelling 21.278613 35.68894
Hyloxalus pumilus Anura DD Stream-dwelling 25.876801 36.42376
Hyloxalus ramosi Anura EN Ground-dwelling 23.912703 36.81536
Hyloxalus ruizi Anura CR Ground-dwelling 25.027891 36.91967
Hyloxalus saltuarius Anura DD Ground-dwelling 25.529583 37.12575
Hyloxalus sauli Anura LC Ground-dwelling 24.979564 37.62380
Hyloxalus shuar Anura NT Ground-dwelling 23.982510 36.83980
Hyloxalus sordidatus Anura DD Stream-dwelling 22.971692 35.98807
Hyloxalus spilotogaster Anura DD Ground-dwelling 24.252411 36.78076
Hyloxalus subpunctatus Anura LC Ground-dwelling 23.287490 36.68559
Hyloxalus sylvaticus Anura EN Stream-dwelling 22.881730 35.99632
Hyloxalus toachi Anura EN Ground-dwelling 23.191329 36.88769
Hyloxalus utcubambensis Anura DD Ground-dwelling 21.985724 36.46882
Hyloxalus vergeli Anura VU Ground-dwelling 22.970058 36.80325
Hyloxalus vertebralis Anura CR Stream-dwelling 23.751204 35.25042
Hymenochirus boettgeri Anura LC Aquatic 27.590348 37.34730
Hymenochirus boulengeri Anura DD Aquatic 27.323659 37.42844
Hymenochirus curtipes Anura LC Semi-aquatic 28.194243 37.51601
Hymenochirus feae Anura DD Aquatic 28.080402 37.45220
Hynobius abei Caudata EN Ground-dwelling 24.668112 33.84328
Hynobius amjiensis Caudata EN Semi-aquatic 26.975317 34.36470
Hynobius arisanensis Caudata EN Semi-aquatic 27.631912 34.15439
Hynobius boulengeri Caudata EN Semi-aquatic 25.803987 34.25101
Hynobius chinensis Caudata DD Semi-aquatic 24.335745 34.03046
Hynobius dunni Caudata VU Semi-aquatic 26.194441 34.23006
Hynobius formosanus Caudata EN Semi-aquatic 27.111431 34.13006
Hynobius fucus Caudata NT Ground-dwelling 27.441464 33.34597
Hynobius guabangshanensis Caudata CR Semi-aquatic 27.752760 34.41367
Hynobius hidamontanus Caudata EN Semi-aquatic 22.860364 33.69563
Hynobius katoi Caudata EN Semi-aquatic 25.298876 34.16109
Hynobius kimurae Caudata LC Fossorial 24.601754 34.83361
Hynobius leechii Caudata LC Ground-dwelling 21.686141 33.36613
Hynobius lichenatus Caudata LC Semi-aquatic 23.723781 33.98580
Hynobius maoershanensis Caudata CR Aquatic 26.709196 34.26909
Hynobius naevius Caudata EN Ground-dwelling 25.659493 33.90279
Hynobius nebulosus Caudata LC Semi-aquatic 25.591636 34.21797
Hynobius nigrescens Caudata LC Ground-dwelling 23.805659 33.74626
Hynobius okiensis Caudata EN Ground-dwelling 25.019973 33.80856
Hynobius quelpaertensis Caudata VU Semi-aquatic 24.198406 34.03600
Hynobius retardatus Caudata LC Semi-aquatic 19.710834 33.38648
Hynobius sonani Caudata EN Semi-aquatic 27.558269 34.23204
Hynobius stejnegeri Caudata NT Semi-aquatic 26.158497 34.32591
Hynobius takedai Caudata EN Semi-aquatic 23.374551 33.90137
Hynobius tokyoensis Caudata VU Semi-aquatic 25.037030 34.09829
Hynobius tsuensis Caudata NT Semi-aquatic 25.393547 34.11588
Hynobius turkestanicus Caudata DD Semi-aquatic 14.888156 32.69288
Hynobius yangi Caudata EN Semi-aquatic 24.087076 33.96816
Hynobius yiwuensis Caudata LC Semi-aquatic 26.674234 34.33524
Hyperolius acuticeps Anura LC Arboreal 23.576816 40.28014
Hyperolius acutirostris Anura LC Arboreal 26.838834 40.63508
Hyperolius ademetzi Anura EN Arboreal 26.644872 40.70017
Hyperolius adspersus Anura LC Arboreal 27.672493 40.80606
Hyperolius argus Anura LC Arboreal 25.683872 40.48183
Hyperolius atrigularis Anura DD Arboreal 23.363909 40.23288
Hyperolius balfouri Anura LC Arboreal 26.260290 40.57855
Hyperolius baumanni Anura LC Arboreal 28.557661 41.04633
Hyperolius benguellensis Anura LC Arboreal 24.556634 40.39470
Hyperolius bicolor Anura DD Arboreal 27.022934 40.63643
Hyperolius bobirensis Anura VU Arboreal 27.729107 40.91033
Hyperolius bolifambae Anura LC Arboreal 26.889379 40.74340
Hyperolius bopeleti Anura VU Arboreal 26.949638 40.79640
Hyperolius brachiofasciatus Anura DD Arboreal 27.137777 40.75006
Hyperolius camerunensis Anura LC Arboreal 26.509925 40.67570
Hyperolius castaneus Anura LC Arboreal 23.389956 40.32800
Hyperolius chlorosteus Anura LC Arboreal 27.676050 40.76128
Hyperolius chrysogaster Anura NT Arboreal 23.828760 40.18945
Hyperolius cinereus Anura LC Arboreal 23.930790 40.26417
Hyperolius cinnamomeoventris Anura LC Arboreal 26.577998 40.63093
Hyperolius concolor Anura LC Arboreal 27.785333 40.76611
Hyperolius constellatus Anura VU Arboreal 23.832094 40.28710
Hyperolius cystocandicans Anura EN Arboreal 21.422362 39.96838
Hyperolius dartevellei Anura LC Arboreal 26.958723 40.73242
Hyperolius diaphanus Anura DD Arboreal 24.986402 40.53114
Hyperolius dintelmanni Anura EN Arboreal 27.191396 40.80813
Hyperolius discodactylus Anura LC Arboreal 23.353776 40.16272
Hyperolius endjami Anura LC Arboreal 26.641773 40.60293
Hyperolius fasciatus Anura DD Arboreal 26.763698 40.70735
Hyperolius ferreirai Anura DD Arboreal 26.763698 40.74281
Hyperolius ferrugineus Anura DD Arboreal 25.278286 40.48050
Hyperolius friedemanni Anura DD Arboreal 23.139713 40.18430
Hyperolius frontalis Anura LC Arboreal 23.800564 40.32083
Hyperolius fuscigula Anura DD Arboreal 26.301903 40.65244
Hyperolius fusciventris Anura LC Arboreal 27.727860 40.78713
Hyperolius ghesquieri Anura DD Arboreal 28.340147 40.83697
Hyperolius glandicolor Anura LC Arboreal 23.484108 40.19091
Hyperolius gularis Anura DD Arboreal 27.300545 40.74753
Hyperolius guttulatus Anura LC Arboreal 27.737338 40.73881
Hyperolius horstockii Anura LC Arboreal 21.007762 39.76878
Hyperolius howelli Anura LC Arboreal 21.586452 40.03838
Hyperolius hutsebauti Anura LC Arboreal 26.376287 40.71707
Hyperolius igbettensis Anura LC Arboreal 27.660892 40.68106
Hyperolius inornatus Anura DD Arboreal 28.358838 40.91061
Hyperolius inyangae Anura VU Arboreal 23.913002 40.35112
Hyperolius jackie Anura DD Arboreal 21.922171 40.05235
Hyperolius jacobseni Anura DD Arboreal 27.646331 40.69134
Hyperolius kachalolae Anura LC Arboreal 24.308309 40.29494
Hyperolius kibarae Anura DD Arboreal 25.072460 40.55922
Hyperolius kihangensis Anura EN Arboreal 21.685335 39.99349
Hyperolius kivuensis Anura LC Arboreal 24.200055 40.31959
Hyperolius kuligae Anura LC Arboreal 26.425399 40.62911
Hyperolius lamottei Anura LC Arboreal 27.565794 40.73851
Hyperolius langi Anura LC Arboreal 25.342108 40.43108
Hyperolius lateralis Anura LC Arboreal 23.627978 40.21580
Hyperolius laurenti Anura NT Arboreal 27.953732 40.77104
Hyperolius leleupi Anura EN Arboreal 23.945073 40.31694
Hyperolius leucotaenius Anura EN Arboreal 24.463491 40.41249
Hyperolius lupiroensis Anura DD Arboreal 23.752891 40.20925
Hyperolius major Anura LC Arboreal 24.757063 40.48441
Hyperolius marginatus Anura LC Arboreal 24.696138 40.33695
Hyperolius mariae Anura LC Arboreal 24.970272 40.36252
Hyperolius marmoratus Anura LC Arboreal 24.446217 46.10154
Hyperolius minutissimus Anura VU Arboreal 22.685843 40.14595
Hyperolius mitchelli Anura LC Arboreal 25.337788 40.67598
Hyperolius molleri Anura LC Arboreal 27.185336 40.71062
Hyperolius montanus Anura LC Arboreal 21.178117 39.93638
Hyperolius mosaicus Anura LC Arboreal 27.034546 40.76041
Hyperolius nasicus Anura LC Arboreal 24.177631 40.29787
Hyperolius nasutus Anura LC Arboreal 24.627053 40.44029
Hyperolius nienokouensis Anura EN Arboreal 27.659304 40.81866
Hyperolius nimbae Anura EN Arboreal 27.635550 40.78649
Hyperolius nitidulus Anura LC Arboreal 27.655941 40.84867
Hyperolius obscurus Anura DD Arboreal 25.699383 40.64709
Hyperolius occidentalis Anura LC Arboreal 27.416980 40.75387
Hyperolius ocellatus Anura LC Arboreal 27.442391 40.89660
Hyperolius parallelus Anura LC Arboreal 25.627324 40.47684
Hyperolius pardalis Anura LC Arboreal 27.325387 40.66101
Hyperolius parkeri Anura LC Arboreal 25.997471 40.52071
Hyperolius phantasticus Anura LC Arboreal 27.975535 40.80969
Hyperolius pickersgilli Anura EN Arboreal 22.941548 40.09450
Hyperolius picturatus Anura LC Arboreal 27.677690 40.82477
Hyperolius pictus Anura LC Arboreal 22.474501 40.16271
Hyperolius platyceps Anura LC Arboreal 27.698609 40.81809
Hyperolius polli Anura DD Arboreal 27.952435 40.88881
Hyperolius polystictus Anura VU Arboreal 24.438148 40.41973
Hyperolius poweri Anura LC Arboreal 23.128579 40.09301
Hyperolius pseudargus Anura LC Arboreal 22.718272 40.03974
Hyperolius puncticulatus Anura EN Arboreal 25.609096 40.60474
Hyperolius pusillus Anura LC Arboreal 25.165863 40.36344
Hyperolius pustulifer Anura DD Arboreal 21.922171 40.02853
Hyperolius pyrrhodictyon Anura LC Arboreal 24.439259 40.29755
Hyperolius quadratomaculatus Anura DD Arboreal 26.408772 40.65051
Hyperolius quinquevittatus Anura LC Arboreal 24.548856 40.42519
Hyperolius rhizophilus Anura DD Arboreal 28.928989 40.95128
Hyperolius rhodesianus Anura LC Arboreal 24.327795 40.26056
Hyperolius riggenbachi Anura LC Arboreal 26.369320 40.57573
Hyperolius robustus Anura DD Arboreal 28.343170 40.97004
Hyperolius rubrovermiculatus Anura EN Arboreal 25.469893 40.41486
Hyperolius rwandae Anura LC Arboreal 22.334128 40.12514
Hyperolius sankuruensis Anura DD Arboreal 28.104585 40.92168
Hyperolius schoutedeni Anura LC Arboreal 27.596468 40.86499
Hyperolius semidiscus Anura LC Arboreal 22.444607 40.13276
Hyperolius sheldricki Anura DD Arboreal 24.846766 40.41954
Hyperolius soror Anura LC Arboreal 27.699239 40.74097
Hyperolius spinigularis Anura VU Arboreal 25.899987 40.57040
Hyperolius steindachneri Anura LC Arboreal 25.208113 40.46916
Hyperolius stenodactylus Anura DD Arboreal 26.939613 40.73272
Hyperolius substriatus Anura LC Arboreal 24.830986 40.50885
Hyperolius swynnertoni Anura LC Arboreal 25.308072 40.60732
Hyperolius sylvaticus Anura LC Arboreal 27.831453 40.96397
Hyperolius tanneri Anura CR Arboreal 25.090940 40.55611
Hyperolius thomensis Anura EN Arboreal 27.104015 40.67603
Hyperolius torrentis Anura VU Arboreal 28.381916 40.81114
Hyperolius tuberculatus Anura LC Arboreal 27.456434 40.78952
Hyperolius tuberilinguis Anura LC Arboreal 25.146918 39.12172
Hyperolius veithi Anura LC Arboreal 28.396396 40.83036
Hyperolius vilhenai Anura DD Arboreal 25.825412 40.72018
Hyperolius viridiflavus Anura LC Arboreal 24.785074 40.92617
Hyperolius viridigulosus Anura NT Arboreal 27.557566 40.79125
Hyperolius viridis Anura LC Arboreal 22.640339 40.18008
Hyperolius watsonae Anura CR Arboreal 25.469893 40.58226
Hyperolius xenorhinus Anura DD Arboreal 25.264248 40.52451
Hyperolius zonatus Anura LC Semi-aquatic 27.707282 41.13106
Hypopachus barberi Anura NT Ground-dwelling 26.140555 39.73780
Hypopachus pictiventris Anura LC Ground-dwelling 26.413976 39.87426
Hypopachus variolosus Anura LC Ground-dwelling 26.294631 39.88912
Ichthyosaura alpestris Caudata LC Ground-dwelling 19.340904 36.37482
Ikakogi tayrona Anura VU Stream-dwelling 27.127537 37.26156
Incilius alvarius Anura LC Ground-dwelling 23.516470 39.77127
Incilius aucoinae Anura LC Ground-dwelling 25.556516 39.70885
Incilius bocourti Anura LC Ground-dwelling 25.721881 39.53250
Incilius campbelli Anura LC Stream-dwelling 26.448978 39.11666
Incilius canaliferus Anura LC Ground-dwelling 27.123233 39.41697
Incilius cavifrons Anura EN Stream-dwelling 27.340327 39.20831
Incilius chompipe Anura EN Ground-dwelling 24.241567 39.50370
Incilius coccifer Anura LC Ground-dwelling 26.806928 39.86545
Incilius coniferus Anura LC Ground-dwelling 26.316540 39.78332
Incilius cristatus Anura EN Ground-dwelling 24.647146 39.50525
Incilius cycladen Anura VU Ground-dwelling 25.328169 39.70630
Incilius epioticus Anura VU Ground-dwelling 24.380342 39.48302
Incilius gemmifer Anura EN Ground-dwelling 26.134371 39.67445
Incilius guanacaste Anura EN Ground-dwelling 26.749134 39.80740
Incilius holdridgei Anura CR Ground-dwelling 27.731359 39.88827
Incilius ibarrai Anura LC Ground-dwelling 25.613458 39.69718
Incilius leucomyos Anura NT Ground-dwelling 26.187288 39.74094
Incilius luetkenii Anura LC Ground-dwelling 26.902817 39.94073
Incilius macrocristatus Anura NT Ground-dwelling 27.801042 39.94248
Incilius marmoreus Anura LC Ground-dwelling 26.483756 40.49796
Incilius mazatlanensis Anura LC Ground-dwelling 25.509473 40.08211
Incilius melanochlorus Anura LC Ground-dwelling 26.486482 39.73700
Incilius nebulifer Anura LC Ground-dwelling 25.941913 39.67748
Incilius occidentalis Anura LC Ground-dwelling 24.305857 39.60374
Incilius perplexus Anura LC Ground-dwelling 25.262770 39.65699
Incilius pisinnus Anura EN Ground-dwelling 24.478778 39.54633
Incilius porteri Anura LC Ground-dwelling 26.106517 39.75832
Incilius signifer Anura LC Ground-dwelling 27.069244 39.88020
Incilius spiculatus Anura EN Stream-dwelling 22.681874 38.68815
Incilius tacanensis Anura EN Stream-dwelling 25.619531 39.06689
Incilius tutelarius Anura VU Stream-dwelling 26.435028 39.14503
Incilius valliceps Anura LC Ground-dwelling 27.062612 39.84352
Indirana beddomii Anura LC Ground-dwelling 27.379145 38.31688
Indirana brachytarsus Anura EN Stream-dwelling 27.479123 37.72272
Indirana diplosticta Anura EN Stream-dwelling 27.983803 37.63846
Indirana gundia Anura CR Stream-dwelling 27.049047 37.64238
Indirana leithii Anura VU Ground-dwelling 27.163911 38.34044
Indirana leptodactyla Anura EN Ground-dwelling 27.834131 38.23520
Indirana longicrus Anura DD Stream-dwelling 26.875890 37.57296
Indirana phrynoderma Anura CR Ground-dwelling 28.297719 38.24829
Indirana semipalmata Anura LC Stream-dwelling 27.577539 37.73367
Ingerana borealis Anura LC Semi-aquatic 24.794939 38.29940
Ingerana charlesdarwini Anura CR Arboreal 28.730299 38.39486
Ingerana reticulata Anura DD Stream-dwelling 16.407198 36.26563
Ingerana tenasserimensis Anura LC Ground-dwelling 27.942961 38.52740
Ingerophrynus biporcatus Anura LC Ground-dwelling 28.007009 39.16300
Ingerophrynus celebensis Anura LC Ground-dwelling 27.037055 38.94955
Ingerophrynus claviger Anura LC Ground-dwelling 27.465804 38.92305
Ingerophrynus divergens Anura LC Ground-dwelling 28.183685 39.11725
Ingerophrynus galeatus Anura LC Ground-dwelling 27.695416 39.09752
Ingerophrynus gollum Anura EN Stream-dwelling 28.335018 38.51433
Ingerophrynus kumquat Anura EN Ground-dwelling 28.481475 39.14033
Ingerophrynus macrotis Anura LC Ground-dwelling 27.345822 39.03928
Ingerophrynus parvus Anura LC Stream-dwelling 28.581511 38.54241
Ingerophrynus philippinicus Anura LC Ground-dwelling 27.931168 39.11378
Ingerophrynus quadriporcatus Anura LC Ground-dwelling 28.388189 39.11104
Insuetophrynus acarpicus Anura EN Stream-dwelling 17.544929 36.15299
Ischnocnema bolbodactyla Anura LC Ground-dwelling 25.851477 36.85993
Ischnocnema epipeda Anura NT Ground-dwelling 25.780363 36.79875
Ischnocnema erythromera Anura DD Ground-dwelling 26.561451 37.00509
Ischnocnema gehrti Anura DD Ground-dwelling 25.741310 36.84217
Ischnocnema gualteri Anura LC Ground-dwelling 26.561451 37.01549
Ischnocnema guentheri Anura LC Ground-dwelling 25.764344 36.91415
Ischnocnema henselii Anura LC Ground-dwelling 25.378418 36.84593
Ischnocnema hoehnei Anura LC Ground-dwelling 25.764576 36.78992
Ischnocnema holti Anura DD Ground-dwelling 26.714437 36.93642
Ischnocnema izecksohni Anura DD Ground-dwelling 25.220967 36.75290
Ischnocnema juipoca Anura LC Ground-dwelling 26.121025 36.78272
Ischnocnema lactea Anura LC Ground-dwelling 25.980139 36.83159
Ischnocnema manezinho Anura NT Ground-dwelling 24.676795 36.73378
Ischnocnema nasuta Anura LC Arboreal 25.934239 36.64654
Ischnocnema nigriventris Anura DD Ground-dwelling 25.741310 36.80074
Ischnocnema octavioi Anura LC Ground-dwelling 26.096995 36.83790
Ischnocnema oea Anura NT Ground-dwelling 25.780363 36.91998
Ischnocnema paranaensis Anura DD Ground-dwelling 24.076546 36.50762
Ischnocnema parva Anura LC Ground-dwelling 25.862742 36.71857
Ischnocnema penaxavantinho Anura DD Ground-dwelling 26.206370 36.84387
Ischnocnema pusilla Anura DD Ground-dwelling 25.945038 36.83820
Ischnocnema randorum Anura DD Ground-dwelling 24.541828 36.76031
Ischnocnema sambaqui Anura DD Ground-dwelling 24.076546 36.65066
Ischnocnema spanios Anura DD Ground-dwelling 25.141569 36.75120
Ischnocnema venancioi Anura LC Ground-dwelling 26.348097 36.92737
Ischnocnema verrucosa Anura DD Ground-dwelling 25.835132 36.79215
Isthmohyla angustilineata Anura CR Arboreal 27.888486 40.04502
Isthmohyla debilis Anura CR Arboreal 27.359743 39.96076
Isthmohyla graceae Anura CR Arboreal 26.090327 39.94537
Isthmohyla infucata Anura EN Arboreal 27.943292 39.97451
Isthmohyla insolita Anura EN Stream-dwelling 26.359827 39.40152
Isthmohyla lancasteri Anura LC Arboreal 25.245561 39.76010
Isthmohyla picadoi Anura LC Arboreal 25.800655 39.82027
Isthmohyla pictipes Anura CR Stream-dwelling 25.742721 39.26460
Isthmohyla pseudopuma Anura LC Arboreal 25.746687 39.76204
Isthmohyla rivularis Anura EN Stream-dwelling 27.888486 39.62190
Isthmohyla tica Anura CR Stream-dwelling 27.888486 39.47545
Isthmohyla xanthosticta Anura DD Arboreal 27.731359 40.01481
Isthmohyla zeteki Anura VU Arboreal 25.742721 39.73025
Itapotihyla langsdorffii Anura LC Arboreal 25.797899 39.81811
Ixalotriton niger Caudata EN Ground-dwelling 27.717146 35.58402
Ixalotriton parvus Caudata CR Arboreal 28.096738 35.41428
Kalophrynus baluensis Anura LC Ground-dwelling 26.959611 36.90298
Kalophrynus bunguranus Anura DD Ground-dwelling 27.552443 37.14801
Kalophrynus eok Anura DD Ground-dwelling 26.158013 36.90857
Kalophrynus heterochirus Anura LC Ground-dwelling 28.010703 37.10240
Kalophrynus interlineatus Anura LC Ground-dwelling 27.540714 37.05854
Kalophrynus intermedius Anura LC Ground-dwelling 28.444029 37.16228
Kalophrynus limbooliati Anura NT Ground-dwelling 28.890137 37.02657
Kalophrynus minusculus Anura LC Ground-dwelling 28.261916 37.28342
Kalophrynus nubicola Anura LC Ground-dwelling 27.227495 37.01882
Kalophrynus orangensis Anura LC Ground-dwelling 27.295018 37.08473
Kalophrynus palmatissimus Anura EN Ground-dwelling 28.220033 37.04861
Kalophrynus pleurostigma Anura LC Ground-dwelling 28.436829 37.38669
Kalophrynus punctatus Anura LC Ground-dwelling 27.761890 37.08544
Kalophrynus robinsoni Anura DD Ground-dwelling 28.598454 37.31736
Kalophrynus subterrestris Anura LC Ground-dwelling 28.097365 37.06838
Kaloula assamensis Anura LC Arboreal 26.236185 38.21156
Kaloula aureata Anura DD Arboreal 28.597859 38.40519
Kaloula baleata Anura LC Arboreal 27.481917 38.29938
Kaloula borealis Anura LC Ground-dwelling 23.262885 37.93864
Kaloula conjuncta Anura LC Ground-dwelling 27.642081 38.27359
Kaloula kalingensis Anura LC Arboreal 27.864325 36.95067
Kaloula kokacii Anura LC Arboreal 27.879887 37.82352
Kaloula mediolineata Anura NT Ground-dwelling 28.729169 38.55533
Kaloula picta Anura LC Ground-dwelling 27.737658 38.25586
Kaloula pulchra Anura LC Ground-dwelling 27.848416 41.11518
Kaloula rigida Anura LC Ground-dwelling 27.991122 38.17767
Kaloula rugifera Anura LC Ground-dwelling 21.426060 37.69533
Kaloula verrucosa Anura LC Ground-dwelling 21.666479 37.76741
Kaloula walteri Anura VU Stream-dwelling 27.757881 37.74118
Karsenia koreana Caudata LC Ground-dwelling 23.953713 34.63354
Kassina arboricola Anura VU Semi-aquatic 27.718303 40.61057
Kassina cassinoides Anura LC Semi-aquatic 27.762649 40.64758
Kassina cochranae Anura LC Arboreal 27.679596 40.27314
Kassina decorata Anura VU Semi-aquatic 26.605270 40.55767
Kassina fusca Anura LC Ground-dwelling 27.937786 40.36528
Kassina jozani Anura EN Ground-dwelling 25.862318 40.06070
Kassina kuvangensis Anura LC Semi-aquatic 24.143692 40.13392
Kassina lamottei Anura LC Ground-dwelling 27.727678 40.31582
Kassina maculata Anura LC Ground-dwelling 25.629594 40.07643
Kassina maculifer Anura LC Ground-dwelling 24.556952 40.00672
Kassina maculosa Anura LC Ground-dwelling 27.049837 40.32456
Kassina mertensi Anura LC Ground-dwelling 26.613301 40.33388
Kassina schioetzi Anura LC Ground-dwelling 27.881718 40.35231
Kassina senegalensis Anura LC Ground-dwelling 25.450188 40.07236
Kassina somalica Anura LC Ground-dwelling 24.299361 39.95389
Kassina wazae Anura DD Semi-aquatic 27.838013 40.61340
Kassinula wittei Anura LC Arboreal 24.211793 40.27139
Kurixalus appendiculatus Anura LC Arboreal 27.615678 37.37166
Kurixalus baliogaster Anura LC Arboreal 28.321814 37.16141
Kurixalus banaensis Anura LC Arboreal 28.075572 37.17635
Kurixalus bisacculus Anura LC Arboreal 28.476236 37.33769
Kurixalus eiffingeri Anura LC Arboreal 27.581338 35.53656
Kurixalus idiootocus Anura LC Arboreal 27.659741 36.73324
Kurixalus naso Anura LC Arboreal 20.830211 36.26575
Kurixalus odontotarsus Anura LC Arboreal 25.121880 36.82967
Kurixalus verrucosus Anura LC Arboreal 27.242286 37.02995
Laliostoma labrosum Anura LC Ground-dwelling 26.542613 37.87139
Lankanectes corrugatus Anura NT Ground-dwelling 28.050126 37.29992
Lanzarana largeni Anura LC Ground-dwelling 25.751629 37.77229
Laotriton laoensis Caudata EN Aquatic 27.181236 37.56830
Latonia nigriventer Anura CR Semi-aquatic 23.639626 37.25621
Laurentophryne parkeri Anura DD Ground-dwelling 24.550522 38.48585
Lechriodus aganoposis Anura LC Ground-dwelling 26.718630 38.30228
Lechriodus fletcheri Anura LC Ground-dwelling 22.667575 37.38302
Lechriodus melanopyga Anura LC Ground-dwelling 27.200975 38.44274
Lechriodus platyceps Anura LC Ground-dwelling 27.025160 37.96546
Leiopelma archeyi Anura CR Ground-dwelling 19.283251 34.54102
Leiopelma hamiltoni Anura VU Ground-dwelling 18.504937 34.44758
Leiopelma hochstetteri Anura LC Semi-aquatic 19.354432 34.84508
Leiopelma pakeka Anura VU Ground-dwelling 17.018164 34.24279
Lepidobatrachus asper Anura NT Ground-dwelling 26.635503 40.91373
Lepidobatrachus laevis Anura LC Ground-dwelling 26.987012 41.00028
Lepidobatrachus llanensis Anura LC Fossorial 25.440836 42.85574
Leptobrachella baluensis Anura LC Ground-dwelling 27.138200 37.50945
Leptobrachella brevicrus Anura LC Stream-dwelling 27.321843 37.04895
Leptobrachella mjobergi Anura DD Ground-dwelling 27.322531 37.57046
Leptobrachella natunae Anura DD Stream-dwelling 27.552443 37.02432
Leptobrachella palmata Anura CR Stream-dwelling 28.513629 37.07994
Leptobrachella parva Anura LC Ground-dwelling 27.680243 37.69976
Leptobrachella serasanae Anura NT Ground-dwelling 27.936990 37.67306
Leptobrachium abbotti Anura LC Ground-dwelling 27.921698 37.54504
Leptobrachium ailaonicum Anura LC Ground-dwelling 23.748918 37.26123
Leptobrachium banae Anura LC Ground-dwelling 28.086887 37.72298
Leptobrachium boringii Anura EN Ground-dwelling 22.951704 37.08756
Leptobrachium buchardi Anura EN Ground-dwelling 28.721743 37.82487
Leptobrachium chapaense Anura LC Ground-dwelling 24.708620 37.32488
Leptobrachium gunungense Anura LC Ground-dwelling 27.189560 37.53956
Leptobrachium hainanense Anura VU Ground-dwelling 28.145497 37.74217
Leptobrachium hasseltii Anura LC Ground-dwelling 27.793307 37.63506
Leptobrachium hendricksoni Anura LC Ground-dwelling 28.378091 37.73514
Leptobrachium huashen Anura LC Ground-dwelling 23.347902 37.15980
Leptobrachium leishanense Anura EN Ground-dwelling 26.105134 37.47972
Leptobrachium leucops Anura VU Ground-dwelling 28.417762 37.82807
Leptobrachium liui Anura LC Ground-dwelling 27.517799 37.71370
Leptobrachium montanum Anura LC Ground-dwelling 27.795013 37.61805
Leptobrachium mouhoti Anura LC Ground-dwelling 28.394649 37.82660
Leptobrachium ngoclinhense Anura EN Ground-dwelling 27.911823 37.67350
Leptobrachium nigrops Anura LC Ground-dwelling 28.615478 37.75364
Leptobrachium promustache Anura EN Stream-dwelling 25.805111 36.79420
Leptobrachium pullum Anura LC Ground-dwelling 28.279834 37.74876
Leptobrachium smithi Anura LC Ground-dwelling 27.929637 37.70003
Leptobrachium xanthops Anura EN Stream-dwelling 27.662974 37.06273
Leptobrachium xanthospilum Anura EN Stream-dwelling 27.253507 37.06018
Leptodactylodon albiventris Anura EN Stream-dwelling 26.821882 38.38106
Leptodactylodon axillaris Anura CR Ground-dwelling 25.683805 38.81768
Leptodactylodon bicolor Anura NT Stream-dwelling 26.642228 38.36431
Leptodactylodon blanci Anura EN Stream-dwelling 28.414125 38.63096
Leptodactylodon boulengeri Anura NT Stream-dwelling 26.601273 38.31077
Leptodactylodon bueanus Anura EN Stream-dwelling 27.196836 38.44554
Leptodactylodon erythrogaster Anura CR Stream-dwelling 27.125406 38.36470
Leptodactylodon mertensi Anura EN Stream-dwelling 26.644872 38.37538
Leptodactylodon ornatus Anura EN Stream-dwelling 26.599971 38.33340
Leptodactylodon ovatus Anura LC Stream-dwelling 26.846848 38.41759
Leptodactylodon perreti Anura EN Stream-dwelling 26.197768 38.22781
Leptodactylodon polyacanthus Anura VU Stream-dwelling 26.504936 38.33325
Leptodactylodon stevarti Anura EN Stream-dwelling 27.222655 38.35888
Leptodactylodon ventrimarmoratus Anura VU Ground-dwelling 26.806103 39.03875
Leptodactylodon wildi Anura CR Stream-dwelling 27.191396 38.50747
Leptodactylus albilabris Anura LC Semi-aquatic 27.145140 38.11377
Leptodactylus bolivianus Anura LC Semi-aquatic 27.461815 39.11325
Leptodactylus bufonius Anura LC Ground-dwelling 26.478249 42.32555
Leptodactylus caatingae Anura LC Ground-dwelling 25.845100 39.86194
Leptodactylus camaquara Anura DD Fossorial 25.329739 40.85240
Leptodactylus chaquensis Anura LC Semi-aquatic 26.466739 39.93452
Leptodactylus colombiensis Anura LC Ground-dwelling 24.837567 39.79297
Leptodactylus cunicularius Anura LC Ground-dwelling 25.919190 40.02113
Leptodactylus cupreus Anura DD Fossorial 25.847809 40.82219
Leptodactylus didymus Anura LC Ground-dwelling 22.294262 38.11654
Leptodactylus diedrus Anura LC Ground-dwelling 28.755703 40.59126
Leptodactylus discodactylus Anura LC Ground-dwelling 27.583881 40.64693
Leptodactylus elenae Anura LC Ground-dwelling 27.347744 39.50375
Leptodactylus fallax Anura CR Ground-dwelling 27.145519 40.00683
Leptodactylus flavopictus Anura LC Ground-dwelling 25.666220 39.93976
Leptodactylus fragilis Anura LC Ground-dwelling 26.617669 41.53463
Leptodactylus furnarius Anura LC Ground-dwelling 26.635312 39.55104
Leptodactylus fuscus Anura LC Ground-dwelling 27.240801 42.33657
Leptodactylus gracilis Anura LC Ground-dwelling 24.783012 40.54040
Leptodactylus griseigularis Anura LC Ground-dwelling 19.680667 39.61921
Leptodactylus hylodes Anura DD Ground-dwelling 25.273849 39.82789
Leptodactylus jolyi Anura LC Ground-dwelling 26.399841 40.39840
Leptodactylus knudseni Anura LC Ground-dwelling 27.604761 40.05174
Leptodactylus labrosus Anura LC Ground-dwelling 24.344225 39.42177
Leptodactylus labyrinthicus Anura LC Semi-aquatic 27.477757 40.25226
Leptodactylus laticeps Anura NT Ground-dwelling 26.671880 39.99030
Leptodactylus latinasus Anura LC Ground-dwelling 25.443049 41.63056
Leptodactylus latrans Anura LC Semi-aquatic 26.741048 40.73776
Leptodactylus lauramiriamae Anura DD Ground-dwelling 28.103544 40.20437
Leptodactylus leptodactyloides Anura LC Ground-dwelling 27.710451 39.69157
Leptodactylus lithonaetes Anura LC Stream-dwelling 27.932965 41.21593
Leptodactylus longirostris Anura LC Ground-dwelling 27.183543 41.40373
Leptodactylus magistris Anura CR Stream-dwelling 26.512811 39.21615
Leptodactylus marambaiae Anura LC Ground-dwelling 25.471995 39.95267
Leptodactylus melanonotus Anura LC Ground-dwelling 26.603701 39.39484
Leptodactylus myersi Anura LC Ground-dwelling 27.448942 40.10063
Leptodactylus mystaceus Anura LC Ground-dwelling 27.676232 39.33752
Leptodactylus mystacinus Anura LC Ground-dwelling 25.712786 41.71357
Leptodactylus natalensis Anura LC Ground-dwelling 26.013038 39.92380
Leptodactylus nesiotus Anura LC Ground-dwelling 27.142160 39.74042
Leptodactylus notoaktites Anura LC Ground-dwelling 25.751105 39.16252
Leptodactylus paraensis Anura LC Ground-dwelling 28.059848 40.15158
Leptodactylus pentadactylus Anura LC Ground-dwelling 27.650132 40.04420
Leptodactylus peritoaktites Anura EN Ground-dwelling 25.726422 39.96949
Leptodactylus petersii Anura LC Ground-dwelling 27.974449 39.88384
Leptodactylus plaumanni Anura LC Ground-dwelling 25.706669 40.33886
Leptodactylus podicipinus Anura LC Ground-dwelling 27.751496 41.76791
Leptodactylus poecilochilus Anura LC Ground-dwelling 26.930583 38.98174
Leptodactylus pustulatus Anura LC Ground-dwelling 27.967129 40.20717
Leptodactylus rhodomerus Anura LC Ground-dwelling 25.162080 39.87387
Leptodactylus rhodomystax Anura LC Ground-dwelling 27.854827 39.33237
Leptodactylus rhodonotus Anura LC Ground-dwelling 23.506702 39.60243
Leptodactylus riveroi Anura LC Ground-dwelling 28.390929 40.44451
Leptodactylus rugosus Anura LC Ground-dwelling 26.438698 39.95536
Leptodactylus sabanensis Anura LC Ground-dwelling 26.170031 39.95669
Leptodactylus savagei Anura LC Ground-dwelling 27.017935 40.12248
Leptodactylus sertanejo Anura LC Ground-dwelling 26.761439 39.96964
Leptodactylus silvanimbus Anura CR Ground-dwelling 26.808944 40.03980
Leptodactylus spixi Anura LC Ground-dwelling 25.619060 39.15943
Leptodactylus stenodema Anura LC Ground-dwelling 27.995075 40.29015
Leptodactylus syphax Anura LC Ground-dwelling 26.998200 39.83675
Leptodactylus tapiti Anura DD Ground-dwelling 26.643224 40.03974
Leptodactylus troglodytes Anura LC Ground-dwelling 26.476424 41.27491
Leptodactylus turimiquensis Anura NT Ground-dwelling 26.813880 40.14707
Leptodactylus validus Anura LC Ground-dwelling 26.926455 40.12400
Leptodactylus vastus Anura LC Ground-dwelling 26.865228 40.06635
Leptodactylus ventrimaculatus Anura LC Ground-dwelling 25.164513 39.22826
Leptodactylus viridis Anura DD Ground-dwelling 25.483560 39.94468
Leptodactylus wagneri Anura LC Ground-dwelling 26.194859 39.40479
Leptopelis anchietae Anura LC Ground-dwelling 24.741233 38.65024
Leptopelis argenteus Anura LC Ground-dwelling 25.440502 38.79986
Leptopelis aubryi Anura LC Arboreal 27.730148 38.97567
Leptopelis aubryioides Anura LC Arboreal 27.431543 38.95184
Leptopelis bequaerti Anura DD Arboreal 27.573012 38.96833
Leptopelis bocagii Anura LC Fossorial 24.042690 39.60522
Leptopelis boulengeri Anura LC Arboreal 27.667417 38.95935
Leptopelis brevipes Anura DD Arboreal 26.388381 38.78722
Leptopelis brevirostris Anura LC Arboreal 27.333884 38.85842
Leptopelis bufonides Anura LC Fossorial 27.794140 40.10290
Leptopelis calcaratus Anura LC Arboreal 27.448755 38.98934
Leptopelis christyi Anura LC Arboreal 24.591443 38.49343
Leptopelis concolor Anura LC Arboreal 25.069954 38.62236
Leptopelis crystallinoron Anura DD Arboreal 27.222655 38.81964
Leptopelis cynnamomeus Anura LC Arboreal 24.599653 38.51867
Leptopelis fenestratus Anura DD Arboreal 25.264248 38.63031
Leptopelis fiziensis Anura DD Arboreal 24.419975 38.38181
Leptopelis flavomaculatus Anura LC Arboreal 25.192029 38.69591
Leptopelis gramineus Anura LC Fossorial 20.547985 39.16841
Leptopelis jordani Anura DD Arboreal 25.672523 38.60589
Leptopelis karissimbensis Anura VU Arboreal 22.614538 38.18677
Leptopelis kivuensis Anura LC Arboreal 23.183914 38.22809
Leptopelis lebeaui Anura DD Arboreal 25.800228 38.65733
Leptopelis mackayi Anura VU Arboreal 24.722684 38.59516
Leptopelis macrotis Anura NT Stream-dwelling 27.663194 38.50945
Leptopelis marginatus Anura DD Arboreal 24.114851 38.40103
Leptopelis millsoni Anura LC Arboreal 27.554003 38.82315
Leptopelis modestus Anura LC Stream-dwelling 26.516002 38.39248
Leptopelis mossambicus Anura LC Arboreal 25.136643 38.55662
Leptopelis natalensis Anura LC Arboreal 22.506444 38.26395
Leptopelis nordequatorialis Anura LC Arboreal 26.270303 38.75189
Leptopelis notatus Anura LC Arboreal 27.558097 38.85442
Leptopelis occidentalis Anura NT Arboreal 27.721961 38.82501
Leptopelis ocellatus Anura LC Arboreal 27.886757 39.11803
Leptopelis oryi Anura LC Arboreal 26.049646 38.65090
Leptopelis palmatus Anura EN Stream-dwelling 27.266657 38.34678
Leptopelis parbocagii Anura LC Fossorial 24.466037 39.56725
Leptopelis parkeri Anura EN Arboreal 23.982484 38.45462
Leptopelis parvus Anura DD Arboreal 25.072460 38.61807
Leptopelis ragazzii Anura VU Stream-dwelling 20.362967 37.57870
Leptopelis rufus Anura LC Arboreal 27.531393 38.92504
Leptopelis spiritusnoctis Anura LC Arboreal 27.768404 38.98548
Leptopelis susanae Anura EN Stream-dwelling 21.386135 37.63185
Leptopelis uluguruensis Anura NT Arboreal 23.910615 38.51304
Leptopelis vannutellii Anura LC Arboreal 22.133823 38.10902
Leptopelis vermiculatus Anura EN Arboreal 23.605043 38.39684
Leptopelis viridis Anura LC Arboreal 27.628262 38.86802
Leptopelis xenodactylus Anura EN Arboreal 21.940017 38.18294
Leptopelis yaldeni Anura VU Arboreal 23.089824 38.37389
Leptopelis zebra Anura LC Arboreal 26.814317 38.81048
Leptophryne borbonica Anura LC Ground-dwelling 28.238874 39.02414
Leptophryne cruentata Anura CR Stream-dwelling 28.621205 38.45525
Limnodynastes convexiusculus Anura LC Semi-aquatic 27.593212 36.46086
Limnodynastes depressus Anura LC Ground-dwelling 28.288099 35.54549
Limnodynastes dorsalis Anura LC Semi-aquatic 20.615130 35.94070
Limnodynastes dumerilii Anura LC Ground-dwelling 20.442020 35.27358
Limnodynastes fletcheri Anura LC Semi-aquatic 22.824617 33.62474
Limnodynastes interioris Anura LC Semi-aquatic 21.618127 35.72508
Limnodynastes lignarius Anura LC Ground-dwelling 28.241070 36.50374
Limnodynastes peronii Anura LC Ground-dwelling 22.189174 36.30601
Limnodynastes salmini Anura LC Ground-dwelling 23.548054 36.22573
Limnodynastes tasmaniensis Anura LC Semi-aquatic 22.744494 36.33481
Limnodynastes terraereginae Anura LC Semi-aquatic 24.653879 36.24539
Limnomedusa macroglossa Anura LC Semi-aquatic 24.808156 39.32600
Limnonectes acanthi Anura NT Stream-dwelling 27.906641 38.17881
Limnonectes arathooni Anura VU Ground-dwelling 27.189680 38.66769
Limnonectes asperatus Anura LC Ground-dwelling 28.612669 38.91831
Limnonectes blythii Anura LC Stream-dwelling 28.356025 37.15312
Limnonectes dabanus Anura LC Semi-aquatic 28.538114 39.18566
Limnonectes dammermani Anura LC Stream-dwelling 27.416283 38.13333
Limnonectes diuatus Anura VU Stream-dwelling 27.808024 38.18054
Limnonectes doriae Anura LC Ground-dwelling 28.053605 38.80138
Limnonectes finchi Anura LC Ground-dwelling 27.928676 38.40488
Limnonectes fragilis Anura VU Stream-dwelling 28.158168 38.12394
Limnonectes fujianensis Anura LC Semi-aquatic 27.674149 39.04905
Limnonectes grunniens Anura LC Semi-aquatic 27.184411 38.96753
Limnonectes gyldenstolpei Anura LC Ground-dwelling 28.141826 38.81994
Limnonectes hascheanus Anura LC Ground-dwelling 27.694030 38.67777
Limnonectes heinrichi Anura VU Stream-dwelling 27.444248 37.47128
Limnonectes ibanorum Anura LC Semi-aquatic 28.131721 39.00668
Limnonectes ingeri Anura LC Stream-dwelling 27.743515 37.78934
Limnonectes kadarsani Anura LC Stream-dwelling 27.606506 38.12045
Limnonectes kenepaiensis Anura VU Ground-dwelling 27.902362 38.99233
Limnonectes khammonensis Anura DD Ground-dwelling 28.682675 39.04538
Limnonectes khasianus Anura LC Ground-dwelling 25.865550 38.46496
Limnonectes kohchangae Anura LC Ground-dwelling 29.060378 38.93837
Limnonectes kuhlii Anura LC Stream-dwelling 27.481917 38.03472
Limnonectes leporinus Anura LC Ground-dwelling 28.081420 38.89234
Limnonectes leytensis Anura LC Stream-dwelling 27.562746 38.15844
Limnonectes limborgi Anura LC Ground-dwelling 27.209850 38.64498
Limnonectes macrocephalus Anura NT Semi-aquatic 27.961445 38.19431
Limnonectes macrodon Anura LC Semi-aquatic 27.811732 38.99799
Limnonectes macrognathus Anura LC Ground-dwelling 28.081802 38.83082
Limnonectes magnus Anura NT Stream-dwelling 27.561495 37.43571
Limnonectes malesianus Anura LC Stream-dwelling 28.450644 37.51892
Limnonectes mawlyndipi Anura DD Ground-dwelling 23.160752 38.22235
Limnonectes micrixalus Anura DD Stream-dwelling 26.911943 38.13033
Limnonectes microdiscus Anura LC Ground-dwelling 27.740658 38.64476
Limnonectes microtympanum Anura EN Stream-dwelling 26.861749 37.96642
Limnonectes modestus Anura LC Semi-aquatic 27.221506 38.33445
Limnonectes namiyei Anura EN Stream-dwelling 27.638404 38.06729
Limnonectes nitidus Anura EN Stream-dwelling 27.794848 38.19019
Limnonectes palavanensis Anura LC Stream-dwelling 27.884316 38.21508
Limnonectes paramacrodon Anura LC Semi-aquatic 28.273755 39.02739
Limnonectes parvus Anura LC Stream-dwelling 27.650524 38.15244
Limnonectes plicatellus Anura LC Stream-dwelling 28.446893 38.19339
Limnonectes poilani Anura LC Stream-dwelling 28.504569 37.50954
Limnonectes shompenorum Anura LC Ground-dwelling 27.653557 38.70985
Limnonectes tweediei Anura LC Ground-dwelling 28.365578 38.82536
Limnonectes visayanus Anura NT Stream-dwelling 27.398093 37.28900
Limnonectes woodworthi Anura LC Semi-aquatic 27.867994 37.56747
Lissotriton boscai Caudata LC Semi-aquatic 20.564606 36.89227
Lissotriton helveticus Caudata LC Semi-aquatic 18.260584 36.49498
Lissotriton italicus Caudata LC Semi-aquatic 23.675850 37.19632
Lissotriton montandoni Caudata LC Ground-dwelling 19.186578 36.30125
Lissotriton vulgaris Caudata LC Semi-aquatic 14.796267 35.98073
Lithobates berlandieri Anura LC Semi-aquatic 24.199626 39.86380
Lithobates bwana Anura LC Semi-aquatic 24.870264 37.83133
Lithobates catesbeianus Anura LC Semi-aquatic 22.864518 36.77046
Lithobates clamitans Anura LC Semi-aquatic 22.369361 36.79024
Lithobates palmipes Anura LC Semi-aquatic 27.496003 37.46595
Lithobates palustris Anura LC Semi-aquatic 23.205541 33.83851
Lithobates pipiens Anura LC Semi-aquatic 19.431149 36.03282
Lithobates sphenocephalus Anura LC Semi-aquatic 26.061328 39.14735
Lithobates sylvaticus Anura LC Semi-aquatic 16.397544 34.47081
Lithobates vaillanti Anura LC Semi-aquatic 26.361325 38.58177
Lithobates virgatipes Anura LC Semi-aquatic 25.343812 38.07110
Lithobates warszewitschii Anura LC Stream-dwelling 27.011867 34.72109
Lithodytes lineatus Anura LC Ground-dwelling 27.453822 39.83997
Litoria adelaidensis Anura LC Arboreal 20.624590 37.33595
Litoria albolabris Anura DD Arboreal 25.926222 39.45630
Litoria amboinensis Anura LC Arboreal 27.208547 38.08096
Litoria andiirrmalin Anura VU Stream-dwelling 27.562130 36.96596
Litoria angiana Anura LC Stream-dwelling 26.663280 37.50715
Litoria arfakiana Anura LC Arboreal 26.885546 38.05603
Litoria aruensis Anura DD Arboreal 26.821126 38.10375
Litoria auae Anura LC Arboreal 27.327789 38.22888
Litoria aurea Anura VU Semi-aquatic 20.641657 36.20077
Litoria becki Anura LC Stream-dwelling 26.487831 37.41027
Litoria biakensis Anura DD Arboreal 27.350340 38.03269
Litoria bibonius Anura LC Arboreal 27.379962 38.06947
Litoria bicolor Anura LC Arboreal 27.685227 40.87850
Litoria booroolongensis Anura CR Stream-dwelling 21.712188 35.61471
Litoria brevipalmata Anura EN Ground-dwelling 22.860151 37.64851
Litoria brongersmai Anura LC Stream-dwelling 25.745007 37.44493
Litoria bulmeri Anura LC Stream-dwelling 27.209817 37.68630
Litoria burrowsi Anura NT Arboreal 16.291351 36.63695
Litoria caerulea Anura LC Arboreal 25.482487 39.32497
Litoria capitula Anura DD Arboreal 27.454284 38.16140
Litoria cavernicola Anura DD Arboreal 27.758132 39.06659
Litoria chloris Anura LC Arboreal 23.252540 39.17450
Litoria chloronota Anura LC Semi-aquatic 27.785597 38.72549
Litoria chrisdahli Anura LC Arboreal 26.057487 37.99861
Litoria christianbergmanni Anura LC Arboreal 27.314380 38.24952
Litoria citropa Anura LC Stream-dwelling 20.228303 33.91890
Litoria congenita Anura LC Arboreal 27.337468 39.15207
Litoria contrastens Anura LC Semi-aquatic 26.610265 38.31446
Litoria cooloolensis Anura EN Arboreal 23.933724 37.72722
Litoria coplandi Anura LC Arboreal 27.598159 38.37887
Litoria cyclorhyncha Anura LC Semi-aquatic 20.080030 36.65206
Litoria dahlii Anura LC Semi-aquatic 27.949422 39.47342
Litoria darlingtoni Anura LC Arboreal 26.017530 37.97540
Litoria daviesae Anura VU Stream-dwelling 22.094493 35.00965
Litoria dayi Anura EN Stream-dwelling 26.203584 37.58995
Litoria dentata Anura LC Arboreal 22.603880 38.55456
Litoria dorsalis Anura LC Arboreal 27.337400 38.12230
Litoria dorsivena Anura LC Stream-dwelling 26.665234 37.58210
Litoria dux Anura LC Arboreal 25.720021 37.90665
Litoria electrica Anura LC Arboreal 25.999663 39.18154
Litoria elkeae Anura LC Arboreal 26.731891 37.95265
Litoria eucnemis Anura LC Stream-dwelling 27.064215 36.13678
Litoria everetti Anura DD Arboreal 27.525278 38.15225
Litoria ewingii Anura LC Arboreal 18.181251 34.76419
Litoria exophthalmia Anura LC Stream-dwelling 26.471903 37.42840
Litoria fallax Anura LC Arboreal 23.742641 39.52168
Litoria flavescens Anura LC Arboreal 27.703831 38.07476
Litoria freycineti Anura VU Ground-dwelling 22.657494 36.73647
Litoria fuscula Anura DD Stream-dwelling 24.020029 37.30228
Litoria genimaculata Anura LC Arboreal 26.948392 37.46570
Litoria gilleni Anura LC Arboreal 23.609203 38.54697
Litoria gracilenta Anura LC Arboreal 24.532375 38.57518
Litoria graminea Anura LC Arboreal 27.116758 38.04210
Litoria havina Anura LC Arboreal 27.679420 38.09940
Litoria hilli Anura LC Arboreal 27.393260 38.26828
Litoria humboldtorum Anura LC Arboreal 26.860920 38.10847
Litoria hunti Anura LC Arboreal 26.903474 37.97146
Litoria impura Anura LC Arboreal 27.362517 38.16011
Litoria inermis Anura LC Ground-dwelling 26.743650 37.20537
Litoria infrafrenata Anura LC Arboreal 27.350401 38.10725
Litoria iris Anura LC Arboreal 26.486192 38.01191
Litoria jervisiensis Anura LC Arboreal 20.601137 35.14466
Litoria jungguy Anura LC Stream-dwelling 26.348368 36.18726
Litoria kumae Anura LC Arboreal 25.925352 38.96439
Litoria latopalmata Anura LC Ground-dwelling 24.415190 36.82170
Litoria lesueurii Anura LC Stream-dwelling 20.415206 34.82786
Litoria leucova Anura LC Stream-dwelling 27.764437 37.70404
Litoria littlejohni Anura LC Arboreal 21.053375 34.91136
Litoria longicrus Anura DD Arboreal 27.533759 38.09161
Litoria longirostris Anura LC Arboreal 27.713309 38.15806
Litoria lorica Anura CR Stream-dwelling 26.770769 37.54083
Litoria louisiadensis Anura LC Stream-dwelling 27.553773 37.63922
Litoria lutea Anura LC Arboreal 27.810824 38.21551
Litoria macki Anura LC Stream-dwelling 24.020029 37.26891
Litoria majikthise Anura LC Arboreal 27.821029 38.13942
Litoria mareku Anura DD Arboreal 28.031168 38.22195
Litoria megalops Anura DD Stream-dwelling 24.020029 37.27550
Litoria meiriana Anura LC Semi-aquatic 28.142185 38.65377
Litoria microbelos Anura LC Ground-dwelling 27.907461 38.44291
Litoria micromembrana Anura LC Stream-dwelling 26.714442 37.55035
Litoria modica Anura LC Stream-dwelling 26.874936 37.64367
Litoria moorei Anura LC Semi-aquatic 20.723806 36.77675
Litoria mucro Anura LC Arboreal 26.995571 38.07802
Litoria multicolor Anura DD Arboreal 27.945788 38.24220
Litoria multiplica Anura LC Stream-dwelling 26.017530 37.50268
Litoria myola Anura CR Stream-dwelling 26.770769 37.47494
Litoria mystax Anura DD Arboreal 25.273758 37.95695
Litoria nannotis Anura LC Stream-dwelling 26.176582 37.57629
Litoria napaea Anura LC Stream-dwelling 25.858870 37.52936
Litoria nasuta Anura LC Ground-dwelling 26.741259 36.70320
Litoria nigrofrenata Anura LC Ground-dwelling 27.694468 38.69207
Litoria nigropunctata Anura LC Arboreal 26.888792 38.15046
Litoria nudidigita Anura LC Arboreal 19.751147 34.76507
Litoria obtusirostris Anura DD Arboreal 26.874997 38.08856
Litoria oenicolen Anura LC Stream-dwelling 26.658461 37.51391
Litoria ollauro Anura LC Arboreal 27.678143 38.22691
Litoria olongburensis Anura VU Arboreal 23.668655 38.76041
Litoria pallida Anura LC Ground-dwelling 27.377629 37.25249
Litoria paraewingi Anura LC Arboreal 20.081886 34.60333
Litoria pearsoniana Anura LC Stream-dwelling 22.845590 34.54193
Litoria peronii Anura LC Arboreal 22.305924 37.29098
Litoria personata Anura LC Ground-dwelling 28.573975 38.49772
Litoria phyllochroa Anura LC Stream-dwelling 22.446513 34.34262
Litoria pratti Anura DD Stream-dwelling 27.867454 37.84031
Litoria pronimia Anura LC Arboreal 26.172960 38.01132
Litoria prora Anura LC Arboreal 27.839557 38.24729
Litoria purpureolata Anura LC Arboreal 26.167068 38.00791
Litoria pygmaea Anura LC Arboreal 27.181843 38.06158
Litoria quadrilineata Anura DD Arboreal 27.443780 38.25270
Litoria raniformis Anura EN Semi-aquatic 18.506576 36.49806
Litoria rara Anura DD Arboreal 26.593990 38.10325
Litoria revelata Anura LC Arboreal 22.797876 35.09995
Litoria rheocola Anura EN Arboreal 26.325611 38.06503
Litoria richardsi Anura LC Arboreal 26.206369 37.91421
Litoria rivicola Anura LC Stream-dwelling 27.324747 37.71843
Litoria rothii Anura LC Arboreal 27.176837 39.19962
Litoria rubella Anura LC Arboreal 25.191368 39.81536
Litoria rubrops Anura LC Arboreal 27.633568 38.23406
Litoria sanguinolenta Anura LC Arboreal 27.695247 38.14930
Litoria scabra Anura LC Stream-dwelling 24.020029 37.24592
Litoria singadanae Anura LC Arboreal 25.720021 37.86051
Litoria spartacus Anura DD Arboreal 27.217699 38.17985
Litoria spenceri Anura CR Stream-dwelling 19.736473 34.47344
Litoria spinifera Anura LC Stream-dwelling 25.844142 37.59189
Litoria splendida Anura LC Arboreal 27.970032 39.13788
Litoria staccato Anura LC Ground-dwelling 28.081750 38.44526
Litoria subglandulosa Anura VU Stream-dwelling 22.885692 35.02532
Litoria thesaurensis Anura LC Arboreal 27.350314 38.11750
Litoria timida Anura LC Arboreal 27.915848 38.29669
Litoria tornieri Anura LC Ground-dwelling 28.118074 37.42417
Litoria tyleri Anura LC Arboreal 22.148094 37.54261
Litoria umarensis Anura DD Arboreal 28.031168 38.14046
Litoria umbonata Anura DD Arboreal 25.820430 37.91526
Litoria vagabunda Anura DD Arboreal 27.321133 38.11375
Litoria verae Anura DD Arboreal 28.031168 38.26518
Litoria verreauxii Anura LC Ground-dwelling 20.936977 34.08071
Litoria vocivincens Anura LC Ground-dwelling 27.387613 38.30164
Litoria wapogaensis Anura DD Stream-dwelling 24.020029 37.21400
Litoria watjulumensis Anura LC Ground-dwelling 27.731799 38.47915
Litoria wilcoxii Anura LC Stream-dwelling 24.038674 35.80368
Litoria wisselensis Anura DD Semi-aquatic 25.808020 38.37186
Litoria wollastoni Anura LC Arboreal 26.685475 38.06066
Litoria xanthomera Anura LC Arboreal 26.129469 39.24095
Liua shihi Caudata LC Semi-aquatic 24.987408 34.45484
Liua tsinpaensis Caudata VU Semi-aquatic 22.423793 34.10784
Liuixalus hainanus Anura VU Arboreal 28.029614 38.29954
Liuixalus ocellatus Anura VU Arboreal 28.158168 38.37518
Liuixalus romeri Anura EN Arboreal 27.639777 38.20711
Lyciasalamandra antalyana Caudata EN Ground-dwelling 23.805359 35.65436
Lyciasalamandra atifi Caudata EN Ground-dwelling 22.867086 35.40453
Lyciasalamandra fazilae Caudata EN Ground-dwelling 22.848776 35.46833
Lyciasalamandra flavimembris Caudata EN Ground-dwelling 23.796745 35.58650
Lyciasalamandra helverseni Caudata VU Ground-dwelling 24.243332 35.65842
Lyciasalamandra luschani Caudata VU Ground-dwelling 22.570085 35.38200
Lynchius flavomaculatus Anura DD Ground-dwelling 22.990209 34.29582
Lynchius nebulanastes Anura EN Ground-dwelling 22.881730 34.25896
Lynchius parkeri Anura EN Ground-dwelling 22.881730 34.31975
Lynchius simmonsi Anura VU Ground-dwelling 25.876801 34.66725
Lysapsus caraya Anura LC Aquatic 28.188656 40.96546
Lysapsus laevis Anura LC Aquatic 25.872276 40.43471
Lysapsus limellum Anura LC Aquatic 27.243384 41.13491
Macrogenioglottus alipioi Anura LC Semi-aquatic 25.682559 37.94587
Madecassophryne truebae Anura EN Ground-dwelling 25.752340 37.98664
Mannophryne caquetio Anura EN Stream-dwelling 26.601412 36.67077
Mannophryne collaris Anura EN Stream-dwelling 25.673615 36.56827
Mannophryne cordilleriana Anura VU Stream-dwelling 26.956396 36.71972
Mannophryne herminae Anura NT Stream-dwelling 26.940736 36.64400
Mannophryne lamarcai Anura EN Stream-dwelling 26.512811 36.69712
Mannophryne larandina Anura DD Ground-dwelling 26.854615 37.32542
Mannophryne leonardoi Anura NT Stream-dwelling 27.086121 36.66373
Mannophryne neblina Anura CR Stream-dwelling 27.121618 36.71169
Mannophryne oblitterata Anura NT Stream-dwelling 26.563037 36.70465
Mannophryne olmonae Anura VU Stream-dwelling 26.692732 36.69680
Mannophryne riveroi Anura EN Stream-dwelling 26.667627 36.74506
Mannophryne speeri Anura CR Stream-dwelling 25.511265 36.51860
Mannophryne trinitatis Anura LC Stream-dwelling 26.424572 36.71962
Mannophryne trujillensis Anura EN Stream-dwelling 26.854615 36.66464
Mannophryne venezuelensis Anura NT Stream-dwelling 26.832038 36.71822
Mannophryne yustizi Anura EN Stream-dwelling 25.511265 36.42713
Mantella baroni Anura LC Ground-dwelling 25.520037 37.76368
Mantella bernhardi Anura VU Ground-dwelling 26.022617 37.76747
Mantella betsileo Anura LC Ground-dwelling 26.547460 37.76260
Mantella cowanii Anura EN Stream-dwelling 25.529268 37.14980
Mantella crocea Anura VU Semi-aquatic 25.798195 38.00316
Mantella ebenaui Anura LC Ground-dwelling 26.832247 37.82588
Mantella expectata Anura EN Stream-dwelling 26.264673 37.17996
Mantella haraldmeieri Anura EN Stream-dwelling 25.953118 37.18346
Mantella laevigata Anura LC Ground-dwelling 26.371997 37.73733
Mantella madagascariensis Anura VU Stream-dwelling 25.382631 37.06593
Mantella manery Anura VU Ground-dwelling 27.096597 37.85074
Mantella milotympanum Anura CR Ground-dwelling 24.893568 37.62552
Mantella nigricans Anura LC Stream-dwelling 26.582654 37.23176
Mantella pulchra Anura NT Ground-dwelling 25.998243 37.75875
Mantella viridis Anura EN Stream-dwelling 26.637693 37.24121
Mantidactylus aerumnalis Anura LC Ground-dwelling 25.712678 37.68220
Mantidactylus albofrenatus Anura EN Stream-dwelling 24.925297 36.95231
Mantidactylus alutus Anura LC Semi-aquatic 25.765995 37.86078
Mantidactylus ambohimitombi Anura DD Stream-dwelling 25.647539 37.12605
Mantidactylus ambreensis Anura LC Stream-dwelling 26.680026 37.22032
Mantidactylus argenteus Anura LC Arboreal 25.837543 37.49696
Mantidactylus bellyi Anura LC Stream-dwelling 26.741933 37.12713
Mantidactylus betsileanus Anura LC Stream-dwelling 26.223369 37.06184
Mantidactylus biporus Anura LC Stream-dwelling 25.980788 37.08573
Mantidactylus bourgati Anura EN Stream-dwelling 26.040443 37.15285
Mantidactylus brevipalmatus Anura LC Stream-dwelling 25.903767 37.06302
Mantidactylus charlotteae Anura LC Stream-dwelling 25.859213 37.08872
Mantidactylus cowanii Anura NT Stream-dwelling 25.518428 37.02112
Mantidactylus curtus Anura LC Stream-dwelling 26.318115 37.07586
Mantidactylus delormei Anura EN Stream-dwelling 26.177430 37.13827
Mantidactylus femoralis Anura LC Stream-dwelling 26.148099 37.08205
Mantidactylus grandidieri Anura LC Stream-dwelling 25.879208 37.03626
Mantidactylus guttulatus Anura LC Stream-dwelling 26.144229 37.13605
Mantidactylus lugubris Anura LC Stream-dwelling 25.952953 37.10360
Mantidactylus madecassus Anura EN Stream-dwelling 26.094308 37.15645
Mantidactylus majori Anura LC Stream-dwelling 25.814637 37.09187
Mantidactylus melanopleura Anura LC Stream-dwelling 25.944755 37.03906
Mantidactylus mocquardi Anura LC Stream-dwelling 26.044482 37.12526
Mantidactylus noralottae Anura DD Arboreal 26.195793 37.59139
Mantidactylus opiparis Anura LC Stream-dwelling 26.165195 37.10882
Mantidactylus paidroa Anura EN Stream-dwelling 25.878849 37.01452
Mantidactylus pauliani Anura CR Stream-dwelling 25.047111 36.99429
Mantidactylus tricinctus Anura VU Stream-dwelling 25.819850 37.05153
Mantidactylus ulcerosus Anura LC Stream-dwelling 26.494882 37.10960
Mantidactylus zipperi Anura LC Stream-dwelling 25.620755 37.08863
Mantidactylus zolitschka Anura CR Stream-dwelling 24.925297 36.95247
Mantophryne lateralis Anura LC Ground-dwelling 27.178877 35.40021
Mantophryne louisiadensis Anura LC Ground-dwelling 27.553773 35.41390
Megaelosia apuana Anura DD Stream-dwelling 25.882443 36.66442
Megaelosia bocainensis Anura DD Stream-dwelling 26.714437 36.80336
Megaelosia boticariana Anura DD Stream-dwelling 25.741310 36.68887
Megaelosia goeldii Anura LC Stream-dwelling 26.098283 36.67453
Megaelosia jordanensis Anura DD Ground-dwelling 26.191708 37.28246
Megaelosia lutzae Anura DD Stream-dwelling 26.714437 36.80483
Megaelosia massarti Anura DD Stream-dwelling 25.141569 36.61794
Megastomatohyla mixe Anura CR Stream-dwelling 22.681874 38.75001
Megastomatohyla mixomaculata Anura EN Stream-dwelling 24.858995 38.97268
Megastomatohyla nubicola Anura CR Stream-dwelling 25.789382 39.15104
Megastomatohyla pellita Anura CR Stream-dwelling 26.914236 39.29905
Megophrys kobayashii Anura LC Ground-dwelling 27.540277 37.62548
Megophrys ligayae Anura NT Ground-dwelling 27.845204 37.68533
Megophrys montana Anura LC Ground-dwelling 27.450287 37.54270
Megophrys nasuta Anura LC Ground-dwelling 28.326690 37.65016
Megophrys stejnegeri Anura LC Ground-dwelling 27.599783 37.60844
Melanobatrachus indicus Anura VU Ground-dwelling 27.927840 37.77857
Melanophryniscus admirabilis Anura CR Stream-dwelling 25.377939 37.78918
Melanophryniscus alipioi Anura DD Ground-dwelling 24.076546 38.17256
Melanophryniscus atroluteus Anura LC Ground-dwelling 24.940495 38.31786
Melanophryniscus cambaraensis Anura DD Stream-dwelling 24.675082 37.79387
Melanophryniscus cupreuscapularis Anura NT Ground-dwelling 27.241941 38.64887
Melanophryniscus devincenzii Anura EN Stream-dwelling 24.705411 38.19548
Melanophryniscus dorsalis Anura VU Ground-dwelling 24.335058 38.37511
Melanophryniscus fulvoguttatus Anura LC Ground-dwelling 28.017801 38.71107
Melanophryniscus klappenbachi Anura LC Ground-dwelling 27.781100 38.69472
Melanophryniscus krauczuki Anura LC Stream-dwelling 27.157010 38.98387
Melanophryniscus langonei Anura CR Stream-dwelling 24.890107 37.61511
Melanophryniscus macrogranulosus Anura VU Ground-dwelling 24.884955 38.24680
Melanophryniscus montevidensis Anura VU Ground-dwelling 22.212080 37.90976
Melanophryniscus moreirae Anura NT Ground-dwelling 26.714437 38.54828
Melanophryniscus orejasmirandai Anura VU Ground-dwelling 21.862607 38.02003
Melanophryniscus pachyrhynus Anura DD Ground-dwelling 24.168876 38.28587
Melanophryniscus peritus Anura CR Ground-dwelling 26.412111 38.52396
Melanophryniscus rubriventris Anura LC Ground-dwelling 19.423294 35.74294
Melanophryniscus sanmartini Anura NT Ground-dwelling 23.103259 38.12361
Melanophryniscus simplex Anura DD Ground-dwelling 24.898854 38.40994
Melanophryniscus spectabilis Anura DD Ground-dwelling 25.257994 38.38146
Melanophryniscus stelzneri Anura LC Ground-dwelling 21.704839 37.90605
Melanophryniscus tumifrons Anura LC Ground-dwelling 24.978947 38.43274
Meristogenys amoropalamus Anura LC Stream-dwelling 27.453420 36.94873
Meristogenys jerboa Anura VU Stream-dwelling 28.438186 37.06033
Meristogenys kinabaluensis Anura LC Stream-dwelling 27.521129 36.85340
Meristogenys macrophthalmus Anura DD Stream-dwelling 28.217251 37.01923
Meristogenys orphnocnemis Anura LC Stream-dwelling 27.828139 36.99262
Meristogenys phaeomerus Anura LC Stream-dwelling 28.243192 37.03295
Meristogenys poecilus Anura LC Stream-dwelling 28.343031 37.05884
Meristogenys whiteheadi Anura LC Stream-dwelling 27.925674 36.92365
Mertensiella caucasica Caudata VU Semi-aquatic 19.468288 35.85275
Mertensophryne anotis Anura LC Ground-dwelling 26.517866 38.84957
Mertensophryne howelli Anura EN Ground-dwelling 26.181850 38.82352
Mertensophryne lindneri Anura LC Ground-dwelling 25.450257 38.68999
Mertensophryne lonnbergi Anura VU Ground-dwelling 21.651044 38.25944
Mertensophryne loveridgei Anura LC Ground-dwelling 25.778053 38.75894
Mertensophryne melanopleura Anura LC Ground-dwelling 24.441557 38.52050
Mertensophryne micranotis Anura LC Ground-dwelling 25.138953 38.70568
Mertensophryne mocquardi Anura DD Ground-dwelling 21.261217 38.15609
Mertensophryne nairobiensis Anura DD Ground-dwelling 21.601189 38.20590
Mertensophryne nyikae Anura NT Ground-dwelling 22.179062 38.26662
Mertensophryne schmidti Anura DD Ground-dwelling 25.800228 38.72915
Mertensophryne taitana Anura LC Ground-dwelling 23.388085 38.46018
Mertensophryne usambarae Anura CR Ground-dwelling 25.090940 38.70256
Mertensophryne uzunguensis Anura VU Ground-dwelling 22.132744 38.24623
Metacrinia nichollsi Anura LC Ground-dwelling 19.113387 35.19458
Metaphrynella pollicaris Anura LC Arboreal 28.362280 38.08167
Metaphrynella sundana Anura LC Arboreal 28.045567 38.02666
Metaphryniscus sosai Anura NT Ground-dwelling 25.966820 38.65222
Micrixalus elegans Anura DD Stream-dwelling 26.875890 37.11753
Micrixalus fuscus Anura NT Stream-dwelling 27.563293 37.15593
Micrixalus gadgili Anura EN Stream-dwelling 27.525072 37.20030
Micrixalus kottigeharensis Anura CR Semi-aquatic 26.875890 37.96465
Micrixalus narainensis Anura DD Stream-dwelling 26.875890 37.11797
Micrixalus nudis Anura VU Semi-aquatic 27.780236 38.05323
Micrixalus phyllophilus Anura VU Stream-dwelling 27.676074 37.13762
Micrixalus saxicola Anura VU Stream-dwelling 27.052461 37.18246
Micrixalus silvaticus Anura DD Stream-dwelling 27.631649 37.22605
Micrixalus swamianus Anura DD Ground-dwelling 26.875890 37.67881
Micrixalus thampii Anura DD Stream-dwelling 27.229333 37.14607
Microbatrachella capensis Anura CR Semi-aquatic 20.817692 37.21247
Microhyla achatina Anura LC Ground-dwelling 27.581954 38.03390
Microhyla berdmorei Anura LC Ground-dwelling 27.464920 38.57049
Microhyla borneensis Anura LC Ground-dwelling 28.663384 38.16950
Microhyla butleri Anura LC Ground-dwelling 27.111809 38.51555
Microhyla chakrapanii Anura DD Ground-dwelling 28.674045 38.65340
Microhyla fissipes Anura LC Ground-dwelling 26.551013 39.37055
Microhyla heymonsi Anura LC Ground-dwelling 27.461709 40.56870
Microhyla karunaratnei Anura EN Ground-dwelling 27.547532 38.62017
Microhyla maculifera Anura DD Ground-dwelling 28.262351 38.66876
Microhyla mantheyi Anura LC Ground-dwelling 28.543996 37.44006
Microhyla mixtura Anura LC Ground-dwelling 24.658481 38.07920
Microhyla okinavensis Anura LC Ground-dwelling 27.464438 38.54432
Microhyla ornata Anura LC Ground-dwelling 26.825878 40.09824
Microhyla palmipes Anura LC Ground-dwelling 28.152734 38.67340
Microhyla picta Anura DD Ground-dwelling 27.988984 38.70869
Microhyla pulchra Anura LC Ground-dwelling 27.486658 38.54517
Microhyla pulverata Anura DD Ground-dwelling 27.253507 38.51971
Microhyla rubra Anura LC Ground-dwelling 27.381056 38.48795
Microhyla sholigari Anura EN Ground-dwelling 27.550187 38.48102
Microhyla superciliaris Anura LC Ground-dwelling 28.400490 38.72579
Microhyla zeylanica Anura EN Semi-aquatic 27.547532 38.70214
Micryletta inornata Anura LC Ground-dwelling 28.444793 38.06469
Micryletta steinegeri Anura VU Ground-dwelling 28.001842 38.03914
Minyobates steyermarki Anura CR Arboreal 27.588342 36.45158
Mixophyes balbus Anura VU Stream-dwelling 21.413044 32.60821
Mixophyes carbinensis Anura LC Stream-dwelling 26.937055 33.43103
Mixophyes coggeri Anura LC Ground-dwelling 26.075047 33.92230
Mixophyes fasciolatus Anura LC Ground-dwelling 23.097552 32.41881
Mixophyes fleayi Anura EN Semi-aquatic 23.723704 33.84103
Mixophyes hihihorlo Anura DD Ground-dwelling 27.746469 34.30979
Mixophyes iteratus Anura EN Stream-dwelling 22.643465 32.49816
Mixophyes schevilli Anura LC Stream-dwelling 26.203584 33.35251
Morerella cyanophthalma Anura VU Stream-dwelling 27.339405 40.19883
Myersiella microps Anura LC Ground-dwelling 25.776733 39.30410
Myersiohyla aromatica Anura VU Arboreal 25.966820 39.16809
Myersiohyla inparquesi Anura NT Arboreal 25.966820 39.20543
Myersiohyla loveridgei Anura NT Ground-dwelling 25.966820 39.27225
Myobatrachus gouldii Anura LC Fossorial 20.855755 36.41450
Nannophryne apolobambica Anura CR Ground-dwelling 16.318090 37.38368
Nannophryne corynetes Anura EN Ground-dwelling 18.526994 37.69009
Nannophryne variegata Anura LC Ground-dwelling 11.581406 36.77549
Nannophrys ceylonensis Anura VU Aquatic 27.674004 40.61167
Nannophrys marmorata Anura EN Semi-aquatic 27.674004 40.65413
Nannophrys naeyakai Anura EN Stream-dwelling 28.452741 39.98835
Nanorana aenea Anura LC Ground-dwelling 25.340885 41.51181
Nanorana annandalii Anura NT Stream-dwelling 19.754539 40.26112
Nanorana arnoldi Anura DD Stream-dwelling 17.056244 39.86323
Nanorana blanfordii Anura LC Stream-dwelling 18.920805 40.04797
Nanorana conaensis Anura DD Stream-dwelling 18.359299 39.92675
Nanorana ercepeae Anura NT Stream-dwelling 20.767892 40.34290
Nanorana liebigii Anura LC Stream-dwelling 16.912352 39.85691
Nanorana maculosa Anura VU Stream-dwelling 22.882467 40.58814
Nanorana medogensis Anura EN Stream-dwelling 16.407198 39.82240
Nanorana minica Anura LC Stream-dwelling 17.890316 39.95740
Nanorana mokokchungensis Anura DD Stream-dwelling 26.727759 41.00656
Nanorana parkeri Anura LC Ground-dwelling 11.239134 39.73437
Nanorana pleskei Anura LC Aquatic 13.844309 40.13857
Nanorana polunini Anura LC Stream-dwelling 17.664201 39.99818
Nanorana quadranus Anura NT Stream-dwelling 23.711943 40.70642
Nanorana rarica Anura DD Semi-aquatic 12.388279 40.14355
Nanorana rostandi Anura VU Stream-dwelling 16.561387 39.77810
Nanorana taihangnica Anura LC Stream-dwelling 22.921876 40.58815
Nanorana unculuanus Anura VU Stream-dwelling 23.475689 40.69649
Nanorana ventripunctata Anura LC Semi-aquatic 16.554604 40.61260
Nanorana vicina Anura LC Stream-dwelling 15.629296 39.64069
Nanorana yunnanensis Anura EN Stream-dwelling 23.065242 40.62877
Nasikabatrachus sahyadrensis Anura NT Fossorial 27.811422 38.65759
Natalobatrachus bonebergi Anura EN Stream-dwelling 22.385133 36.56881
Nectophryne afra Anura LC Ground-dwelling 27.383526 38.89710
Nectophryne batesii Anura LC Ground-dwelling 27.360841 38.81063
Nectophrynoides cryptus Anura EN Ground-dwelling 24.359158 38.77638
Nectophrynoides frontierei Anura DD Ground-dwelling 25.080649 38.80034
Nectophrynoides laevis Anura DD Ground-dwelling 24.488624 38.80392
Nectophrynoides laticeps Anura CR Ground-dwelling 23.164809 38.58717
Nectophrynoides minutus Anura EN Ground-dwelling 24.359158 38.75023
Nectophrynoides paulae Anura CR Arboreal 23.164809 38.40889
Nectophrynoides poyntoni Anura CR Ground-dwelling 21.685335 38.38062
Nectophrynoides pseudotornieri Anura CR Ground-dwelling 24.229692 38.70665
Nectophrynoides tornieri Anura LC Ground-dwelling 23.828042 38.63893
Nectophrynoides vestergaardi Anura EN Ground-dwelling 25.085794 38.83852
Nectophrynoides viviparus Anura LC Ground-dwelling 23.100789 38.52893
Nectophrynoides wendyae Anura CR Ground-dwelling 21.685335 38.36520
Necturus alabamensis Caudata EN Aquatic 27.720247 35.34560
Necturus beyeri Caudata LC Aquatic 27.812352 35.37773
Necturus lewisi Caudata NT Aquatic 24.774419 35.03700
Necturus maculosus Caudata LC Aquatic 22.646398 34.60406
Necturus punctatus Caudata LC Aquatic 25.679401 35.11203
Neobatrachus albipes Anura LC Ground-dwelling 20.648170 34.20707
Neobatrachus aquilonius Anura LC Ground-dwelling 26.942738 34.75992
Neobatrachus fulvus Anura LC Ground-dwelling 25.419275 34.37765
Neobatrachus kunapalari Anura LC Ground-dwelling 21.330887 34.31895
Neobatrachus pelobatoides Anura LC Ground-dwelling 20.818550 33.72533
Neobatrachus pictus Anura LC Fossorial 20.690563 33.72404
Neobatrachus sudelli Anura LC Ground-dwelling 22.627494 33.98102
Neobatrachus sutor Anura LC Ground-dwelling 22.735397 34.03067
Neobatrachus wilsmorei Anura LC Ground-dwelling 23.071252 34.25229
Neurergus crocatus Caudata VU Aquatic 21.280792 36.83985
Neurergus kaiseri Caudata VU Semi-aquatic 23.352765 37.11828
Neurergus strauchii Caudata VU Semi-aquatic 20.136634 36.72800
Niceforonia adenobrachia Anura EN Ground-dwelling 21.387901 32.92938
Niceforonia nana Anura VU Ground-dwelling 23.498591 33.33616
Nimbaphrynoides occidentalis Anura CR Ground-dwelling 27.635550 38.97517
Noblella carrascoicola Anura LC Ground-dwelling 18.545793 31.46042
Noblella coloma Anura CR Ground-dwelling 19.955019 31.68530
Noblella duellmani Anura DD Ground-dwelling 21.293309 31.81587
Noblella heyeri Anura LC Ground-dwelling 23.200249 32.35464
Noblella lochites Anura EN Ground-dwelling 24.985852 32.61031
Noblella lynchi Anura EN Ground-dwelling 23.472623 32.17365
Noblella myrmecoides Anura LC Ground-dwelling 26.070153 32.94437
Noblella pygmaea Anura LC Ground-dwelling 14.573980 28.28003
Noblella ritarasquinae Anura LC Ground-dwelling 18.545793 31.51352
Notaden bennettii Anura LC Ground-dwelling 23.610744 35.25773
Notaden melanoscaphus Anura LC Ground-dwelling 27.924506 35.86669
Notaden nichollsi Anura LC Fossorial 25.082603 36.41180
Notaden weigeli Anura LC Fossorial 28.109930 36.92246
Nothophryne broadleyi Anura EN Stream-dwelling 25.902836 37.16747
Notophthalmus meridionalis Caudata VU Semi-aquatic 25.470368 38.33913
Notophthalmus perstriatus Caudata NT Semi-aquatic 27.689791 38.74691
Notophthalmus viridescens Caudata LC Aquatic 23.037599 39.07484
Nototriton abscondens Caudata LC Ground-dwelling 25.171956 35.24519
Nototriton barbouri Caudata EN Ground-dwelling 26.218855 35.43667
Nototriton brodiei Caudata EN Ground-dwelling 25.474466 35.29289
Nototriton gamezi Caudata LC Ground-dwelling 27.731359 35.53858
Nototriton guanacaste Caudata LC Ground-dwelling 26.749134 35.38664
Nototriton lignicola Caudata EN Ground-dwelling 25.679465 35.29719
Nototriton limnospectator Caudata EN Ground-dwelling 25.258907 35.23331
Nototriton major Caudata EN Ground-dwelling 17.152122 34.27206
Nototriton picadoi Caudata LC Ground-dwelling 24.318821 35.12053
Nototriton richardi Caudata LC Ground-dwelling 27.786289 35.51642
Nototriton saslaya Caudata CR Ground-dwelling 26.980559 35.43555
Nototriton stuarti Caudata CR Ground-dwelling 25.474466 35.36105
Nototriton tapanti Caudata LC Ground-dwelling 22.496670 34.87600
Nyctanolis pernix Caudata VU Ground-dwelling 25.015983 35.16274
Nyctibates corrugatus Anura LC Ground-dwelling 26.911933 38.95363
Nyctibatrachus aliciae Anura EN Semi-aquatic 27.319488 37.39279
Nyctibatrachus beddomii Anura EN Semi-aquatic 27.834131 37.52312
Nyctibatrachus dattatreyaensis Anura CR Stream-dwelling 26.702734 36.49808
Nyctibatrachus deccanensis Anura VU Semi-aquatic 27.564255 37.41636
Nyctibatrachus humayuni Anura VU Stream-dwelling 26.868913 36.63728
Nyctibatrachus karnatakaensis Anura EN Stream-dwelling 26.702734 36.44432
Nyctibatrachus kempholeyensis Anura DD Stream-dwelling 27.049047 36.58012
Nyctibatrachus major Anura VU Stream-dwelling 27.411710 36.61124
Nyctibatrachus minimus Anura DD Ground-dwelling 27.593117 37.22185
Nyctibatrachus minor Anura EN Semi-aquatic 27.519155 37.44633
Nyctibatrachus petraeus Anura NT Stream-dwelling 27.157284 36.63892
Nyctibatrachus sanctipalustris Anura EN Semi-aquatic 26.858559 37.32233
Nyctibatrachus sylvaticus Anura DD Stream-dwelling 27.049047 36.55803
Nyctibatrachus vasanthi Anura EN Stream-dwelling 27.808977 36.68130
Nyctimantis rugiceps Anura LC Arboreal 25.847336 39.87987
Nyctimystes avocalis Anura LC Stream-dwelling 27.379962 37.63083
Nyctimystes cheesmani Anura LC Stream-dwelling 26.278115 37.48109
Nyctimystes daymani Anura LC Stream-dwelling 27.678143 37.66339
Nyctimystes disruptus Anura LC Stream-dwelling 26.053860 37.49253
Nyctimystes fluviatilis Anura LC Stream-dwelling 26.785311 37.56516
Nyctimystes foricula Anura LC Stream-dwelling 26.543377 37.55205
Nyctimystes granti Anura LC Stream-dwelling 27.055100 37.66603
Nyctimystes gularis Anura LC Stream-dwelling 27.498582 37.61239
Nyctimystes humeralis Anura LC Stream-dwelling 26.644116 37.53020
Nyctimystes kubori Anura LC Stream-dwelling 26.699212 37.49281
Nyctimystes kuduki Anura DD Stream-dwelling 26.688929 37.53594
Nyctimystes montanus Anura DD Stream-dwelling 27.860409 37.66501
Nyctimystes narinosus Anura LC Stream-dwelling 25.872355 37.43712
Nyctimystes obsoletus Anura DD Stream-dwelling 26.251026 37.41830
Nyctimystes oktediensis Anura LC Arboreal 27.351580 38.08810
Nyctimystes papua Anura LC Stream-dwelling 27.290904 37.68336
Nyctimystes perimetri Anura LC Stream-dwelling 27.393260 37.65503
Nyctimystes persimilis Anura LC Stream-dwelling 27.607723 37.69788
Nyctimystes pulcher Anura LC Stream-dwelling 26.651507 37.61477
Nyctimystes semipalmatus Anura LC Stream-dwelling 26.629601 37.56008
Nyctimystes trachydermis Anura LC Stream-dwelling 27.180733 37.63276
Nyctimystes zweifeli Anura LC Stream-dwelling 26.830266 37.59132
Nyctixalus margaritifer Anura LC Arboreal 27.868455 37.68481
Nyctixalus pictus Anura LC Arboreal 27.997710 37.32184
Nyctixalus spinosus Anura LC Ground-dwelling 27.542129 37.80748
Nymphargus anomalus Anura EN Stream-dwelling 22.966949 36.56575
Nymphargus armatus Anura CR Stream-dwelling 24.198867 36.73820
Nymphargus bejaranoi Anura EN Arboreal 18.545793 36.41853
Nymphargus buenaventura Anura EN Stream-dwelling 24.212864 36.70865
Nymphargus cariticommatus Anura EN Stream-dwelling 23.865482 36.70110
Nymphargus chami Anura NT Arboreal 26.309963 37.55189
Nymphargus chancas Anura EN Stream-dwelling 24.381259 36.79932
Nymphargus cochranae Anura LC Stream-dwelling 23.033015 36.58375
Nymphargus cristinae Anura EN Arboreal 26.439037 37.46144
Nymphargus garciae Anura VU Arboreal 23.481345 37.05797
Nymphargus grandisonae Anura LC Arboreal 23.919590 37.24123
Nymphargus griffithsi Anura LC Arboreal 23.945938 37.22825
Nymphargus ignotus Anura LC Arboreal 25.401204 37.34667
Nymphargus laurae Anura EN Arboreal 23.837156 37.19722
Nymphargus luminosus Anura EN Arboreal 26.439037 37.50894
Nymphargus luteopunctatus Anura EN Arboreal 24.364732 37.23369
Nymphargus mariae Anura LC Arboreal 23.778253 37.11433
Nymphargus mixomaculatus Anura CR Stream-dwelling 15.720102 35.66823
Nymphargus nephelophila Anura DD Stream-dwelling 25.868620 37.03057
Nymphargus ocellatus Anura DD Arboreal 21.293309 36.80849
Nymphargus oreonympha Anura LC Arboreal 25.868620 37.38581
Nymphargus phenax Anura EN Arboreal 15.595790 36.08439
Nymphargus pluvialis Anura EN Stream-dwelling 17.982179 35.93485
Nymphargus posadae Anura LC Arboreal 23.435383 37.04151
Nymphargus prasinus Anura VU Arboreal 24.930172 37.38627
Nymphargus rosada Anura VU Arboreal 23.267499 37.13071
Nymphargus ruizi Anura VU Arboreal 24.532910 37.23405
Nymphargus siren Anura EN Arboreal 23.382727 37.18203
Nymphargus spilotus Anura NT Arboreal 23.046042 37.06303
Nymphargus vicenteruedai Anura DD Stream-dwelling 22.575003 36.56173
Nymphargus wileyi Anura CR Stream-dwelling 23.837156 36.73585
Occidozyga baluensis Anura LC Aquatic 27.999039 38.35677
Occidozyga celebensis Anura LC Semi-aquatic 27.032697 38.23596
Occidozyga diminutiva Anura NT Stream-dwelling 27.227709 37.26239
Occidozyga floresiana Anura VU Semi-aquatic 27.219124 37.51820
Occidozyga laevis Anura LC Aquatic 27.735231 36.88111
Occidozyga lima Anura LC Semi-aquatic 27.675026 38.27877
Occidozyga magnapustulosa Anura LC Aquatic 27.867965 38.10210
Occidozyga martensii Anura LC Aquatic 27.593101 38.03354
Occidozyga semipalmata Anura LC Aquatic 27.058232 38.03918
Occidozyga sumatrana Anura LC Semi-aquatic 27.809241 38.23145
Odontobatrachus natator Anura LC Stream-dwelling 27.668492 37.18677
Odontophrynus achalensis Anura VU Semi-aquatic 23.100998 36.69219
Odontophrynus americanus Anura LC Fossorial 24.955928 38.98209
Odontophrynus barrioi Anura LC Ground-dwelling 20.344381 37.63156
Odontophrynus carvalhoi Anura LC Ground-dwelling 26.059131 37.74031
Odontophrynus cordobae Anura LC Stream-dwelling 24.116754 36.69041
Odontophrynus cultripes Anura LC Fossorial 26.260481 38.56222
Odontophrynus lavillai Anura LC Fossorial 25.094398 38.40451
Odontophrynus occidentalis Anura LC Ground-dwelling 20.743716 35.15138
Odorrana absita Anura LC Stream-dwelling 28.068805 36.30874
Odorrana amamiensis Anura EN Stream-dwelling 27.273711 36.28554
Odorrana anlungensis Anura EN Stream-dwelling 24.370712 35.87628
Odorrana aureola Anura LC Stream-dwelling 27.599949 36.33155
Odorrana bacboensis Anura LC Stream-dwelling 26.498676 36.16582
Odorrana banaorum Anura LC Stream-dwelling 28.504569 36.34098
Odorrana bolavensis Anura EN Stream-dwelling 28.721743 36.42453
Odorrana chapaensis Anura LC Stream-dwelling 25.967546 36.12599
Odorrana chloronota Anura LC Stream-dwelling 27.101228 36.27255
Odorrana exiliversabilis Anura LC Stream-dwelling 27.338028 36.37533
Odorrana geminata Anura VU Stream-dwelling 25.830675 36.01393
Odorrana gigatympana Anura LC Stream-dwelling 28.295956 36.41951
Odorrana grahami Anura VU Stream-dwelling 21.538380 35.48799
Odorrana graminea Anura LC Stream-dwelling 28.194974 36.40000
Odorrana hainanensis Anura VU Stream-dwelling 28.145497 36.42051
Odorrana hejiangensis Anura VU Stream-dwelling 24.918596 35.92659
Odorrana hosii Anura LC Stream-dwelling 28.230435 36.33741
Odorrana indeprensa Anura VU Stream-dwelling 29.179900 36.54012
Odorrana ishikawae Anura EN Stream-dwelling 27.638404 36.31694
Odorrana jingdongensis Anura VU Stream-dwelling 23.285732 35.74657
Odorrana junlianensis Anura LC Stream-dwelling 24.211468 35.88984
Odorrana khalam Anura LC Stream-dwelling 28.322226 36.35352
Odorrana kuangwuensis Anura VU Stream-dwelling 23.795336 35.77414
Odorrana leporipes Anura DD Stream-dwelling 28.477286 36.35814
Odorrana livida Anura DD Stream-dwelling 28.387064 36.48654
Odorrana lungshengensis Anura LC Stream-dwelling 26.545737 36.14887
Odorrana margaretae Anura LC Stream-dwelling 24.316523 35.93739
Odorrana mawphlangensis Anura DD Stream-dwelling 24.690616 35.89769
Odorrana monjerai Anura DD Stream-dwelling 28.824507 36.38259
Odorrana morafkai Anura LC Stream-dwelling 28.555775 36.40362
Odorrana narina Anura EN Stream-dwelling 27.638404 36.32428
Odorrana nasica Anura LC Stream-dwelling 27.736654 36.34506
Odorrana nasuta Anura LC Stream-dwelling 28.158168 36.44231
Odorrana orba Anura LC Stream-dwelling 28.184957 36.35823
Odorrana schmackeri Anura LC Stream-dwelling 25.872402 36.09223
Odorrana splendida Anura EN Stream-dwelling 27.216885 36.24741
Odorrana supranarina Anura EN Stream-dwelling 28.069796 36.32246
Odorrana swinhoana Anura LC Stream-dwelling 27.537243 36.20910
Odorrana tiannanensis Anura LC Stream-dwelling 26.579545 36.14809
Odorrana tormota Anura LC Stream-dwelling 27.390769 36.36040
Odorrana trankieni Anura NT Stream-dwelling 27.443238 36.28878
Odorrana utsunomiyaorum Anura EN Stream-dwelling 28.069796 36.32343
Odorrana versabilis Anura LC Stream-dwelling 27.189838 36.38585
Odorrana wuchuanensis Anura VU Stream-dwelling 25.903732 36.07964
Odorrana yentuensis Anura EN Stream-dwelling 27.747355 36.33937
Oedipina alfaroi Caudata VU Ground-dwelling 24.312211 35.04624
Oedipina alleni Caudata LC Ground-dwelling 24.985341 35.13692
Oedipina altura Caudata DD Ground-dwelling 17.152122 34.20644
Oedipina carablanca Caudata EN Ground-dwelling 27.841219 35.56094
Oedipina collaris Caudata DD Ground-dwelling 25.099162 35.10608
Oedipina complex Caudata LC Ground-dwelling 25.865207 35.26381
Oedipina cyclocauda Caudata NT Ground-dwelling 25.742721 35.27970
Oedipina elongata Caudata LC Ground-dwelling 27.004424 35.35748
Oedipina gephyra Caudata CR Ground-dwelling 26.218855 35.31373
Oedipina gracilis Caudata EN Ground-dwelling 25.166998 35.18363
Oedipina grandis Caudata EN Fossorial 28.045611 36.54871
Oedipina ignea Caudata EN Ground-dwelling 25.978876 35.31445
Oedipina maritima Caudata CR Ground-dwelling 28.249726 35.58626
Oedipina pacificensis Caudata LC Fossorial 24.985341 36.06149
Oedipina parvipes Caudata LC Ground-dwelling 27.004622 35.39769
Oedipina paucidentata Caudata DD Ground-dwelling 17.152122 34.27171
Oedipina poelzi Caudata EN Ground-dwelling 25.171956 35.24159
Oedipina pseudouniformis Caudata DD Ground-dwelling 22.496670 34.91724
Oedipina savagei Caudata VU Ground-dwelling 25.576931 35.20128
Oedipina stenopodia Caudata EN Ground-dwelling 27.195014 35.46181
Oedipina taylori Caudata EN Ground-dwelling 27.772197 35.45123
Oedipina tomasi Caudata CR Ground-dwelling 25.474466 35.18356
Oedipina uniformis Caudata LC Ground-dwelling 26.275796 35.22060
Ololygon agilis Anura LC Arboreal 25.535122 41.35332
Ololygon aromothyella Anura DD Arboreal 26.877164 41.16983
Ombrana sikimensis Anura LC Stream-dwelling 20.368082 38.00907
Ommatotriton ophryticus Caudata NT Ground-dwelling 19.760312 36.43769
Ommatotriton vittatus Caudata LC Semi-aquatic 23.670789 37.13485
Onychodactylus fischeri Caudata LC Semi-aquatic 21.283008 34.53652
Onychodactylus japonicus Caudata LC Semi-aquatic 24.910996 35.03863
Oophaga granulifera Anura VU Ground-dwelling 25.576931 34.64883
Oophaga occultator Anura CR Ground-dwelling 25.763603 34.16291
Oophaga pumilio Anura LC Ground-dwelling 26.762973 32.89321
Oophaga sylvatica Anura NT Ground-dwelling 24.471182 34.06883
Oophaga vicentei Anura EN Arboreal 27.293423 34.04413
Opisthothylax immaculatus Anura LC Arboreal 27.631210 40.57597
Oreobates ayacucho Anura EN Ground-dwelling 18.639686 32.74666
Oreobates choristolemma Anura VU Ground-dwelling 20.000781 33.50574
Oreobates crepitans Anura DD Ground-dwelling 28.205441 35.08306
Oreobates cruralis Anura LC Ground-dwelling 21.233886 35.78664
Oreobates discoidalis Anura DD Ground-dwelling 20.008899 34.12042
Oreobates gemcare Anura LC Ground-dwelling 14.573980 29.11356
Oreobates granulosus Anura LC Ground-dwelling 16.202655 32.34537
Oreobates heterodactylus Anura DD Ground-dwelling 28.378616 35.03332
Oreobates ibischi Anura LC Ground-dwelling 21.782690 34.32341
Oreobates lehri Anura EN Ground-dwelling 17.822366 31.49959
Oreobates lundbergi Anura EN Ground-dwelling 21.293309 33.95485
Oreobates madidi Anura LC Ground-dwelling 21.018189 34.51457
Oreobates pereger Anura EN Ground-dwelling 16.788504 32.54609
Oreobates quixensis Anura LC Ground-dwelling 27.326762 37.65625
Oreobates sanctaecrucis Anura LC Ground-dwelling 22.321742 33.95286
Oreobates sanderi Anura LC Ground-dwelling 19.041148 33.24224
Oreobates saxatilis Anura LC Ground-dwelling 21.034111 35.57501
Oreobates zongoensis Anura CR Ground-dwelling 17.902178 33.51974
Oreolalax chuanbeiensis Anura EN Ground-dwelling 18.740568 36.51119
Oreolalax granulosus Anura NT Stream-dwelling 22.882467 36.41335
Oreolalax jingdongensis Anura VU Stream-dwelling 22.406826 36.44937
Oreolalax liangbeiensis Anura CR Ground-dwelling 20.834276 36.85349
Oreolalax lichuanensis Anura LC Ground-dwelling 25.461759 37.43558
Oreolalax major Anura LC Ground-dwelling 19.844231 36.72827
Oreolalax multipunctatus Anura EN Ground-dwelling 19.508927 36.60173
Oreolalax nanjiangensis Anura VU Stream-dwelling 20.277182 36.12570
Oreolalax omeimontis Anura EN Ground-dwelling 21.440032 36.83692
Oreolalax pingii Anura EN Ground-dwelling 21.043228 36.84675
Oreolalax popei Anura LC Ground-dwelling 19.653032 36.64878
Oreolalax puxiongensis Anura EN Semi-aquatic 20.834276 37.04087
Oreolalax rhodostigmatus Anura VU Ground-dwelling 25.157400 37.38848
Oreolalax rugosus Anura LC Semi-aquatic 20.676370 37.03218
Oreolalax schmidti Anura NT Ground-dwelling 19.726461 36.63540
Oreolalax xiangchengensis Anura LC Stream-dwelling 16.482509 35.60959
Oreophryne albopunctata Anura LC Arboreal 27.434668 35.31817
Oreophryne alticola Anura DD Ground-dwelling 25.609209 35.24301
Oreophryne anthonyi Anura LC Arboreal 27.498582 35.33130
Oreophryne anulata Anura LC Arboreal 27.700679 35.41530
Oreophryne asplenicola Anura DD Arboreal 26.372759 35.11417
Oreophryne atrigularis Anura DD Arboreal 27.032046 35.38783
Oreophryne biroi Anura LC Arboreal 26.768437 35.17038
Oreophryne brachypus Anura LC Arboreal 27.578589 35.23589
Oreophryne brevicrus Anura DD Arboreal 26.232798 35.16749
Oreophryne brevirostris Anura VU Ground-dwelling 25.609209 35.33368
Oreophryne celebensis Anura VU Arboreal 27.444248 35.26196
Oreophryne clamata Anura DD Arboreal 28.031168 35.48244
Oreophryne crucifer Anura LC Arboreal 27.027784 35.31071
Oreophryne flava Anura DD Arboreal 25.972733 35.04837
Oreophryne frontifasciata Anura DD Arboreal 27.157221 35.28040
Oreophryne geislerorum Anura LC Arboreal 27.185208 35.25311
Oreophryne geminus Anura DD Arboreal 27.821029 35.48765
Oreophryne habbemensis Anura DD Arboreal 27.479976 35.31556
Oreophryne hypsiops Anura LC Arboreal 26.989146 35.31492
Oreophryne idenburgensis Anura LC Arboreal 28.339510 35.40652
Oreophryne inornata Anura LC Arboreal 27.379962 35.25033
Oreophryne insulana Anura VU Arboreal 27.379962 35.32716
Oreophryne jeffersoniana Anura LC Arboreal 27.467110 35.25666
Oreophryne kampeni Anura DD Arboreal 28.037156 35.35465
Oreophryne kapisa Anura LC Arboreal 26.892847 35.19329
Oreophryne loriae Anura DD Arboreal 28.037156 35.42914
Oreophryne minuta Anura LC Arboreal 24.020029 34.73092
Oreophryne moluccensis Anura LC Arboreal 27.578896 35.43058
Oreophryne monticola Anura EN Arboreal 27.702619 35.41063
Oreophryne notata Anura LC Arboreal 26.304487 35.22025
Oreophryne pseudasplenicola Anura DD Arboreal 26.372759 35.12383
Oreophryne rookmaakeri Anura EN Arboreal 26.933835 35.26816
Oreophryne sibilans Anura DD Arboreal 28.031168 35.40287
Oreophryne terrestris Anura DD Arboreal 27.821029 35.41293
Oreophryne unicolor Anura DD Arboreal 27.472200 35.26176
Oreophryne variabilis Anura VU Arboreal 27.270879 35.37446
Oreophryne waira Anura DD Arboreal 26.372759 35.22333
Oreophryne wapoga Anura DD Arboreal 25.755928 35.04337
Oreophrynella cryptica Anura NT Ground-dwelling 26.143635 38.72277
Oreophrynella dendronastes Anura DD Arboreal 26.912428 38.71389
Oreophrynella huberi Anura VU Ground-dwelling 26.310247 38.73255
Oreophrynella macconnelli Anura VU Arboreal 26.912428 38.66281
Oreophrynella nigra Anura VU Ground-dwelling 26.671496 38.80704
Oreophrynella quelchii Anura VU Ground-dwelling 26.671496 38.82153
Oreophrynella vasquezi Anura VU Ground-dwelling 25.966470 38.75109
Oreophrynella weiassipuensis Anura DD Arboreal 26.671496 38.56227
Osornophryne antisana Anura EN Ground-dwelling 22.061283 38.04851
Osornophryne bufoniformis Anura NT Ground-dwelling 22.662368 38.15369
Osornophryne cofanorum Anura LC Arboreal 22.211278 37.95947
Osornophryne guacamayo Anura VU Ground-dwelling 22.001151 38.08044
Osornophryne percrassa Anura VU Ground-dwelling 22.658289 38.18171
Osornophryne puruanta Anura EN Ground-dwelling 22.211278 38.08675
Osornophryne sumacoensis Anura VU Ground-dwelling 23.837156 38.39342
Osornophryne talipes Anura VU Ground-dwelling 22.968880 38.24947
Osteocephalus alboguttatus Anura LC Arboreal 24.710956 39.48205
Osteocephalus buckleyi Anura LC Stream-dwelling 27.559407 39.79874
Osteocephalus cabrerai Anura LC Arboreal 27.500440 39.80979
Osteocephalus castaneicola Anura LC Arboreal 22.361976 39.14172
Osteocephalus deridens Anura LC Arboreal 27.126277 39.75413
Osteocephalus fuscifacies Anura LC Arboreal 26.735572 39.67241
Osteocephalus heyeri Anura LC Arboreal 29.333404 40.09364
Osteocephalus leoniae Anura LC Arboreal 21.985038 39.09601
Osteocephalus leprieurii Anura LC Arboreal 27.862594 39.87841
Osteocephalus mutabor Anura LC Arboreal 24.830682 38.87729
Osteocephalus oophagus Anura LC Arboreal 28.237883 39.94198
Osteocephalus planiceps Anura LC Arboreal 26.549532 39.71683
Osteocephalus subtilis Anura LC Ground-dwelling 28.683164 40.13235
Osteocephalus taurinus Anura LC Arboreal 27.773820 39.89630
Osteocephalus verruciger Anura LC Stream-dwelling 24.910426 39.04960
Osteocephalus yasuni Anura LC Arboreal 28.322153 39.95790
Osteopilus crucialis Anura VU Arboreal 27.512405 39.83386
Osteopilus dominicensis Anura LC Arboreal 27.497780 39.89824
Osteopilus marianae Anura EN Arboreal 27.453434 39.85475
Osteopilus ocellatus Anura NT Arboreal 27.545850 39.84273
Osteopilus pulchrilineatus Anura VU Arboreal 27.336324 39.91663
Osteopilus septentrionalis Anura LC Arboreal 27.523564 39.19547
Osteopilus vastus Anura VU Stream-dwelling 27.259805 39.45065
Osteopilus wilderi Anura VU Arboreal 27.568588 39.83554
Otophryne pyburni Anura LC Ground-dwelling 27.592049 37.61237
Otophryne robusta Anura LC Ground-dwelling 26.255413 37.48236
Otophryne steyermarki Anura LC Ground-dwelling 26.094206 37.45874
Pachyhynobius shangchengensis Caudata VU Semi-aquatic 27.911080 34.78185
Pachytriton brevipes Caudata LC Aquatic 26.739870 37.51899
Paracassina kounhiensis Anura VU Arboreal 20.363946 39.52541
Paracassina obscura Anura LC Arboreal 21.854238 39.79697
Paracrinia haswelli Anura LC Stream-dwelling 20.413292 34.35527
Paradoxophyla palmata Anura LC Fossorial 25.769795 38.90246
Paradoxophyla tiarano Anura DD Ground-dwelling 26.773003 38.07358
Paramesotriton caudopunctatus Caudata NT Aquatic 26.882660 37.43051
Paramesotriton chinensis Caudata LC Semi-aquatic 26.930794 37.48711
Paramesotriton deloustali Caudata LC Aquatic 26.220075 37.31779
Paramesotriton fuzhongensis Caudata VU Semi-aquatic 27.615330 37.63905
Paramesotriton hongkongensis Caudata NT Ground-dwelling 27.917902 37.40804
Paramesotriton labiatus Caudata CR Aquatic 28.035574 37.17754
Parapelophryne scalpta Anura VU Ground-dwelling 28.145497 39.14364
Paratelmatobius cardosoi Anura DD Ground-dwelling 25.141569 39.26070
Paratelmatobius gaigeae Anura DD Ground-dwelling 26.714437 39.52291
Paratelmatobius lutzii Anura DD Ground-dwelling 26.714437 39.50522
Paratelmatobius mantiqueira Anura DD Ground-dwelling 26.191708 39.43960
Paratelmatobius poecilogaster Anura DD Ground-dwelling 25.141569 39.36516
Parhoplophryne usambarica Anura CR Ground-dwelling 25.080649 38.32171
Parvimolge townsendi Caudata VU Ground-dwelling 25.132478 35.22117
Pedostibes kempi Anura DD Arboreal 25.601956 38.60370
Pedostibes tuberculosus Anura EN Stream-dwelling 27.625351 38.53499
Pelobates cultripes Anura VU Ground-dwelling 21.056008 38.10309
Pelobates fuscus Anura LC Ground-dwelling 18.980009 37.30036
Pelobates syriacus Anura LC Fossorial 20.659877 38.57710
Pelobates varaldii Anura EN Fossorial 22.877492 39.02937
Pelodytes caucasicus Anura NT Semi-aquatic 20.047848 36.12808
Pelodytes ibericus Anura LC Semi-aquatic 22.151068 35.62989
Pelodytes punctatus Anura LC Semi-aquatic 20.292770 35.92195
Pelophryne albotaeniata Anura VU Arboreal 27.811324 39.02495
Pelophryne api Anura LC Ground-dwelling 27.321843 39.02441
Pelophryne brevipes Anura LC Arboreal 27.770902 38.93798
Pelophryne guentheri Anura LC Ground-dwelling 27.524835 39.12803
Pelophryne lighti Anura LC Arboreal 27.536705 39.00371
Pelophryne linanitensis Anura CR Ground-dwelling 26.158013 38.94573
Pelophryne misera Anura LC Ground-dwelling 26.959611 38.98532
Pelophryne murudensis Anura CR Ground-dwelling 26.158013 38.99166
Pelophryne rhopophilia Anura VU Ground-dwelling 27.599273 39.10743
Pelophryne signata Anura LC Ground-dwelling 27.712727 39.05545
Pelophylax bedriagae Anura LC Aquatic 22.946697 37.64746
Pelophylax bergeri Anura LC Semi-aquatic 23.493682 37.76461
Pelophylax caralitanus Anura NT Aquatic 21.594614 37.54882
Pelophylax cerigensis Anura CR Aquatic 24.564498 37.92040
Pelophylax chosenicus Anura VU Semi-aquatic 22.846554 37.69201
Pelophylax cretensis Anura VU Semi-aquatic 24.879008 37.95455
Pelophylax epeiroticus Anura NT Aquatic 20.782748 37.35125
Pelophylax fukienensis Anura LC Aquatic 27.333858 38.22899
Pelophylax hubeiensis Anura LC Aquatic 26.964887 38.26771
Pelophylax kurtmuelleri Anura LC Aquatic 22.339293 37.56860
Pelophylax lessonae Anura LC Semi-aquatic 19.024567 37.12242
Pelophylax nigromaculatus Anura NT Aquatic 22.846145 37.57065
Pelophylax perezi Anura LC Semi-aquatic 21.116379 38.41357
Pelophylax plancyi Anura LC Semi-aquatic 25.075756 37.95513
Pelophylax porosus Anura LC Semi-aquatic 24.768973 37.91121
Pelophylax ridibundus Anura LC Semi-aquatic 19.824271 37.29976
Pelophylax saharicus Anura LC Aquatic 23.270345 38.39977
Pelophylax shqipericus Anura VU Aquatic 22.407893 37.50511
Pelophylax tenggerensis Anura EN Aquatic 18.855164 37.05291
Pelophylax terentievi Anura DD Semi-aquatic 14.768756 36.55218
Peltophryne cataulaciceps Anura EN Ground-dwelling 27.444628 38.84295
Peltophryne empusa Anura VU Ground-dwelling 27.534654 38.86981
Peltophryne florentinoi Anura CR Ground-dwelling 27.476309 38.83360
Peltophryne fustiger Anura LC Ground-dwelling 27.450832 38.81687
Peltophryne guentheri Anura LC Ground-dwelling 27.483070 38.78990
Peltophryne gundlachi Anura VU Ground-dwelling 27.470163 38.76031
Peltophryne lemur Anura EN Ground-dwelling 27.072959 38.83379
Peltophryne longinasus Anura EN Ground-dwelling 27.582823 38.89166
Peltophryne peltocephala Anura LC Ground-dwelling 27.567168 38.79522
Peltophryne taladai Anura VU Ground-dwelling 27.633385 38.84072
Petropedetes cameronensis Anura LC Stream-dwelling 27.019060 36.96974
Petropedetes johnstoni Anura LC Ground-dwelling 27.038406 37.64565
Petropedetes palmipes Anura VU Semi-aquatic 27.066775 37.95668
Petropedetes parkeri Anura DD Semi-aquatic 26.930526 37.84534
Petropedetes perreti Anura CR Stream-dwelling 26.644872 36.98202
Phaeognathus hubrichti Caudata EN Ground-dwelling 28.296362 35.00174
Phasmahyla cochranae Anura LC Arboreal 26.039438 38.91495
Phasmahyla exilis Anura LC Arboreal 25.596079 38.77384
Phasmahyla guttata Anura LC Arboreal 25.847042 38.81182
Phasmahyla jandaia Anura LC Stream-dwelling 25.564647 38.24147
Phasmahyla spectabilis Anura DD Arboreal 25.655650 38.13063
Phasmahyla timbo Anura DD Stream-dwelling 24.908486 38.31055
Philautus abditus Anura LC Stream-dwelling 28.219863 36.82928
Philautus acutirostris Anura LC Arboreal 27.603411 36.02823
Philautus acutus Anura LC Arboreal 27.227495 37.15435
Philautus amoenus Anura LC Arboreal 27.189560 37.22793
Philautus aurantium Anura VU Arboreal 27.540277 37.28453
Philautus aurifasciatus Anura LC Arboreal 27.858793 37.26854
Philautus bunitus Anura LC Arboreal 27.657701 37.34879
Philautus cardamonus Anura EN Arboreal 29.289540 37.53427
Philautus cornutus Anura EN Arboreal 29.112694 37.51834
Philautus davidlabangi Anura LC Arboreal 28.175617 37.29390
Philautus disgregus Anura NT Arboreal 28.220973 37.35977
Philautus erythrophthalmus Anura EN Arboreal 27.846517 37.28845
Philautus everetti Anura EN Arboreal 27.849778 37.19758
Philautus garo Anura DD Arboreal 25.601956 36.84584
Philautus gunungensis Anura LC Arboreal 27.189560 37.20784
Philautus hosii Anura LC Arboreal 27.886235 37.24750
Philautus ingeri Anura VU Arboreal 27.334238 37.25533
Philautus kempiae Anura CR Arboreal 25.601956 36.96354
Philautus kempii Anura DD Arboreal 17.750552 35.92056
Philautus kerangae Anura VU Arboreal 27.069877 37.26787
Philautus leitensis Anura LC Arboreal 27.605317 37.23246
Philautus longicrus Anura VU Arboreal 27.645869 37.24742
Philautus maosonensis Anura DD Arboreal 27.245576 37.13505
Philautus microdiscus Anura CR Arboreal 20.956618 36.29562
Philautus mjobergi Anura LC Arboreal 27.295784 37.28354
Philautus namdaphaensis Anura DD Arboreal 22.342472 36.50910
Philautus pallidipes Anura LC Arboreal 28.621205 37.43196
Philautus petersi Anura DD Ground-dwelling 27.570595 37.35597
Philautus poecilius Anura LC Arboreal 27.665350 37.27085
Philautus refugii Anura VU Arboreal 28.167894 37.32644
Philautus saueri Anura LC Arboreal 27.189560 37.28600
Philautus schmackeri Anura EN Arboreal 27.810488 37.26516
Philautus similipalensis Anura DD Ground-dwelling 30.153214 37.76224
Philautus surdus Anura LC Arboreal 27.730695 35.53861
Philautus surrufus Anura NT Arboreal 27.627032 37.14496
Philautus tectus Anura LC Arboreal 28.081211 37.33045
Philautus tytthus Anura DD Arboreal 24.156784 36.75566
Philautus umbra Anura LC Arboreal 27.321843 37.28483
Philautus vermiculatus Anura LC Arboreal 28.307161 37.32870
Philautus vittiger Anura NT Arboreal 28.131525 37.31882
Philautus worcesteri Anura LC Arboreal 27.740174 37.45139
Philoria frosti Anura CR Ground-dwelling 19.878076 30.01431
Philoria kundagungan Anura EN Ground-dwelling 23.593207 33.26025
Philoria loveridgei Anura EN Ground-dwelling 23.495554 33.43942
Philoria pughi Anura EN Stream-dwelling 23.336562 31.43629
Philoria richmondensis Anura EN Ground-dwelling 23.424501 33.29616
Philoria sphagnicolus Anura EN Ground-dwelling 22.986318 32.13569
Phlyctimantis boulengeri Anura LC Arboreal 27.474043 40.17128
Phlyctimantis keithae Anura EN Arboreal 21.685335 39.40432
Phlyctimantis leonardi Anura LC Arboreal 27.994923 40.17254
Phlyctimantis verrucosus Anura LC Arboreal 26.141902 39.92754
Phrynella pulchra Anura LC Arboreal 28.458011 38.22490
Phrynobatrachus acridoides Anura LC Semi-aquatic 24.508171 37.68587
Phrynobatrachus acutirostris Anura NT Stream-dwelling 23.091156 36.65408
Phrynobatrachus africanus Anura LC Semi-aquatic 27.424945 38.14526
Phrynobatrachus albomarginatus Anura DD Ground-dwelling 26.858234 37.78864
Phrynobatrachus alleni Anura LC Semi-aquatic 27.707689 38.05718
Phrynobatrachus annulatus Anura LC Semi-aquatic 27.644337 38.11535
Phrynobatrachus anotis Anura DD Ground-dwelling 25.269289 37.41045
Phrynobatrachus asper Anura VU Semi-aquatic 24.302798 37.74509
Phrynobatrachus auritus Anura LC Ground-dwelling 27.428415 37.73637
Phrynobatrachus batesii Anura LC Ground-dwelling 27.176195 37.72243
Phrynobatrachus bequaerti Anura LC Semi-aquatic 23.108804 37.43991
Phrynobatrachus breviceps Anura DD Ground-dwelling 21.685335 36.93624
Phrynobatrachus brevipalmatus Anura DD Ground-dwelling 26.593601 37.73817
Phrynobatrachus bullans Anura LC Semi-aquatic 22.079591 37.36817
Phrynobatrachus calcaratus Anura LC Semi-aquatic 27.527663 38.06136
Phrynobatrachus chukuchuku Anura CR Semi-aquatic 25.817681 37.78761
Phrynobatrachus cornutus Anura LC Ground-dwelling 27.520362 37.84775
Phrynobatrachus cricogaster Anura NT Semi-aquatic 26.955925 37.94941
Phrynobatrachus cryptotis Anura DD Ground-dwelling 25.269289 37.54952
Phrynobatrachus dalcqi Anura DD Ground-dwelling 25.375973 37.49959
Phrynobatrachus dendrobates Anura LC Ground-dwelling 24.975150 37.44065
Phrynobatrachus dispar Anura LC Semi-aquatic 27.266657 37.97669
Phrynobatrachus elberti Anura DD Ground-dwelling 27.169992 37.84703
Phrynobatrachus francisci Anura LC Ground-dwelling 27.766061 37.76883
Phrynobatrachus fraterculus Anura LC Semi-aquatic 27.657048 37.99669
Phrynobatrachus gastoni Anura DD Ground-dwelling 27.789084 37.86000
Phrynobatrachus ghanensis Anura NT Ground-dwelling 27.578083 37.73363
Phrynobatrachus giorgii Anura DD Ground-dwelling 28.317460 37.92261
Phrynobatrachus graueri Anura LC Semi-aquatic 22.812033 37.60460
Phrynobatrachus guineensis Anura LC Arboreal 27.634723 37.65886
Phrynobatrachus gutturosus Anura LC Semi-aquatic 27.878854 38.07889
Phrynobatrachus hylaios Anura LC Semi-aquatic 27.326750 38.00101
Phrynobatrachus inexpectatus Anura DD Ground-dwelling 19.782608 36.75261
Phrynobatrachus intermedius Anura CR Semi-aquatic 27.581893 38.11195
Phrynobatrachus irangi Anura CR Ground-dwelling 21.910703 37.07943
Phrynobatrachus kakamikro Anura DD Ground-dwelling 22.784709 37.09933
Phrynobatrachus keniensis Anura LC Semi-aquatic 21.320855 37.25334
Phrynobatrachus kinangopensis Anura VU Semi-aquatic 21.422362 37.34711
Phrynobatrachus krefftii Anura EN Ground-dwelling 25.085794 37.53630
Phrynobatrachus latifrons Anura LC Ground-dwelling 27.807181 37.87410
Phrynobatrachus leveleve Anura LC Semi-aquatic 27.104015 37.95812
Phrynobatrachus liberiensis Anura LC Semi-aquatic 27.647507 38.05747
Phrynobatrachus mababiensis Anura LC Semi-aquatic 24.201433 37.62006
Phrynobatrachus minutus Anura LC Semi-aquatic 21.235176 37.24303
Phrynobatrachus nanus Anura DD Ground-dwelling 27.169992 37.65814
Phrynobatrachus natalensis Anura LC Ground-dwelling 25.181001 37.57710
Phrynobatrachus ogoensis Anura DD Ground-dwelling 28.800383 38.07179
Phrynobatrachus pakenhami Anura EN Semi-aquatic 25.412884 37.87087
Phrynobatrachus pallidus Anura LC Semi-aquatic 25.512923 37.86324
Phrynobatrachus parkeri Anura LC Ground-dwelling 27.773541 37.82226
Phrynobatrachus parvulus Anura LC Ground-dwelling 24.256564 37.37710
Phrynobatrachus perpalmatus Anura LC Semi-aquatic 25.704168 37.76754
Phrynobatrachus petropedetoides Anura DD Ground-dwelling 24.760431 37.44591
Phrynobatrachus phyllophilus Anura LC Ground-dwelling 27.647507 37.80542
Phrynobatrachus pintoi Anura EN Ground-dwelling 28.021273 37.80669
Phrynobatrachus plicatus Anura LC Semi-aquatic 27.825143 38.10356
Phrynobatrachus pygmaeus Anura DD Ground-dwelling 27.169992 37.65897
Phrynobatrachus rouxi Anura DD Ground-dwelling 21.017652 36.99483
Phrynobatrachus rungwensis Anura LC Semi-aquatic 23.586189 37.48034
Phrynobatrachus sandersoni Anura LC Ground-dwelling 26.874287 37.96222
Phrynobatrachus scapularis Anura LC Semi-aquatic 26.992906 37.91189
Phrynobatrachus scheffleri Anura LC Semi-aquatic 23.115202 37.49384
Phrynobatrachus steindachneri Anura CR Semi-aquatic 26.097737 37.86187
Phrynobatrachus sternfeldi Anura DD Ground-dwelling 27.578482 37.74336
Phrynobatrachus stewartae Anura LC Semi-aquatic 23.123424 37.33792
Phrynobatrachus sulfureogularis Anura VU Ground-dwelling 23.039952 37.14411
Phrynobatrachus taiensis Anura DD Ground-dwelling 27.573070 37.88615
Phrynobatrachus tokba Anura LC Ground-dwelling 27.632506 37.85360
Phrynobatrachus ukingensis Anura LC Semi-aquatic 23.038101 37.38952
Phrynobatrachus ungujae Anura EN Ground-dwelling 25.354542 37.47627
Phrynobatrachus uzungwensis Anura NT Stream-dwelling 23.217953 36.59663
Phrynobatrachus versicolor Anura LC Ground-dwelling 22.254248 37.17374
Phrynobatrachus villiersi Anura LC Ground-dwelling 27.632376 37.90663
Phrynobatrachus werneri Anura LC Stream-dwelling 26.612735 37.02906
Phrynomantis affinis Anura LC Ground-dwelling 24.261544 37.51798
Phrynomantis annectens Anura LC Ground-dwelling 22.381583 37.20271
Phrynomantis bifasciatus Anura LC Ground-dwelling 24.182927 37.52394
Phrynomantis microps Anura LC Ground-dwelling 27.648286 38.04426
Phrynomantis somalicus Anura LC Ground-dwelling 25.755878 37.76981
Phrynomedusa appendiculata Anura NT Arboreal 24.720524 39.17011
Phrynomedusa bokermanni Anura DD Stream-dwelling 26.100808 38.75754
Phrynomedusa marginata Anura LC Arboreal 25.837940 39.25109
Phrynomedusa vanzolinii Anura DD Stream-dwelling 25.946292 38.81175
Phrynopus auriculatus Anura DD Ground-dwelling 21.293309 34.05129
Phrynopus barthlenae Anura EN Ground-dwelling 19.242958 33.75379
Phrynopus bracki Anura DD Ground-dwelling 21.293309 34.05259
Phrynopus bufoides Anura DD Ground-dwelling 21.293309 34.05466
Phrynopus dagmarae Anura EN Ground-dwelling 19.973855 33.94436
Phrynopus heimorum Anura CR Ground-dwelling 17.481530 33.62365
Phrynopus horstpauli Anura EN Arboreal 19.534037 33.66425
Phrynopus juninensis Anura CR Ground-dwelling 17.039787 33.49340
Phrynopus kauneorum Anura EN Ground-dwelling 19.679576 33.93261
Phrynopus kotosh Anura DD Ground-dwelling 15.720102 33.31947
Phrynopus miroslawae Anura DD Ground-dwelling 21.293309 34.14639
Phrynopus montium Anura EN Ground-dwelling 17.039787 33.55707
Phrynopus nicoleae Anura DD Ground-dwelling 21.293309 34.07737
Phrynopus oblivius Anura DD Ground-dwelling 17.039787 33.53326
Phrynopus paucari Anura DD Ground-dwelling 21.293309 34.00331
Phrynopus peruanus Anura CR Ground-dwelling 17.039787 33.45348
Phrynopus pesantesi Anura DD Ground-dwelling 21.293309 34.03373
Phrynopus tautzorum Anura DD Ground-dwelling 19.242958 33.84706
Phrynopus thompsoni Anura DD Ground-dwelling 22.537771 34.25800
Phrynopus tribulosus Anura LC Ground-dwelling 21.293309 34.01806
Phyllobates aurotaenia Anura LC Ground-dwelling 25.822018 36.80251
Phyllobates bicolor Anura EN Ground-dwelling 25.069361 36.66159
Phyllobates lugubris Anura LC Ground-dwelling 26.538178 36.94940
Phyllobates terribilis Anura EN Ground-dwelling 26.028080 36.88573
Phyllobates vittatus Anura VU Stream-dwelling 23.965250 35.97040
Phyllodytes acuminatus Anura LC Arboreal 25.482458 39.80672
Phyllodytes brevirostris Anura DD Arboreal 25.850479 39.86640
Phyllodytes edelmoi Anura DD Arboreal 25.702849 39.88983
Phyllodytes gyrinaethes Anura DD Arboreal 25.702849 39.89511
Phyllodytes kautskyi Anura LC Arboreal 25.535122 39.77238
Phyllodytes luteolus Anura LC Arboreal 25.482714 39.73469
Phyllodytes maculosus Anura DD Arboreal 25.573170 39.83630
Phyllodytes melanomystax Anura LC Arboreal 25.351025 40.61588
Phyllodytes punctatus Anura DD Arboreal 25.547428 39.80995
Phyllodytes tuberculosus Anura DD Arboreal 24.959353 39.74471
Phyllodytes wuchereri Anura DD Arboreal 25.379203 39.79784
Phyllomedusa araguari Anura DD Arboreal 26.227707 40.31366
Phyllomedusa bahiana Anura LC Arboreal 25.262760 40.81028
Phyllomedusa bicolor Anura LC Arboreal 27.860104 40.58826
Phyllomedusa boliviana Anura LC Arboreal 26.742259 40.85539
Phyllomedusa burmeisteri Anura LC Arboreal 25.720126 41.68542
Phyllomedusa camba Anura LC Arboreal 26.726963 41.44965
Phyllomedusa coelestis Anura LC Ground-dwelling 25.324783 40.63783
Phyllomedusa distincta Anura LC Arboreal 25.384568 40.89082
Phyllomedusa iheringii Anura LC Arboreal 23.790257 40.31856
Phyllomedusa neildi Anura DD Arboreal 26.464656 40.92380
Phyllomedusa sauvagii Anura LC Arboreal 26.710596 41.26460
Phyllomedusa tarsius Anura LC Arboreal 27.615999 41.15183
Phyllomedusa tetraploidea Anura LC Arboreal 26.701289 41.13520
Phyllomedusa trinitatis Anura LC Arboreal 26.766527 40.98859
Phyllomedusa vaillantii Anura LC Arboreal 27.856217 40.57943
Phyllomedusa venusta Anura LC Arboreal 26.558295 40.20363
Physalaemus aguirrei Anura LC Ground-dwelling 25.594199 39.82263
Physalaemus albifrons Anura LC Semi-aquatic 25.943222 39.92987
Physalaemus albonotatus Anura LC Ground-dwelling 27.398750 40.40784
Physalaemus angrensis Anura DD Ground-dwelling 26.714437 39.90559
Physalaemus atlanticus Anura VU Ground-dwelling 24.858734 40.48286
Physalaemus barrioi Anura DD Ground-dwelling 26.714437 39.53487
Physalaemus biligonigerus Anura LC Ground-dwelling 25.942779 39.45073
Physalaemus bokermanni Anura DD Ground-dwelling 25.741310 39.92918
Physalaemus caete Anura DD Ground-dwelling 25.681934 40.06697
Physalaemus camacan Anura DD Ground-dwelling 25.575562 39.74689
Physalaemus centralis Anura LC Ground-dwelling 27.491983 39.41679
Physalaemus cicada Anura LC Ground-dwelling 25.345585 39.09110
Physalaemus crombiei Anura LC Ground-dwelling 25.542560 41.20882
Physalaemus cuqui Anura LC Semi-aquatic 23.830197 40.00335
Physalaemus cuvieri Anura LC Semi-aquatic 27.229720 38.52141
Physalaemus deimaticus Anura DD Ground-dwelling 24.594125 39.63226
Physalaemus ephippifer Anura LC Ground-dwelling 27.949731 39.27315
Physalaemus erikae Anura LC Ground-dwelling 25.565537 40.07594
Physalaemus erythros Anura DD Ground-dwelling 25.847809 39.24915
Physalaemus evangelistai Anura DD Ground-dwelling 25.220967 39.67855
Physalaemus fernandezae Anura LC Ground-dwelling 21.738313 38.55690
Physalaemus fischeri Anura LC Ground-dwelling 26.763485 39.84787
Physalaemus gracilis Anura LC Ground-dwelling 24.854672 38.67847
Physalaemus henselii Anura LC Ground-dwelling 24.591281 37.15578
Physalaemus insperatus Anura DD Ground-dwelling 24.452954 39.60984
Physalaemus irroratus Anura DD Ground-dwelling 25.659968 39.76277
Physalaemus jordanensis Anura DD Ground-dwelling 25.847842 39.57572
Physalaemus kroyeri Anura LC Ground-dwelling 25.419657 39.89564
Physalaemus lisei Anura LC Ground-dwelling 24.604965 39.56511
Physalaemus maculiventris Anura LC Semi-aquatic 25.750972 40.05315
Physalaemus marmoratus Anura LC Semi-aquatic 26.979290 41.22957
Physalaemus maximus Anura DD Ground-dwelling 25.616410 39.17858
Physalaemus moreirae Anura DD Ground-dwelling 26.100808 39.81842
Physalaemus nanus Anura LC Ground-dwelling 24.718925 39.60269
Physalaemus nattereri Anura LC Fossorial 27.384431 41.40528
Physalaemus obtectus Anura DD Ground-dwelling 25.801465 39.76682
Physalaemus olfersii Anura LC Ground-dwelling 25.643718 39.70166
Physalaemus riograndensis Anura LC Ground-dwelling 25.427026 41.35410
Physalaemus rupestris Anura DD Ground-dwelling 25.986631 39.77750
Physalaemus santafecinus Anura LC Semi-aquatic 26.598792 40.84880
Physalaemus signifer Anura LC Ground-dwelling 25.637395 40.91391
Physalaemus soaresi Anura EN Ground-dwelling 26.222532 39.82201
Physalaemus spiniger Anura LC Ground-dwelling 25.726242 40.43639
Phytotriades auratus Anura EN Arboreal 26.667627 39.90054
Phyzelaphryne miriamae Anura LC Ground-dwelling 28.920309 37.43741
Pipa arrabali Anura LC Aquatic 27.852651 38.59500
Pipa aspera Anura LC Aquatic 27.577137 38.58618
Pipa carvalhoi Anura LC Aquatic 25.698608 39.60131
Pipa myersi Anura EN Aquatic 28.084410 38.53600
Pipa parva Anura LC Aquatic 26.604995 38.37994
Pipa pipa Anura LC Aquatic 27.539248 38.54120
Pipa snethlageae Anura LC Aquatic 28.651187 38.68249
Pithecopus nordestinus Anura DD Arboreal 25.852918 40.44010
Pithecopus rohdei Anura LC Arboreal 25.961716 40.35953
Platymantis banahao Anura NT Arboreal 27.438353 35.73011
Platymantis cagayanensis Anura NT Ground-dwelling 27.861076 36.22692
Platymantis cornutus Anura LC Arboreal 27.991122 36.15199
Platymantis corrugatus Anura LC Ground-dwelling 27.726873 35.02843
Platymantis diesmosi Anura EN Ground-dwelling 27.839570 36.20472
Platymantis dorsalis Anura LC Ground-dwelling 27.659770 34.46154
Platymantis guentheri Anura LC Arboreal 27.678638 36.01579
Platymantis hazelae Anura VU Arboreal 27.345221 35.44776
Platymantis indeprensus Anura NT Ground-dwelling 27.438353 36.10372
Platymantis insulatus Anura CR Ground-dwelling 27.387839 35.99261
Platymantis isarog Anura LC Arboreal 27.839570 36.08450
Platymantis lawtoni Anura EN Arboreal 27.597276 36.06313
Platymantis levigatus Anura EN Ground-dwelling 27.597276 36.31728
Platymantis luzonensis Anura NT Arboreal 27.780539 35.51833
Platymantis mimulus Anura LC Ground-dwelling 27.860270 35.02817
Platymantis montanus Anura VU Arboreal 27.783815 35.16420
Platymantis naomii Anura NT Ground-dwelling 27.438353 34.95446
Platymantis negrosensis Anura NT Arboreal 27.388730 36.14741
Platymantis paengi Anura EN Ground-dwelling 27.486589 36.10070
Platymantis panayensis Anura EN Arboreal 27.432239 35.78295
Platymantis polillensis Anura LC Arboreal 27.892652 36.03172
Platymantis pseudodorsalis Anura NT Ground-dwelling 27.438353 36.09982
Platymantis pygmaeus Anura LC Ground-dwelling 28.015923 35.69924
Platymantis rabori Anura LC Arboreal 27.651515 36.03915
Platymantis sierramadrensis Anura VU Arboreal 28.134325 36.15086
Platymantis spelaeus Anura EN Ground-dwelling 27.836992 36.28161
Platymantis subterrestris Anura EN Arboreal 28.091366 36.07627
Platymantis taylori Anura VU Ground-dwelling 27.944422 36.15707
Platyplectrum ornatum Anura LC Ground-dwelling 25.831775 40.60325
Platyplectrum spenceri Anura LC Ground-dwelling 24.370711 37.10011
Plectrohyla acanthodes Anura EN Stream-dwelling 26.443403 39.10996
Plectrohyla avia Anura EN Arboreal 26.235202 39.65166
Plectrohyla chrysopleura Anura CR Stream-dwelling 26.218855 39.21782
Plectrohyla dasypus Anura CR Arboreal 25.474466 39.58573
Plectrohyla exquisita Anura CR Arboreal 25.474466 39.53251
Plectrohyla glandulosa Anura CR Stream-dwelling 22.662030 38.75994
Plectrohyla guatemalensis Anura NT Stream-dwelling 26.060437 39.18090
Plectrohyla hartwegi Anura EN Stream-dwelling 26.086690 39.06335
Plectrohyla ixil Anura VU Stream-dwelling 26.224531 39.14763
Plectrohyla lacertosa Anura EN Stream-dwelling 26.306472 39.15203
Plectrohyla matudai Anura LC Ground-dwelling 26.253157 39.81854
Plectrohyla pokomchi Anura EN Stream-dwelling 25.349043 39.11670
Plectrohyla psiloderma Anura EN Stream-dwelling 26.808944 39.28417
Plectrohyla quecchi Anura EN Stream-dwelling 26.075416 39.15726
Plectrohyla sagorum Anura VU Stream-dwelling 25.677372 39.15144
Plectrohyla tecunumani Anura CR Stream-dwelling 22.662030 38.72630
Plectrohyla teuchestes Anura CR Stream-dwelling 26.801790 39.26856
Plethodon albagula Caudata LC Ground-dwelling 25.796568 35.14904
Plethodon amplus Caudata EN Ground-dwelling 26.612388 35.15878
Plethodon angusticlavius Caudata LC Semi-aquatic 25.344871 34.85502
Plethodon asupak Caudata EN Ground-dwelling 18.640238 33.65518
Plethodon aureolus Caudata DD Ground-dwelling 26.581556 35.21123
Plethodon caddoensis Caudata NT Ground-dwelling 26.938406 35.78527
Plethodon cheoah Caudata VU Ground-dwelling 26.416263 35.19973
Plethodon cinereus Caudata LC Ground-dwelling 20.783469 35.24835
Plethodon cylindraceus Caudata LC Ground-dwelling 24.677079 34.31154
Plethodon dorsalis Caudata LC Ground-dwelling 26.212147 34.37004
Plethodon dunni Caudata LC Ground-dwelling 18.311281 33.48614
Plethodon electromorphus Caudata LC Ground-dwelling 23.793345 34.94322
Plethodon elongatus Caudata LC Ground-dwelling 18.545405 33.75528
Plethodon fourchensis Caudata NT Ground-dwelling 26.938406 35.34323
Plethodon glutinosus Caudata LC Ground-dwelling 25.114425 35.01925
Plethodon hoffmani Caudata LC Ground-dwelling 22.085123 34.68363
Plethodon hubrichti Caudata VU Ground-dwelling 25.226755 34.65451
Plethodon idahoensis Caudata LC Semi-aquatic 17.315250 33.81902
Plethodon jordani Caudata NT Ground-dwelling 26.591833 35.66712
Plethodon kentucki Caudata LC Ground-dwelling 25.432631 35.19310
Plethodon kiamichi Caudata VU Ground-dwelling 26.791072 35.25523
Plethodon kisatchie Caudata LC Ground-dwelling 27.595386 35.38216
Plethodon larselli Caudata LC Ground-dwelling 18.047693 33.65660
Plethodon meridianus Caudata EN Ground-dwelling 26.615888 35.14765
Plethodon metcalfi Caudata LC Ground-dwelling 26.684875 35.07914
Plethodon montanus Caudata LC Ground-dwelling 25.985686 34.81377
Plethodon neomexicanus Caudata EN Ground-dwelling 19.361487 33.78864
Plethodon nettingi Caudata NT Ground-dwelling 24.445954 34.99589
Plethodon ouachitae Caudata NT Ground-dwelling 26.791072 35.41325
Plethodon petraeus Caudata VU Ground-dwelling 26.919287 35.23050
Plethodon punctatus Caudata NT Ground-dwelling 25.071540 34.80259
Plethodon richmondi Caudata LC Ground-dwelling 25.607859 35.12922
Plethodon sequoyah Caudata DD Ground-dwelling 26.993791 35.30451
Plethodon serratus Caudata LC Ground-dwelling 26.053398 35.27488
Plethodon shenandoah Caudata VU Ground-dwelling 24.980275 35.26887
Plethodon sherando Caudata VU Ground-dwelling 25.226755 35.09454
Plethodon shermani Caudata NT Ground-dwelling 26.704641 35.15169
Plethodon stormi Caudata EN Ground-dwelling 18.662596 33.76114
Plethodon teyahalee Caudata LC Ground-dwelling 26.711067 35.23552
Plethodon vandykei Caudata LC Ground-dwelling 17.283743 33.58472
Plethodon vehiculum Caudata LC Ground-dwelling 16.895233 32.99858
Plethodon ventralis Caudata LC Ground-dwelling 27.105219 34.79397
Plethodon virginia Caudata NT Ground-dwelling 24.858064 34.91520
Plethodon websteri Caudata LC Ground-dwelling 27.662289 35.27027
Plethodon wehrlei Caudata LC Ground-dwelling 24.094497 35.03941
Plethodon welleri Caudata EN Ground-dwelling 25.951141 34.93696
Plethodon yonahlossee Caudata LC Ground-dwelling 26.065892 35.13347
Plethodontohyla bipunctata Anura LC Fossorial 25.700721 38.93514
Plethodontohyla brevipes Anura VU Ground-dwelling 26.044957 38.00696
Plethodontohyla fonetana Anura EN Ground-dwelling 27.336782 38.12929
Plethodontohyla guentheri Anura EN Ground-dwelling 26.476930 38.14047
Plethodontohyla inguinalis Anura LC Arboreal 25.957775 37.83042
Plethodontohyla mihanika Anura LC Arboreal 25.536097 37.85142
Plethodontohyla notosticta Anura LC Arboreal 26.074998 37.88506
Plethodontohyla ocellata Anura LC Ground-dwelling 25.843044 37.98985
Plethodontohyla tuberata Anura NT Ground-dwelling 25.578091 37.98121
Pleurodeles poireti Caudata EN Ground-dwelling 24.660210 36.80325
Pleurodeles waltl Caudata NT Semi-aquatic 21.715524 36.52835
Pleurodema bibroni Anura NT Ground-dwelling 24.490001 39.13601
Pleurodema borellii Anura LC Ground-dwelling 20.804172 39.91047
Pleurodema brachyops Anura LC Ground-dwelling 26.975133 42.83507
Pleurodema bufoninum Anura LC Ground-dwelling 14.224131 37.49533
Pleurodema cinereum Anura LC Ground-dwelling 16.867150 39.41411
Pleurodema diplolister Anura LC Fossorial 26.289187 42.24695
Pleurodema fuscomaculatum Anura DD Ground-dwelling 28.382297 40.87242
Pleurodema guayapae Anura LC Ground-dwelling 23.701560 39.83563
Pleurodema kriegi Anura NT Ground-dwelling 23.325162 38.95469
Pleurodema marmoratum Anura VU Ground-dwelling 16.534575 36.25950
Pleurodema nebulosum Anura LC Ground-dwelling 20.304007 39.77422
Pleurodema thaul Anura LC Ground-dwelling 16.170853 38.20385
Pleurodema tucumanum Anura LC Ground-dwelling 23.174897 40.28131
Polypedates braueri Anura LC Arboreal 25.299620 39.22702
Polypedates chlorophthalmus Anura DD Stream-dwelling 28.108281 38.22063
Polypedates colletti Anura LC Arboreal 28.117194 38.80158
Polypedates cruciger Anura LC Arboreal 28.208607 38.70796
Polypedates insularis Anura EN Arboreal 27.905235 38.66359
Polypedates leucomystax Anura LC Arboreal 27.289508 39.09722
Polypedates macrotis Anura LC Arboreal 28.221712 38.68324
Polypedates maculatus Anura LC Arboreal 27.062007 38.61193
Polypedates megacephalus Anura LC Arboreal 27.181825 38.68664
Polypedates mutus Anura LC Arboreal 26.845948 38.57435
Polypedates occidentalis Anura DD Arboreal 28.605524 38.75539
Polypedates otilophus Anura LC Arboreal 27.907256 38.67502
Polypedates pseudocruciger Anura LC Arboreal 27.593730 38.66748
Polypedates taeniatus Anura LC Arboreal 24.502041 38.25199
Polypedates zed Anura DD Arboreal 21.995506 37.90795
Poyntonia paludicola Anura NT Stream-dwelling 20.760458 36.41674
Poyntonophrynus beiranus Anura LC Ground-dwelling 25.523508 38.67936
Poyntonophrynus damaranus Anura DD Fossorial 23.098939 39.34673
Poyntonophrynus dombensis Anura LC Ground-dwelling 23.460750 38.35168
Poyntonophrynus fenoulheti Anura LC Ground-dwelling 24.084959 38.57055
Poyntonophrynus grandisonae Anura DD Arboreal 24.517565 38.28849
Poyntonophrynus hoeschi Anura LC Ground-dwelling 22.104579 38.21582
Poyntonophrynus kavangensis Anura LC Ground-dwelling 24.223848 38.49475
Poyntonophrynus lughensis Anura LC Ground-dwelling 24.496094 38.55615
Poyntonophrynus parkeri Anura LC Ground-dwelling 22.300721 38.18801
Poyntonophrynus vertebralis Anura LC Ground-dwelling 21.015120 38.07231
Pristimantis aaptus Anura LC Ground-dwelling 29.297821 35.14651
Pristimantis acatallelus Anura LC Arboreal 24.768618 34.49533
Pristimantis acerus Anura EN Arboreal 21.173347 33.98907
Pristimantis achatinus Anura LC Ground-dwelling 25.180631 38.38838
Pristimantis achuar Anura LC Ground-dwelling 25.933961 34.76817
Pristimantis actinolaimus Anura EN Arboreal 23.046042 34.28993
Pristimantis actites Anura VU Ground-dwelling 23.082386 34.69308
Pristimantis acuminatus Anura LC Arboreal 25.422109 34.53400
Pristimantis acutirostris Anura EN Arboreal 22.327385 34.08005
Pristimantis adiastolus Anura LC Arboreal 21.293309 34.11266
Pristimantis aemulatus Anura EN Arboreal 26.439037 34.74906
Pristimantis affinis Anura EN Arboreal 23.224229 34.30091
Pristimantis alalocophus Anura EN Arboreal 22.600953 34.09306
Pristimantis albertus Anura VU Ground-dwelling 19.166548 33.85628
Pristimantis altae Anura LC Arboreal 26.177360 34.80149
Pristimantis altamazonicus Anura LC Ground-dwelling 27.274259 35.02902
Pristimantis altamnis Anura LC Arboreal 23.910793 34.40616
Pristimantis amydrotus Anura DD Arboreal 24.501951 34.43040
Pristimantis anemerus Anura DD Arboreal 22.881730 34.29513
Pristimantis angustilineatus Anura EN Arboreal 24.394921 34.50743
Pristimantis aniptopalmatus Anura LC Ground-dwelling 21.293309 34.19543
Pristimantis anolirex Anura VU Arboreal 23.310280 34.35938
Pristimantis apiculatus Anura EN Ground-dwelling 22.782399 34.29103
Pristimantis appendiculatus Anura LC Ground-dwelling 22.668175 34.30420
Pristimantis aquilonaris Anura LC Ground-dwelling 23.447308 34.54349
Pristimantis ardalonychus Anura EN Arboreal 22.544786 34.25865
Pristimantis atrabracus Anura DD Arboreal 24.252411 34.51914
Pristimantis atratus Anura VU Arboreal 23.232843 34.24702
Pristimantis aurantiguttatus Anura EN Arboreal 26.169057 34.67927
Pristimantis aureolineatus Anura LC Arboreal 26.583239 34.70845
Pristimantis aureoventris Anura EN Arboreal 26.671496 34.71679
Pristimantis avicuporum Anura LC Ground-dwelling 24.252411 34.53341
Pristimantis avius Anura DD Arboreal 27.345187 34.82390
Pristimantis bacchus Anura EN Arboreal 22.575003 34.27224
Pristimantis baiotis Anura NT Arboreal 26.439037 34.77322
Pristimantis balionotus Anura EN Arboreal 22.745113 34.05609
Pristimantis bambu Anura EN Arboreal 20.702287 33.84711
Pristimantis baryecuus Anura EN Arboreal 23.289544 34.28602
Pristimantis batrachites Anura EN Arboreal 22.438970 34.20157
Pristimantis bearsei Anura DD Stream-dwelling 24.265362 33.97607
Pristimantis bellator Anura LC Arboreal 23.447308 34.26112
Pristimantis bellona Anura EN Arboreal 26.439037 34.67570
Pristimantis bicolor Anura VU Arboreal 23.919509 35.73086
Pristimantis bicumulus Anura VU Ground-dwelling 26.646904 34.85640
Pristimantis bipunctatus Anura LC Ground-dwelling 20.168836 34.01669
Pristimantis bogotensis Anura LC Arboreal 23.224229 35.33947
Pristimantis boulengeri Anura LC Arboreal 23.900691 34.38310
Pristimantis brevifrons Anura LC Arboreal 23.919367 34.42466
Pristimantis bromeliaceus Anura LC Arboreal 22.973203 34.11469
Pristimantis buccinator Anura LC Arboreal 23.069088 34.30343
Pristimantis buckleyi Anura LC Arboreal 24.204056 32.90353
Pristimantis cabrerai Anura DD Arboreal 24.397288 34.43177
Pristimantis cacao Anura CR Ground-dwelling 22.965861 34.40529
Pristimantis caeruleonotus Anura DD Arboreal 24.012885 34.43110
Pristimantis cajamarcensis Anura LC Arboreal 23.218477 34.31290
Pristimantis calcaratus Anura VU Ground-dwelling 24.552956 34.71419
Pristimantis calcarulatus Anura VU Arboreal 23.256608 34.16186
Pristimantis cantitans Anura NT Ground-dwelling 27.044932 34.86601
Pristimantis capitonis Anura EN Ground-dwelling 23.996460 34.59926
Pristimantis caprifer Anura CR Arboreal 25.012270 34.56143
Pristimantis carlossanchezi Anura EN Arboreal 24.251284 34.37327
Pristimantis carmelitae Anura EN Ground-dwelling 28.236147 35.14669
Pristimantis carranguerorum Anura EN Ground-dwelling 22.707356 34.38964
Pristimantis carvalhoi Anura LC Arboreal 27.217530 33.62993
Pristimantis caryophyllaceus Anura LC Ground-dwelling 26.760077 34.94533
Pristimantis celator Anura VU Arboreal 23.613523 34.23550
Pristimantis cerasinus Anura LC Ground-dwelling 26.892353 34.88420
Pristimantis ceuthospilus Anura VU Arboreal 23.691841 34.38416
Pristimantis chalceus Anura LC Arboreal 25.236539 34.71165
Pristimantis charlottevillensis Anura VU Ground-dwelling 26.692732 34.97543
Pristimantis chiastonotus Anura LC Ground-dwelling 27.534829 35.02514
Pristimantis chimu Anura DD Arboreal 24.501951 34.45618
Pristimantis chloronotus Anura LC Arboreal 22.883613 34.24568
Pristimantis chrysops Anura CR Arboreal 24.612963 34.42685
Pristimantis citriogaster Anura EN Stream-dwelling 23.790447 33.94375
Pristimantis colodactylus Anura LC Arboreal 23.402771 34.32451
Pristimantis colomai Anura VU Arboreal 23.531525 36.25053
Pristimantis colonensis Anura VU Arboreal 24.181133 34.46767
Pristimantis colostichos Anura EN Ground-dwelling 25.673615 34.68908
Pristimantis condor Anura LC Arboreal 23.557997 34.28460
Pristimantis conspicillatus Anura LC Ground-dwelling 26.731523 35.68882
Pristimantis cordovae Anura EN Ground-dwelling 20.831249 34.15401
Pristimantis corniger Anura EN Ground-dwelling 25.227561 34.63866
Pristimantis coronatus Anura DD Ground-dwelling 23.447308 34.37153
Pristimantis corrugatus Anura LC Arboreal 21.549203 34.06813
Pristimantis cosnipatae Anura CR Arboreal 14.573980 33.00894
Pristimantis cremnobates Anura EN Stream-dwelling 23.837156 33.93262
Pristimantis crenunguis Anura EN Stream-dwelling 23.191329 34.22648
Pristimantis cristinae Anura EN Arboreal 27.127537 34.72058
Pristimantis croceoinguinis Anura LC Arboreal 26.136162 34.77441
Pristimantis crucifer Anura NT Arboreal 24.129337 34.57786
Pristimantis cruciocularis Anura LC Ground-dwelling 21.332623 34.17126
Pristimantis cruentus Anura LC Arboreal 26.917141 34.88370
Pristimantis cryophilius Anura EN Ground-dwelling 23.751204 34.50399
Pristimantis cryptomelas Anura NT Ground-dwelling 23.174325 34.45304
Pristimantis cuentasi Anura EN Ground-dwelling 26.843099 34.83839
Pristimantis cuneirostris Anura DD Arboreal 24.252411 34.44085
Pristimantis curtipes Anura LC Ground-dwelling 22.501542 34.64132
Pristimantis danae Anura LC Arboreal 19.191409 31.31458
Pristimantis degener Anura EN Arboreal 23.183886 34.22349
Pristimantis deinops Anura CR Arboreal 24.612963 34.48137
Pristimantis delicatus Anura EN Arboreal 28.236147 34.89806
Pristimantis delius Anura DD Ground-dwelling 27.400077 34.98753
Pristimantis dendrobatoides Anura LC Arboreal 27.039707 34.86600
Pristimantis devillei Anura EN Arboreal 21.896088 34.03939
Pristimantis diadematus Anura LC Arboreal 24.875501 34.49575
Pristimantis diaphonus Anura CR Arboreal 25.027059 34.58255
Pristimantis diogenes Anura CR Stream-dwelling 24.364732 33.97905
Pristimantis dissimulatus Anura EN Arboreal 19.955019 33.74255
Pristimantis divnae Anura LC Arboreal 19.200894 33.62761
Pristimantis dorsopictus Anura VU Arboreal 21.646674 34.06359
Pristimantis duellmani Anura VU Arboreal 23.152905 34.31738
Pristimantis duende Anura VU Ground-dwelling 24.198867 34.56460
Pristimantis dundeei Anura DD Arboreal 26.542558 34.75551
Pristimantis elegans Anura VU Arboreal 23.419792 35.39875
Pristimantis epacrus Anura LC Ground-dwelling 25.227561 34.74806
Pristimantis eremitus Anura VU Arboreal 22.782399 34.21963
Pristimantis eriphus Anura VU Arboreal 22.883613 34.16512
Pristimantis ernesti Anura VU Arboreal 23.837156 34.36511
Pristimantis erythropleura Anura LC Arboreal 24.303858 34.36690
Pristimantis esmeraldas Anura LC Arboreal 24.783598 34.50212
Pristimantis eugeniae Anura EN Arboreal 22.402782 34.16873
Pristimantis euphronides Anura CR Ground-dwelling 27.926837 35.08557
Pristimantis eurydactylus Anura LC Arboreal 28.039464 34.85565
Pristimantis exoristus Anura DD Arboreal 25.035132 34.60950
Pristimantis factiosus Anura LC Arboreal 23.702532 34.38654
Pristimantis fallax Anura VU Stream-dwelling 23.859099 35.95740
Pristimantis fasciatus Anura VU Arboreal 27.137334 34.95695
Pristimantis fenestratus Anura LC Ground-dwelling 27.978301 35.36257
Pristimantis festae Anura EN Ground-dwelling 19.955019 33.19379
Pristimantis fetosus Anura NT Arboreal 23.046042 34.23929
Pristimantis floridus Anura DD Arboreal 19.955019 33.81477
Pristimantis frater Anura LC Arboreal 23.916953 33.81273
Pristimantis gaigei Anura LC Ground-dwelling 25.624271 34.69766
Pristimantis galdi Anura LC Arboreal 23.636192 34.25463
Pristimantis ganonotus Anura DD Arboreal 20.328653 33.92309
Pristimantis gentryi Anura EN Ground-dwelling 23.009904 34.68067
Pristimantis gladiator Anura VU Fossorial 22.883613 35.31342
Pristimantis glandulosus Anura EN Ground-dwelling 21.896088 34.26116
Pristimantis gracilis Anura VU Arboreal 23.588316 34.25151
Pristimantis grandiceps Anura EN Arboreal 22.575003 34.17163
Pristimantis gutturalis Anura LC Arboreal 27.574609 34.99163
Pristimantis hectus Anura VU Ground-dwelling 22.819091 34.30434
Pristimantis helvolus Anura EN Arboreal 23.702532 34.34205
Pristimantis hernandezi Anura EN Arboreal 24.417241 34.39885
Pristimantis huicundo Anura EN Arboreal 22.592931 34.24445
Pristimantis hybotragus Anura EN Arboreal 25.027059 34.49498
Pristimantis ignicolor Anura EN Arboreal 22.001151 34.08719
Pristimantis illotus Anura NT Arboreal 22.177162 34.14097
Pristimantis imitatrix Anura LC Ground-dwelling 22.527380 34.39269
Pristimantis incanus Anura EN Arboreal 22.001151 34.24627
Pristimantis incomptus Anura LC Arboreal 23.113821 34.78535
Pristimantis infraguttatus Anura DD Arboreal 20.676160 33.83649
Pristimantis inguinalis Anura LC Arboreal 27.558617 34.91723
Pristimantis insignitus Anura NT Ground-dwelling 27.127537 35.02500
Pristimantis inusitatus Anura EN Arboreal 21.896088 34.09610
Pristimantis ixalus Anura DD Stream-dwelling 24.655161 33.99358
Pristimantis jaimei Anura CR Arboreal 24.364732 34.42348
Pristimantis jester Anura LC Arboreal 26.912428 34.69433
Pristimantis johannesdei Anura VU Arboreal 25.398934 34.59997
Pristimantis jorgevelosai Anura EN Stream-dwelling 23.646500 33.79753
Pristimantis juanchoi Anura VU Arboreal 24.552956 34.53568
Pristimantis jubatus Anura NT Arboreal 24.364732 34.43655
Pristimantis kareliae Anura CR Stream-dwelling 26.956396 34.45055
Pristimantis katoptroides Anura LC Arboreal 23.883495 34.33574
Pristimantis kichwarum Anura LC Ground-dwelling 24.624746 34.70590
Pristimantis labiosus Anura LC Arboreal 24.446127 34.65465
Pristimantis lacrimosus Anura LC Arboreal 24.584713 34.46815
Pristimantis lanthanites Anura LC Ground-dwelling 27.218518 35.00130
Pristimantis lasalleorum Anura EN Arboreal 26.439037 34.72496
Pristimantis laticlavius Anura VU Arboreal 22.782399 34.94138
Pristimantis latidiscus Anura LC Arboreal 25.469066 36.97185
Pristimantis lemur Anura VU Arboreal 24.408861 34.42750
Pristimantis leoni Anura LC Ground-dwelling 22.964039 34.41388
Pristimantis leptolophus Anura LC Arboreal 24.525740 34.46353
Pristimantis leucopus Anura EN Arboreal 23.024217 34.22108
Pristimantis librarius Anura DD Arboreal 25.758606 33.20757
Pristimantis lichenoides Anura CR Stream-dwelling 23.046042 33.82793
Pristimantis lindae Anura LC Arboreal 14.573980 29.67622
Pristimantis lirellus Anura LC Arboreal 23.650936 34.15126
Pristimantis lividus Anura EN Arboreal 21.896088 34.03602
Pristimantis llojsintuta Anura LC Arboreal 19.504106 33.78835
Pristimantis loustes Anura EN Ground-dwelling 23.183886 34.32723
Pristimantis lucasi Anura LC Arboreal 21.293309 33.99874
Pristimantis luscombei Anura DD Arboreal 26.279230 34.76011
Pristimantis luteolateralis Anura NT Arboreal 19.955019 33.73734
Pristimantis lutitus Anura EN Arboreal 23.547065 34.40606
Pristimantis lymani Anura LC Arboreal 23.915481 36.86066
Pristimantis lynchi Anura LC Ground-dwelling 22.392691 34.30036
Pristimantis lythrodes Anura LC Arboreal 29.288480 35.19079
Pristimantis maculosus Anura VU Arboreal 21.646674 34.04094
Pristimantis malkini Anura LC Ground-dwelling 27.437917 35.11398
Pristimantis marahuaka Anura NT Ground-dwelling 25.966820 34.75269
Pristimantis marmoratus Anura LC Ground-dwelling 27.366952 35.06710
Pristimantis mars Anura CR Ground-dwelling 23.046042 34.38604
Pristimantis martiae Anura LC Ground-dwelling 27.325213 35.04426
Pristimantis matidiktyo Anura LC Ground-dwelling 25.150767 37.50872
Pristimantis medemi Anura LC Arboreal 24.467317 35.06836
Pristimantis megalops Anura NT Ground-dwelling 27.127537 35.06630
Pristimantis melanogaster Anura NT Ground-dwelling 21.985724 34.21888
Pristimantis melanoproctus Anura DD Arboreal 22.438970 34.03959
Pristimantis memorans Anura DD Stream-dwelling 27.345187 34.47663
Pristimantis mendax Anura LC Arboreal 20.917258 33.90874
Pristimantis meridionalis Anura DD Arboreal 20.626332 33.92225
Pristimantis merostictus Anura VU Arboreal 23.016169 34.26948
Pristimantis metabates Anura EN Stream-dwelling 25.064606 34.05882
Pristimantis minutulus Anura DD Arboreal 22.059310 33.99964
Pristimantis miyatai Anura LC Arboreal 23.312174 34.30646
Pristimantis mnionaetes Anura EN Arboreal 22.672962 34.20342
Pristimantis modipeplus Anura EN Arboreal 22.391675 34.12208
Pristimantis molybrignus Anura CR Arboreal 24.490215 34.37924
Pristimantis mondolfii Anura DD Arboreal 22.438970 34.14904
Pristimantis moro Anura LC Arboreal 27.284171 34.86593
Pristimantis muricatus Anura VU Arboreal 23.191329 34.28818
Pristimantis muscosus Anura NT Stream-dwelling 23.665187 33.77461
Pristimantis museosus Anura VU Arboreal 27.333714 34.75276
Pristimantis myersi Anura LC Ground-dwelling 23.957471 34.50673
Pristimantis myops Anura EN Arboreal 24.198867 34.56493
Pristimantis nephophilus Anura NT Arboreal 23.633987 34.32507
Pristimantis nervicus Anura LC Ground-dwelling 23.287490 35.73466
Pristimantis nicefori Anura LC Arboreal 23.040733 34.22402
Pristimantis nigrogriseus Anura VU Stream-dwelling 22.724160 33.75587
Pristimantis nyctophylax Anura VU Arboreal 23.223818 34.31491
Pristimantis obmutescens Anura LC Arboreal 23.996460 34.36327
Pristimantis ocellatus Anura EN Arboreal 24.234545 34.38420
Pristimantis ockendeni Anura LC Arboreal 25.927467 32.53848
Pristimantis ocreatus Anura EN Fossorial 22.211278 35.31580
Pristimantis olivaceus Anura LC Arboreal 20.244341 33.86491
Pristimantis orcesi Anura LC Arboreal 20.952423 33.97660
Pristimantis orcus Anura LC Arboreal 26.641638 34.76723
Pristimantis orestes Anura EN Ground-dwelling 23.677071 34.48539
Pristimantis ornatissimus Anura EN Arboreal 23.191329 34.42562
Pristimantis ornatus Anura EN Ground-dwelling 21.293309 34.08495
Pristimantis orpacobates Anura NT Arboreal 24.753807 34.55235
Pristimantis orphnolaimus Anura LC Arboreal 26.201005 34.72765
Pristimantis ortizi Anura DD Arboreal 22.211278 34.21403
Pristimantis padrecarlosi Anura DD Stream-dwelling 24.049346 33.81144
Pristimantis paisa Anura LC Stream-dwelling 21.646674 33.63334
Pristimantis palmeri Anura LC Arboreal 24.080724 34.52792
Pristimantis paramerus Anura EN Ground-dwelling 26.494876 34.88948
Pristimantis pardalinus Anura EN Ground-dwelling 17.039787 33.56352
Pristimantis pardalis Anura LC Arboreal 26.389302 34.83837
Pristimantis parectatus Anura EN Arboreal 22.605131 34.20255
Pristimantis parvillus Anura LC Arboreal 24.690943 34.66404
Pristimantis pastazensis Anura EN Arboreal 22.391675 34.21263
Pristimantis pataikos Anura DD Arboreal 21.684497 33.99249
Pristimantis paulodutrai Anura LC Arboreal 25.304676 34.58724
Pristimantis paululus Anura LC Ground-dwelling 24.705731 34.62919
Pristimantis pecki Anura DD Arboreal 24.290693 34.31932
Pristimantis pedimontanus Anura VU Ground-dwelling 25.597769 34.80337
Pristimantis penelopus Anura LC Arboreal 25.448492 34.63441
Pristimantis peraticus Anura LC Ground-dwelling 25.113062 34.78557
Pristimantis percnopterus Anura LC Arboreal 23.498246 34.27462
Pristimantis percultus Anura EN Arboreal 22.745113 34.12678
Pristimantis permixtus Anura LC Arboreal 23.884876 34.36063
Pristimantis peruvianus Anura LC Ground-dwelling 27.283167 34.93513
Pristimantis petersi Anura NT Arboreal 23.912354 34.53820
Pristimantis petrobardus Anura EN Arboreal 22.890282 34.25723
Pristimantis phalaroinguinis Anura DD Arboreal 24.501951 34.50374
Pristimantis phalarus Anura EN Arboreal 24.198867 34.35292
Pristimantis pharangobates Anura LC Ground-dwelling 19.257130 29.41116
Pristimantis philipi Anura DD Arboreal 26.948386 34.85704
Pristimantis phoxocephalus Anura CR Arboreal 23.223818 32.35763
Pristimantis piceus Anura LC Ground-dwelling 23.630555 34.44959
Pristimantis pinguis Anura EN Ground-dwelling 22.336373 34.29691
Pristimantis pirrensis Anura NT Arboreal 26.419274 34.75695
Pristimantis platychilus Anura VU Arboreal 25.048890 34.59287
Pristimantis platydactylus Anura LC Arboreal 18.901205 31.49084
Pristimantis pleurostriatus Anura DD Arboreal 25.673615 34.52966
Pristimantis polemistes Anura CR Stream-dwelling 26.439037 34.35301
Pristimantis polychrus Anura VU Arboreal 24.905950 34.56393
Pristimantis prolatus Anura LC Arboreal 23.240590 34.32487
Pristimantis proserpens Anura VU Arboreal 23.232843 34.25936
Pristimantis pruinatus Anura VU Arboreal 27.104316 34.88480
Pristimantis pseudoacuminatus Anura LC Ground-dwelling 25.680500 34.72476
Pristimantis pteridophilus Anura EN Arboreal 20.357864 33.80294
Pristimantis ptochus Anura EN Arboreal 24.394921 34.38389
Pristimantis pugnax Anura CR Stream-dwelling 24.164721 33.86638
Pristimantis pulvinatus Anura LC Arboreal 26.697950 34.75605
Pristimantis pycnodermis Anura EN Arboreal 23.289544 34.53633
Pristimantis pyrrhomerus Anura EN Ground-dwelling 23.256608 34.49481
Pristimantis quantus Anura EN Arboreal 24.198867 34.41892
Pristimantis quaquaversus Anura LC Arboreal 24.985421 35.19276
Pristimantis quinquagesimus Anura VU Arboreal 23.524443 34.30665
Pristimantis racemus Anura VU Arboreal 23.842044 34.44814
Pristimantis ramagii Anura LC Ground-dwelling 25.504589 34.71753
Pristimantis renjiforum Anura EN Ground-dwelling 23.448271 36.37028
Pristimantis repens Anura EN Ground-dwelling 24.453276 34.44969
Pristimantis restrepoi Anura LC Ground-dwelling 24.905950 34.62933
Pristimantis reticulatus Anura DD Arboreal 27.121618 34.82860
Pristimantis rhabdocnemus Anura LC Arboreal 21.293309 33.98200
Pristimantis rhabdolaemus Anura LC Arboreal 17.743213 33.46541
Pristimantis rhodoplichus Anura EN Ground-dwelling 23.447308 34.43300
Pristimantis rhodostichus Anura LC Arboreal 24.003412 34.33639
Pristimantis ridens Anura LC Arboreal 26.774528 34.82838
Pristimantis rivasi Anura VU Ground-dwelling 26.826684 35.01531
Pristimantis riveroi Anura DD Arboreal 26.940736 34.73486
Pristimantis riveti Anura CR Ground-dwelling 22.211278 34.91165
Pristimantis rosadoi Anura VU Arboreal 24.064192 34.42821
Pristimantis roseus Anura LC Stream-dwelling 26.071482 34.27664
Pristimantis rozei Anura DD Arboreal 27.121618 34.74104
Pristimantis rubicundus Anura EN Arboreal 22.966949 34.17473
Pristimantis ruedai Anura VU Stream-dwelling 24.905950 34.05288
Pristimantis rufioculis Anura VU Arboreal 23.518622 34.29009
Pristimantis ruidus Anura DD Arboreal 26.948386 34.71849
Pristimantis ruthveni Anura EN Ground-dwelling 27.127537 35.06294
Pristimantis salaputium Anura LC Arboreal 14.573980 30.79906
Pristimantis saltissimus Anura LC Arboreal 26.912428 34.66991
Pristimantis samaipatae Anura LC Arboreal 22.321742 34.12123
Pristimantis sanctaemartae Anura NT Arboreal 27.127537 34.76762
Pristimantis sanguineus Anura NT Arboreal 25.119709 34.59009
Pristimantis satagius Anura EN Ground-dwelling 26.439037 34.84531
Pristimantis savagei Anura NT Arboreal 24.355607 33.64419
Pristimantis schultei Anura VU Arboreal 22.225005 34.15087
Pristimantis scitulus Anura DD Arboreal 15.595790 33.08992
Pristimantis scoloblepharus Anura EN Stream-dwelling 22.605131 33.59880
Pristimantis scolodiscus Anura VU Arboreal 23.724859 34.41497
Pristimantis scopaeus Anura LC Arboreal 22.464412 34.11030
Pristimantis seorsus Anura DD Arboreal 20.531148 33.91157
Pristimantis serendipitus Anura EN Ground-dwelling 22.464285 34.29582
Pristimantis shrevei Anura EN Arboreal 27.163565 34.81027
Pristimantis signifer Anura CR Ground-dwelling 24.198867 34.54126
Pristimantis silverstonei Anura VU Arboreal 25.055260 34.61877
Pristimantis simonbolivari Anura EN Ground-dwelling 22.391675 34.30359
Pristimantis simonsii Anura VU Ground-dwelling 22.336373 34.19525
Pristimantis simoteriscus Anura EN Ground-dwelling 21.387901 34.13079
Pristimantis simoterus Anura NT Ground-dwelling 22.658289 34.39292
Pristimantis siopelus Anura VU Arboreal 24.806805 34.41477
Pristimantis skydmainos Anura LC Arboreal 23.985512 34.36397
Pristimantis sobetes Anura EN Arboreal 19.955019 33.77990
Pristimantis spectabilis Anura DD Arboreal 21.293309 34.05840
Pristimantis spilogaster Anura CR Arboreal 24.655161 34.48802
Pristimantis spinosus Anura EN Arboreal 23.289544 34.32607
Pristimantis stenodiscus Anura CR Ground-dwelling 27.121618 34.93176
Pristimantis sternothylax Anura LC Arboreal 24.227574 34.39442
Pristimantis stictoboubonus Anura DD Arboreal 22.692835 34.32676
Pristimantis stictogaster Anura LC Ground-dwelling 21.293309 34.28182
Pristimantis subsigillatus Anura LC Arboreal 25.086888 34.55015
Pristimantis suetus Anura VU Arboreal 23.912703 34.36243
Pristimantis sulculus Anura VU Arboreal 24.806805 34.56964
Pristimantis supernatis Anura VU Stream-dwelling 23.520923 33.72821
Pristimantis surdus Anura EN Ground-dwelling 20.357864 33.98093
Pristimantis susaguae Anura EN Arboreal 23.674292 34.28946
Pristimantis taciturnus Anura DD Stream-dwelling 22.965861 33.71126
Pristimantis taeniatus Anura LC Ground-dwelling 26.318654 36.78323
Pristimantis tamsitti Anura VU Arboreal 25.126887 34.60641
Pristimantis tantanti Anura LC Arboreal 22.176959 34.12855
Pristimantis tanyrhynchus Anura DD Arboreal 20.531148 34.01912
Pristimantis tayrona Anura NT Arboreal 27.127537 34.91102
Pristimantis telefericus Anura CR Ground-dwelling 25.673615 34.83699
Pristimantis tenebrionis Anura EN Arboreal 24.270099 34.45483
Pristimantis thectopternus Anura LC Arboreal 23.919367 34.28251
Pristimantis thymalopsoides Anura EN Arboreal 19.955019 33.83699
Pristimantis thymelensis Anura LC Ground-dwelling 22.366712 34.38620
Pristimantis toftae Anura LC Ground-dwelling 22.521425 32.68835
Pristimantis torrenticola Anura CR Arboreal 23.046042 34.28736
Pristimantis trachyblepharis Anura LC Arboreal 23.878766 33.49732
Pristimantis tribulosus Anura CR Arboreal 23.046042 34.23436
Pristimantis truebae Anura EN Arboreal 22.499342 34.45312
Pristimantis tubernasus Anura DD Arboreal 25.305183 34.60548
Pristimantis turik Anura DD Arboreal 27.792904 34.97522
Pristimantis turpinorum Anura DD Arboreal 26.692732 34.81076
Pristimantis turumiquirensis Anura CR Ground-dwelling 27.160860 34.92542
Pristimantis uisae Anura VU Arboreal 23.387139 34.22218
Pristimantis unistrigatus Anura LC Ground-dwelling 22.370872 35.63373
Pristimantis uranobates Anura LC Stream-dwelling 23.033229 33.77218
Pristimantis urichi Anura LC Ground-dwelling 26.513958 35.02132
Pristimantis variabilis Anura LC Arboreal 27.008429 34.80531
Pristimantis veletis Anura CR Arboreal 23.046042 34.26473
Pristimantis ventriguttatus Anura DD Arboreal 24.501951 34.53998
Pristimantis ventrimarmoratus Anura LC Ground-dwelling 23.942876 34.46872
Pristimantis verecundus Anura NT Arboreal 22.668175 34.23451
Pristimantis versicolor Anura LC Arboreal 23.865482 34.73636
Pristimantis vertebralis Anura VU Stream-dwelling 22.402782 31.72685
Pristimantis vicarius Anura NT Ground-dwelling 24.087174 34.50168
Pristimantis vidua Anura EN Ground-dwelling 21.477341 34.20051
Pristimantis viejas Anura LC Ground-dwelling 25.334031 34.66936
Pristimantis vilarsi Anura LC Ground-dwelling 27.834121 35.04485
Pristimantis vilcabambae Anura DD Arboreal 20.531148 34.10128
Pristimantis vinhai Anura LC Ground-dwelling 25.296814 34.74211
Pristimantis viridicans Anura EN Ground-dwelling 24.585508 34.69255
Pristimantis viridis Anura EN Arboreal 26.189446 34.60709
Pristimantis w-nigrum Anura LC Arboreal 24.479494 36.19209
Pristimantis wagteri Anura EN Ground-dwelling 21.985724 34.34014
Pristimantis walkeri Anura LC Arboreal 24.079192 34.47278
Pristimantis waoranii Anura LC Arboreal 25.911199 34.65825
Pristimantis wiensi Anura DD Arboreal 22.881730 34.11472
Pristimantis xeniolum Anura VU Arboreal 24.198867 34.44460
Pristimantis xestus Anura VU Arboreal 25.939855 34.68444
Pristimantis xylochobates Anura CR Arboreal 24.198867 34.45285
Pristimantis yaviensis Anura NT Ground-dwelling 27.044932 34.88891
Pristimantis yukpa Anura LC Ground-dwelling 26.455266 36.22335
Pristimantis yustizi Anura VU Arboreal 25.486973 34.66311
Pristimantis zeuctotylus Anura LC Ground-dwelling 27.636695 34.96924
Pristimantis zimmermanae Anura LC Ground-dwelling 28.573372 35.27161
Pristimantis zoilae Anura EN Arboreal 24.099747 34.47998
Pristimantis zophus Anura NT Arboreal 24.847704 34.42236
Probreviceps durirostris Anura EN Ground-dwelling 23.545164 38.03600
Probreviceps loveridgei Anura EN Ground-dwelling 23.506191 37.96937
Probreviceps macrodactylus Anura EN Ground-dwelling 24.410568 38.14283
Probreviceps rhodesianus Anura EN Ground-dwelling 24.369951 38.06314
Probreviceps rungwensis Anura EN Ground-dwelling 22.818563 37.86619
Probreviceps uluguruensis Anura EN Ground-dwelling 24.359158 38.13952
Proceratophrys appendiculata Anura LC Ground-dwelling 25.848651 38.18561
Proceratophrys avelinoi Anura LC Semi-aquatic 26.332167 38.47940
Proceratophrys bigibbosa Anura NT Ground-dwelling 25.743040 38.20418
Proceratophrys boiei Anura LC Ground-dwelling 25.659438 38.22532
Proceratophrys brauni Anura LC Ground-dwelling 24.908521 38.05401
Proceratophrys concavitympanum Anura DD Stream-dwelling 28.290741 37.93040
Proceratophrys cristiceps Anura LC Ground-dwelling 25.833785 38.25133
Proceratophrys cururu Anura DD Ground-dwelling 24.594125 38.10884
Proceratophrys goyana Anura LC Ground-dwelling 26.928882 38.35393
Proceratophrys laticeps Anura LC Ground-dwelling 25.485168 38.12000
Proceratophrys melanopogon Anura LC Ground-dwelling 25.926832 38.24493
Proceratophrys moehringi Anura DD Stream-dwelling 25.870259 37.62980
Proceratophrys moratoi Anura CR Semi-aquatic 26.685256 38.50953
Proceratophrys palustris Anura DD Ground-dwelling 26.352253 38.28829
Proceratophrys paviotii Anura DD Stream-dwelling 25.780363 37.75201
Proceratophrys phyllostomus Anura DD Ground-dwelling 25.804730 38.22856
Proceratophrys schirchi Anura LC Ground-dwelling 25.629759 38.60904
Proceratophrys subguttata Anura LC Ground-dwelling 24.601247 38.01079
Proceratophrys vielliardi Anura DD Ground-dwelling 26.446700 38.30000
Pseudacris brachyphona Anura LC Ground-dwelling 25.124069 38.56504
Pseudacris brimleyi Anura LC Ground-dwelling 25.394831 38.55725
Pseudacris cadaverina Anura LC Arboreal 21.513090 35.61669
Pseudacris clarkii Anura LC Ground-dwelling 25.347379 38.61194
Pseudacris crucifer Anura LC Arboreal 22.121275 37.66469
Pseudacris feriarum Anura LC Ground-dwelling 25.725635 38.63591
Pseudacris fouquettei Anura LC Ground-dwelling 27.183090 38.87334
Pseudacris kalmi Anura LC Ground-dwelling 23.378568 38.31866
Pseudacris maculata Anura LC Semi-aquatic 19.189381 38.07156
Pseudacris nigrita Anura LC Ground-dwelling 26.890659 38.79070
Pseudacris ocularis Anura LC Ground-dwelling 26.678517 38.59748
Pseudacris ornata Anura LC Ground-dwelling 27.177733 38.86395
Pseudacris regilla Anura LC Arboreal 16.404867 35.50969
Pseudacris streckeri Anura LC Ground-dwelling 26.163147 38.72303
Pseudacris triseriata Anura LC Ground-dwelling 22.409970 37.86048
Pseudhymenochirus merlini Anura LC Aquatic 27.551217 37.40536
Pseudis bolbodactyla Anura LC Aquatic 26.403000 40.67930
Pseudis cardosoi Anura LC Aquatic 24.904100 39.63347
Pseudis fusca Anura LC Aquatic 25.754893 40.58589
Pseudis minuta Anura LC Aquatic 24.681745 39.03734
Pseudis paradoxa Anura LC Aquatic 27.722432 41.22655
Pseudis platensis Anura DD Aquatic 27.593064 41.34513
Pseudis tocantins Anura LC Aquatic 27.917277 40.89120
Pseudobranchus axanthus Caudata LC Semi-aquatic 28.013010 35.81572
Pseudobranchus striatus Caudata LC Aquatic 27.601905 35.63379
Pseudobufo subasper Anura LC Aquatic 28.952989 39.02405
Pseudoeurycea ahuitzotl Caudata CR Ground-dwelling 24.338588 35.28208
Pseudoeurycea altamontana Caudata EN Ground-dwelling 21.070217 34.71342
Pseudoeurycea amuzga Caudata EN Ground-dwelling 25.594119 35.26824
Pseudoeurycea aquatica Caudata CR Aquatic 22.681874 35.09556
Pseudoeurycea aurantia Caudata CR Ground-dwelling 22.681874 35.04757
Pseudoeurycea cochranae Caudata VU Ground-dwelling 25.328536 35.32529
Pseudoeurycea conanti Caudata EN Ground-dwelling 24.828071 35.13834
Pseudoeurycea firscheini Caudata EN Ground-dwelling 25.021001 35.14795
Pseudoeurycea gadovii Caudata VU Ground-dwelling 22.834567 34.94087
Pseudoeurycea goebeli Caudata CR Ground-dwelling 27.195014 35.54442
Pseudoeurycea juarezi Caudata EN Ground-dwelling 25.036151 35.31956
Pseudoeurycea leprosa Caudata LC Ground-dwelling 23.381565 35.01580
Pseudoeurycea lineola Caudata EN Ground-dwelling 24.858995 35.26022
Pseudoeurycea longicauda Caudata EN Ground-dwelling 23.867272 35.11571
Pseudoeurycea lynchi Caudata EN Ground-dwelling 24.522527 35.21121
Pseudoeurycea melanomolga Caudata EN Ground-dwelling 21.551792 34.81202
Pseudoeurycea mixcoatl Caudata CR Ground-dwelling 25.457526 35.28763
Pseudoeurycea mixteca Caudata VU Ground-dwelling 24.545714 35.19781
Pseudoeurycea mystax Caudata EN Ground-dwelling 25.160565 35.17866
Pseudoeurycea nigromaculata Caudata EN Arboreal 25.961397 35.21534
Pseudoeurycea obesa Caudata CR Ground-dwelling 27.073807 35.45673
Pseudoeurycea orchileucos Caudata EN Ground-dwelling 22.681874 35.03660
Pseudoeurycea orchimelas Caudata EN Ground-dwelling 27.340327 35.50977
Pseudoeurycea papenfussi Caudata EN Ground-dwelling 22.681874 34.93991
Pseudoeurycea rex Caudata VU Ground-dwelling 25.044144 35.24605
Pseudoeurycea robertsi Caudata CR Ground-dwelling 20.209526 34.70520
Pseudoeurycea ruficauda Caudata EN Arboreal 24.877841 35.04015
Pseudoeurycea saltator Caudata CR Arboreal 22.681874 34.89669
Pseudoeurycea smithi Caudata CR Ground-dwelling 22.681874 34.89866
Pseudoeurycea tenchalli Caudata CR Ground-dwelling 25.457526 35.29632
Pseudoeurycea tlahcuiloh Caudata CR Ground-dwelling 24.338588 35.17395
Pseudoeurycea tlilicxitl Caudata EN Ground-dwelling 21.070217 34.78688
Pseudoeurycea werleri Caudata EN Ground-dwelling 25.787509 35.35924
Pseudohynobius flavomaculatus Caudata VU Ground-dwelling 26.009085 34.31531
Pseudohynobius kuankuoshuiensis Caudata CR Semi-aquatic 25.289478 34.47932
Pseudohynobius puxiongensis Caudata CR Ground-dwelling 20.834276 33.69313
Pseudohynobius shuichengensis Caudata CR Ground-dwelling 23.425313 33.93725
Pseudopaludicola boliviana Anura LC Ground-dwelling 27.791008 40.10226
Pseudopaludicola canga Anura DD Ground-dwelling 28.078510 40.11419
Pseudopaludicola falcipes Anura LC Ground-dwelling 25.637007 40.56372
Pseudopaludicola llanera Anura LC Ground-dwelling 26.877630 39.92406
Pseudopaludicola mineira Anura DD Ground-dwelling 24.594125 39.64166
Pseudopaludicola mystacalis Anura LC Semi-aquatic 26.696503 39.98995
Pseudopaludicola pusilla Anura LC Ground-dwelling 26.631146 40.02923
Pseudopaludicola saltica Anura LC Ground-dwelling 26.883296 40.12602
Pseudopaludicola ternetzi Anura LC Ground-dwelling 26.610569 40.18619
Pseudophilautus abundus Anura EN Arboreal 27.674004 37.95108
Pseudophilautus alto Anura EN Arboreal 27.674004 37.89318
Pseudophilautus amboli Anura CR Arboreal 26.493008 37.80630
Pseudophilautus asankai Anura EN Arboreal 27.674004 38.04322
Pseudophilautus auratus Anura EN Arboreal 27.547532 38.00316
Pseudophilautus caeruleus Anura EN Arboreal 27.547532 38.02309
Pseudophilautus cavirostris Anura VU Arboreal 27.674004 38.01438
Pseudophilautus cuspis Anura EN Ground-dwelling 27.674004 38.15916
Pseudophilautus decoris Anura CR Arboreal 27.547532 37.97738
Pseudophilautus femoralis Anura EN Arboreal 27.674004 38.10548
Pseudophilautus fergusonianus Anura LC Arboreal 28.092804 38.02128
Pseudophilautus folicola Anura VU Arboreal 27.674004 37.93479
Pseudophilautus frankenbergi Anura EN Arboreal 27.915921 37.90381
Pseudophilautus fulvus Anura EN Arboreal 27.674004 37.90043
Pseudophilautus kani Anura LC Arboreal 27.808977 37.90902
Pseudophilautus limbus Anura EN Arboreal 27.674004 38.02429
Pseudophilautus lunatus Anura CR Arboreal 27.547532 37.98205
Pseudophilautus macropus Anura EN Stream-dwelling 27.800476 37.49789
Pseudophilautus microtympanum Anura EN Arboreal 27.674004 38.06179
Pseudophilautus mittermeieri Anura VU Arboreal 27.674004 38.03159
Pseudophilautus mooreorum Anura CR Arboreal 27.800476 37.99125
Pseudophilautus nemus Anura EN Arboreal 27.674004 38.04175
Pseudophilautus ocularis Anura CR Arboreal 27.547532 37.96543
Pseudophilautus pleurotaenia Anura VU Arboreal 27.849500 38.00691
Pseudophilautus poppiae Anura CR Arboreal 27.547532 38.01636
Pseudophilautus popularis Anura VU Arboreal 28.064890 38.05625
Pseudophilautus regius Anura LC Arboreal 28.117410 38.04995
Pseudophilautus reticulatus Anura VU Arboreal 27.674004 37.96189
Pseudophilautus rus Anura NT Arboreal 27.674004 37.92693
Pseudophilautus sarasinorum Anura EN Stream-dwelling 27.933583 37.51776
Pseudophilautus schmarda Anura EN Arboreal 27.674004 37.99419
Pseudophilautus semiruber Anura EN Ground-dwelling 27.674004 38.17962
Pseudophilautus simba Anura CR Ground-dwelling 27.547532 38.11092
Pseudophilautus singu Anura EN Arboreal 27.674004 38.02084
Pseudophilautus sordidus Anura VU Arboreal 27.674004 38.03918
Pseudophilautus steineri Anura EN Arboreal 27.800476 37.97800
Pseudophilautus stellatus Anura CR Arboreal 27.547532 37.99704
Pseudophilautus stictomerus Anura VU Arboreal 28.064890 38.00003
Pseudophilautus stuarti Anura CR Arboreal 27.800476 37.99048
Pseudophilautus tanu Anura EN Arboreal 27.547532 37.96129
Pseudophilautus viridis Anura EN Arboreal 27.674004 38.02113
Pseudophilautus wynaadensis Anura EN Arboreal 27.519155 38.03877
Pseudophilautus zorro Anura VU Ground-dwelling 27.674004 38.20335
Pseudophryne australis Anura VU Ground-dwelling 21.344230 36.78865
Pseudophryne bibronii Anura LC Ground-dwelling 20.938984 36.55544
Pseudophryne coriacea Anura LC Ground-dwelling 22.836070 35.94104
Pseudophryne corroboree Anura CR Stream-dwelling 19.216734 34.10380
Pseudophryne covacevichae Anura EN Ground-dwelling 25.369995 36.32727
Pseudophryne dendyi Anura LC Ground-dwelling 19.645859 37.19853
Pseudophryne douglasi Anura LC Aquatic 25.497297 36.04598
Pseudophryne guentheri Anura LC Ground-dwelling 21.097697 34.94781
Pseudophryne major Anura LC Ground-dwelling 24.549873 35.23971
Pseudophryne occidentalis Anura LC Ground-dwelling 21.770635 36.33750
Pseudophryne pengilleyi Anura CR Stream-dwelling 19.672656 34.78839
Pseudophryne raveni Anura LC Ground-dwelling 24.314601 36.04508
Pseudophryne semimarmorata Anura LC Ground-dwelling 18.200026 34.57193
Pseudotriton montanus Caudata LC Fossorial 25.950755 36.49113
Pseudotriton ruber Caudata LC Semi-aquatic 24.894769 35.61527
Psychrophrynella bagrecito Anura CR Ground-dwelling 16.124027 30.85224
Psychrophrynella usurpator Anura NT Ground-dwelling 14.573980 29.57898
Pterorana khare Anura LC Aquatic 25.862088 37.13233
Ptychadena aequiplicata Anura LC Semi-aquatic 27.557252 38.25356
Ptychadena anchietae Anura LC Semi-aquatic 24.324013 37.75305
Ptychadena ansorgii Anura LC Semi-aquatic 24.534568 37.91976
Ptychadena arnei Anura DD Ground-dwelling 27.578523 38.00279
Ptychadena bibroni Anura LC Ground-dwelling 27.569091 37.92649
Ptychadena broadleyi Anura NT Ground-dwelling 25.902836 37.65739
Ptychadena bunoderma Anura LC Ground-dwelling 25.075141 37.68357
Ptychadena christyi Anura LC Ground-dwelling 24.696396 37.49273
Ptychadena chrysogaster Anura LC Ground-dwelling 22.189667 37.11973
Ptychadena cooperi Anura LC Semi-aquatic 19.949142 37.25009
Ptychadena erlangeri Anura NT Ground-dwelling 21.436388 37.20430
Ptychadena filwoha Anura DD Semi-aquatic 20.215510 37.14878
Ptychadena gansi Anura LC Ground-dwelling 26.344963 37.77909
Ptychadena grandisonae Anura LC Ground-dwelling 24.409033 37.50814
Ptychadena guibei Anura LC Ground-dwelling 24.996624 37.62291
Ptychadena harenna Anura DD Ground-dwelling 20.234697 36.88864
Ptychadena ingeri Anura DD Semi-aquatic 26.635510 38.02429
Ptychadena keilingi Anura LC Ground-dwelling 24.928540 37.49445
Ptychadena longirostris Anura LC Ground-dwelling 27.787713 37.97819
Ptychadena mahnerti Anura LC Semi-aquatic 21.456231 37.48225
Ptychadena mapacha Anura DD Ground-dwelling 24.889868 37.57549
Ptychadena mascareniensis Anura LC Semi-aquatic 25.907931 37.97210
Ptychadena mossambica Anura LC Ground-dwelling 24.313589 37.43376
Ptychadena nana Anura EN Ground-dwelling 19.134325 36.89268
Ptychadena neumanni Anura LC Semi-aquatic 21.607072 37.43540
Ptychadena newtoni Anura EN Semi-aquatic 27.104015 38.18931
Ptychadena nilotica Anura LC Semi-aquatic 24.210743 37.72519
Ptychadena obscura Anura LC Ground-dwelling 24.036147 37.48256
Ptychadena oxyrhynchus Anura LC Ground-dwelling 25.594153 37.73421
Ptychadena perplicata Anura LC Ground-dwelling 24.779752 37.58658
Ptychadena perreti Anura LC Ground-dwelling 27.594158 37.94090
Ptychadena porosissima Anura LC Ground-dwelling 23.872989 37.55503
Ptychadena pujoli Anura DD Ground-dwelling 27.760821 37.93873
Ptychadena pumilio Anura LC Semi-aquatic 27.371998 38.17277
Ptychadena retropunctata Anura LC Semi-aquatic 27.694564 38.24216
Ptychadena schillukorum Anura LC Ground-dwelling 25.820087 37.70229
Ptychadena stenocephala Anura LC Ground-dwelling 26.043954 37.65295
Ptychadena straeleni Anura LC Ground-dwelling 27.122800 37.88997
Ptychadena submascareniensis Anura DD Ground-dwelling 27.623983 37.94336
Ptychadena subpunctata Anura LC Aquatic 24.614680 37.67508
Ptychadena superciliaris Anura LC Ground-dwelling 27.657455 37.97306
Ptychadena taenioscelis Anura LC Ground-dwelling 24.838342 37.48286
Ptychadena tellinii Anura LC Ground-dwelling 27.276975 37.99454
Ptychadena tournieri Anura LC Semi-aquatic 27.803057 38.16020
Ptychadena trinodis Anura LC Ground-dwelling 27.601917 37.89427
Ptychadena upembae Anura LC Semi-aquatic 24.423596 37.88240
Ptychadena uzungwensis Anura LC Semi-aquatic 24.445989 37.87599
Ptychadena wadei Anura DD Ground-dwelling 23.505649 37.50451
Ptychohyla dendrophasma Anura CR Stream-dwelling 27.036876 39.26877
Ptychohyla euthysanota Anura LC Stream-dwelling 26.411656 39.21837
Ptychohyla hypomykter Anura VU Arboreal 26.133952 39.65707
Ptychohyla legleri Anura EN Stream-dwelling 24.985341 39.06030
Ptychohyla leonhardschultzei Anura LC Stream-dwelling 25.756334 39.07814
Ptychohyla macrotympanum Anura VU Stream-dwelling 26.691340 39.23657
Ptychohyla salvadorensis Anura NT Arboreal 26.360507 39.56046
Ptychohyla zophodes Anura VU Stream-dwelling 25.541778 39.06476
Pyxicephalus adspersus Anura LC Fossorial 23.132226 38.22466
Pyxicephalus angusticeps Anura LC Semi-aquatic 25.898132 37.87412
Pyxicephalus edulis Anura LC Fossorial 25.269806 38.44315
Pyxicephalus obbianus Anura LC Fossorial 25.495816 38.54948
Quasipaa boulengeri Anura VU Stream-dwelling 24.661969 42.01554
Quasipaa delacouri Anura LC Stream-dwelling 26.511748 41.53546
Quasipaa exilispinosa Anura LC Stream-dwelling 27.730147 42.76060
Quasipaa fasciculispina Anura LC Stream-dwelling 29.318622 41.93860
Quasipaa jiulongensis Anura VU Stream-dwelling 27.129088 42.26784
Quasipaa shini Anura EN Stream-dwelling 26.967073 42.30119
Quasipaa spinosa Anura VU Stream-dwelling 26.681111 44.72732
Quasipaa verrucospinosa Anura LC Stream-dwelling 26.088900 42.15516
Quasipaa yei Anura VU Stream-dwelling 27.813321 42.22123
Rana amurensis Anura LC Semi-aquatic 16.620890 35.19313
Rana arvalis Anura LC Ground-dwelling 17.289179 34.06724
Rana asiatica Anura LC Semi-aquatic 15.861758 34.79071
Rana aurora Anura LC Semi-aquatic 16.826522 34.60995
Rana boylii Anura NT Stream-dwelling 18.888402 34.11505
Rana cascadae Anura LC Semi-aquatic 18.022032 34.36360
Rana chaochiaoensis Anura LC Ground-dwelling 21.404976 35.82240
Rana chensinensis Anura LC Semi-aquatic 21.096042 34.20660
Rana coreana Anura LC Semi-aquatic 23.411105 36.15423
Rana dalmatina Anura LC Semi-aquatic 19.996536 35.71638
Rana draytonii Anura NT Semi-aquatic 19.682507 35.10618
Rana dybowskii Anura LC Semi-aquatic 18.348132 29.37354
Rana graeca Anura LC Aquatic 20.857533 35.74501
Rana hanluica Anura LC Semi-aquatic 27.058004 36.75025
Rana huanrensis Anura LC Stream-dwelling 22.365663 32.60943
Rana iberica Anura VU Aquatic 19.969009 34.66489
Rana italica Anura LC Stream-dwelling 22.901786 34.80588
Rana japonica Anura LC Semi-aquatic 24.938555 36.48869
Rana johnsi Anura LC Ground-dwelling 26.007466 36.30491
Rana kukunoris Anura LC Semi-aquatic 13.651276 32.43416
Rana latastei Anura VU Ground-dwelling 21.230273 35.67812
Rana longicrus Anura VU Semi-aquatic 27.474124 36.87218
Rana luteiventris Anura LC Aquatic 15.847218 35.08861
Rana macrocnemis Anura LC Semi-aquatic 20.319073 35.35740
Rana muscosa Anura EN Stream-dwelling 20.232762 34.23014
Rana omeimontis Anura LC Ground-dwelling 23.532239 36.01943
Rana ornativentris Anura LC Semi-aquatic 24.767125 33.38101
Rana pirica Anura LC Ground-dwelling 17.608168 31.82944
Rana pretiosa Anura VU Aquatic 17.847452 34.82145
Rana pseudodalmatina Anura LC Semi-aquatic 19.971035 35.38538
Rana pyrenaica Anura EN Stream-dwelling 20.530102 34.55535
Rana sakuraii Anura LC Stream-dwelling 24.763505 35.49497
Rana sangzhiensis Anura LC Stream-dwelling 26.595288 35.67364
Rana sauteri Anura VU Stream-dwelling 27.568429 35.47327
Rana shuchinae Anura LC Stream-dwelling 17.436606 34.42773
Rana sierrae Anura VU Semi-aquatic 18.018919 34.83918
Rana tagoi Anura LC Ground-dwelling 24.825962 36.12762
Rana tavasensis Anura EN Stream-dwelling 21.793226 34.74065
Rana temporaria Anura LC Semi-aquatic 17.290511 35.53112
Rana tsushimensis Anura NT Semi-aquatic 25.393547 36.37813
Rana zhenhaiensis Anura LC Semi-aquatic 27.386211 36.82421
Ranitomeya amazonica Anura DD Arboreal 28.018079 37.58029
Ranitomeya benedicta Anura VU Ground-dwelling 25.607771 37.43970
Ranitomeya fantastica Anura VU Arboreal 24.706468 37.10836
Ranitomeya flavovittata Anura LC Arboreal 28.764917 37.87756
Ranitomeya imitator Anura LC Arboreal 25.239720 37.32548
Ranitomeya reticulata Anura LC Ground-dwelling 27.391802 37.61425
Ranitomeya sirensis Anura LC Arboreal 22.150329 38.06621
Ranitomeya summersi Anura EN Ground-dwelling 24.265362 37.18128
Ranitomeya uakarii Anura LC Ground-dwelling 25.424000 37.37742
Ranitomeya vanzolinii Anura LC Arboreal 25.028536 37.31068
Ranitomeya variabilis Anura DD Arboreal 24.576112 37.01190
Ranitomeya ventrimaculata Anura LC Arboreal 28.116077 37.57308
Ranodon sibiricus Caudata EN Stream-dwelling 15.060149 32.28295
Raorchestes akroparallagi Anura LC Arboreal 27.419995 37.91465
Raorchestes anili Anura LC Ground-dwelling 27.687545 38.12028
Raorchestes beddomii Anura LC Arboreal 27.985330 38.06535
Raorchestes bobingeri Anura NT Arboreal 27.808977 37.90148
Raorchestes bombayensis Anura VU Arboreal 26.988464 37.78385
Raorchestes charius Anura EN Arboreal 26.875890 37.80489
Raorchestes chlorosomma Anura EN Arboreal 27.763410 38.00921
Raorchestes chotta Anura DD Arboreal 27.808977 37.95172
Raorchestes chromasynchysi Anura VU Arboreal 27.143558 37.81662
Raorchestes coonoorensis Anura LC Arboreal 27.229333 37.97192
Raorchestes dubois Anura VU Arboreal 28.044115 38.01338
Raorchestes glandulosus Anura VU Arboreal 27.378592 37.87487
Raorchestes graminirupes Anura VU Ground-dwelling 27.808977 38.20645
Raorchestes griet Anura CR Arboreal 27.989913 37.99466
Raorchestes gryllus Anura VU Arboreal 28.200291 38.01181
Raorchestes kaikatti Anura CR Arboreal 28.605524 38.07893
Raorchestes longchuanensis Anura LC Arboreal 24.544798 37.46422
Raorchestes luteolus Anura LC Arboreal 27.245487 37.87009
Raorchestes marki Anura CR Arboreal 28.605524 38.03025
Raorchestes menglaensis Anura LC Stream-dwelling 24.681442 36.96019
Raorchestes munnarensis Anura EN Ground-dwelling 28.044115 38.17738
Raorchestes nerostagona Anura EN Arboreal 27.229333 37.87620
Raorchestes ochlandrae Anura LC Arboreal 27.535995 37.98115
Raorchestes parvulus Anura LC Arboreal 27.428086 37.97912
Raorchestes ponmudi Anura LC Arboreal 27.658911 37.99157
Raorchestes resplendens Anura CR Ground-dwelling 27.989913 38.22390
Raorchestes signatus Anura EN Arboreal 27.648557 38.02038
Raorchestes sushili Anura CR Arboreal 28.605524 38.08055
Raorchestes tinniens Anura EN Ground-dwelling 27.229333 38.06826
Raorchestes travancoricus Anura EN Arboreal 27.536907 37.90616
Raorchestes tuberohumerus Anura LC Arboreal 27.247345 37.87323
Rhacophorus angulirostris Anura NT Arboreal 26.959611 37.84754
Rhacophorus annamensis Anura LC Stream-dwelling 28.506792 37.61410
Rhacophorus baluensis Anura LC Arboreal 27.498234 37.99569
Rhacophorus barisani Anura LC Stream-dwelling 28.399235 37.57318
Rhacophorus bifasciatus Anura LC Stream-dwelling 28.035742 37.45059
Rhacophorus bimaculatus Anura LC Arboreal 27.670597 37.97159
Rhacophorus bipunctatus Anura LC Arboreal 25.930137 37.67651
Rhacophorus calcadensis Anura EN Arboreal 28.134805 38.05671
Rhacophorus calcaneus Anura EN Arboreal 27.724865 37.83879
Rhacophorus catamitus Anura LC Stream-dwelling 28.327037 37.53971
Rhacophorus exechopygus Anura LC Arboreal 28.219226 38.01004
Rhacophorus fasciatus Anura LC Arboreal 27.803691 37.84653
Rhacophorus gadingensis Anura LC Arboreal 27.992958 38.01707
Rhacophorus gauni Anura LC Arboreal 28.105017 38.08824
Rhacophorus georgii Anura LC Arboreal 27.118062 37.94648
Rhacophorus harrissoni Anura LC Arboreal 28.172938 37.97306
Rhacophorus helenae Anura EN Arboreal 29.434619 38.22228
Rhacophorus hoanglienensis Anura LC Arboreal 25.682751 37.80910
Rhacophorus kio Anura LC Arboreal 26.032866 37.73437
Rhacophorus lateralis Anura VU Arboreal 27.198746 37.93541
Rhacophorus malabaricus Anura LC Arboreal 27.427408 37.94939
Rhacophorus margaritifer Anura LC Stream-dwelling 27.845724 37.47695
Rhacophorus marmoridorsum Anura VU Arboreal 27.948482 37.89336
Rhacophorus modestus Anura LC Stream-dwelling 28.782390 37.62110
Rhacophorus monticola Anura VU Stream-dwelling 26.773829 37.39150
Rhacophorus nigropalmatus Anura LC Arboreal 28.356548 38.00325
Rhacophorus orlovi Anura LC Stream-dwelling 28.272209 37.54256
Rhacophorus pardalis Anura LC Arboreal 27.854337 37.93855
Rhacophorus poecilonotus Anura LC Arboreal 27.637815 37.97025
Rhacophorus pseudomalabaricus Anura VU Arboreal 28.044115 38.04213
Rhacophorus reinwardtii Anura LC Arboreal 27.481917 37.92054
Rhacophorus rhodopus Anura LC Arboreal 25.610427 37.64522
Rhacophorus robertingeri Anura LC Stream-dwelling 28.210794 37.51009
Rhacophorus robinsonii Anura LC Arboreal 28.261105 38.04417
Rhacophorus rufipes Anura LC Arboreal 28.322647 37.94940
Rhacophorus spelaeus Anura VU Arboreal 28.552715 38.04405
Rhacophorus translineatus Anura NT Arboreal 18.270271 36.71797
Rhacophorus tuberculatus Anura DD Arboreal 20.425427 36.94976
Rhacophorus turpes Anura DD Arboreal 24.156784 37.45619
Rhacophorus vampyrus Anura EN Arboreal 28.417762 38.10598
Rhacophorus verrucopus Anura NT Arboreal 16.407198 36.49474
Rhaebo blombergi Anura NT Ground-dwelling 25.212583 38.40981
Rhaebo caeruleostictus Anura EN Ground-dwelling 23.982008 38.25701
Rhaebo glaberrimus Anura LC Stream-dwelling 25.336584 37.84921
Rhaebo guttatus Anura LC Ground-dwelling 27.740406 38.71018
Rhaebo haematiticus Anura LC Ground-dwelling 26.157432 38.17096
Rhaebo hypomelas Anura LC Ground-dwelling 24.959110 38.38498
Rhaebo lynchi Anura DD Ground-dwelling 26.439037 38.55711
Rhaebo nasicus Anura LC Stream-dwelling 26.566325 37.99993
Rheobates palmatus Anura LC Stream-dwelling 24.059726 36.20466
Rheobates pseudopalmatus Anura LC Stream-dwelling 25.162775 36.42886
Rheohyla miotympanum Anura LC Arboreal 24.556155 39.52451
Rhinella abei Anura LC Ground-dwelling 24.650402 39.82263
Rhinella achalensis Anura EN Ground-dwelling 22.890532 39.43516
Rhinella achavali Anura LC Stream-dwelling 24.569890 39.42794
Rhinella acrolopha Anura EN Ground-dwelling 27.251842 40.07154
Rhinella acutirostris Anura LC Ground-dwelling 27.259218 39.97011
Rhinella alata Anura DD Ground-dwelling 26.965602 40.01161
Rhinella amabilis Anura CR Semi-aquatic 22.745113 39.56376
Rhinella amboroensis Anura DD Stream-dwelling 22.559731 38.76727
Rhinella arborescandens Anura EN Arboreal 22.540468 39.26962
Rhinella arenarum Anura LC Ground-dwelling 22.254241 39.17745
Rhinella arunco Anura NT Ground-dwelling 17.941875 38.81728
Rhinella atacamensis Anura VU Semi-aquatic 17.033348 38.90825
Rhinella bergi Anura LC Ground-dwelling 27.332934 40.03433
Rhinella castaneotica Anura LC Ground-dwelling 28.293123 40.10715
Rhinella cerradensis Anura DD Ground-dwelling 27.160045 40.41314
Rhinella chavin Anura EN Arboreal 19.679576 38.77721
Rhinella cristinae Anura EN Ground-dwelling 24.984184 39.68894
Rhinella crucifer Anura LC Ground-dwelling 25.631885 40.31260
Rhinella dapsilis Anura LC Ground-dwelling 27.000794 39.92802
Rhinella diptycha Anura DD Ground-dwelling 27.801879 41.16833
Rhinella dorbignyi Anura LC Ground-dwelling 23.223136 39.66347
Rhinella fernandezae Anura LC Ground-dwelling 25.098141 39.81962
Rhinella festae Anura LC Ground-dwelling 24.082695 39.59194
Rhinella fissipes Anura DD Ground-dwelling 20.595105 39.11702
Rhinella gallardoi Anura EN Ground-dwelling 23.101751 39.43516
Rhinella gnustae Anura DD Stream-dwelling 15.522314 37.85217
Rhinella granulosa Anura LC Ground-dwelling 27.247875 41.92773
Rhinella henseli Anura LC Ground-dwelling 25.050892 39.66580
Rhinella hoogmoedi Anura LC Ground-dwelling 25.795157 39.17612
Rhinella icterica Anura LC Ground-dwelling 26.136684 40.63503
Rhinella inca Anura LC Ground-dwelling 18.829383 38.95520
Rhinella iserni Anura DD Ground-dwelling 22.173411 39.36457
Rhinella jimi Anura LC Ground-dwelling 25.916086 40.24007
Rhinella justinianoi Anura VU Ground-dwelling 20.993756 39.22008
Rhinella lescurei Anura LC Ground-dwelling 27.738181 40.02960
Rhinella limensis Anura LC Ground-dwelling 20.719591 39.24639
Rhinella lindae Anura EN Ground-dwelling 26.439037 39.84852
Rhinella macrorhina Anura VU Ground-dwelling 22.605131 39.39432
Rhinella magnussoni Anura LC Ground-dwelling 27.785396 40.08234
Rhinella manu Anura LC Arboreal 17.366171 38.56596
Rhinella margaritifera Anura LC Ground-dwelling 27.367018 38.91454
Rhinella marina Anura LC Ground-dwelling 27.124898 40.88615
Rhinella martyi Anura LC Ground-dwelling 27.508718 39.96258
Rhinella multiverrucosa Anura DD Ground-dwelling 20.268134 39.18840
Rhinella nesiotes Anura VU Arboreal 22.825311 39.26327
Rhinella nicefori Anura EN Ground-dwelling 24.030777 39.62268
Rhinella ocellata Anura LC Ground-dwelling 27.343112 40.05883
Rhinella ornata Anura LC Ground-dwelling 26.189578 39.98292
Rhinella poeppigii Anura LC Stream-dwelling 21.911277 38.72319
Rhinella pombali Anura LC Ground-dwelling 25.867549 39.98696
Rhinella proboscidea Anura LC Ground-dwelling 28.588179 40.17776
Rhinella pygmaea Anura LC Fossorial 25.794625 40.85705
Rhinella quechua Anura VU Ground-dwelling 19.704311 39.03972
Rhinella roqueana Anura LC Ground-dwelling 26.793333 39.97958
Rhinella rubescens Anura LC Stream-dwelling 26.858966 39.71367
Rhinella rubropunctata Anura VU Ground-dwelling 16.882411 38.60149
Rhinella ruizi Anura VU Ground-dwelling 22.605131 39.43162
Rhinella rumbolli Anura NT Ground-dwelling 20.471107 39.08087
Rhinella scitula Anura DD Stream-dwelling 28.653412 39.59481
Rhinella sclerocephala Anura VU Ground-dwelling 26.864752 39.86370
Rhinella spinulosa Anura LC Ground-dwelling 16.381229 38.14999
Rhinella stanlaii Anura LC Ground-dwelling 20.135784 39.08459
Rhinella sternosignata Anura LC Ground-dwelling 25.672375 39.75675
Rhinella tacana Anura LC Arboreal 19.469485 38.84601
Rhinella tenrec Anura EN Ground-dwelling 26.439037 40.01761
Rhinella vellardi Anura EN Ground-dwelling 20.797911 39.23510
Rhinella veraguensis Anura LC Arboreal 19.930050 38.86389
Rhinella veredas Anura LC Ground-dwelling 26.497353 39.88962
Rhinella yanachaga Anura EN Arboreal 21.293309 39.08043
Rhinoderma darwinii Anura EN Ground-dwelling 15.305318 36.44050
Rhinoderma rufum Anura CR Ground-dwelling 19.510575 36.97076
Rhinophrynus dorsalis Anura LC Ground-dwelling 26.966968 37.13713
Rhombophryne coronata Anura LC Fossorial 25.581771 38.91565
Rhombophryne coudreaui Anura NT Fossorial 26.517390 39.12665
Rhombophryne guentherpetersi Anura EN Ground-dwelling 26.747102 38.16421
Rhombophryne laevipes Anura LC Fossorial 26.369665 39.11417
Rhombophryne mangabensis Anura VU Fossorial 27.140802 39.16477
Rhombophryne matavy Anura CR Ground-dwelling 26.637693 38.05589
Rhombophryne minuta Anura EN Fossorial 26.476930 39.03307
Rhombophryne serratopalpebrosa Anura EN Ground-dwelling 26.476930 38.11814
Rhombophryne testudo Anura EN Ground-dwelling 27.525133 38.34265
Rhyacotriton cascadae Caudata NT Semi-aquatic 18.044879 30.61957
Rhyacotriton kezeri Caudata NT Semi-aquatic 17.981582 30.61008
Rhyacotriton olympicus Caudata NT Semi-aquatic 16.696957 29.92953
Rhyacotriton variegatus Caudata LC Ground-dwelling 18.335834 29.01987
Rulyrana adiazeta Anura VU Stream-dwelling 24.441176 36.78179
Rulyrana flavopunctata Anura LC Stream-dwelling 24.527268 36.83462
Rulyrana mcdiarmidi Anura NT Stream-dwelling 23.692973 36.72245
Rulyrana saxiscandens Anura EN Stream-dwelling 24.265362 36.75224
Rulyrana spiculata Anura NT Stream-dwelling 19.167851 36.07614
Rulyrana susatamai Anura NT Stream-dwelling 24.009201 36.69015
Rupirana cardosoi Anura NT Stream-dwelling 25.168824 38.79310
Sachatamia albomaculata Anura LC Stream-dwelling 26.474128 37.07413
Sachatamia ilex Anura LC Stream-dwelling 26.356764 37.07048
Sachatamia orejuela Anura LC Stream-dwelling 24.185699 36.70396
Sachatamia punctulata Anura VU Stream-dwelling 24.223246 36.68061
Salamandra algira Caudata VU Semi-aquatic 22.860491 35.56281
Salamandra atra Caudata LC Ground-dwelling 19.750032 34.87671
Salamandra corsica Caudata LC Ground-dwelling 23.907151 35.49013
Salamandra infraimmaculata Caudata NT Ground-dwelling 21.979791 35.22650
Salamandra lanzai Caudata CR Ground-dwelling 20.252671 35.00715
Salamandra salamandra Caudata LC Ground-dwelling 20.083985 34.55079
Salamandrella keyserlingii Caudata LC Ground-dwelling 15.381214 32.95495
Salamandrina perspicillata Caudata EN Ground-dwelling 21.811406 36.30306
Salamandrina terdigitata Caudata LC Ground-dwelling 24.487672 36.67029
Sanguirana everetti Anura NT Stream-dwelling 27.582992 36.38671
Sanguirana igorota Anura VU Stream-dwelling 28.015940 36.42676
Sanguirana luzonensis Anura LC Stream-dwelling 27.862632 36.21926
Sanguirana sanguinea Anura LC Stream-dwelling 27.872371 36.43025
Sanguirana tipanan Anura VU Semi-aquatic 28.134325 37.30406
Scaphiophryne boribory Anura VU Ground-dwelling 25.891084 37.96683
Scaphiophryne brevis Anura LC Ground-dwelling 26.267109 38.02876
Scaphiophryne calcarata Anura LC Ground-dwelling 26.555260 38.09398
Scaphiophryne gottlebei Anura EN Fossorial 26.195793 38.96414
Scaphiophryne madagascariensis Anura NT Fossorial 25.849954 38.92322
Scaphiophryne marmorata Anura VU Ground-dwelling 25.211223 37.83749
Scaphiophryne menabensis Anura LC Semi-aquatic 26.841274 38.35936
Scaphiophryne spinosa Anura LC Ground-dwelling 25.748555 37.91435
Scaphiopus couchii Anura LC Fossorial 23.814194 39.03446
Scaphiopus holbrookii Anura LC Fossorial 25.365630 35.18634
Scaphiopus hurterii Anura LC Fossorial 26.804432 36.52924
Scarthyla goinorum Anura LC Semi-aquatic 28.030089 38.67126
Scarthyla vigilans Anura LC Ground-dwelling 26.791188 39.00979
Schismaderma carens Anura LC Ground-dwelling 23.842166 38.59280
Scinax acuminatus Anura LC Semi-aquatic 27.760809 42.34737
Scinax altae Anura LC Arboreal 27.493562 40.77726
Scinax alter Anura LC Arboreal 25.387695 40.91230
Scinax auratus Anura LC Arboreal 25.484986 40.39736
Scinax baumgardneri Anura DD Arboreal 27.070816 40.66275
Scinax blairi Anura LC Ground-dwelling 26.489149 40.76537
Scinax boesemani Anura LC Arboreal 28.110001 40.88553
Scinax boulengeri Anura LC Arboreal 27.040688 40.74860
Scinax cabralensis Anura DD Arboreal 25.517655 40.40985
Scinax caldarum Anura LC Arboreal 25.932282 40.64208
Scinax camposseabrai Anura DD Arboreal 25.316792 40.52735
Scinax cardosoi Anura LC Arboreal 25.959546 40.56294
Scinax castroviejoi Anura LC Arboreal 21.125255 39.22320
Scinax chiquitanus Anura LC Arboreal 25.659504 40.42630
Scinax constrictus Anura LC Arboreal 27.403267 40.85504
Scinax cretatus Anura LC Arboreal 25.597046 40.46776
Scinax crospedospilus Anura LC Arboreal 25.914601 40.54516
Scinax cruentommus Anura LC Arboreal 27.762137 40.69608
Scinax curicica Anura DD Arboreal 25.220967 40.45046
Scinax cuspidatus Anura LC Arboreal 25.633706 40.40671
Scinax danae Anura DD Arboreal 25.977285 40.56205
Scinax duartei Anura LC Ground-dwelling 25.848824 40.62261
Scinax elaeochroa Anura LC Arboreal 26.696934 40.29181
Scinax eurydice Anura LC Arboreal 26.087273 41.06700
Scinax exiguus Anura LC Arboreal 26.170031 40.54720
Scinax funereus Anura LC Arboreal 26.436211 40.59359
Scinax fuscomarginatus Anura LC Arboreal 27.145243 40.72073
Scinax fuscovarius Anura LC Semi-aquatic 26.882556 41.03941
Scinax garbei Anura LC Arboreal 27.596419 40.00975
Scinax granulatus Anura LC Ground-dwelling 24.684222 40.13926
Scinax hayii Anura LC Arboreal 25.771621 40.61050
Scinax ictericus Anura LC Arboreal 23.164216 40.14301
Scinax iquitorum Anura LC Arboreal 27.593813 40.67328
Scinax jolyi Anura DD Arboreal 27.088674 40.15611
Scinax karenanneae Anura LC Arboreal 28.220209 40.84522
Scinax kennedyi Anura LC Arboreal 27.796502 40.80134
Scinax lindsayi Anura LC Arboreal 28.756800 40.91408
Scinax manriquei Anura NT Arboreal 25.357013 40.44120
Scinax maracaya Anura DD Arboreal 25.893387 40.54992
Scinax nasicus Anura LC Arboreal 26.712094 41.37486
Scinax nebulosus Anura LC Arboreal 28.125277 41.26977
Scinax oreites Anura LC Arboreal 21.789211 39.98645
Scinax pachycrus Anura LC Arboreal 25.438296 41.24507
Scinax parkeri Anura LC Ground-dwelling 27.318607 40.92963
Scinax pedromedinae Anura LC Arboreal 23.870576 40.31508
Scinax perereca Anura LC Arboreal 25.630529 40.54761
Scinax proboscideus Anura LC Arboreal 27.607576 40.28253
Scinax quinquefasciatus Anura LC Arboreal 24.833318 41.23278
Scinax rostratus Anura LC Arboreal 26.860838 40.27191
Scinax ruber Anura LC Arboreal 27.713379 40.82410
Scinax similis Anura LC Arboreal 25.673076 40.55826
Scinax squalirostris Anura LC Arboreal 25.632764 41.29233
Scinax staufferi Anura LC Arboreal 26.705517 40.71605
Scinax sugillatus Anura LC Arboreal 24.980163 40.49649
Scinax tigrinus Anura LC Semi-aquatic 26.885490 41.12058
Scinax trilineatus Anura LC Arboreal 26.737269 40.66339
Scinax uruguayus Anura LC Ground-dwelling 24.848787 39.54304
Scinax wandae Anura LC Ground-dwelling 26.958388 40.76502
Scinax x-signatus Anura LC Arboreal 27.461328 41.58018
Scotobleps gabonicus Anura LC Stream-dwelling 27.658046 38.34264
Scutiger adungensis Anura DD Stream-dwelling 17.369125 35.67514
Scutiger boulengeri Anura LC Stream-dwelling 12.605423 35.06947
Scutiger brevipes Anura DD Stream-dwelling 15.184491 35.37442
Scutiger chintingensis Anura VU Stream-dwelling 21.440032 36.21063
Scutiger glandulatus Anura LC Ground-dwelling 15.315638 36.03737
Scutiger gongshanensis Anura LC Semi-aquatic 18.663023 36.78476
Scutiger jiulongensis Anura EN Semi-aquatic 17.923825 36.63094
Scutiger liupanensis Anura EN Stream-dwelling 20.385648 36.06909
Scutiger mammatus Anura LC Stream-dwelling 12.281296 35.03064
Scutiger muliensis Anura EN Stream-dwelling 17.614027 35.72015
Scutiger nepalensis Anura VU Stream-dwelling 16.516261 35.64856
Scutiger ningshanensis Anura LC Stream-dwelling 23.621802 36.56477
Scutiger nyingchiensis Anura LC Stream-dwelling 14.249952 35.32008
Scutiger pingwuensis Anura EN Stream-dwelling 19.768911 35.96852
Scutiger sikimmensis Anura LC Stream-dwelling 17.566255 35.66413
Scutiger tuberculatus Anura VU Stream-dwelling 20.775404 36.17111
Scythrophrys sawayae Anura LC Ground-dwelling 24.594068 39.29359
Sechellophryne gardineri Anura EN Ground-dwelling 26.889900 37.47412
Sechellophryne pipilodryas Anura CR Ground-dwelling 26.889900 37.39721
Semnodactylus wealii Anura LC Ground-dwelling 21.701954 39.58804
Silverstoneia erasmios Anura EN Ground-dwelling 25.141645 37.83194
Silverstoneia flotator Anura LC Ground-dwelling 26.879129 38.00792
Silverstoneia nubicola Anura VU Ground-dwelling 26.554831 38.04243
Siren intermedia Caudata LC Aquatic 26.511742 35.50796
Siren lacertina Caudata LC Semi-aquatic 26.712798 35.71994
Smilisca baudinii Anura LC Ground-dwelling 26.176379 40.04569
Smilisca cyanosticta Anura LC Arboreal 26.960239 39.95043
Smilisca dentata Anura EN Ground-dwelling 23.626351 39.46141
Smilisca fodiens Anura LC Fossorial 24.762744 39.59078
Smilisca phaeota Anura LC Stream-dwelling 26.319033 40.64093
Smilisca puma Anura LC Ground-dwelling 26.025414 40.22208
Smilisca sila Anura LC Arboreal 26.810685 39.84660
Smilisca sordida Anura LC Stream-dwelling 26.568307 39.29227
Sooglossus sechellensis Anura EN Ground-dwelling 26.889900 37.43519
Sooglossus thomasseti Anura CR Stream-dwelling 26.889900 36.91248
Spea bombifrons Anura LC Aquatic 21.587969 36.67988
Spea hammondii Anura NT Fossorial 19.888949 37.48541
Spea intermontana Anura LC Aquatic 17.602077 36.14555
Spea multiplicata Anura LC Ground-dwelling 22.261387 36.43908
Spelaeophryne methneri Anura LC Fossorial 24.219220 39.04543
Sphaenorhynchus bromelicola Anura DD Arboreal 24.959353 40.35920
Sphaenorhynchus caramaschii Anura LC Semi-aquatic 25.627277 40.72286
Sphaenorhynchus carneus Anura LC Semi-aquatic 27.657690 41.01489
Sphaenorhynchus dorisae Anura LC Semi-aquatic 27.822395 40.99970
Sphaenorhynchus lacteus Anura LC Semi-aquatic 27.685675 41.48385
Sphaenorhynchus mirim Anura DD Arboreal 25.692279 40.35013
Sphaenorhynchus orophilus Anura LC Arboreal 25.856211 40.45275
Sphaenorhynchus palustris Anura LC Aquatic 25.471289 40.56931
Sphaenorhynchus planicola Anura LC Aquatic 25.662105 40.90496
Sphaenorhynchus prasinus Anura LC Arboreal 25.527165 40.47644
Sphaenorhynchus surdus Anura LC Arboreal 24.976463 40.33238
Sphaerotheca breviceps Anura LC Ground-dwelling 27.346148 40.08894
Sphaerotheca dobsonii Anura LC Fossorial 27.854297 41.17500
Sphaerotheca leucorhynchus Anura DD Fossorial 27.234274 41.07523
Sphaerotheca maskeyi Anura LC Fossorial 22.283543 40.39302
Sphaerotheca rolandae Anura LC Fossorial 28.460641 41.24557
Sphaerotheca swani Anura DD Fossorial 25.953686 40.87243
Sphenophryne cornuta Anura LC Ground-dwelling 27.176539 35.41464
Spicospina flammocaerulea Anura VU Semi-aquatic 18.726993 34.97241
Spinomantis aglavei Anura LC Stream-dwelling 25.973618 37.11988
Spinomantis bertini Anura NT Stream-dwelling 25.943531 37.21223
Spinomantis brunae Anura EN Stream-dwelling 25.635403 37.08724
Spinomantis elegans Anura NT Stream-dwelling 25.985815 37.21804
Spinomantis fimbriatus Anura LC Arboreal 26.216758 37.61886
Spinomantis guibei Anura VU Stream-dwelling 25.671246 37.16643
Spinomantis massi Anura VU Arboreal 26.747102 37.78400
Spinomantis microtis Anura EN Stream-dwelling 25.752340 37.10970
Spinomantis peraccae Anura LC Arboreal 26.084029 37.56576
Spinomantis phantasticus Anura LC Stream-dwelling 26.112827 37.24195
Spinomantis tavaratra Anura VU Arboreal 26.882329 37.66675
Staurois latopalmatus Anura LC Stream-dwelling 28.039146 37.22784
Staurois parvus Anura VU Stream-dwelling 27.361544 37.20177
Staurois tuberilinguis Anura LC Stream-dwelling 27.992342 37.29940
Stefania ackawaio Anura VU Arboreal 26.912428 37.66733
Stefania ayangannae Anura VU Arboreal 26.912428 37.57791
Stefania breweri Anura VU Arboreal 28.342027 37.95027
Stefania coxi Anura VU Arboreal 26.912428 37.69040
Stefania evansi Anura DD Stream-dwelling 27.114808 37.23453
Stefania ginesi Anura NT Arboreal 25.619235 37.59007
Stefania goini Anura NT Ground-dwelling 25.966820 37.82927
Stefania marahuaquensis Anura NT Ground-dwelling 25.966820 37.71385
Stefania oculosa Anura VU Ground-dwelling 25.633941 37.62541
Stefania percristata Anura VU Arboreal 25.633941 37.50006
Stefania riae Anura NT Arboreal 25.743412 37.55893
Stefania riveroi Anura VU Ground-dwelling 26.671496 37.73142
Stefania roraimae Anura EN Ground-dwelling 26.671496 37.79460
Stefania satelles Anura NT Ground-dwelling 25.696434 37.66837
Stefania scalae Anura LC Stream-dwelling 26.288956 37.09697
Stefania schuberti Anura NT Ground-dwelling 26.143635 37.73699
Stefania tamacuarina Anura DD Stream-dwelling 27.345187 37.28502
Stefania woodleyi Anura DD Stream-dwelling 27.153360 37.27742
Stereochilus marginatus Caudata LC Semi-aquatic 25.561479 35.72479
Stereocyclops histrio Anura DD Ground-dwelling 25.433241 39.68219
Stereocyclops incrassatus Anura LC Ground-dwelling 25.551804 40.05586
Stereocyclops parkeri Anura LC Ground-dwelling 26.039029 39.92367
Strabomantis anatipes Anura VU Stream-dwelling 24.460522 32.72774
Strabomantis anomalus Anura LC Stream-dwelling 25.369238 32.84521
Strabomantis biporcatus Anura LC Ground-dwelling 26.964087 33.84147
Strabomantis bufoniformis Anura EN Stream-dwelling 26.233818 33.03286
Strabomantis cadenai Anura CR Ground-dwelling 26.439037 33.72516
Strabomantis cerastes Anura LC Ground-dwelling 24.555625 33.43570
Strabomantis cheiroplethus Anura EN Stream-dwelling 25.618773 32.96687
Strabomantis cornutus Anura VU Ground-dwelling 24.016147 33.35824
Strabomantis helonotus Anura CR Ground-dwelling 22.090899 33.16316
Strabomantis ingeri Anura VU Ground-dwelling 23.581962 33.25190
Strabomantis laticorpus Anura DD Ground-dwelling 28.084410 33.97224
Strabomantis necopinus Anura VU Ground-dwelling 22.866967 33.15510
Strabomantis ruizi Anura EN Ground-dwelling 24.612963 33.42205
Strabomantis sulcatus Anura LC Ground-dwelling 26.922328 33.80412
Strabomantis zygodactylus Anura LC Stream-dwelling 25.655660 33.05958
Strauchbufo raddei Anura LC Ground-dwelling 18.755172 37.78527
Strongylopus bonaespei Anura LC Semi-aquatic 20.764129 37.18526
Strongylopus fasciatus Anura LC Semi-aquatic 22.881627 37.44112
Strongylopus fuelleborni Anura LC Semi-aquatic 23.141740 37.58066
Strongylopus grayii Anura LC Semi-aquatic 21.678845 37.28273
Strongylopus kilimanjaro Anura DD Stream-dwelling 22.670118 36.47109
Strongylopus kitumbeine Anura VU Semi-aquatic 21.152086 37.22393
Strongylopus merumontanus Anura LC Stream-dwelling 21.936803 36.47286
Strongylopus rhodesianus Anura VU Stream-dwelling 24.846367 36.84188
Strongylopus springbokensis Anura LC Semi-aquatic 20.466731 37.10454
Strongylopus wageri Anura LC Semi-aquatic 22.251252 37.41178
Stumpffia analamaina Anura CR Ground-dwelling 27.256065 38.16694
Stumpffia be Anura EN Ground-dwelling 26.962711 38.11277
Stumpffia gimmeli Anura LC Ground-dwelling 26.871170 38.05352
Stumpffia grandis Anura LC Ground-dwelling 26.039383 38.00835
Stumpffia hara Anura CR Ground-dwelling 26.637693 38.12678
Stumpffia madagascariensis Anura EN Ground-dwelling 26.637693 38.06270
Stumpffia megsoni Anura DD Ground-dwelling 26.637693 38.07455
Stumpffia miery Anura EN Ground-dwelling 25.878849 38.04178
Stumpffia psologlossa Anura EN Ground-dwelling 26.611874 37.95844
Stumpffia pygmaea Anura EN Ground-dwelling 27.525133 38.20708
Stumpffia roseifemoralis Anura EN Ground-dwelling 26.476930 38.14284
Stumpffia staffordi Anura VU Ground-dwelling 26.637693 38.05826
Stumpffia tetradactyla Anura DD Ground-dwelling 26.258355 38.05334
Stumpffia tridactyla Anura DD Ground-dwelling 25.544571 37.94392
Synapturanus mirandaribeiroi Anura LC Ground-dwelling 27.946172 37.64494
Synapturanus rabus Anura LC Fossorial 27.718009 38.64282
Synapturanus salseri Anura LC Ground-dwelling 28.534119 37.78494
Tachycnemis seychellensis Anura LC Arboreal 26.889900 40.43525
Taricha granulosa Caudata LC Ground-dwelling 15.431020 35.59822
Taricha rivularis Caudata VU Ground-dwelling 18.074106 36.14145
Taricha torosa Caudata NT Ground-dwelling 19.711454 36.31538
Taruga eques Anura EN Arboreal 27.674004 38.58066
Taruga fastigo Anura EN Arboreal 27.547532 38.56138
Taruga longinasus Anura EN Arboreal 27.674004 38.56347
Taudactylus eungellensis Anura EN Stream-dwelling 25.641198 35.07283
Taudactylus liemi Anura LC Semi-aquatic 25.641198 35.85187
Taudactylus pleione Anura CR Ground-dwelling 24.400069 35.59456
Telmatobius arequipensis Anura NT Aquatic 15.566642 36.73193
Telmatobius atacamensis Anura CR Aquatic 14.396671 36.45287
Telmatobius atahualpai Anura VU Semi-aquatic 20.278053 37.38000
Telmatobius brevipes Anura VU Semi-aquatic 20.127014 37.31975
Telmatobius brevirostris Anura EN Semi-aquatic 19.973855 37.37857
Telmatobius carrillae Anura VU Semi-aquatic 16.160113 36.79257
Telmatobius chusmisensis Anura EN Stream-dwelling 15.695928 35.92533
Telmatobius colanensis Anura DD Stream-dwelling 24.252411 36.99769
Telmatobius contrerasi Anura EN Stream-dwelling 20.977490 36.66035
Telmatobius culeus Anura EN Aquatic 16.214995 36.68361
Telmatobius dankoi Anura CR Aquatic 14.633854 36.52742
Telmatobius degener Anura DD Semi-aquatic 22.537771 37.58083
Telmatobius fronteriensis Anura CR Stream-dwelling 11.930120 35.34653
Telmatobius gigas Anura EN Stream-dwelling 15.702740 35.89314
Telmatobius halli Anura DD Semi-aquatic 9.975574 36.04757
Telmatobius hauthali Anura EN Aquatic 12.432014 36.32171
Telmatobius hintoni Anura VU Aquatic 18.285864 37.02107
Telmatobius hockingi Anura DD Stream-dwelling 17.418204 36.11305
Telmatobius huayra Anura VU Aquatic 14.743225 36.53605
Telmatobius hypselocephalus Anura EN Aquatic 14.440140 36.51795
Telmatobius ignavus Anura EN Semi-aquatic 22.881730 37.64523
Telmatobius intermedius Anura EN Semi-aquatic 15.218556 36.70095
Telmatobius jelskii Anura NT Semi-aquatic 16.598978 36.85789
Telmatobius latirostris Anura EN Semi-aquatic 22.890282 37.66193
Telmatobius marmoratus Anura EN Semi-aquatic 15.816895 36.75702
Telmatobius mayoloi Anura EN Aquatic 21.963628 37.55623
Telmatobius necopinus Anura DD Stream-dwelling 20.676160 36.63790
Telmatobius niger Anura CR Semi-aquatic 23.479298 37.78277
Telmatobius oxycephalus Anura EN Aquatic 18.048793 37.05953
Telmatobius pefauri Anura CR Stream-dwelling 16.677387 35.90660
Telmatobius peruvianus Anura VU Semi-aquatic 14.549685 36.58858
Telmatobius philippii Anura CR Aquatic 9.975574 35.99691
Telmatobius pinguiculus Anura EN Aquatic 19.540248 37.13466
Telmatobius pisanoi Anura EN Aquatic 14.490261 36.46361
Telmatobius platycephalus Anura EN Aquatic 15.530940 36.56799
Telmatobius punctatus Anura EN Semi-aquatic 19.534037 37.18691
Telmatobius rimac Anura VU Semi-aquatic 19.002640 37.19628
Telmatobius sanborni Anura CR Semi-aquatic 16.318090 36.90879
Telmatobius schreiteri Anura EN Aquatic 20.341275 37.24131
Telmatobius scrocchii Anura CR Aquatic 20.910470 37.40280
Telmatobius simonsi Anura CR Aquatic 20.049444 37.26404
Telmatobius stephani Anura EN Aquatic 21.000696 37.34184
Telmatobius thompsoni Anura DD Semi-aquatic 22.537771 37.67926
Telmatobius timens Anura CR Semi-aquatic 16.459088 36.82327
Telmatobius truebae Anura VU Semi-aquatic 21.733334 37.53084
Telmatobius verrucosus Anura CR Aquatic 18.664739 37.13511
Telmatobius vilamensis Anura CR Semi-aquatic 14.633854 36.63703
Telmatobius yuracare Anura CR Aquatic 22.559731 37.62398
Telmatobius zapahuirensis Anura EN Semi-aquatic 16.677387 36.84473
Telmatobufo australis Anura LC Stream-dwelling 16.551337 34.35905
Telmatobufo bullocki Anura EN Stream-dwelling 18.338116 34.64808
Telmatobufo venustus Anura EN Stream-dwelling 16.584952 34.38144
Tepuihyla aecii Anura NT Arboreal 25.966820 39.71481
Tepuihyla edelcae Anura LC Arboreal 25.696434 39.60354
Tepuihyla exophthalma Anura LC Arboreal 26.362100 39.72034
Tepuihyla luteolabris Anura VU Arboreal 25.966820 39.68912
Tepuihyla rodriguezi Anura NT Arboreal 26.459117 39.70706
Teratohyla adenocheira Anura LC Stream-dwelling 28.463470 37.28301
Teratohyla amelie Anura LC Arboreal 22.622266 36.98870
Teratohyla midas Anura LC Arboreal 27.900763 37.67721
Teratohyla pulverata Anura LC Arboreal 26.462609 37.52580
Teratohyla spinosa Anura LC Stream-dwelling 26.068215 36.92157
Theloderma asperum Anura LC Ground-dwelling 28.119713 38.20267
Theloderma bicolor Anura LC Ground-dwelling 23.894363 37.73759
Theloderma corticale Anura LC Ground-dwelling 27.546631 38.06366
Theloderma gordoni Anura LC Ground-dwelling 26.987687 38.05325
Theloderma horridum Anura LC Arboreal 28.078368 38.05342
Theloderma laeve Anura LC Arboreal 28.357886 38.03524
Theloderma lateriticum Anura LC Arboreal 26.770626 37.79985
Theloderma leporosum Anura LC Arboreal 28.464832 38.10112
Theloderma licin Anura LC Arboreal 28.181849 38.04964
Theloderma moloch Anura LC Arboreal 18.334918 36.76135
Theloderma nagalandense Anura DD Arboreal 25.414438 37.58787
Theloderma nebulosum Anura EN Arboreal 28.131262 37.83410
Theloderma phrynoderma Anura LC Arboreal 27.963266 38.02539
Theloderma rhododiscus Anura LC Arboreal 26.725301 37.86599
Theloderma ryabovi Anura EN Arboreal 27.627978 38.03548
Theloderma stellatum Anura LC Arboreal 28.844143 38.01283
Theloderma truongsonense Anura LC Stream-dwelling 28.255805 37.49799
Thorius adelos Caudata NT Arboreal 22.681874 34.64568
Thorius arboreus Caudata CR Arboreal 22.681874 34.66958
Thorius aureus Caudata CR Ground-dwelling 22.681874 34.88934
Thorius boreas Caudata EN Ground-dwelling 22.681874 34.85905
Thorius dubitus Caudata CR Ground-dwelling 25.021001 35.15517
Thorius grandis Caudata CR Ground-dwelling 24.338588 35.03331
Thorius infernalis Caudata CR Semi-aquatic 24.338588 35.27791
Thorius insperatus Caudata CR Ground-dwelling 22.681874 34.93441
Thorius lunaris Caudata CR Ground-dwelling 25.021001 35.16527
Thorius macdougalli Caudata EN Ground-dwelling 22.681874 34.76346
Thorius magnipes Caudata CR Arboreal 25.021001 34.97445
Thorius minutissimus Caudata CR Ground-dwelling 27.639256 35.41765
Thorius minydemus Caudata EN Ground-dwelling 23.670587 34.99227
Thorius munificus Caudata CR Ground-dwelling 21.551792 34.64371
Thorius narismagnus Caudata CR Fossorial 27.246796 36.36909
Thorius narisovalis Caudata EN Ground-dwelling 24.112672 34.98745
Thorius omiltemi Caudata EN Ground-dwelling 25.457526 35.21429
Thorius papaloae Caudata CR Ground-dwelling 22.681874 34.92242
Thorius pennatulus Caudata EN Ground-dwelling 24.858995 35.14508
Thorius pulmonaris Caudata CR Ground-dwelling 22.681874 34.84102
Thorius schmidti Caudata CR Ground-dwelling 25.021001 35.08772
Thorius smithi Caudata CR Ground-dwelling 22.681874 34.85907
Thorius spilogaster Caudata CR Fossorial 25.021001 36.05898
Thorius troglodytes Caudata EN Fossorial 23.286396 35.88239
Thoropa lutzi Anura EN Stream-dwelling 26.017373 37.09969
Thoropa megatympanum Anura LC Stream-dwelling 25.416083 36.96599
Thoropa miliaris Anura LC Stream-dwelling 25.620218 37.01206
Thoropa petropolitana Anura VU Stream-dwelling 25.776702 37.08656
Thoropa saxatilis Anura NT Stream-dwelling 24.832390 36.90261
Tlalocohyla godmani Anura VU Stream-dwelling 25.160347 39.39580
Tlalocohyla loquax Anura LC Aquatic 27.081078 40.45847
Tlalocohyla picta Anura LC Arboreal 26.553809 40.16822
Tlalocohyla smithii Anura LC Stream-dwelling 25.411445 41.06344
Tomopterna cryptotis Anura LC Ground-dwelling 25.405140 37.46292
Tomopterna damarensis Anura DD Fossorial 23.510280 38.21346
Tomopterna delalandii Anura LC Semi-aquatic 20.709477 37.13596
Tomopterna elegans Anura LC Ground-dwelling 25.956765 37.56791
Tomopterna gallmanni Anura LC Ground-dwelling 22.032623 37.06908
Tomopterna kachowskii Anura LC Ground-dwelling 21.775728 37.07166
Tomopterna krugerensis Anura LC Ground-dwelling 23.725020 37.26970
Tomopterna luganga Anura LC Semi-aquatic 22.314268 37.28106
Tomopterna marmorata Anura LC Ground-dwelling 24.083510 37.31217
Tomopterna milletihorsini Anura DD Ground-dwelling 27.825689 37.78082
Tomopterna natalensis Anura LC Ground-dwelling 22.453559 37.14412
Tomopterna tandyi Anura LC Ground-dwelling 22.364635 37.00615
Tomopterna tuberculosa Anura LC Semi-aquatic 23.828103 37.53717
Tomopterna wambensis Anura LC Semi-aquatic 22.636551 37.33151
Trachycephalus atlas Anura LC Arboreal 25.209799 40.99881
Trachycephalus coriaceus Anura LC Arboreal 27.768714 40.55415
Trachycephalus dibernardoi Anura LC Arboreal 25.632648 40.34671
Trachycephalus hadroceps Anura LC Arboreal 27.597336 40.50595
Trachycephalus imitatrix Anura LC Arboreal 25.721911 40.29435
Trachycephalus jordani Anura LC Arboreal 24.854936 40.09106
Trachycephalus lepidus Anura DD Arboreal 26.712618 40.46915
Trachycephalus mesophaeus Anura LC Arboreal 25.501898 40.26526
Trachycephalus nigromaculatus Anura LC Arboreal 25.944122 40.32579
Trachycephalus resinifictrix Anura LC Arboreal 27.877906 40.54227
Trichobatrachus robustus Anura LC Stream-dwelling 27.437749 38.45911
Triprion petasatus Anura LC Arboreal 27.644050 39.87705
Triturus carnifex Caudata LC Semi-aquatic 20.761969 36.95047
Triturus cristatus Caudata LC Ground-dwelling 18.360240 36.32447
Triturus dobrogicus Caudata LC Ground-dwelling 19.951363 36.75942
Triturus karelinii Caudata LC Semi-aquatic 20.095303 36.88678
Triturus marmoratus Caudata LC Semi-aquatic 19.808909 36.71313
Triturus pygmaeus Caudata NT Semi-aquatic 21.620798 36.74258
Truebella skoptes Anura DD Arboreal 17.039787 37.41511
Truebella tothastes Anura EN Ground-dwelling 17.117738 37.52472
Tsingymantis antitra Anura EN Ground-dwelling 26.962711 37.96395
Tylototriton asperrimus Caudata NT Ground-dwelling 26.773854 37.06498
Tylototriton hainanensis Caudata EN Ground-dwelling 27.965646 37.21651
Tylototriton kweichowensis Caudata VU Semi-aquatic 23.495055 36.90510
Tylototriton notialis Caudata VU Ground-dwelling 27.992413 37.22325
Tylototriton shanjing Caudata VU Ground-dwelling 22.195424 36.47447
Tylototriton verrucosus Caudata NT Semi-aquatic 23.127635 36.84354
Tylototriton vietnamensis Caudata VU Semi-aquatic 27.652937 37.45968
Tylototriton wenxianensis Caudata VU Ground-dwelling 23.598202 36.65414
Uperodon globulosus Anura LC Fossorial 27.366568 39.27542
Uperodon systoma Anura LC Fossorial 26.874124 39.12038
Uperoleia altissima Anura LC Ground-dwelling 26.227656 35.77344
Uperoleia arenicola Anura LC Ground-dwelling 28.579204 36.16157
Uperoleia aspera Anura LC Ground-dwelling 28.062909 36.08974
Uperoleia borealis Anura LC Ground-dwelling 27.759634 35.95806
Uperoleia crassa Anura LC Semi-aquatic 28.105154 36.32963
Uperoleia daviesae Anura EN Ground-dwelling 28.261603 36.11231
Uperoleia fusca Anura LC Ground-dwelling 23.559250 34.92711
Uperoleia glandulosa Anura LC Ground-dwelling 26.490424 35.80550
Uperoleia inundata Anura LC Ground-dwelling 28.132525 36.04338
Uperoleia laevigata Anura LC Ground-dwelling 22.612007 34.47361
Uperoleia lithomoda Anura LC Ground-dwelling 27.641203 35.91848
Uperoleia littlejohni Anura LC Ground-dwelling 25.839762 35.74209
Uperoleia martini Anura DD Ground-dwelling 19.239381 34.69932
Uperoleia micromeles Anura LC Ground-dwelling 25.329711 35.60523
Uperoleia mimula Anura LC Ground-dwelling 26.823310 35.77866
Uperoleia minima Anura LC Ground-dwelling 28.089361 36.05592
Uperoleia mjobergii Anura LC Ground-dwelling 28.033660 35.96325
Uperoleia orientalis Anura DD Ground-dwelling 27.907294 36.04024
Uperoleia rugosa Anura LC Ground-dwelling 23.334600 35.54103
Uperoleia russelli Anura LC Ground-dwelling 24.776773 35.58304
Uperoleia talpa Anura LC Ground-dwelling 27.771193 36.08142
Uperoleia trachyderma Anura LC Ground-dwelling 27.046260 35.90363
Uperoleia tyleri Anura DD Ground-dwelling 20.430555 34.51880
Urspelerpes brucei Caudata LC Fossorial 26.950810 37.39077
Vandijkophrynus amatolicus Anura CR Ground-dwelling 20.611452 37.87503
Vandijkophrynus angusticeps Anura LC Ground-dwelling 21.029625 38.02499
Vandijkophrynus gariepensis Anura LC Ground-dwelling 21.030582 37.98720
Vandijkophrynus inyangae Anura VU Ground-dwelling 23.836789 38.32970
Vandijkophrynus robinsoni Anura LC Ground-dwelling 20.388532 37.89806
Vitreorana antisthenesi Anura VU Arboreal 27.224334 37.56870
Vitreorana castroviejoi Anura EN Arboreal 26.667627 37.53030
Vitreorana eurygnatha Anura LC Arboreal 25.709906 37.43393
Vitreorana gorzulae Anura LC Arboreal 26.288956 37.38521
Vitreorana helenae Anura VU Arboreal 26.073805 37.38745
Vitreorana parvula Anura VU Stream-dwelling 24.718914 36.81400
Vitreorana uranoscopa Anura LC Arboreal 25.763201 37.36727
Wakea madinika Anura DD Ground-dwelling 27.525133 37.94841
Werneria bambutensis Anura CR Stream-dwelling 26.186967 38.21887
Werneria iboundji Anura CR Stream-dwelling 28.009525 38.41826
Werneria mertensiana Anura CR Stream-dwelling 26.852636 38.25971
Werneria preussi Anura EN Stream-dwelling 27.191396 38.37549
Werneria submontana Anura EN Stream-dwelling 27.125406 38.19761
Werneria tandyi Anura CR Stream-dwelling 27.125406 38.23027
Wolterstorffina chirioi Anura CR Ground-dwelling 25.817681 38.77103
Wolterstorffina mirei Anura EN Ground-dwelling 25.750743 38.74170
Wolterstorffina parvipalmata Anura CR Stream-dwelling 26.837496 38.17882
Xanthophryne koynayensis Anura EN Ground-dwelling 27.042391 38.95304
Xanthophryne tigerina Anura CR Ground-dwelling 27.105274 39.03572
Xenohyla eugenioi Anura DD Arboreal 25.366870 39.19976
Xenohyla truncata Anura NT Arboreal 25.773498 39.35640
Xenopus amieti Anura VU Aquatic 26.438074 36.80296
Xenopus andrei Anura LC Aquatic 27.243486 36.93356
Xenopus borealis Anura LC Aquatic 21.719078 36.25441
Xenopus boumbaensis Anura NT Stream-dwelling 27.271002 36.18929
Xenopus clivii Anura LC Aquatic 22.582031 36.23554
Xenopus epitropicalis Anura LC Aquatic 27.565308 37.22981
Xenopus fraseri Anura DD Aquatic 28.391255 37.06166
Xenopus gilli Anura EN Ground-dwelling 20.817692 35.79351
Xenopus itombwensis Anura EN Aquatic 24.550522 36.54970
Xenopus laevis Anura LC Aquatic 22.664902 36.08129
Xenopus largeni Anura EN Aquatic 20.982090 36.07785
Xenopus lenduensis Anura CR Aquatic 25.691672 36.65412
Xenopus longipes Anura CR Aquatic 25.817681 36.71879
Xenopus muelleri Anura LC Aquatic 24.331849 36.48612
Xenopus petersii Anura LC Aquatic 25.481007 36.64394
Xenopus pygmaeus Anura LC Aquatic 27.643730 36.90465
Xenopus ruwenzoriensis Anura DD Aquatic 24.375681 36.61515
Xenopus tropicalis Anura LC Aquatic 27.706784 37.23102
Xenopus vestitus Anura LC Aquatic 23.239962 36.30991
Xenopus victorianus Anura LC Aquatic 23.577763 36.38335
Xenopus wittei Anura LC Aquatic 23.522868 36.31207
Xenorhina adisca Anura DD Ground-dwelling 27.228017 35.40229
Xenorhina anorbis Anura DD Ground-dwelling 26.332044 35.25985
Xenorhina arboricola Anura LC Arboreal 27.000482 35.22456
Xenorhina arfakiana Anura LC Ground-dwelling 27.785597 35.65204
Xenorhina bidens Anura LC Ground-dwelling 27.830272 35.55610
Xenorhina bouwensi Anura LC Ground-dwelling 27.111356 35.38636
Xenorhina eiponis Anura DD Ground-dwelling 25.609209 35.14290
Xenorhina fuscigula Anura LC Fossorial 26.165987 36.23021
Xenorhina gigantea Anura DD Ground-dwelling 26.232798 35.23064
Xenorhina huon Anura DD Ground-dwelling 26.251026 35.19192
Xenorhina lanthanites Anura DD Ground-dwelling 26.372759 35.18595
Xenorhina macrodisca Anura DD Ground-dwelling 24.020029 34.99610
Xenorhina macrops Anura LC Ground-dwelling 26.541684 35.30641
Xenorhina mehelyi Anura LC Ground-dwelling 26.756386 35.39711
Xenorhina minima Anura LC Ground-dwelling 26.481603 35.26998
Xenorhina multisica Anura LC Ground-dwelling 24.843060 35.01946
Xenorhina obesa Anura LC Ground-dwelling 26.894098 35.38488
Xenorhina ocellata Anura LC Ground-dwelling 26.431858 35.36904
Xenorhina ophiodon Anura DD Ground-dwelling 27.860409 35.48622
Xenorhina oxycephala Anura LC Ground-dwelling 27.099169 35.43762
Xenorhina parkerorum Anura LC Ground-dwelling 26.638466 35.30956
Xenorhina rostrata Anura LC Ground-dwelling 26.812031 35.33615
Xenorhina scheepstrai Anura DD Ground-dwelling 26.375358 35.29733
Xenorhina schiefenhoeveli Anura LC Ground-dwelling 25.609209 35.26789
Xenorhina similis Anura LC Ground-dwelling 27.210276 35.45063
Xenorhina subcrocea Anura DD Ground-dwelling 26.827638 35.21565
Xenorhina tumulus Anura LC Fossorial 26.761957 36.37137
Xenorhina varia Anura DD Ground-dwelling 26.372759 35.35645
Xenorhina zweifeli Anura LC Ground-dwelling 27.537612 35.44491
Zachaenus carvalhoi Anura DD Ground-dwelling 25.780363 37.64286
Zachaenus parvulus Anura LC Ground-dwelling 25.762956 37.54486

Predicted plasticity of each species

# Load estimated intercepts and acclimation response ratios
species_ARR <- readRDS("RData/Climate_vulnerability/Pond/current/species_ARR_pond_current.rds")

# Display data
kable(species_ARR, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label intercept intercept_se slope slope_se
Pleurodema thaul 35.90767 1.4968582 0.1419952 0.0917530
Anaxyrus americanus 37.17172 0.9556022 0.0914746 0.0490691
Dryophytes versicolor 37.37297 3.0542887 0.1254332 0.1366829
Pseudacris crucifer 34.91936 3.2099507 0.1241034 0.1449068
Rana cascadae 32.07766 2.8450193 0.1268415 0.1560132
Rana luteiventris 32.83118 2.8260619 0.1424495 0.1724273
Lithobates sphenocephalus 35.78824 5.6650724 0.1288926 0.2199606
Hylomantis aspera 35.23926 18.3796928 0.1341506 0.7236338
Alytes cisternasii 32.92891 3.0861756 0.1669401 0.1446988
Alytes dickhilleni 34.61466 4.6161589 0.1216522 0.2061491
Alytes obstetricans 33.14787 3.0136465 0.1517981 0.1554486
Bufotes boulengeri 36.30905 8.6350966 0.1379723 0.3649727
Barbarophryne brongersmai 35.97622 4.1091377 0.1131505 0.1828543
Bufo bufo 34.61728 1.4318987 0.1075313 0.0770052
Epidalea calamita 34.97773 1.8687862 0.1512542 0.0998857
Ceratophrys aurita 36.84152 13.6556746 0.1307139 0.5331869
Dendropsophus branneri 36.33712 8.0488758 0.1098838 0.3085076
Dendropsophus elegans 35.91089 8.3460092 0.1185909 0.3258930
Dendropsophus haddadi 34.78968 13.9032440 0.1064546 0.5473902
Dendropsophus novaisi 37.59220 7.4331543 0.1240432 0.2940948
Discoglossus galganoi 32.71215 4.8703373 0.1739762 0.2327465
Discoglossus pictus 34.11433 8.4205481 0.1508807 0.3563427
Discoglossus scovazzi 33.81670 7.8268129 0.1495117 0.3518580
Hyla arborea 35.46782 2.4402588 0.1429389 0.1263647
Hyla meridionalis 35.00066 2.4975613 0.1225487 0.1153174
Boana albomarginata 37.05342 9.8182168 0.1319985 0.3822931
Boana faber 37.74968 4.0566618 0.1220565 0.1558899
Leptodactylus fuscus 38.64980 15.5496516 0.1353399 0.5705433
Leptodactylus latrans 37.49833 5.9607367 0.1211408 0.2236524
Pelobates cultripes 35.05683 3.0873347 0.1446740 0.1473795
Pelodytes ibericus 33.60718 2.2699440 0.0913140 0.1033273
Pelodytes punctatus 33.57987 2.7660345 0.1154146 0.1360515
Phasmahyla spectabilis 34.85572 10.4742114 0.1276487 0.4072916
Phyllodytes luteolus 36.47355 12.7425672 0.1279742 0.5008105
Phyllodytes melanomystax 37.24333 16.7241585 0.1330341 0.6591738
Pithecopus rohdei 36.82828 11.2799193 0.1360178 0.4346870
Physalaemus camacan 36.32224 20.4784728 0.1339034 0.8018721
Physalaemus erikae 36.63712 19.8677707 0.1345101 0.7786767
Pipa carvalhoi 36.01514 17.8179208 0.1395476 0.6933710
Pleurodeles waltl 33.56475 4.6485278 0.1364741 0.2145150
Pelophylax perezi 35.45840 4.7071927 0.1399468 0.2227183
Rana temporaria 33.25867 0.7437576 0.1314276 0.0418929
Rhinella crucifer 36.91400 13.5789891 0.1325925 0.5298529
Rhinella hoogmoedi 36.01245 15.7363110 0.1226459 0.6116361
Rhinella diptycha 37.67846 7.1037589 0.1255264 0.2574013
Salamandra salamandra 31.92020 3.0745371 0.1309795 0.1508895
Ololygon agilis 38.07360 19.4875879 0.1284396 0.7608263
Scinax eurydice 37.70814 11.8918001 0.1287549 0.4578202
Sphaenorhynchus prasinus 37.22559 14.0899427 0.1273486 0.5514213
Trachycephalus mesophaeus 37.07261 12.3070037 0.1251925 0.4848371
Triturus pygmaeus 33.90250 5.6450539 0.1313584 0.2636277
Desmognathus carolinensis 31.90158 7.5792690 0.1233274 0.2895605
Desmognathus fuscus 32.21470 1.7904952 0.1418146 0.0775668
Desmognathus monticola 32.07484 5.1014552 0.1263172 0.2019459
Desmognathus ochrophaeus 31.27907 2.4019815 0.1265893 0.1082744
Desmognathus ocoee 31.91811 9.0663088 0.1252681 0.3374157
Desmognathus orestes 31.99354 8.5763637 0.1252990 0.3331097
Plethodon cinereus 32.90209 1.8679561 0.1128909 0.0918481
Plethodon hubrichti 31.66814 5.1070949 0.1183808 0.2044553
Plethodon richmondi 31.96018 5.7113536 0.1237528 0.2253615
Plethodon virginia 31.86418 6.3878034 0.1227377 0.2561231
Plethodon cylindraceus 31.55514 2.6132503 0.1116987 0.1090486
Plethodon glutinosus 32.11147 2.6036651 0.1157815 0.1057241
Plethodon montanus 31.63822 7.2028220 0.1222038 0.2800241
Plethodon teyahalee 31.93891 7.6708146 0.1234175 0.2882602
Plethodon punctatus 31.69873 5.9842884 0.1237999 0.2428210
Plethodon wehrlei 31.97423 4.9338506 0.1272147 0.2047725
Rhinella spinulosa 36.77510 1.6792336 0.0839307 0.1031322
Bryophryne cophites 26.70259 3.0079874 0.1497181 0.2011119
Bryophryne hanssaueri 24.73739 3.2455593 0.1445457 0.2145290
Bryophryne nubilosus 25.65551 2.8955671 0.1468640 0.1937736
Noblella myrmecoides 29.17549 13.8297552 0.1445667 0.5297371
Noblella pygmaea 26.23381 3.0214653 0.1404028 0.2005598
Oreobates cruralis 32.63153 11.5208401 0.1485885 0.5415513
Pristimantis buccinator 31.23264 12.4973642 0.1331129 0.5412214
Pristimantis carvalhoi 29.91050 16.2550269 0.1366556 0.5975981
Pristimantis danae 28.63742 9.1868209 0.1394979 0.4784075
Pristimantis lindae 27.67285 4.2325748 0.1374622 0.2859249
Pristimantis ockendeni 29.07599 14.0152912 0.1335453 0.5412334
Pristimantis platydactylus 28.88496 12.0374648 0.1378684 0.6353338
Pristimantis salaputium 28.72880 3.1989424 0.1420520 0.2115826
Pristimantis toftae 29.47045 12.5175212 0.1428816 0.5548656
Psychrophrynella usurpator 27.47295 3.1758567 0.1445062 0.2132946
Eurycea nana 34.62224 10.8515253 0.1231991 0.4040657
Aneides ferreus 31.15977 5.7447453 0.1267984 0.3131427
Ensatina eschscholtzii 30.54211 6.8673734 0.1259896 0.3625886
Plethodon dunni 31.18135 5.7547071 0.1258671 0.3171349
Plethodon vehiculum 30.87583 4.7451189 0.1256419 0.2777759
Rhyacotriton olympicus 27.63918 4.4272095 0.1371720 0.2669584
Agalychnis dacnicolor 32.21004 13.4220497 0.1668800 0.5269765
Anaxyrus boreas 35.37909 1.3685809 0.1060820 0.0839189
Anaxyrus canorus 35.12555 4.1644123 0.1332097 0.2284401
Anaxyrus cognatus 37.74822 2.7076482 0.1351643 0.1264390
Anaxyrus compactilis 35.50241 8.0925766 0.1204651 0.3482736
Anaxyrus retiformis 37.51842 5.5736821 0.1319652 0.2316246
Anaxyrus exsul 35.33852 4.1627347 0.1113743 0.2074005
Anaxyrus fowleri 35.24840 3.3335841 0.1393498 0.1370017
Anaxyrus nelsoni 35.47392 4.1072399 0.0997265 0.2087943
Dendrobates auratus 32.37270 21.7199292 0.1397169 0.8078943
Incilius alvarius 36.49633 4.6698208 0.1392618 0.1993624
Incilius canaliferus 36.22440 13.4962497 0.1177060 0.4974011
Incilius marmoreus 36.72723 9.9300228 0.1423793 0.3747158
Incilius mazatlanensis 36.72131 7.5022253 0.1317468 0.2936653
Leptodactylus melanonotus 35.79088 12.3049591 0.1354684 0.4624952
Lithobates catesbeianus 34.98783 2.3630041 0.0779649 0.1044071
Lithobates palmipes 33.89274 13.6682895 0.1299539 0.4977325
Lithobates palustris 30.89755 2.7310802 0.1267352 0.1182065
Lithobates pipiens 32.58702 0.7462146 0.1773336 0.0384003
Lithobates sylvaticus 32.03755 0.5918826 0.1483915 0.0349865
Lithobates warszewitschii 31.31035 19.0644512 0.1262679 0.7048592
Pseudacris cadaverina 31.92663 6.0174258 0.1715263 0.2799594
Pseudacris regilla 33.61363 1.5293991 0.1155792 0.0919788
Rana boylii 31.63922 4.3222790 0.1310769 0.2281221
Lithobates clamitans 33.41402 1.8323922 0.1509304 0.0821521
Rana pretiosa 32.53709 3.1877356 0.1279934 0.1757095
Rhaebo haematiticus 34.76432 13.9456366 0.1302363 0.5329895
Rhinella marina 36.84045 2.9077570 0.1491506 0.1070747
Scaphiopus holbrookii 30.26072 4.1736591 0.1941850 0.1661914
Smilisca fodiens 35.24641 6.1814436 0.1754397 0.2498349
Smilisca baudinii 36.15278 11.7692333 0.1487184 0.4502001
Spea hammondii 34.64317 3.1144172 0.1429053 0.1554243
Tlalocohyla smithii 36.64299 11.2312276 0.1739553 0.4420024
Adelotus brevis 31.91534 10.0038436 0.1465029 0.4296026
Assa darlingtoni 31.10420 12.1461689 0.1562575 0.5207402
Cophixalus ornatus 30.95022 8.6003614 0.1381921 0.3325436
Crinia parinsignifera 32.98110 6.2121160 0.1548452 0.2840692
Crinia signifera 32.98573 2.0934469 0.1332107 0.1019387
Geocrinia laevis 31.03966 4.1411135 0.1719357 0.2412690
Geocrinia victoriana 31.59138 2.8832335 0.1781639 0.1539253
Limnodynastes dorsalis 32.86558 2.9247113 0.1491678 0.1412983
Limnodynastes fletcheri 29.63963 7.5362132 0.1745970 0.3318408
Limnodynastes peronii 32.21026 2.5415572 0.1845834 0.1155415
Limnodynastes salmini 32.76633 7.1728659 0.1469080 0.3054585
Limnodynastes tasmaniensis 32.58545 3.5149936 0.1648466 0.1549739
Litoria aurea 33.46141 3.4581957 0.1327104 0.1680405
Litoria bicolor 35.98738 10.4689601 0.1766691 0.3799321
Cyclorana brevipes 36.58744 7.3740156 0.1411053 0.2957682
Litoria caerulea 35.09641 3.1440472 0.1659396 0.1243468
Litoria chloris 36.36788 4.4903733 0.1207016 0.1927979
Litoria citropa 31.39531 4.2940795 0.1247556 0.2111795
Litoria ewingii 33.00333 2.0509106 0.0968506 0.1146215
Litoria fallax 36.51312 3.4798735 0.1267154 0.1477013
Litoria freycineti 33.04389 8.7525171 0.1629739 0.3863970
Litoria gracilenta 35.95938 2.9342908 0.1066263 0.1204283
Litoria lesueurii 31.99473 2.5686918 0.1387758 0.1266606
Litoria peronii 34.15075 3.2466334 0.1407803 0.1475272
Litoria phyllochroa 31.19378 5.6810297 0.1402817 0.2558809
Litoria rothii 34.31159 6.4267948 0.1798600 0.2368473
Litoria rubella 35.78480 3.4554432 0.1599977 0.1373021
Litoria verreauxii 31.00342 2.9865697 0.1469790 0.1443763
Mixophyes fasciolatus 29.39715 6.0470434 0.1308217 0.2615626
Neobatrachus pictus 30.60911 4.7448920 0.1505485 0.2301309
Philoria frosti 27.45344 2.6593773 0.1288291 0.1355863
Philoria loveridgei 29.83052 9.1528030 0.1535991 0.3919913
Philoria sphagnicolus 28.21748 10.1398282 0.1704582 0.4433988
Pseudophryne bibronii 33.39529 2.8232694 0.1509215 0.1369985
Pseudophryne corroboree 29.95901 3.2041108 0.2156861 0.1677196
Pseudophryne dendyi 34.48447 6.0859968 0.1381492 0.3118419
Dicamptodon tenebrosus 28.17619 6.6784953 0.1360270 0.3653086
Rhyacotriton variegatus 26.38422 5.8523707 0.1437428 0.3225512
Buergeria japonica 38.20828 9.3704908 0.1541821 0.3416879
Eleutherodactylus coqui 36.31050 11.8820506 0.1762884 0.4562115
Eleutherodactylus portoricensis 34.73325 21.4735869 0.1217940 0.7970227
Ascaphus truei 28.60808 2.9974450 0.1473752 0.1840779
Ambystoma jeffersonianum 33.92129 1.1796412 0.1184082 0.0528307
Ambystoma tigrinum 34.39242 1.4877056 0.1285672 0.0687734
Pseudacris triseriata 36.02640 0.8914264 0.0818421 0.0403610
Anaxyrus woodhousii 37.66817 1.6114378 0.0952896 0.0732470
Gastrophryne carolinensis 37.11722 2.2654925 0.1325774 0.0866698
Fejervarya cancrivora 37.32253 20.4261160 0.1313539 0.7337612
Ceratophrys cranwelli 37.81002 10.0227642 0.1312649 0.3784074
Dermatonotus muelleri 38.54105 14.0967514 0.1394330 0.5211526
Elachistocleis bicolor 36.84878 6.1546992 0.1353074 0.2423385
Boana raniceps 38.06152 10.4971606 0.1384480 0.3801402
Lepidobatrachus llanensis 39.34535 9.5149285 0.1379822 0.3750165
Leptodactylus bufonius 38.77449 8.3672087 0.1341124 0.3152022
Leptodactylus latinasus 38.27009 5.8183790 0.1320783 0.2302662
Leptodactylus podicipinus 37.87559 14.4799374 0.1402565 0.5219127
Phyllomedusa sauvagii 37.67543 9.6019536 0.1343727 0.3604422
Physalaemus albonotatus 36.59699 9.9170749 0.1390884 0.3632352
Lysapsus limellum 37.64544 9.1483241 0.1280850 0.3382767
Pseudis platensis 37.75647 11.2255465 0.1300566 0.4085919
Scinax acuminatus 38.75717 10.3115539 0.1293263 0.3744487
Scinax nasicus 37.95959 8.0911223 0.1278548 0.3059548
Crossodactylus schmidti 32.77616 10.5435216 0.1341895 0.3912888
Dendropsophus minutus 34.72222 7.4978651 0.0722797 0.2777232
Boana curupi 34.73464 11.2013633 0.1223155 0.4111194
Limnomedusa macroglossa 35.88779 6.7262789 0.1385921 0.2725921
Melanophryniscus devincenzii 34.86807 8.2427217 0.1346833 0.3338350
Melanophryniscus krauczuki 35.35608 10.3083216 0.1335857 0.3820430
Phyllomedusa tetraploidea 37.56040 9.3741969 0.1338808 0.3508478
Rhinella ornata 36.49696 6.2650174 0.1331049 0.2407876
Scinax fuscovarius 37.61067 10.2358998 0.1275453 0.3815967
Alytes muletensis 34.21688 7.9365090 0.1373381 0.3400058
Lissotriton boscai 34.10608 6.3592929 0.1354845 0.3060497
Pelophylax lessonae 34.60030 3.6109739 0.1325715 0.1869427
Rana arvalis 31.88324 1.3440480 0.1263218 0.0762326
Rana iberica 32.45930 3.2263097 0.1104507 0.1632883
Triturus cristatus 33.81386 3.4883609 0.1367414 0.1882583
Acris crepitans 40.09492 1.8287392 0.0485946 0.0720471
Necturus maculosus 31.75270 1.3357826 0.1259081 0.0605515
Ambystoma maculatum 34.91646 2.9041412 0.1089694 0.1323105
Hyperolius tuberilinguis 36.07376 14.8917055 0.1212065 0.5890562
Hyperolius viridiflavus 39.06977 9.2697090 0.0749002 0.3723930
Triturus dobrogicus 34.00271 3.2914769 0.1381718 0.1646092
Eleutherodactylus richmondi 32.57754 39.3787565 0.1291711 1.4599971
Lithobates virgatipes 34.79505 3.8395145 0.1292643 0.1534824
Ambystoma macrodactylum 32.60164 1.8390732 0.1175102 0.1147252
Aneides aeneus 30.95585 8.1932833 0.1251327 0.3229445
Eurycea longicauda 35.02888 3.7933869 0.0626395 0.1574310
Eurycea lucifuga 34.63830 3.6741607 0.0689443 0.1469518
Notophthalmus viridescens 34.89463 0.7531419 0.1814518 0.0334014
Ambystoma opacum 34.85929 2.9830361 0.1145548 0.1183904
Ambystoma mabeei 34.43831 4.9438114 0.1291223 0.1963845
Ambystoma talpoideum 34.47394 8.4275926 0.1293395 0.3122923
Ambystoma laterale 33.86765 2.7412634 0.1228391 0.1458573
Taricha granulosa 33.49126 3.9048929 0.1365402 0.2511301
Amphiuma tridactylum 33.90365 10.9727406 0.1261646 0.4006385
Desmognathus quadramaculatus 30.18392 5.0116277 0.1347364 0.1947823
Plethodon jordani 32.25698 4.2062091 0.1282402 0.1604490
Hemidactylium scutatum 33.38379 5.6270616 0.1233687 0.2444489
Gyrinophilus porphyriticus 32.03470 5.4674750 0.1108568 0.2321687
Pseudotriton montanus 33.49504 6.9134445 0.1154531 0.2684086
Eurycea quadridigitata 34.69269 8.7711484 0.1152250 0.3240464
Cryptobranchus alleganiensis 32.70015 2.4149966 0.1205661 0.0995114
Dryophytes andersonii 37.59761 4.6404496 0.1403212 0.1830401
Osteopilus septentrionalis 35.67680 11.4377573 0.1278421 0.4153134
Acris gryllus 37.31159 8.0327112 0.1151088 0.2972578
Dryophytes cinereus 36.81852 6.5173686 0.1385377 0.2461396
Dryophytes squirellus 35.77479 9.2334835 0.1249346 0.3424816
Cyclorana alboguttata 36.65889 10.1018142 0.1418270 0.3996545
Cyclorana australis 36.72582 11.6545415 0.1405814 0.4283080
Litoria eucnemis 32.58559 19.7648495 0.1312137 0.7297794
Litoria nasuta 33.18227 12.8569767 0.1316665 0.4770837
Litoria nigrofrenata 34.83169 16.6318799 0.1393916 0.5999016
Litoria pearsoniana 31.36166 8.4588587 0.1392071 0.3706182
Neobatrachus sudelli 30.33585 6.3276999 0.1610945 0.2770086
Pseudophryne major 31.49809 10.8357712 0.1524089 0.4417851
Pseudophryne semimarmorata 31.80583 5.9154740 0.1519834 0.3253112
Uperoleia laevigata 31.22234 8.3358806 0.1437851 0.3647188
Uperoleia rugosa 31.97367 8.9650806 0.1528784 0.3833756
Platyplectrum ornatum 35.98971 6.2551289 0.1785995 0.2427903
Eurycea bislineata 33.87822 1.2697053 0.1027152 0.0621476
Plethodon ouachitae 32.10273 5.8705926 0.1235682 0.2209510
Lithobates berlandieri 36.79609 7.4917476 0.1267671 0.3119510
Dryophytes chrysoscelis 38.00793 4.0087859 0.1152905 0.1735754
Rhinella granulosa 37.82245 7.2093286 0.1506642 0.2657099
Pleurodema bufoninum 35.79825 2.2795403 0.1193099 0.1544833
Alsodes gargola 31.46361 2.8668143 0.1217670 0.1807451
Anaxyrus terrestris 36.15789 2.9195681 0.1138981 0.1072395
Xenopus laevis 32.94557 2.6576173 0.1383514 0.1178029
Eleutherodactylus cundalli 33.03194 36.0029414 0.1329940 1.3062070
Eleutherodactylus gossei 32.77041 34.7071136 0.1170241 1.2600756
Eleutherodactylus johnstonei 35.34416 16.7535730 0.1320435 0.6364972
Eleutherodactylus planirostris 35.50404 15.6554686 0.1479865 0.5697575
Odontophrynus occidentalis 32.01959 3.0741075 0.1509751 0.1501935
Rhinella arenarum 36.83196 3.2410565 0.1053951 0.1458827
Melanophryniscus rubriventris 33.41002 7.7579801 0.1201093 0.3981939
Kaloula kalingensis 33.27966 24.8123773 0.1317459 0.8906992
Occidozyga laevis 33.33221 28.0718552 0.1279565 1.0113107
Philautus surdus 32.03380 29.3905791 0.1263874 1.0590492
Platymantis banahao 31.92813 23.9522192 0.1385645 0.8733605
Platymantis corrugatus 31.29564 29.5635217 0.1346269 1.0660484
Platymantis dorsalis 30.81432 34.2458209 0.1318600 1.2381518
Platymantis luzonensis 31.66845 34.5725059 0.1385819 1.2448622
Sanguirana luzonensis 32.51587 25.2378911 0.1329160 0.9050631
Hylarana erythraea 32.49387 19.2677775 0.1315926 0.6872791
Limnonectes woodworthi 34.11164 31.3681914 0.1240071 1.1261051
Platymantis montanus 31.39919 22.4055001 0.1355109 0.8064588
Kaloula walteri 33.77540 27.9842009 0.1428703 1.0085508
Physalaemus cuvieri 34.91222 6.1098230 0.1325461 0.2242250
Pleurodema diplolister 38.63260 5.5369857 0.1374842 0.2113209
Rhinella icterica 37.15915 3.6409673 0.1329886 0.1394009
Rana chensinensis 31.11038 1.8506335 0.1467677 0.0893644
Batrachuperus tibetanus 31.83790 4.9414162 0.1317089 0.2784241
Batrachuperus yenyuanensis 31.25527 9.9207581 0.1319309 0.4888598
Paramesotriton chinensis 33.83186 9.1517601 0.1357275 0.3409739
Tylototriton kweichowensis 33.75427 11.7534203 0.1341059 0.5013229
Quasipaa spinosa 40.90802 7.0160903 0.1431462 0.2632096
Pseudotriton ruber 32.77218 5.4165694 0.1142044 0.2203067
Scaphiopus couchii 35.37886 4.1171028 0.1535052 0.1725881
Leptodactylus mystacinus 38.34201 9.6993963 0.1311239 0.3791203
Pelophylax saharicus 35.23388 9.1849030 0.1360483 0.3959768
Bufotes viridis 35.91465 3.9201107 0.1320976 0.1959403
Leptodactylus albilabris 34.86532 20.5068737 0.1196700 0.7559496
Aplastodiscus ibirapitanga 36.24157 17.8375037 0.1315123 0.7022669
Aplastodiscus sibilatus 34.59024 15.3764665 0.1277686 0.6133786
Aplastodiscus weygoldti 35.01054 12.5387152 0.1243410 0.4894652
Ceratophrys joazeirensis 37.66166 13.3339207 0.1281378 0.5202602
Phyllomedusa burmeisteri 38.02514 11.4839922 0.1423121 0.4464460
Physalaemus cicada 35.61035 11.8180707 0.1373315 0.4657086
Proceratophrys schirchi 35.07616 17.1223913 0.1378430 0.6686164
Physalaemus signifer 37.51504 15.3120342 0.1325745 0.5979565
Scinax alter 37.73443 13.1673778 0.1251735 0.5202877
Stereocyclops incrassatus 36.53194 16.9488922 0.1379128 0.6639400
Scinax pachycrus 37.99501 14.1499495 0.1277623 0.5567946
Gabohyla pauloalvini 37.22576 18.6530002 0.1251870 0.7300249
Dendropsophus sanborni 35.53476 9.3517677 0.1231605 0.3676516
Boana albopunctata 35.65948 12.9959503 0.1173953 0.4790018
Boana pulchella 34.51224 4.5011381 0.1203295 0.1850671
Scinax uruguayus 36.70591 4.9293859 0.1141760 0.1972055
Leptodactylus gracilis 37.24712 8.1966646 0.1328845 0.3303090
Odontophrynus americanus 35.32737 5.8540691 0.1464466 0.2346533
Ololygon aromothyella 37.70005 12.1984375 0.1290977 0.4522051
Phyllomedusa iheringii 37.36712 3.8151065 0.1240612 0.1628297
Physalaemus gracilis 35.63592 4.7443052 0.1224137 0.1908778
Physalaemus henselii 34.49212 4.0667762 0.1083173 0.1670750
Physalaemus riograndensis 37.90734 9.0585595 0.1355549 0.3610913
Pseudis minuta 36.31666 4.4533447 0.1102303 0.1808001
Pseudopaludicola falcipes 37.09572 11.0082315 0.1352730 0.4312673
Rhinella dorbignyi 36.69807 6.7803217 0.1276916 0.2909403
Scinax granulatus 37.05197 8.5475004 0.1250713 0.3454127
Scinax squalirostris 37.99786 10.7132064 0.1285257 0.4159500
Gastrotheca pseustes 34.79926 3.3373357 0.1007766 0.1415829
Gastrotheca riobambae 35.44378 2.6660986 0.1175301 0.1261569
Agalychnis spurrelli 36.94061 6.7432450 0.1527273 0.2579657
Boana geographica 36.91832 6.2669011 0.1430783 0.2311900
Smilisca phaeota 36.76117 6.3919994 0.1474125 0.2424009
Boana crepitans 36.87646 8.6838146 0.1090146 0.3282811
Boana semilineata 36.71193 9.8058724 0.1214357 0.3815155
Leptodactylus troglodytes 37.70078 12.2790740 0.1349928 0.4635892
Physalaemus crombiei 37.74129 15.8438124 0.1357552 0.6205202
Pithecopus nordestinus 36.93523 10.4592646 0.1355698 0.4053558
Scinax x-signatus 38.02416 12.4752840 0.1294922 0.4537159
Trachycephalus atlas 37.63317 8.8551553 0.1335052 0.3519818
Agalychnis hulli 35.84437 17.5575752 0.1421333 0.6771627
Allobates insperatus 33.94459 16.4381344 0.1404480 0.6346450
Allobates zaparo 34.58866 15.9720322 0.1341842 0.6196941
Atelopus elegans 33.07710 9.9784587 0.1288160 0.4195556
Atelopus spumarius 33.36409 22.0896181 0.1299274 0.7954695
Boana boans 36.86326 16.7159480 0.1307887 0.6088735
Boana cinerascens 36.37692 15.5506307 0.1313267 0.5607729
Boana fasciata 36.44485 20.8703240 0.1261314 0.7561467
Boana lanciformis 37.31167 13.6271577 0.1484445 0.4961304
Boana pellucens 37.11919 11.5558499 0.1300659 0.4734882
Chiasmocleis ventrimaculata 35.54454 19.7000582 0.1388993 0.7793272
Chimerella mariaelenae 34.15983 8.7615844 0.1321940 0.3662215
Cruziohyla calcarifer 36.16971 19.0738848 0.1424958 0.7628452
Dendropsophus bifurcus 37.26774 17.0447853 0.1259601 0.6401093
Dendropsophus bokermanni 35.97660 22.1389189 0.1215854 0.8185853
Dendropsophus brevifrons 35.74029 15.9966236 0.1210312 0.5863426
Dendropsophus carnifex 36.44208 5.0670802 0.1288830 0.2493030
Dendropsophus ebraccatus 37.72514 13.0925151 0.1305459 0.4986442
Dendropsophus marmoratus 37.63966 20.2879131 0.1287028 0.7311458
Dendropsophus parviceps 35.86126 20.2233579 0.1221267 0.7327706
Dendropsophus sarayacuensis 36.77383 13.5668930 0.1214954 0.4939026
Dendropsophus triangulum 37.13498 15.6460837 0.1184125 0.5666817
Engystomops coloradorum 36.58316 7.7815661 0.1294375 0.3377967
Engystomops guayaco 36.48918 9.7452974 0.1302980 0.3837839
Engystomops petersi 35.67082 13.0254991 0.1322863 0.4954118
Engystomops randi 37.07417 10.8775615 0.1362801 0.4520530
Epipedobates anthonyi 34.56060 4.2020361 0.1451780 0.1740421
Epipedobates boulengeri 35.05421 11.1267512 0.1382626 0.4530946
Epipedobates espinosai 34.78491 13.4642250 0.1327288 0.5053362
Epipedobates machalilla 35.04932 9.0768196 0.1393055 0.3751468
Epipedobates tricolor 34.89604 7.3379972 0.1343050 0.3011955
Espadarana callistomma 33.20965 13.4907341 0.1388461 0.5403309
Espadarana prosoblepon 32.50357 9.9643329 0.0826525 0.3845727
Gastrotheca lateonota 34.57027 9.4886554 0.1299536 0.4154239
Gastrotheca litonedis 34.77106 7.6610457 0.1304998 0.3555916
Hyloscirtus alytolylax 33.74647 10.3133698 0.1284278 0.4209250
Hyloscirtus lindae 33.32656 9.0817821 0.1262004 0.3771023
Hyloscirtus phyllognathus 34.25477 9.4258254 0.1313580 0.4206969
Hyloxalus bocagei 34.09311 11.7800157 0.1412941 0.4806715
Hyloxalus elachyhistus 32.98280 15.6663978 0.1361408 0.6642536
Colostethus jacobuspetersi 30.53724 5.5654316 0.1256346 0.2769279
Hyloxalus maculosus 33.48969 10.8054622 0.1356817 0.4509721
Hyloxalus nexipus 33.53705 12.8977856 0.1411288 0.5398966
Hyloxalus pulchellus 31.53619 12.8924363 0.1316912 0.5516327
Hyloxalus toachi 33.70892 10.4435403 0.1370672 0.4469094
Hyloxalus vertebralis 32.03762 10.0082614 0.1352692 0.4196539
Leptodactylus labrosus 36.25969 13.3714264 0.1298902 0.5481166
Leptodactylus rhodomystax 35.80443 19.6099393 0.1266547 0.7035120
Leptodactylus ventrimaculatus 35.97225 10.6855210 0.1293890 0.4238892
Leptodactylus wagneri 36.14684 16.8663898 0.1243738 0.6436862
Osteocephalus mutabor 35.84502 11.2507568 0.1221176 0.4530401
Phyllomedusa coelestis 37.14370 16.9645000 0.1379726 0.6698584
Phyllomedusa vaillantii 36.70918 15.4689647 0.1389365 0.5557441
Lithobates bwana 34.37513 11.6957552 0.1389692 0.4704499
Lithobates vaillanti 34.88632 17.2976428 0.1401843 0.6600671
Rhinella margaritifera 35.72005 12.6552292 0.1167276 0.4622606
Scinax elaeochroa 36.90757 21.6644918 0.1267652 0.8109837
Scinax garbei 36.57811 19.2984564 0.1243511 0.6990507
Scinax quinquefasciatus 38.10032 12.7426519 0.1261394 0.5136522
Scinax ruber 37.38576 11.9797490 0.1240679 0.4325272
Eleutherodactylus antillensis 39.84469 31.1562860 0.2074894 1.1465045
Eleutherodactylus brittoni 33.97998 36.4281384 0.0936755 1.3493097
Eleutherodactylus wightmanae 35.08720 30.6327505 0.1246027 1.1362676
Plethodon yonahlossee 31.99571 5.5356724 0.1203781 0.2158428
Plethodon caddoensis 32.52509 6.0048499 0.1210234 0.2237491
Plethodon dorsalis 31.14106 7.0939645 0.1231865 0.2754046
Eurycea multiplicata 35.29046 5.5789261 0.0923948 0.2182359
Plethodon serratus 32.08807 6.9692184 0.1223185 0.2701675
Adenomera andreae 34.65016 19.8495923 0.1207805 0.7176132
Allobates conspicuus 33.05201 20.2153465 0.1298142 0.7545555
Allobates femoralis 35.76609 19.0531374 0.1532516 0.6874322
Allobates trilineatus 32.38898 19.4758602 0.1241443 0.7695610
Ameerega hahneli 34.87428 19.2989992 0.1392685 0.6919355
Ameerega trivittata 35.08190 20.2279073 0.1467246 0.7268737
Chiasmocleis bassleri 35.73983 19.9829625 0.1339145 0.7132882
Ctenophryne geayi 36.28575 19.5443420 0.1410027 0.7112951
Dendropsophus koechlini 36.36041 17.7516225 0.1329053 0.6691826
Dendropsophus leucophyllatus 37.27329 18.5071389 0.1312714 0.6666759
Dendropsophus schubarti 35.16455 18.9547886 0.1190446 0.6973872
Edalorhina perezi 36.28423 18.2449638 0.1308065 0.6647651
Engystomops freibergi 35.53396 17.3524756 0.1219516 0.6371524
Hamptophryne boliviana 36.30525 20.7335299 0.1351112 0.7493332
Boana punctata 36.93842 15.2330094 0.1377188 0.5572430
Leptodactylus bolivianus 35.71466 20.5149165 0.1237567 0.7456278
Leptodactylus didymus 35.41066 16.4395312 0.1213713 0.7372448
Leptodactylus leptodactyloides 36.14050 18.3938871 0.1281492 0.6629116
Leptodactylus petersii 36.35015 17.5258808 0.1263186 0.6268164
Lithodytes lineatus 36.20001 19.0647513 0.1325848 0.6947641
Oreobates quixensis 33.10891 17.6188957 0.1664060 0.6438333
Osteocephalus buckleyi 36.08096 20.2336657 0.1349008 0.7370392
Phyllomedusa camba 37.63045 15.1538985 0.1428968 0.5648873
Pristimantis fenestratus 31.35547 17.8433763 0.1432215 0.6375118
Ranitomeya sirensis 34.72916 16.3712952 0.1506547 0.7397430
Scarthyla goinorum 35.46039 18.1555330 0.1145509 0.6457283
Scinax ictericus 37.21921 21.4807690 0.1262205 0.9269441
Sphaenorhynchus lacteus 37.85198 19.9921156 0.1311824 0.7227151
Leptodactylus lithonaetes 36.98472 15.4510149 0.1514773 0.5525890
Chiropterotriton multidentatus 31.26475 6.0028860 0.1222220 0.2586117
Bufo bankorensis 35.56948 5.7767231 0.1566579 0.2091798
Odorrana swinhoana 32.45261 19.1247487 0.1364150 0.6953413
Kurixalus eiffingeri 32.69997 12.2894191 0.1028447 0.4447803
Fejervarya limnocharis 36.80688 5.7534787 0.1254149 0.2158818
Hylarana latouchii 34.73251 9.3596051 0.1345240 0.3410991
Rana longicrus 33.23651 16.5423759 0.1323306 0.6035160
Rana sauteri 31.83992 19.1654726 0.1317941 0.6961106
Kaloula pulchra 36.29268 6.5902624 0.1731697 0.2383341
Batrachyla taeniata 34.00455 1.6683514 0.1091738 0.1126937
Atelopus limosus 34.06267 23.8008976 0.1356618 0.8722778
Physalaemus nattereri 37.71244 6.5977471 0.1348520 0.2419743
Boana pardalis 38.07937 8.0850765 0.1364192 0.3140255
Hylorina sylvatica 32.95919 3.3644839 0.1328401 0.2369259
Craugastor crassidigitus 33.88668 23.1609538 0.1358378 0.8597226
Craugastor fitzingeri 34.59417 19.1867051 0.1442309 0.7157156
Dendropsophus anceps 35.37279 10.3874111 0.1205514 0.4034062
Dendropsophus decipiens 34.67701 12.1544764 0.1114419 0.4664445
Alytes maurus 34.22058 8.5504907 0.1419431 0.3846693
Bufo gargarizans 34.40812 1.9213489 0.1411800 0.0908227
Pseudacris feriarum 35.41802 5.7263248 0.1250849 0.2231041
Cophixalus aenigma 28.12543 13.5322046 0.1423999 0.5063692
Cophixalus bombiens 31.14672 15.6303478 0.1439942 0.5811071
Cophixalus concinnus 28.77287 12.8486771 0.1409551 0.4802522
Cophixalus exiguus 32.91085 14.6947925 0.1487390 0.5337749
Cophixalus hosmeri 30.61092 14.1419269 0.1471042 0.5281092
Cophixalus infacetus 32.43335 17.7911809 0.1463361 0.6837361
Cophixalus mcdonaldi 31.14597 11.2581993 0.1429628 0.4455380
Cophixalus monticola 30.15332 14.3794489 0.1418168 0.5376343
Cophixalus neglectus 30.15729 18.6832545 0.1448550 0.7472612
Cophixalus saxatilis 32.19438 13.9897850 0.1487174 0.5078909
Craugastor rhodopis 31.62385 12.1089501 0.1336858 0.4902416
Rheohyla miotympanum 36.31561 12.9831485 0.1306760 0.5320724
Engystomops pustulosus 36.30104 6.1937275 0.1468198 0.2320241
Craugastor loki 32.42587 8.8905521 0.1320943 0.3328506
Pleurodema brachyops 38.59158 12.0302096 0.1573112 0.4459004
Pristimantis frater 30.73729 12.8370273 0.1285885 0.5375634
Pristimantis medemi 31.50748 17.8107510 0.1455362 0.7287983
Pristimantis taeniatus 32.86541 15.1973238 0.1488610 0.5771638
Pristimantis fallax 32.36195 16.8607977 0.1506951 0.7085255
Pristimantis w-nigrum 32.26499 13.2799844 0.1604242 0.5433993
Pristimantis bicolor 32.25870 18.3232803 0.1451603 0.7667730
Pristimantis bogotensis 32.08614 10.4578354 0.1400834 0.4510933
Pristimantis savagei 30.24743 18.4527802 0.1394652 0.7588160
Pristimantis renjiforum 33.12582 18.7757760 0.1383669 0.7998374
Pristimantis conspicillatus 31.93100 19.3279089 0.1405764 0.7242452
Pristimantis elegans 32.13891 10.2760100 0.1391916 0.4402823
Pristimantis nervicus 32.49752 15.4326814 0.1390076 0.6639109
Eurycea sosorum 33.82483 9.6247304 0.0969221 0.3576186
Duttaphrynus melanostictus 35.37124 9.3047391 0.1344155 0.3411658
Limnonectes blythii 33.52474 20.2279058 0.1279579 0.7134996
Limnonectes malesianus 33.87734 21.4122666 0.1279963 0.7533289
Nyctixalus pictus 33.62010 24.0844152 0.1322157 0.8607765
Polypedates leucomystax 35.40683 19.4718675 0.1352311 0.7125531
Microhyla butleri 34.71235 15.1200224 0.1402786 0.5571824
Microhyla heymonsi 36.59422 15.5112200 0.1447279 0.5646290
Microhyla mantheyi 33.55581 21.6092877 0.1360796 0.7575153
Pseudis paradoxa 37.77251 14.5719362 0.1245937 0.5275504
Anaxyrus punctatus 37.28466 4.9168091 0.1293904 0.2156454
Craugastor longirostris 36.31172 18.1619050 0.1441543 0.7020346
Pristimantis achatinus 34.61531 13.1697466 0.1498401 0.5238302
Pristimantis latidiscus 33.27723 19.5615145 0.1450631 0.7676233
Pristimantis laticlavius 31.67845 9.8006337 0.1432213 0.4272497
Pristimantis incomptus 31.49632 10.2265411 0.1422970 0.4421868
Pristimantis quaquaversus 31.56357 14.7593372 0.1452524 0.5910952
Pristimantis crenunguis 30.87098 9.9561726 0.1446881 0.4317986
Pristimantis trachyblepharis 30.21793 12.5085250 0.1373349 0.5209421
Pristimantis actites 31.48284 9.0749079 0.1390777 0.3918722
Pristimantis unistrigatus 32.42753 7.2587580 0.1433203 0.3242432
Pristimantis vertebralis 28.61296 8.5455981 0.1389958 0.3798749
Pristimantis riveti 31.71116 12.5755184 0.1440930 0.5668911
Pristimantis phoxocephalus 29.11756 8.8250174 0.1395150 0.3804169
Pristimantis pycnodermis 31.21826 9.5217024 0.1424704 0.4095413
Pristimantis curtipes 31.48554 9.9298012 0.1402477 0.4422142
Pleurodema marmoratum 34.11738 6.2184942 0.1295535 0.3762044
Microhyla fissipes 35.74556 7.6932754 0.1365291 0.2899093
Hoplobatrachus rugulosus 38.70076 14.3792039 0.1419918 0.5278267
Microhyla ornata 36.15122 8.9141705 0.1471349 0.3318942
Rana dybowskii 27.48359 1.6451739 0.1030049 0.0871131
Hyperolius marmoratus 41.01820 4.3041378 0.2079399 0.1765936
Oophaga pumilio 29.81233 16.0856858 0.1151173 0.6012899
Odontophrynus barrioi 34.62070 4.1065931 0.1479946 0.2018624
Pleurodema nebulosum 36.98184 5.7986323 0.1375285 0.2852390
Pleurodema tucumanum 37.21321 6.2037682 0.1323888 0.2681083
Desmognathus brimleyorum 32.40243 8.0125689 0.1270742 0.2986658
Ambystoma californiense 34.08800 7.8010906 0.1223616 0.3915001
Ambystoma mavortium 33.89635 5.4109834 0.1232949 0.2650791
Batrachuperus karlschmidti 30.64659 7.4796180 0.1341000 0.4479413
Batrachuperus londongensis 30.50442 11.2102842 0.1341546 0.5383008
Batrachuperus pinchonii 31.44109 8.8260055 0.1307414 0.4756909
Liua shihi 31.10349 12.5303648 0.1341216 0.4989493
Liua tsinpaensis 31.06816 10.4086499 0.1355559 0.4592655
Pseudohynobius flavomaculatus 30.75546 15.4703492 0.1368695 0.5927038
Pseudohynobius kuankuoshuiensis 31.04559 20.3094689 0.1357769 0.8024141
Pseudohynobius shuichengensis 30.79754 18.0792175 0.1340304 0.7712110
Pseudohynobius puxiongensis 30.82670 16.4183418 0.1375821 0.7854088
Hynobius abei 30.49769 12.2965933 0.1356243 0.4973077
Hynobius lichenatus 30.73622 10.1917846 0.1369758 0.4323137
Hynobius tokyoensis 30.67489 11.7382560 0.1367335 0.4706414
Hynobius nigrescens 30.53368 10.0761629 0.1349505 0.4202248
Hynobius takedai 30.70928 9.8104647 0.1365622 0.4239986
Hynobius stejnegeri 30.74945 14.8590176 0.1367228 0.5709296
Hynobius amjiensis 30.71464 11.9913934 0.1353108 0.4428365
Hynobius chinensis 30.71969 11.0398376 0.1360455 0.4505146
Hynobius guabangshanensis 30.66685 23.5276583 0.1350072 0.8489041
Hynobius maoershanensis 30.64347 19.1462931 0.1357441 0.7154024
Hynobius yiwuensis 30.76008 14.6375133 0.1340303 0.5469888
Hynobius hidamontanus 30.60222 9.3149957 0.1353178 0.4074523
Hynobius katoi 30.77728 13.9288430 0.1337531 0.5473697
Hynobius naevius 30.44969 15.1297963 0.1345739 0.5913775
Hynobius dunni 30.65102 16.3707111 0.1366338 0.6265392
Hynobius nebulosus 30.67083 13.5177025 0.1386055 0.5307393
Hynobius tsuensis 30.65512 13.0685721 0.1362849 0.5133373
Hynobius okiensis 30.46744 11.7772649 0.1335379 0.4707558
Hynobius leechii 30.38638 7.7408997 0.1374037 0.3518578
Hynobius yangi 30.74625 11.2052490 0.1337609 0.4682474
Hynobius quelpaertensis 30.72215 10.2389272 0.1369450 0.4228601
Hynobius turkestanicus 30.67778 7.5769380 0.1353492 0.4931962
Hynobius arisanensis 30.37658 37.9728790 0.1367191 1.3736466
Hynobius sonani 30.44121 34.6841917 0.1375569 1.2576967
Hynobius formosanus 30.44837 29.9607650 0.1357983 1.1080957
Hynobius boulengeri 30.73057 14.5496067 0.1364301 0.5649662
Hynobius kimurae 31.49229 11.2396658 0.1358163 0.4571324
Hynobius retardatus 30.71250 8.4984148 0.1356605 0.4327785
Pachyhynobius shangchengensis 30.97503 14.8734032 0.1363908 0.5333558
Salamandrella keyserlingii 30.88068 5.0286169 0.1348573 0.3196623
Ranodon sibiricus 30.25731 8.3046883 0.1345034 0.5508509
Onychodactylus fischeri 31.70963 11.4501276 0.1328235 0.5338727
Onychodactylus japonicus 31.72963 17.4393062 0.1328329 0.6996913
Andrias japonicus 32.06936 15.0367928 0.1284768 0.5949036
Andrias davidianus 32.90436 16.2650047 0.1279828 0.6352520
Siren intermedia 32.03656 23.8382565 0.1309385 0.8943095
Siren lacertina 32.17471 23.0164659 0.1327166 0.8598806
Pseudobranchus striatus 32.01936 34.3477732 0.1309484 1.2442807
Pseudobranchus axanthus 32.15028 42.3464181 0.1308479 1.5104747
Chioglossa lusitanica 33.29848 15.2518502 0.1343753 0.7848602
Mertensiella caucasica 33.21515 10.7109947 0.1354821 0.5459939
Lyciasalamandra antalyana 32.40243 13.9500558 0.1366049 0.5824283
Lyciasalamandra helverseni 32.36080 20.8720863 0.1360216 0.8607517
Lyciasalamandra fazilae 32.40875 13.1815002 0.1339058 0.5786232
Lyciasalamandra flavimembris 32.27943 14.2721930 0.1389711 0.5970138
Lyciasalamandra atifi 32.24300 12.3149642 0.1382568 0.5340517
Lyciasalamandra luschani 32.28495 11.9957010 0.1372193 0.5277007
Salamandra algira 32.38302 11.6133978 0.1390955 0.5040257
Salamandra infraimmaculata 32.16805 10.1478279 0.1391480 0.4582350
Salamandra corsica 32.21785 10.4380956 0.1368745 0.4375236
Salamandra lanzai 32.26716 7.0780020 0.1352901 0.3497992
Salamandra atra 32.22615 5.8391256 0.1342051 0.2955551
Calotriton arnoldi 33.12200 13.1391374 0.1354935 0.5777992
Calotriton asper 33.91979 8.7213724 0.1364886 0.4238993
Triturus carnifex 34.16912 6.6064247 0.1339638 0.3204145
Triturus karelinii 34.13699 6.7697749 0.1368373 0.3401071
Triturus marmoratus 34.08574 7.5241507 0.1326368 0.3783076
Neurergus crocatus 33.90220 12.6362573 0.1380420 0.5938622
Neurergus kaiseri 33.89288 14.0894598 0.1381165 0.6037200
Neurergus strauchii 33.97061 11.0474380 0.1369343 0.5450603
Ommatotriton ophryticus 33.73633 8.8641315 0.1367067 0.4469247
Ommatotriton vittatus 33.88021 16.6955088 0.1374960 0.7026157
Lissotriton helveticus 34.02893 7.7273086 0.1350480 0.4190697
Lissotriton italicus 33.98332 10.0159541 0.1357079 0.4214111
Lissotriton montandoni 33.76779 4.8004968 0.1320433 0.2478373
Lissotriton vulgaris 33.96899 6.1081251 0.1359628 0.4067436
Ichthyosaura alpestris 33.73193 7.5236742 0.1366478 0.3839833
Cynops ensicauda 34.02365 35.1669684 0.1363645 1.2809177
Cynops pyrrhogaster 34.01787 11.1667146 0.1349227 0.4503527
Laotriton laoensis 33.92406 22.4795548 0.1340717 0.8290478
Pachytriton brevipes 33.96047 16.9733560 0.1330793 0.6357693
Paramesotriton caudopunctatus 33.79567 16.6808203 0.1352111 0.6200444
Paramesotriton deloustali 33.78610 18.3931040 0.1346938 0.7025355
Paramesotriton fuzhongensis 33.88422 16.3394845 0.1359692 0.5906686
Paramesotriton hongkongensis 33.62524 23.1678069 0.1354974 0.8293314
Euproctus montanus 33.63953 12.5071033 0.1366891 0.5222454
Euproctus platycephalus 33.77891 13.6732766 0.1351713 0.5629785
Notophthalmus meridionalis 34.89036 23.3841998 0.1354032 0.9185094
Notophthalmus perstriatus 34.93538 18.6426789 0.1376509 0.6758152
Taricha torosa 33.61512 11.5851173 0.1369894 0.5845840
Taricha rivularis 33.66739 12.2376307 0.1368843 0.6755586
Echinotriton andersoni 33.51272 36.7955820 0.1355455 1.3415668
Echinotriton chinhaiensis 33.71924 15.7627107 0.1352863 0.5973383
Tylototriton asperrimus 33.45637 22.0400314 0.1347812 0.8219103
Tylototriton notialis 33.46644 26.5141027 0.1342082 0.9462252
Tylototriton hainanensis 33.49042 39.0489347 0.1332379 1.3976060
Tylototriton wenxianensis 33.54965 12.0100599 0.1315564 0.5077694
Tylototriton vietnamensis 33.77347 21.1549088 0.1333026 0.7665829
Tylototriton shanjing 33.50214 16.3893963 0.1339166 0.7367820
Tylototriton verrucosus 33.78934 19.1530569 0.1320581 0.8295233
Pleurodeles poireti 33.45716 11.8889289 0.1356879 0.4807881
Salamandrina perspicillata 33.33051 9.0770399 0.1362843 0.4137340
Salamandrina terdigitata 33.30186 14.1885303 0.1375561 0.5781181
Ambystoma altamirani 33.29857 9.4064529 0.1227514 0.4632531
Ambystoma amblycephalum 34.24511 15.7578915 0.1247365 0.7042737
Ambystoma lermaense 34.11683 13.6782378 0.1236195 0.6131111
Ambystoma andersoni 33.51877 12.8721003 0.1281269 0.5727922
Ambystoma mexicanum 34.31735 9.6521504 0.1266998 0.4552944
Ambystoma rosaceum 34.38571 10.7498222 0.1270151 0.4495329
Ambystoma dumerilii 34.34006 14.2255388 0.1243099 0.6354994
Ambystoma ordinarium 34.16735 14.6440150 0.1239705 0.6326163
Ambystoma annulatum 35.02609 6.9568376 0.1240880 0.2784965
Ambystoma bishopi 34.04761 14.5940933 0.1245842 0.5196798
Ambystoma cingulatum 35.02077 14.8094644 0.1233339 0.5424819
Ambystoma barbouri 34.23880 9.9449650 0.1232005 0.3874320
Ambystoma texanum 34.40005 10.3894775 0.1242690 0.4059289
Ambystoma flavipiperatum 34.08040 18.2288193 0.1232737 0.7462354
Ambystoma gracile 33.87794 5.1667211 0.1250665 0.3171579
Ambystoma granulosum 34.15190 15.8633091 0.1261140 0.7024886
Ambystoma leorae 34.11775 12.5441792 0.1247283 0.5680981
Ambystoma taylori 34.15021 10.2612810 0.1238336 0.4766545
Ambystoma silvense 33.31849 9.9843353 0.1255840 0.4313137
Ambystoma rivulare 34.52187 12.1561504 0.1214480 0.5533229
Ambystoma velasci 33.92154 14.7073979 0.1257905 0.6238437
Dicamptodon ensatus 29.06861 13.1798740 0.1374339 0.7048267
Dicamptodon aterrimus 29.01722 6.6164380 0.1378488 0.3780612
Dicamptodon copei 29.05049 8.0640322 0.1371717 0.4667919
Necturus punctatus 31.80630 10.3280932 0.1287307 0.4026699
Necturus lewisi 31.79039 7.0604238 0.1310469 0.2819973
Necturus beyeri 31.71140 14.4898356 0.1318239 0.5222395
Necturus alabamensis 31.73837 12.1573003 0.1301301 0.4393504
Rhyacotriton kezeri 28.14413 8.8862142 0.1371375 0.4883957
Rhyacotriton cascadae 28.16118 8.8889235 0.1362376 0.4915142
Amphiuma pholeter 33.47551 20.5749743 0.1246467 0.7328381
Amphiuma means 33.44040 16.1567605 0.1213527 0.5965102
Aneides vagrans 31.25734 9.3746835 0.1273085 0.5775994
Aneides flavipunctatus 31.27246 12.0253628 0.1245383 0.6747683
Aneides lugubris 31.20745 14.4762805 0.1224873 0.7326539
Aneides hardii 31.27918 10.5610748 0.1243078 0.4909234
Desmognathus abditus 31.96916 11.3543141 0.1257547 0.4326139
Desmognathus welteri 31.96433 10.0761131 0.1283603 0.3897247
Desmognathus apalachicolae 31.96778 13.0842953 0.1263009 0.4683053
Desmognathus auriculatus 31.87974 7.3118586 0.1279551 0.2899367
Desmognathus santeetlah 31.89972 11.2025906 0.1259068 0.4192348
Desmognathus imitator 31.92766 11.4988529 0.1267315 0.4338333
Desmognathus aeneus 31.70610 13.7405510 0.1260155 0.4983610
Desmognathus folkertsi 31.27510 12.3268813 0.1263018 0.4584972
Desmognathus marmoratus 31.29829 12.6480799 0.1277179 0.4779198
Desmognathus wrighti 31.41782 13.1624103 0.1276158 0.5011380
Phaeognathus hubrichti 31.47247 20.3380877 0.1247251 0.7195900
Plethodon albagula 31.91582 9.4256764 0.1253351 0.3678227
Plethodon sequoyah 32.00763 10.3683913 0.1221347 0.3831725
Plethodon kisatchie 31.99676 11.1414980 0.1226802 0.4058635
Plethodon kiamichi 31.92430 10.5342040 0.1243300 0.3930793
Plethodon amplus 31.82088 10.0599037 0.1254268 0.3792102
Plethodon meridianus 31.81754 9.7561320 0.1251175 0.3659866
Plethodon metcalfi 31.81681 10.5549013 0.1222540 0.3985473
Plethodon aureolus 31.90622 9.2987283 0.1243347 0.3508432
Plethodon cheoah 31.88507 10.3550302 0.1254781 0.3938599
Plethodon shermani 31.91953 9.6651010 0.1210337 0.3661640
Plethodon fourchensis 32.00837 10.5998594 0.1237957 0.3968356
Plethodon kentucki 32.00257 9.0602869 0.1254503 0.3594969
Plethodon petraeus 31.92171 11.3588955 0.1229151 0.4248010
Plethodon angusticlavius 31.71449 7.6902063 0.1239121 0.3028233
Plethodon ventralis 31.45361 11.4416768 0.1232368 0.4270030
Plethodon welleri 31.67048 10.8767313 0.1258705 0.4182339
Plethodon websteri 31.88089 14.5720385 0.1225273 0.5241342
Plethodon shenandoah 32.19997 8.1460089 0.1228530 0.3259209
Plethodon electromorphus 31.95433 6.0770520 0.1256187 0.2537725
Plethodon nettingi 31.97708 8.0504155 0.1234894 0.3307486
Plethodon hoffmani 31.96429 6.4041573 0.1231300 0.2886482
Plethodon sherando 31.97704 9.3640482 0.1235793 0.3681270
Plethodon asupak 31.30883 12.4190758 0.1258753 0.6623358
Plethodon elongatus 31.44887 11.5034696 0.1243653 0.6159507
Plethodon stormi 31.40626 10.8463366 0.1261817 0.5753655
Plethodon idahoensis 31.68302 6.7819629 0.1233595 0.3877092
Plethodon vandykei 31.47947 8.6927006 0.1218053 0.5002256
Plethodon larselli 31.40337 8.3140893 0.1248482 0.4573971
Plethodon neomexicanus 31.35090 8.4460723 0.1259067 0.4351228
Hydromantes brunus 31.57055 14.5507030 0.1256025 0.7924925
Hydromantes platycephalus 31.58842 12.6687133 0.1248078 0.6615079
Hydromantes shastae 31.58728 13.2171173 0.1239961 0.7037080
Karsenia koreana 31.61242 14.3843820 0.1261234 0.5960138
Eurycea junaluska 34.04846 10.9144264 0.1123841 0.4115936
Eurycea cirrigera 34.09875 7.6567257 0.1077117 0.2955207
Eurycea wilderae 34.10814 10.8771303 0.1087171 0.4102182
Eurycea guttolineata 34.33334 9.3321633 0.1076537 0.3563235
Eurycea chisholmensis 34.09367 15.8785487 0.1116993 0.5915914
Eurycea tonkawae 34.17668 13.9877040 0.1095350 0.5206468
Eurycea naufragia 34.18901 13.4357519 0.1114468 0.4975072
Eurycea tridentifera 34.13831 17.6916812 0.1102591 0.6694034
Eurycea pterophila 34.17322 16.0785147 0.1109265 0.6033881
Eurycea troglodytes 34.19313 18.3461068 0.1095041 0.6973339
Eurycea waterlooensis 34.09651 13.2438909 0.1122203 0.4888025
Eurycea tynerensis 34.20947 7.2095250 0.1078525 0.2931531
Urspelerpes brucei 34.31257 11.8189921 0.1142154 0.4392921
Stereochilus marginatus 32.72033 7.9875206 0.1175385 0.3140362
Batrachoseps gregarius 32.21430 14.2126056 0.1194103 0.7345412
Batrachoseps nigriventris 32.23854 16.0045519 0.1205506 0.7705137
Batrachoseps stebbinsi 32.24159 13.5616499 0.1198362 0.6935682
Batrachoseps simatus 32.20864 12.3195142 0.1190511 0.6854904
Batrachoseps kawia 32.19962 10.2450831 0.1208971 0.6412445
Batrachoseps relictus 32.18946 13.5694973 0.1175611 0.7500328
Batrachoseps diabolicus 32.26996 17.6362582 0.1192425 0.8620515
Batrachoseps regius 32.23450 18.6690939 0.1194778 0.8630113
Batrachoseps gabrieli 32.31850 13.3529022 0.1159342 0.6562995
Batrachoseps gavilanensis 32.24050 16.3545323 0.1191635 0.8187124
Batrachoseps incognitus 32.28068 18.8633563 0.1198935 0.9639366
Batrachoseps minor 32.20986 17.8521138 0.1195006 0.8859637
Batrachoseps major 32.30070 16.8578065 0.1179415 0.7865252
Batrachoseps pacificus 32.26916 15.7598789 0.1181209 0.8050158
Batrachoseps luciae 32.22508 18.1402511 0.1192654 0.9267602
Batrachoseps robustus 32.21937 14.2937106 0.1215410 0.7339153
Batrachoseps attenuatus 32.27125 15.7764698 0.1191629 0.8226890
Batrachoseps campi 32.34415 13.7234994 0.1205916 0.7512857
Batrachoseps wrighti 32.34658 10.7947584 0.1198992 0.5883531
Bolitoglossa adspersa 32.18719 28.0596380 0.1210211 1.1990370
Bolitoglossa medemi 31.97705 41.4229793 0.1225699 1.5563853
Bolitoglossa alberchi 32.12215 27.4980530 0.1194473 0.9964234
Bolitoglossa altamazonica 32.02497 36.5131741 0.1222613 1.3548147
Bolitoglossa peruviana 32.10381 39.5578055 0.1194531 1.6311321
Bolitoglossa palmata 32.09099 17.7224290 0.1188099 0.7692825
Bolitoglossa alvaradoi 32.08612 33.3598837 0.1212691 1.3265743
Bolitoglossa dofleini 32.28265 31.5361419 0.1202047 1.1910497
Bolitoglossa anthracina 32.20218 49.0897900 0.1221572 1.7509235
Bolitoglossa biseriata 32.06921 38.0033664 0.1207242 1.4627860
Bolitoglossa sima 32.11936 24.9241747 0.1180578 1.0295916
Bolitoglossa borburata 32.25033 36.2329316 0.1213557 1.3504699
Bolitoglossa bramei 32.31616 37.5044916 0.1197011 1.5396740
Bolitoglossa pesrubra 32.34402 22.1406488 0.1175052 1.2894709
Bolitoglossa capitana 32.29017 38.3691243 0.1171797 1.5307424
Bolitoglossa carri 32.08081 20.7163326 0.1209707 0.8537026
Bolitoglossa oresbia 32.06759 20.8578521 0.1199959 0.8593628
Bolitoglossa celaque 32.26051 26.6047599 0.1197832 1.0154184
Bolitoglossa synoria 32.10817 34.6589874 0.1193040 1.2633894
Bolitoglossa heiroreias 32.19718 29.8250312 0.1207319 1.0879368
Bolitoglossa cerroensis 32.11797 22.6333843 0.1220499 1.3173677
Bolitoglossa epimela 32.03562 28.8830461 0.1205277 1.2838210
Bolitoglossa marmorea 32.04044 53.7135231 0.1217735 1.9145034
Bolitoglossa chica 32.03550 30.8582243 0.1221039 1.2524587
Bolitoglossa colonnea 32.07314 47.3603206 0.1215314 1.7994711
Bolitoglossa nigrescens 32.28014 29.3189428 0.1210323 1.2989163
Bolitoglossa compacta 32.13067 50.3297674 0.1188913 1.7980182
Bolitoglossa robusta 32.30729 39.9700194 0.1218887 1.5260614
Bolitoglossa schizodactyla 32.08365 42.0565854 0.1212779 1.5867561
Bolitoglossa conanti 32.01187 29.4537065 0.1227822 1.1140799
Bolitoglossa diaphora 32.09277 44.7197598 0.1200772 1.7551524
Bolitoglossa dunni 32.09046 39.6796094 0.1201151 1.5533024
Bolitoglossa copia 32.24707 48.3223050 0.1206438 1.7346439
Bolitoglossa cuchumatana 32.24843 20.8044937 0.1207591 0.8296313
Bolitoglossa helmrichi 32.11767 26.2960455 0.1185172 0.9977071
Bolitoglossa cuna 32.07445 46.7587828 0.1226559 1.6791644
Bolitoglossa suchitanensis 32.03939 29.3970836 0.1198968 1.0697957
Bolitoglossa morio 32.07360 26.4561254 0.1196983 1.0500478
Bolitoglossa flavimembris 32.15005 24.8635025 0.1208872 0.9698189
Bolitoglossa decora 32.06122 51.4824875 0.1193583 1.9418622
Bolitoglossa digitigrada 32.25227 21.2915627 0.1197652 1.3646765
Bolitoglossa diminuta 32.12972 20.6457498 0.1228287 1.2019858
Bolitoglossa engelhardti 32.04964 23.8033281 0.1185010 0.9485045
Bolitoglossa equatoriana 32.00645 36.7137714 0.1202591 1.4310499
Bolitoglossa paraensis 32.07397 43.8861597 0.1193228 1.5722553
Bolitoglossa flaviventris 32.17310 27.5158342 0.1193095 1.0724778
Bolitoglossa franklini 32.05006 24.5087423 0.1237187 0.9557349
Bolitoglossa lincolni 32.06610 24.7988358 0.1220006 0.9567480
Bolitoglossa gomezi 32.05383 35.0451598 0.1197175 1.5464692
Bolitoglossa gracilis 32.06118 33.1718126 0.1175089 1.4723288
Bolitoglossa subpalmata 32.01808 30.7898387 0.1189756 1.2715565
Bolitoglossa tica 32.01405 28.2057049 0.1171088 1.2482575
Bolitoglossa guaramacalensis 32.33234 32.4600877 0.1192014 1.2072452
Bolitoglossa hartwegi 32.25959 31.4533683 0.1199560 1.1421811
Bolitoglossa hermosa 32.15223 26.5502049 0.1175057 1.0875213
Bolitoglossa riletti 32.12881 24.9297818 0.1202011 0.9788674
Bolitoglossa zapoteca 32.27882 27.3254564 0.1176921 0.9881319
Bolitoglossa hiemalis 32.11126 36.2328515 0.1217018 1.4968595
Bolitoglossa hypacra 32.22127 38.3544766 0.1196198 1.4640130
Bolitoglossa indio 32.27507 40.0059101 0.1229459 1.4290655
Bolitoglossa insularis 32.09380 28.8580133 0.1181863 1.0477474
Bolitoglossa jacksoni 32.13891 17.6834644 0.1211707 0.7809337
Bolitoglossa nicefori 32.01067 29.3896748 0.1200502 1.2414103
Bolitoglossa lignicolor 32.04933 39.2139048 0.1213365 1.5291089
Bolitoglossa longissima 32.06494 34.1915513 0.1223273 1.2845589
Bolitoglossa porrasorum 32.09871 42.6741557 0.1184677 1.6174647
Bolitoglossa lozanoi 32.11469 29.5211766 0.1199866 1.2144233
Bolitoglossa macrinii 32.22414 28.2449345 0.1211942 1.0438047
Bolitoglossa oaxacensis 32.20104 25.1854896 0.1200354 0.9587351
Bolitoglossa magnifica 32.28515 51.5786483 0.1205163 1.8367623
Bolitoglossa meliana 32.25600 24.5650980 0.1214352 0.9838953
Bolitoglossa mexicana 32.08156 30.6872882 0.1213421 1.1444185
Bolitoglossa odonnelli 32.11516 32.0449084 0.1191938 1.2217660
Bolitoglossa minutula 32.11225 42.2578105 0.1196592 1.7340058
Bolitoglossa sooyorum 32.05662 22.3985503 0.1215570 1.3035425
Bolitoglossa mombachoensis 32.14530 30.1424558 0.1187399 1.0967248
Bolitoglossa striatula 32.06719 33.2774514 0.1215557 1.2453111
Bolitoglossa mulleri 32.18465 20.7488399 0.1216089 0.8059430
Bolitoglossa yucatana 32.25888 37.5207754 0.1219498 1.3504317
Bolitoglossa orestes 32.27513 30.6428711 0.1194931 1.1569954
Bolitoglossa rufescens 32.02233 24.6468961 0.1219158 0.9300370
Bolitoglossa obscura 32.23925 20.3187523 0.1192775 1.1817765
Bolitoglossa occidentalis 32.13011 28.0831942 0.1191711 1.0449692
Bolitoglossa pandi 32.20819 38.3011852 0.1215807 1.5163903
Bolitoglossa phalarosoma 32.17938 29.6604567 0.1220973 1.2563033
Bolitoglossa platydactyla 32.15362 26.0694345 0.1198346 1.0245041
Bolitoglossa ramosi 32.10174 34.5785689 0.1198468 1.4324049
Bolitoglossa rostrata 32.07739 25.7781144 0.1204008 0.9884973
Bolitoglossa salvinii 32.10399 29.7202505 0.1208936 1.1081603
Bolitoglossa savagei 32.06037 31.4735478 0.1197169 1.1585241
Bolitoglossa silverstonei 32.03907 38.7627477 0.1214802 1.4987863
Bolitoglossa sombra 32.15994 58.6425369 0.1200045 2.0959836
Bolitoglossa stuarti 32.02463 26.7085771 0.1198559 1.0228628
Bolitoglossa tatamae 32.06958 37.9892962 0.1226775 1.5126924
Bolitoglossa taylori 32.06566 41.9931609 0.1203129 1.5368640
Bolitoglossa vallecula 32.16599 28.2975150 0.1204742 1.2182565
Bolitoglossa veracrucis 32.02455 29.0567255 0.1211374 1.0528685
Bolitoglossa walkeri 32.03411 30.1980379 0.1218796 1.2730322
Ixalotriton niger 32.17896 31.3721581 0.1228503 1.1319377
Ixalotriton parvus 32.11128 30.1943565 0.1175581 1.0738695
Parvimolge townsendi 32.23410 23.1314123 0.1188530 0.9190280
Pseudoeurycea ahuitzotl 32.33058 27.9624132 0.1212682 1.1526411
Pseudoeurycea altamontana 32.22911 16.3666529 0.1179063 0.7737358
Pseudoeurycea robertsi 32.26202 14.7091792 0.1208924 0.7241191
Pseudoeurycea longicauda 32.25696 23.7548421 0.1197769 0.9932661
Pseudoeurycea tenchalli 32.26774 23.7369033 0.1189658 0.9298722
Pseudoeurycea cochranae 32.26417 23.0405971 0.1208565 0.9137941
Pseudoeurycea gadovii 32.23552 19.9007019 0.1184760 0.8716138
Pseudoeurycea melanomolga 32.20647 14.1664115 0.1208971 0.6502887
Pseudoeurycea amuzga 32.15132 30.7129064 0.1217824 1.1971375
Pseudoeurycea aquatica 32.38218 16.6735178 0.1196276 0.7330113
Pseudoeurycea aurantia 32.35488 15.9792545 0.1187154 0.7089815
Pseudoeurycea juarezi 32.33810 22.1045205 0.1190861 0.8816108
Pseudoeurycea saltator 32.14108 14.9291224 0.1214892 0.6582604
Pseudoeurycea ruficauda 32.10977 19.9339607 0.1177907 0.8010113
Pseudoeurycea goebeli 32.26153 32.4543346 0.1207166 1.1910862
Pseudoeurycea rex 32.23915 24.1375061 0.1200639 0.9632042
Pseudoeurycea conanti 32.15877 20.9029150 0.1200081 0.8406253
Pseudoeurycea mystax 32.19002 20.7040279 0.1187828 0.8241514
Pseudoeurycea obesa 32.15197 27.1457013 0.1220649 0.9990911
Pseudoeurycea werleri 32.24825 22.9975694 0.1206395 0.8914851
Pseudoeurycea firscheini 32.16178 23.4703680 0.1193466 0.9381259
Pseudoeurycea leprosa 32.23799 21.3951429 0.1188030 0.9100352
Pseudoeurycea nigromaculata 32.08913 26.2747466 0.1204180 1.0113152
Pseudoeurycea lynchi 32.20588 21.9467713 0.1225541 0.8944504
Pseudoeurycea lineola 32.29658 24.5731974 0.1192179 0.9862732
Pseudoeurycea mixcoatl 32.22888 24.9228820 0.1201512 0.9768483
Pseudoeurycea mixteca 32.29283 22.8084263 0.1183499 0.9270970
Pseudoeurycea orchileucos 32.25731 15.4807795 0.1225337 0.6807336
Pseudoeurycea orchimelas 32.23785 26.8429735 0.1196739 0.9824744
Pseudoeurycea papenfussi 32.17175 15.1525992 0.1220428 0.6644830
Pseudoeurycea smithi 32.18657 15.8973615 0.1195709 0.7005734
Pseudoeurycea tlahcuiloh 32.25143 26.9053122 0.1200774 1.1074839
Pseudoeurycea tlilicxitl 32.19692 14.6748636 0.1229203 0.6952976
Bradytriton silus 32.13376 23.1177267 0.1225246 0.9059689
Oedipina alfaroi 32.06490 34.7403160 0.1226273 1.4286744
Oedipina alleni 32.16922 35.8299814 0.1187775 1.4333614
Oedipina savagei 32.12815 41.9789297 0.1201521 1.6407034
Oedipina altura 32.17136 21.4054865 0.1186488 1.2448455
Oedipina carablanca 32.17761 36.8173638 0.1215222 1.3227629
Oedipina elongata 32.11877 34.7620752 0.1199328 1.2879308
Oedipina collaris 32.12827 36.1893399 0.1186419 1.4399414
Oedipina complex 32.11815 37.5925731 0.1216175 1.4572881
Oedipina maritima 32.21167 52.1263495 0.1194556 1.8463005
Oedipina parvipes 32.23822 49.8546970 0.1169975 1.8447339
Oedipina cyclocauda 32.18479 35.4288900 0.1202245 1.3757565
Oedipina pseudouniformis 32.17680 28.0652177 0.1218156 1.2472963
Oedipina gephyra 32.19680 37.4435661 0.1188809 1.4272320
Oedipina tomasi 32.12371 40.2652999 0.1201142 1.5804075
Oedipina gracilis 32.15794 32.7022285 0.1202246 1.3008780
Oedipina pacificensis 32.99953 40.0498979 0.1225503 1.6029702
Oedipina uniformis 32.12445 36.4271772 0.1178328 1.3851516
Oedipina grandis 33.14425 55.3085298 0.1213902 1.9711834
Oedipina poelzi 32.21552 33.7645942 0.1202159 1.3379858
Oedipina ignea 32.14436 26.3727795 0.1220259 1.0178613
Oedipina paucidentata 32.21549 19.8524849 0.1198818 1.1551481
Oedipina stenopodia 32.09441 32.3804448 0.1238241 1.1865906
Oedipina taylori 32.13964 33.9089531 0.1192412 1.2200683
Nototriton abscondens 32.21858 30.3815282 0.1202375 1.2066824
Nototriton gamezi 32.22033 34.2513890 0.1196567 1.2344479
Nototriton picadoi 32.18345 32.6869490 0.1207742 1.3466141
Nototriton guanacaste 32.23518 42.0124640 0.1178152 1.5709391
Nototriton saslaya 32.22262 28.7225459 0.1190831 1.0633557
Nototriton barbouri 32.24496 33.3310102 0.1217336 1.2722996
Nototriton brodiei 32.25514 37.7102997 0.1192471 1.4787764
Nototriton stuarti 32.28868 44.3393274 0.1206057 1.7421364
Nototriton limnospectator 32.21970 22.7614054 0.1193087 0.8993029
Nototriton lignicola 32.21842 31.4280893 0.1198924 1.2218606
Nototriton major 32.19916 21.2198548 0.1208539 1.2324558
Nototriton richardi 32.23270 35.8756833 0.1181778 1.2866855
Nototriton tapanti 32.18646 31.7894386 0.1195529 1.4120174
Dendrotriton bromeliacius 32.03331 24.5174100 0.1205123 0.9835584
Dendrotriton megarhinus 32.03547 27.1413800 0.1214589 0.9920824
Dendrotriton xolocalcae 31.96444 20.7869530 0.1231301 0.8234371
Dendrotriton sanctibarbarus 32.06036 26.0288128 0.1206092 0.9981740
Dendrotriton chujorum 32.01262 18.7078993 0.1226609 0.8253737
Dendrotriton cuchumatanus 31.98094 19.2174818 0.1217220 0.8462579
Dendrotriton kekchiorum 32.03719 21.8912824 0.1204577 0.8658252
Dendrotriton rabbi 32.02662 19.3051620 0.1212368 0.8502090
Nyctanolis pernix 32.11120 20.3139736 0.1219835 0.8111905
Chiropterotriton arboreus 31.52653 15.7912704 0.1212906 0.7044128
Chiropterotriton cracens 31.38139 18.3142630 0.1239478 0.7653606
Chiropterotriton terrestris 31.73957 14.8903560 0.1234633 0.6630485
Chiropterotriton priscus 31.84987 18.1849997 0.1234352 0.7693180
Chiropterotriton chiropterus 31.62023 18.5156856 0.1240128 0.7775073
Chiropterotriton chondrostega 31.84039 17.1307361 0.1211983 0.7458602
Chiropterotriton magnipes 31.81319 22.6404830 0.1206349 0.9133477
Chiropterotriton dimidiatus 31.98974 18.6656573 0.1207247 0.8283702
Chiropterotriton orculus 31.93671 17.2116296 0.1188469 0.7591900
Chiropterotriton lavae 31.82193 17.5010959 0.1193627 0.7442123
Cryptotriton alvarezdeltoroi 32.04704 29.0511496 0.1209782 1.0400850
Cryptotriton monzoni 31.87460 28.1470746 0.1202308 1.0235805
Cryptotriton nasalis 31.78894 38.0243940 0.1218449 1.4935927
Cryptotriton sierraminensis 31.95525 29.1298616 0.1203670 1.0871431
Cryptotriton veraepacis 31.86400 20.1882498 0.1212077 0.7954811
Thorius adelos 31.96366 16.3894126 0.1182449 0.7201184
Thorius arboreus 31.87441 15.3008078 0.1232337 0.6744795
Thorius macdougalli 31.97976 15.4567409 0.1227282 0.6819096
Thorius aureus 32.12893 14.9295990 0.1217012 0.6618887
Thorius boreas 32.08869 14.7908309 0.1221399 0.6509431
Thorius grandis 32.13409 24.5933653 0.1191207 1.0097971
Thorius omiltemi 32.15970 23.1138708 0.1199876 0.9056809
Thorius pulmonaris 32.10635 14.7059923 0.1205667 0.6463042
Thorius minutissimus 32.07844 27.2332227 0.1208142 0.9831097
Thorius narisovalis 32.11297 18.4535988 0.1192105 0.7640313
Thorius papaloae 32.19182 14.4002483 0.1203869 0.6291798
Thorius dubitus 32.13946 21.8206642 0.1205270 0.8703762
Thorius troglodytes 33.09991 17.2026285 0.1194897 0.7397272
Thorius insperatus 32.13739 14.8757347 0.1233152 0.6520869
Thorius minydemus 32.05115 19.5722142 0.1242522 0.8257276
Thorius spilogaster 33.03959 24.1565462 0.1206739 0.9654236
Thorius pennatulus 32.09369 23.2159201 0.1227480 0.9300935
Thorius smithi 32.10360 16.4850762 0.1214831 0.7239705
Thorius infernalis 32.34051 25.0047348 0.1206891 1.0295876
Thorius magnipes 31.95877 23.0255757 0.1205263 0.9148655
Thorius schmidti 32.10991 22.8545983 0.1190127 0.9107680
Thorius narismagnus 33.05132 26.9129477 0.1217673 0.9859692
Thorius lunaris 32.12597 22.5397567 0.1214699 0.8920372
Thorius munificus 32.09601 13.8552563 0.1182131 0.6384118
Ascaphus montanus 28.97264 6.2564332 0.1460927 0.3595713
Leiopelma hochstetteri 32.08346 26.1102547 0.1426869 1.3468694
Leiopelma archeyi 31.76564 27.7784050 0.1439268 1.4337262
Leiopelma pakeka 31.85256 22.9457122 0.1404519 1.3437171
Leiopelma hamiltoni 31.80769 24.3830378 0.1426587 1.3063055
Barbourula kalimantanensis 33.49586 66.4005260 0.1385489 2.2629339
Barbourula busuangensis 33.59937 93.7756207 0.1404869 3.3730500
Bombina orientalis 33.68084 15.6811575 0.1421954 0.7248239
Bombina bombina 33.58513 12.9608479 0.1392382 0.6521283
Bombina variegata 33.58455 14.0301664 0.1417764 0.6876636
Bombina lichuanensis 33.57097 24.3874252 0.1410157 1.0201520
Latonia nigriventer 33.75781 26.2373110 0.1479887 1.1111786
Discoglossus montalentii 32.95831 12.5746486 0.1471813 0.5233624
Discoglossus sardus 34.16632 9.8126711 0.1469425 0.4076984
Rhinophrynus dorsalis 33.41399 50.8728189 0.1380629 1.8934289
Hymenochirus boettgeri 33.54604 50.6853709 0.1377751 1.8354695
Hymenochirus feae 33.48970 51.4216826 0.1411129 1.8280620
Hymenochirus boulengeri 33.52438 53.6553041 0.1428822 1.9587949
Hymenochirus curtipes 33.61323 51.2116920 0.1384247 1.8149355
Pseudhymenochirus merlini 33.54442 43.9332435 0.1401369 1.5941640
Xenopus amieti 33.11071 35.6160357 0.1396567 1.3464257
Xenopus longipes 33.09789 28.3484523 0.1402487 1.0928026
Xenopus boumbaensis 32.28491 38.6090371 0.1431696 1.4161173
Xenopus itombwensis 33.05725 27.5403770 0.1422555 1.1215259
Xenopus wittei 33.02530 27.7761344 0.1397267 1.1808249
Xenopus andrei 33.05702 34.7038358 0.1422925 1.2741324
Xenopus fraseri 33.08040 38.6261580 0.1402284 1.3603352
Xenopus pygmaeus 33.13474 31.2085418 0.1363748 1.1285949
Xenopus gilli 32.86208 13.0502287 0.1408143 0.6256691
Xenopus petersii 33.06516 20.4539630 0.1404488 0.8034244
Xenopus victorianus 33.05835 19.5249848 0.1410226 0.8271642
Xenopus lenduensis 33.03203 28.6326973 0.1409832 1.1136297
Xenopus vestitus 33.04799 31.6223228 0.1403583 1.3590130
Xenopus borealis 33.24072 23.1998378 0.1387575 1.0676909
Xenopus clivii 33.06502 23.4948597 0.1404004 1.0384355
Xenopus largeni 33.11440 22.7224884 0.1412370 1.0829291
Xenopus ruwenzoriensis 33.17345 28.9638934 0.1411940 1.1896956
Xenopus muelleri 33.12956 24.8226433 0.1379490 1.0200748
Xenopus epitropicalis 33.35656 41.6856479 0.1405116 1.5113939
Xenopus tropicalis 33.30357 39.3259342 0.1417505 1.4167156
Pipa arrabali 34.77597 48.7717531 0.1371156 1.7515180
Pipa myersi 34.72659 49.2161348 0.1356413 1.7499478
Pipa parva 34.78109 48.6341878 0.1352697 1.8275400
Pipa pipa 34.81802 46.2821603 0.1351955 1.6753763
Pipa aspera 34.78740 49.8174892 0.1377512 1.8065842
Pipa snethlageae 34.69430 48.4567839 0.1391983 1.6903805
Scaphiopus hurterii 32.43079 15.8333172 0.1529022 0.5891593
Spea multiplicata 33.28488 14.3466669 0.1416889 0.6390097
Spea bombifrons 33.57123 8.0095698 0.1439993 0.3692159
Spea intermontana 33.60420 7.3340454 0.1443775 0.4111268
Pelodytes caucasicus 33.49831 10.0920373 0.1311749 0.5021195
Oreolalax chuanbeiensis 33.94855 13.0426378 0.1367425 0.6914585
Oreolalax nanjiangensis 33.35744 14.7703085 0.1365208 0.7272513
Oreolalax omeimontis 33.88773 21.3312132 0.1375552 0.9895310
Oreolalax popei 33.91594 15.0720821 0.1390546 0.7630783
Oreolalax multipunctatus 33.90356 15.5381068 0.1383045 0.7949623
Oreolalax granulosus 33.30563 27.9020661 0.1358122 1.2159365
Oreolalax jingdongensis 33.38461 26.1892270 0.1367777 1.1700194
Oreolalax liangbeiensis 33.99005 21.1997570 0.1374390 1.0128936
Oreolalax major 34.00884 16.4492895 0.1370385 0.8259878
Oreolalax rugosus 34.19637 23.9715849 0.1371522 1.1583151
Oreolalax xiangchengensis 33.37722 17.6510953 0.1354391 1.0623875
Oreolalax puxiongensis 34.20569 21.5708010 0.1360825 1.0309979
Oreolalax lichuanensis 33.91195 23.0225177 0.1383892 0.9060612
Oreolalax pingii 33.91427 21.4805865 0.1393552 1.0202669
Oreolalax schmidti 33.98458 15.6186481 0.1343791 0.7875141
Oreolalax rhodostigmatus 33.96600 22.4934829 0.1360428 0.8961386
Scutiger adungensis 33.25994 19.5829776 0.1390513 1.1237059
Scutiger boulengeri 33.35358 9.8397146 0.1361228 0.7644444
Scutiger muliensis 33.32935 19.6357731 0.1357327 1.1077072
Scutiger tuberculatus 33.32917 22.7992951 0.1367932 1.0927070
Scutiger mammatus 33.34114 9.6559984 0.1375671 0.7708011
Scutiger brevipes 33.25058 14.1677753 0.1398694 0.9235677
Scutiger chintingensis 33.23115 21.8313880 0.1389682 1.0156155
Scutiger glandulatus 33.91028 12.7952589 0.1388831 0.8272539
Scutiger gongshanensis 34.24497 23.5102568 0.1360869 1.2569825
Scutiger jiulongensis 34.20205 16.0431822 0.1355115 0.8910164
Scutiger liupanensis 33.30062 13.2811955 0.1358048 0.6490044
Scutiger nepalensis 33.36433 12.3316624 0.1383020 0.7352340
Scutiger ningshanensis 33.27653 14.5802683 0.1392034 0.6150369
Scutiger nyingchiensis 33.36554 10.9877754 0.1371612 0.7527914
Scutiger pingwuensis 33.28986 14.2987653 0.1354988 0.7179078
Scutiger sikimmensis 33.20323 15.8170708 0.1400927 0.8938121
Leptobrachella baluensis 33.83633 49.6147950 0.1353487 1.8273484
Leptobrachella brevicrus 33.25644 59.9584053 0.1388087 2.1923704
Leptobrachella mjobergi 33.91896 95.9380056 0.1336444 3.5109824
Leptobrachella natunae 33.27625 93.7483212 0.1360340 3.4025075
Leptobrachella palmata 33.21769 61.2476085 0.1354528 2.1467843
Leptobrachella parva 33.91179 58.2006895 0.1368474 2.1012509
Leptobrachella serasanae 33.93907 55.1736475 0.1336577 1.9737635
Leptobrachium abbotti 33.78129 57.9978801 0.1347966 2.0757830
Leptobrachium gunungense 33.86752 73.9581849 0.1350533 2.7193410
Leptobrachium montanum 33.80983 51.8198461 0.1370109 1.8626866
Leptobrachium hasseltii 33.83185 57.6548166 0.1368392 2.0738559
Leptobrachium smithi 33.83040 39.5128594 0.1385490 1.4130211
Leptobrachium hendricksoni 33.88849 56.7578852 0.1355499 2.0009487
Leptobrachium nigrops 33.89288 59.8788161 0.1349185 2.0913821
Leptobrachium ailaonicum 34.04050 30.5156570 0.1356162 1.2871235
Leptobrachium boringii 33.95529 20.4425183 0.1364726 0.8876903
Leptobrachium leishanense 33.92404 28.8519606 0.1362061 1.1047185
Leptobrachium liui 33.99744 29.9871710 0.1350492 1.0877219
Leptobrachium chapaense 33.96191 31.7628977 0.1361050 1.2834975
Leptobrachium huashen 33.98643 30.5961920 0.1359169 1.3068972
Leptobrachium promustache 33.27716 32.7290309 0.1362921 1.2678175
Leptobrachium banae 33.86302 41.3876218 0.1374291 1.4702561
Leptobrachium buchardi 33.90162 41.5280173 0.1365952 1.4434675
Leptobrachium ngoclinhense 33.87113 38.5447733 0.1362279 1.3799092
Leptobrachium hainanense 33.93797 58.7938190 0.1351618 2.0876170
Leptobrachium mouhoti 33.93905 38.8085882 0.1369114 1.3677652
Leptobrachium pullum 33.91717 40.0130302 0.1354882 1.4137438
Leptobrachium xanthops 33.28147 37.3117368 0.1366901 1.3467077
Leptobrachium xanthospilum 33.37486 38.3564833 0.1352235 1.4056925
Leptobrachium leucops 33.94387 41.1529014 0.1366820 1.4424530
Megophrys kobayashii 33.83937 63.8928434 0.1374753 2.3197847
Megophrys ligayae 33.78802 74.3024761 0.1399633 2.6690659
Megophrys montana 33.74090 58.0902578 0.1384977 2.1127014
Megophrys nasuta 33.72021 51.5741343 0.1387367 1.8204753
Megophrys stejnegeri 33.79993 65.8216805 0.1379905 2.3849119
Pelobates fuscus 34.78530 6.2183795 0.1325109 0.3207071
Pelobates syriacus 35.79125 10.2054024 0.1348433 0.4936942
Pelobates varaldii 35.93296 12.4653301 0.1353471 0.5430791
Hadromophryne natalensis 32.72321 28.9313748 0.1404905 1.2824623
Heleophryne hewitti 33.22472 26.3944353 0.1402630 1.2319351
Heleophryne orientalis 32.67351 22.4039345 0.1384791 1.0332410
Heleophryne purcelli 32.62157 22.6918365 0.1401641 1.0772449
Heleophryne regis 32.59569 24.4249365 0.1391650 1.1401547
Heleophryne rosei 32.60900 21.4461660 0.1375451 1.0311061
Philoria pughi 27.69165 11.9671506 0.1604626 0.5130614
Philoria kundagungan 29.63839 14.6197818 0.1535130 0.6245505
Philoria richmondensis 29.64601 13.3377824 0.1558264 0.5685179
Limnodynastes convexiusculus 32.35353 23.8686671 0.1488531 0.8661003
Limnodynastes lignarius 32.26443 24.4480834 0.1501117 0.8628967
Limnodynastes depressus 31.19459 21.9130147 0.1538065 0.7749052
Limnodynastes terraereginae 32.54637 11.4206330 0.1500380 0.4631590
Limnodynastes dumerilii 32.18741 8.4670315 0.1509716 0.4116415
Limnodynastes interioris 32.42892 8.2324402 0.1524721 0.3791103
Lechriodus aganoposis 34.35927 29.1700112 0.1475754 1.0901542
Lechriodus melanopyga 34.45023 28.8661310 0.1467782 1.0590147
Lechriodus fletcheri 34.04257 15.6393674 0.1473670 0.6932693
Lechriodus platyceps 33.96509 34.0754468 0.1480239 1.2607898
Platyplectrum spenceri 33.40746 14.2093749 0.1515199 0.5807311
Heleioporus albopunctatus 32.37199 12.0040163 0.1493112 0.5661891
Heleioporus barycragus 32.33806 11.9844081 0.1516104 0.5784232
Heleioporus australiacus 32.34015 12.8205797 0.1513701 0.6314620
Heleioporus eyrei 32.25051 12.4352725 0.1527813 0.6025632
Heleioporus inornatus 32.32602 13.8095495 0.1505766 0.6915094
Heleioporus psammophilus 32.26480 12.4259655 0.1516708 0.5972637
Neobatrachus albipes 31.10019 11.2896394 0.1504678 0.5452931
Neobatrachus kunapalari 31.01728 11.7351232 0.1547836 0.5517201
Neobatrachus aquilonius 30.62775 18.5798687 0.1533687 0.6889143
Neobatrachus wilsmorei 30.65494 12.2406336 0.1559234 0.5295943
Neobatrachus sutor 30.53298 11.6495753 0.1538431 0.5098417
Neobatrachus fulvus 30.44474 14.4124799 0.1547219 0.5661810
Neobatrachus pelobatoides 30.52877 10.3205250 0.1535438 0.4951488
Notaden bennettii 31.73549 17.8219837 0.1491792 0.7517379
Notaden melanoscaphus 31.61382 29.0421425 0.1522987 1.0457771
Notaden weigeli 32.60758 40.6288688 0.1535004 1.4444641
Notaden nichollsi 32.63629 18.6008861 0.1505233 0.7427969
Arenophryne rotunda 33.31622 15.5554428 0.1540311 0.6380568
Metacrinia nichollsi 32.29471 14.5255951 0.1517190 0.7565627
Myobatrachus gouldii 33.19628 11.0000518 0.1543084 0.5298496
Pseudophryne australis 33.60166 10.9525805 0.1493136 0.5130128
Pseudophryne occidentalis 33.10970 7.7439600 0.1482636 0.3553619
Pseudophryne coriacea 32.41650 15.0642645 0.1543406 0.6593069
Pseudophryne covacevichae 32.46796 21.6110235 0.1521211 0.8537488
Pseudophryne guentheri 31.69878 8.5264247 0.1539993 0.4036654
Pseudophryne douglasi 32.14984 13.9390251 0.1528061 0.5467278
Pseudophryne pengilleyi 31.85647 8.7296227 0.1490354 0.4459444
Pseudophryne raveni 32.40062 18.1347742 0.1498878 0.7455906
Spicospina flammocaerulea 32.15297 15.1190904 0.1505548 0.8037124
Uperoleia altissima 31.78200 23.1376042 0.1521842 0.8820915
Uperoleia littlejohni 31.79939 16.6765346 0.1525828 0.6450852
Uperoleia orientalis 31.83026 20.8751943 0.1508560 0.7474626
Uperoleia arenicola 31.84630 29.0884952 0.1509933 1.0189409
Uperoleia borealis 31.82772 23.9350211 0.1487893 0.8599475
Uperoleia crassa 32.03650 31.0180905 0.1527525 1.1034444
Uperoleia inundata 31.83355 24.0381417 0.1496428 0.8542408
Uperoleia russelli 31.81683 14.5465654 0.1520055 0.5872373
Uperoleia talpa 31.81097 26.7083696 0.1537724 0.9618824
Uperoleia aspera 31.77498 30.3771610 0.1537533 1.0811835
Uperoleia lithomoda 31.67564 26.2819277 0.1534966 0.9522545
Uperoleia trachyderma 31.74591 19.7776263 0.1537263 0.7329469
Uperoleia minima 31.79944 33.0782808 0.1515336 1.1758473
Uperoleia glandulosa 31.83369 21.6325614 0.1499340 0.8161732
Uperoleia martini 31.77113 10.6982442 0.1521979 0.5549978
Uperoleia daviesae 31.82712 38.9437971 0.1516260 1.3776027
Uperoleia micromeles 31.74953 17.1681738 0.1522202 0.6763622
Uperoleia mjobergii 31.70919 27.0721921 0.1517483 0.9694165
Uperoleia mimula 31.68008 24.2400014 0.1527992 0.9022532
Uperoleia fusca 31.35173 13.4350025 0.1517611 0.5690566
Uperoleia tyleri 31.42461 9.7066516 0.1514492 0.4746902
Geocrinia alba 31.51761 10.8359944 0.1537951 0.5367814
Geocrinia vitellina 31.43975 10.5463470 0.1567875 0.5240363
Geocrinia lutea 31.51082 10.8827361 0.1544337 0.5771489
Geocrinia rosea 31.52655 10.9526634 0.1540623 0.5669283
Geocrinia leai 31.37690 9.4163385 0.1569533 0.4752380
Paracrinia haswelli 31.24775 12.8055676 0.1522302 0.6273890
Crinia bilingua 32.77953 29.6140534 0.1489521 1.0560059
Crinia remota 32.43576 24.1533024 0.1497294 0.8715714
Crinia deserticola 32.56661 17.0087610 0.1488748 0.6567377
Crinia riparia 32.02333 8.3494856 0.1497101 0.3841423
Crinia georgiana 32.58088 9.7204239 0.1497837 0.4788702
Crinia glauerti 32.53605 10.3260107 0.1504754 0.5196363
Crinia insignifera 32.63942 9.8334136 0.1485666 0.4698144
Crinia pseudinsignifera 32.61145 10.5620456 0.1502801 0.5131670
Crinia subinsignifera 32.66954 10.8630909 0.1483391 0.5478036
Crinia sloanei 32.60560 8.9569274 0.1495604 0.4088892
Crinia tinnula 32.71089 15.7561273 0.1493139 0.6805636
Crinia nimbus 32.26508 12.4373688 0.1506357 0.7599121
Crinia tasmaniensis 32.41664 12.2366758 0.1518395 0.7322987
Taudactylus eungellensis 31.19975 23.4810043 0.1510491 0.9144386
Taudactylus liemi 32.00694 25.7240806 0.1499512 1.0011667
Taudactylus pleione 31.86168 26.7184909 0.1529868 1.0910354
Mixophyes balbus 29.35625 13.8348850 0.1518678 0.6444908
Mixophyes carbinensis 29.36536 21.0044950 0.1509324 0.7784203
Mixophyes coggeri 30.04161 22.8207545 0.1488278 0.8786322
Mixophyes schevilli 29.40297 23.4680501 0.1507254 0.8923012
Mixophyes fleayi 30.29478 15.9432889 0.1494814 0.6706036
Mixophyes iteratus 29.10621 12.4540379 0.1497982 0.5493268
Mixophyes hihihorlo 30.17006 28.6242781 0.1491986 1.0335515
Calyptocephalella gayi 32.76931 14.7221429 0.1462785 0.7967895
Telmatobufo bullocki 31.98411 14.1526123 0.1452695 0.7674661
Telmatobufo venustus 31.99194 9.1192573 0.1440762 0.5333209
Telmatobufo australis 31.96365 12.1565166 0.1447255 0.7215533
Adelphobates castaneoticus 32.52613 36.1813040 0.1402239 1.2919694
Adelphobates galactonotus 32.47708 33.7224730 0.1368818 1.1963524
Adelphobates quinquevittatus 32.58536 28.4517348 0.1393846 0.9894034
Dendrobates truncatus 32.42408 26.4903727 0.1378890 1.0142341
Dendrobates leucomelas 32.48789 29.2550526 0.1392458 1.0812849
Dendrobates tinctorius 32.46923 37.2939006 0.1376621 1.3486844
Dendrobates nubeculosus 32.50448 32.9262360 0.1377873 1.2068040
Oophaga vicentei 30.26714 30.6700789 0.1383846 1.1237145
Oophaga sylvatica 30.54779 19.0218053 0.1438852 0.7778117
Oophaga occultator 30.53470 31.9804239 0.1408268 1.2398687
Oophaga granulifera 31.12353 31.8299402 0.1378314 1.2442999
Minyobates steyermarki 32.61545 39.2672480 0.1390488 1.4237931
Andinobates altobueyensis 33.72299 37.4918290 0.1351327 1.3996815
Andinobates bombetes 33.74252 28.5473072 0.1355131 1.2089969
Andinobates tolimensis 33.74935 27.9742724 0.1359374 1.2006972
Andinobates virolinensis 33.77799 27.7756904 0.1338104 1.1522526
Andinobates opisthomelas 33.76416 29.0123210 0.1357596 1.1677202
Andinobates claudiae 33.68838 47.2376309 0.1350841 1.6904020
Andinobates minutus 33.69177 36.7844063 0.1344143 1.3805425
Andinobates daleswansoni 33.62908 31.5632974 0.1353506 1.2999933
Andinobates dorisswansonae 33.66541 26.6303296 0.1378532 1.1379820
Andinobates fulguritus 33.78161 34.7686361 0.1348176 1.3191034
Ranitomeya amazonica 33.78390 39.7270745 0.1354979 1.4153124
Ranitomeya benedicta 33.89813 34.0788905 0.1383006 1.3319340
Ranitomeya fantastica 33.73414 31.0857315 0.1365724 1.2575145
Ranitomeya summersi 33.90463 31.0333776 0.1350343 1.2801409
Ranitomeya reticulata 33.84225 33.0822752 0.1377052 1.2054635
Ranitomeya uakarii 33.87888 34.9870390 0.1376079 1.3755078
Ranitomeya ventrimaculata 33.77968 33.5256195 0.1349195 1.1922524
Ranitomeya variabilis 33.71469 33.1081470 0.1341630 1.3488828
Ranitomeya flavovittata 33.91502 35.8995826 0.1377562 1.2476003
Ranitomeya vanzolinii 33.93441 36.8734658 0.1348969 1.4701167
Ranitomeya imitator 33.89377 31.6275362 0.1359649 1.2526171
Excidobates captivus 32.85541 26.0343979 0.1361899 1.0413917
Excidobates mysteriosus 33.27632 23.9906007 0.1367837 1.0664900
Phyllobates aurotaenia 33.29188 35.3212504 0.1359551 1.3679706
Phyllobates terribilis 33.22713 45.3210922 0.1405636 1.7391777
Phyllobates bicolor 33.24539 34.8568964 0.1362698 1.3891290
Phyllobates lugubris 33.28640 38.5869785 0.1380274 1.4534538
Phyllobates vittatus 32.67858 35.1176553 0.1373579 1.4651826
Hyloxalus aeruginosus 32.88447 17.3208947 0.1355863 0.8341770
Hyloxalus anthracinus 33.44920 13.7972765 0.1344972 0.6632808
Hyloxalus awa 33.73935 18.4578842 0.1348008 0.7657477
Hyloxalus azureiventris 33.51428 39.1737496 0.1368601 1.5926116
Hyloxalus chlorocraspedus 33.36944 45.4999126 0.1347488 1.7416094
Hyloxalus betancuri 32.92791 33.5409047 0.1336273 1.2950190
Hyloxalus sauli 34.26132 27.2638700 0.1346090 1.0921539
Hyloxalus borjai 32.87161 20.7785305 0.1369718 0.9345060
Hyloxalus breviquartus 33.44001 27.0239026 0.1381076 1.1258202
Hyloxalus cevallosi 33.45757 31.3635620 0.1352806 1.2250502
Hyloxalus chocoensis 33.51592 35.7929579 0.1386592 1.3943264
Hyloxalus craspedoceps 32.78090 38.4549169 0.1390802 1.5853893
Hyloxalus delatorreae 32.79924 15.5075229 0.1379498 0.7448741
Hyloxalus eleutherodactylus 32.91183 32.7878873 0.1361076 1.3503679
Hyloxalus exasperatus 33.56451 17.1734054 0.1398111 0.7385697
Hyloxalus excisus 33.72016 19.2168759 0.1394473 0.8651671
Hyloxalus faciopunctulatus 33.58320 32.6792442 0.1354138 1.1135162
Hyloxalus fallax 33.55962 21.1488936 0.1362522 0.8370777
Hyloxalus fascianigrus 33.54709 37.1862424 0.1375833 1.4875269
Hyloxalus fuliginosus 32.92748 26.2851398 0.1361410 1.0989847
Hyloxalus idiomelus 32.97973 22.6459608 0.1353557 1.0449470
Hyloxalus infraguttatus 33.56885 22.1264116 0.1386883 0.8974516
Hyloxalus insulatus 32.86588 28.2024622 0.1391123 1.2586345
Hyloxalus lehmanni 33.50826 24.2647789 0.1358353 1.0137610
Hyloxalus leucophaeus 32.88466 34.9192710 0.1359714 1.5380019
Hyloxalus sordidatus 32.85322 26.8518080 0.1364656 1.1706166
Hyloxalus littoralis 33.69823 22.7715883 0.1341245 1.0674036
Hyloxalus mittermeieri 32.86751 18.3390159 0.1356726 0.8838066
Hyloxalus mystax 32.94556 22.5022294 0.1345663 0.8691843
Hyloxalus parcus 32.94214 25.8092178 0.1362618 1.0306515
Hyloxalus patitae 32.97769 34.7551374 0.1351327 1.5220865
Hyloxalus pinguis 33.49766 19.1406890 0.1368205 0.8330088
Hyloxalus pulcherrimus 32.80928 29.7700687 0.1353310 1.3987920
Hyloxalus pumilus 32.89017 24.0094358 0.1365543 0.9245605
Hyloxalus ramosi 33.57896 26.9553099 0.1353423 1.1245699
Hyloxalus ruizi 33.51852 34.8803119 0.1358944 1.3940887
Hyloxalus saltuarius 33.64360 35.8122904 0.1363967 1.4025206
Hyloxalus shuar 33.54267 21.5212515 0.1374808 0.8951507
Hyloxalus spilotogaster 33.46263 33.3934108 0.1368163 1.3767363
Hyloxalus subpunctatus 33.53203 23.1102447 0.1354184 0.9907767
Hyloxalus sylvaticus 32.90927 26.4503827 0.1349136 1.1546945
Hyloxalus utcubambensis 33.47217 29.4980305 0.1362998 1.3405240
Hyloxalus vergeli 33.72176 25.1586088 0.1341527 1.0928979
Ameerega rubriventris 34.59820 26.3664665 0.1370407 1.1074835
Ameerega macero 34.61553 29.1808011 0.1368733 1.2527233
Ameerega bassleri 34.57498 25.8930758 0.1361887 1.0867761
Ameerega berohoka 34.65675 20.5629344 0.1363197 0.7345843
Ameerega bilinguis 34.53437 27.5580583 0.1399388 1.0307112
Ameerega boliviana 34.65901 24.6615822 0.1356918 1.2201354
Ameerega braccata 34.64154 20.0774675 0.1363617 0.7097286
Ameerega flavopicta 33.96110 20.0249381 0.1394184 0.7398230
Ameerega cainarachi 34.03474 35.0258522 0.1383833 1.4261403
Ameerega smaragdina 34.65465 19.1996550 0.1368532 0.9009666
Ameerega petersi 34.66901 29.7345429 0.1368408 1.2081427
Ameerega picta 34.73957 26.1353157 0.1366663 0.9427087
Ameerega parvula 34.57977 23.4424896 0.1372731 0.8822664
Ameerega pongoensis 33.97379 31.6360501 0.1370110 1.2628236
Ameerega planipaleae 34.00338 21.5670122 0.1380433 1.0112024
Ameerega pulchripecta 34.72921 33.4704257 0.1356517 1.2176432
Ameerega simulans 34.62826 22.1349629 0.1373729 1.0706564
Ameerega yungicola 34.62929 21.6211909 0.1359788 1.0653661
Ameerega silverstonei 34.57702 25.8740114 0.1339299 1.0744732
Colostethus agilis 32.98323 32.2956214 0.1403433 1.3189626
Colostethus furviventris 33.75576 34.5217784 0.1377337 1.3334067
Colostethus imbricolus 33.20036 35.3457327 0.1334167 1.3448445
Colostethus inguinalis 33.09863 40.2171572 0.1358856 1.5337214
Colostethus panamansis 33.14070 42.8937930 0.1372789 1.5726646
Colostethus latinasus 32.96207 36.2261494 0.1391362 1.3725631
Colostethus pratti 33.67024 38.9514393 0.1375539 1.4333078
Colostethus lynchi 33.08869 35.9663968 0.1380635 1.3776673
Colostethus mertensi 33.06853 26.7698547 0.1367887 1.1678677
Colostethus poecilonotus 33.03304 16.4232350 0.1371164 0.7916649
Colostethus ruthveni 33.70730 34.3601505 0.1358534 1.2725743
Colostethus thorntoni 33.02103 24.7185552 0.1402223 1.0408692
Colostethus ucumari 33.00472 24.8346556 0.1379107 1.1622410
Epipedobates narinensis 34.84432 22.4734439 0.1366026 0.8757235
Silverstoneia erasmios 34.38519 29.1215527 0.1370932 1.1585587
Silverstoneia flotator 34.41038 36.1465423 0.1338417 1.3458640
Silverstoneia nubicola 34.39444 34.3638034 0.1373756 1.2938899
Allobates algorei 33.65820 28.7828507 0.1365996 1.1613770
Allobates bromelicola 33.70228 36.2212973 0.1373332 1.3377345
Allobates brunneus 33.67760 37.9391900 0.1382943 1.3368926
Allobates crombiei 33.60929 33.6139521 0.1359963 1.1902323
Allobates caeruleodactylus 33.65102 34.2627246 0.1392536 1.1870453
Allobates caribe 33.67935 36.0741967 0.1371425 1.3275728
Allobates chalcopis 33.74600 61.7018424 0.1387882 2.2585003
Allobates subfolionidificans 33.19891 25.0578808 0.1395969 0.8440346
Allobates fratisenescus 33.59855 25.4231596 0.1381588 1.0366765
Allobates fuscellus 33.70404 39.6486664 0.1372967 1.3617814
Allobates gasconi 33.59142 38.3169771 0.1385248 1.3320341
Allobates marchesianus 33.71287 35.1901202 0.1381992 1.2393532
Allobates goianus 33.68852 22.8414266 0.1367623 0.8592085
Allobates granti 33.72422 32.5636250 0.1348581 1.1788464
Allobates ornatus 33.71208 32.4187514 0.1376664 1.3350540
Allobates humilis 33.62512 30.6596059 0.1359526 1.1387514
Allobates pittieri 33.58396 33.9030047 0.1379413 1.2764535
Allobates juanii 33.66919 23.2146337 0.1363787 0.9895292
Allobates kingsburyi 33.69581 17.3527637 0.1374319 0.7566010
Allobates mandelorum 33.73795 33.5503278 0.1373906 1.2300933
Allobates masniger 33.69967 34.8191948 0.1386886 1.2396106
Allobates nidicola 33.64438 36.6173366 0.1378529 1.2698077
Allobates melanolaemus 33.70482 36.4543937 0.1351298 1.2485196
Allobates myersi 33.70175 34.6849773 0.1383265 1.2183960
Allobates niputidea 33.74472 35.1443041 0.1366388 1.3282701
Allobates olfersioides 33.58313 28.3215737 0.1339898 1.1080785
Allobates paleovarzensis 33.73724 36.8205823 0.1370984 1.2819757
Allobates sumtuosus 33.66843 40.3322501 0.1381805 1.4550645
Allobates sanmartini 33.80081 32.1083281 0.1378941 1.1978523
Allobates talamancae 33.72983 36.9136044 0.1346086 1.4030861
Allobates vanzolinius 33.68322 36.4672444 0.1386580 1.2462144
Allobates wayuu 33.64701 56.1377579 0.1371744 2.0825195
Allobates undulatus 33.62688 46.4785206 0.1364640 1.7226095
Anomaloglossus ayarzaguenai 32.96299 34.9645722 0.1384420 1.3644080
Anomaloglossus baeobatrachus 33.58032 41.9630904 0.1408243 1.5106107
Anomaloglossus beebei 33.45546 36.7356277 0.1379128 1.3650473
Anomaloglossus roraima 33.64667 38.8849901 0.1384749 1.4583680
Anomaloglossus breweri 33.90377 33.2930336 0.1376062 1.2805951
Anomaloglossus degranvillei 33.03986 38.8496724 0.1397113 1.3906826
Anomaloglossus kaiei 33.72206 41.0197805 0.1373245 1.5229920
Anomaloglossus guanayensis 33.07008 47.6581294 0.1378408 1.7654450
Anomaloglossus murisipanensis 33.61705 34.9814360 0.1390968 1.3452970
Anomaloglossus parimae 33.04270 44.3158123 0.1393886 1.6893535
Anomaloglossus parkerae 33.61086 30.1454516 0.1379784 1.1675979
Anomaloglossus praderioi 33.69341 37.9515900 0.1391931 1.4230273
Anomaloglossus rufulus 33.65602 31.1114246 0.1378569 1.2130326
Anomaloglossus shrevei 33.00643 40.6024836 0.1394350 1.5653484
Anomaloglossus stepheni 33.76292 38.4621572 0.1367262 1.3412255
Anomaloglossus tamacuarensis 33.06206 40.3179431 0.1374799 1.4782996
Anomaloglossus tepuyensis 33.05474 34.1356820 0.1372437 1.3012949
Anomaloglossus triunfo 33.04239 32.9709488 0.1369343 1.2517303
Anomaloglossus wothuja 33.06022 48.6278002 0.1365632 1.7418673
Rheobates palmatus 32.93729 31.5921645 0.1358024 1.3116345
Rheobates pseudopalmatus 32.94280 36.6635765 0.1385402 1.4556184
Aromobates saltuensis 33.01299 28.4500143 0.1371021 1.1459923
Aromobates capurinensis 33.07791 38.0171955 0.1400838 1.4809026
Aromobates duranti 33.07278 33.5953860 0.1373818 1.3073589
Aromobates mayorgai 33.05274 33.1650909 0.1374297 1.2568228
Aromobates meridensis 33.11573 32.7026662 0.1379369 1.2735632
Aromobates molinarii 33.00182 35.3778619 0.1385730 1.3746095
Aromobates orostoma 33.09727 33.0470968 0.1372046 1.2845250
Mannophryne caquetio 32.99925 39.0799171 0.1380198 1.4658980
Mannophryne collaris 33.08048 35.9486989 0.1358510 1.3968582
Mannophryne herminae 32.96209 36.8119392 0.1366669 1.3643826
Mannophryne larandina 33.67018 37.3420901 0.1361121 1.3906161
Mannophryne yustizi 32.94941 33.5949455 0.1363210 1.3191484
Mannophryne lamarcai 33.01195 36.1367653 0.1389959 1.3577055
Mannophryne cordilleriana 33.00906 38.4963817 0.1376541 1.4268097
Mannophryne leonardoi 32.98762 34.4632631 0.1357195 1.2724384
Mannophryne trinitatis 33.10309 68.5730452 0.1368626 2.5951802
Mannophryne venezuelensis 33.05261 44.9465678 0.1366131 1.6737233
Mannophryne neblina 32.96258 42.6625980 0.1382336 1.5722287
Mannophryne oblitterata 33.03643 34.5609619 0.1380946 1.3008446
Mannophryne olmonae 33.08333 94.1369510 0.1353728 3.5264366
Mannophryne riveroi 33.10264 47.0149977 0.1365858 1.7623233
Mannophryne speeri 32.97910 30.2461490 0.1387428 1.1852763
Mannophryne trujillensis 32.98150 35.9921985 0.1371511 1.3368640
Cryptobatrachus boulengeri 33.66676 35.1850233 0.1366205 1.2939343
Cryptobatrachus fuhrmanni 33.74201 33.0727893 0.1333313 1.3580929
Hemiphractus bubalus 34.22827 31.9441306 0.1314969 1.3087934
Hemiphractus proboscideus 34.17918 39.4040026 0.1324877 1.4392726
Hemiphractus fasciatus 34.28512 32.9351096 0.1334216 1.3221244
Hemiphractus johnsoni 34.21444 27.1404067 0.1317994 1.1973924
Hemiphractus scutatus 34.16400 38.7997576 0.1318557 1.4503625
Hemiphractus helioi 34.26844 36.2863111 0.1330162 1.6028138
Flectonotus fitzgeraldi 34.10088 57.3206503 0.1306492 2.1409662
Flectonotus pygmaeus 34.08095 40.4822672 0.1339550 1.5550654
Stefania ackawaio 34.08386 41.6758147 0.1331532 1.5532746
Stefania marahuaquensis 34.23736 35.6804466 0.1338820 1.3764149
Stefania ayangannae 34.03543 37.6539858 0.1316300 1.3993803
Stefania coxi 34.12350 39.1022307 0.1325371 1.4546663
Stefania riveroi 34.23898 40.8558366 0.1309428 1.5358726
Stefania riae 34.13665 35.0839663 0.1329381 1.3608106
Stefania oculosa 34.19814 33.4799752 0.1337005 1.3082664
Stefania breweri 34.21609 45.3449456 0.1317543 1.5980490
Stefania goini 34.32170 37.2852913 0.1350790 1.4336905
Stefania evansi 33.61997 40.6906276 0.1333057 1.5000317
Stefania scalae 33.63136 36.1344093 0.1318275 1.3766776
Stefania tamacuarina 33.67274 44.9054728 0.1320995 1.6405485
Stefania roraimae 34.18611 40.0808836 0.1352937 1.5034286
Stefania woodleyi 33.62505 44.1753280 0.1345090 1.6278114
Stefania percristata 34.06346 35.2645697 0.1340645 1.3731597
Stefania schuberti 34.21739 31.8872184 0.1346255 1.2227231
Stefania ginesi 34.17710 32.4808825 0.1332191 1.2676907
Stefania satelles 34.25686 30.7628802 0.1327621 1.1941754
Fritziana fissilis 34.16099 25.4290431 0.1313816 0.9789718
Fritziana ohausi 34.28470 26.4650978 0.1291585 1.0219132
Fritziana goeldii 34.14857 24.7268690 0.1342002 0.9517192
Gastrotheca abdita 34.51552 34.6545764 0.1299871 1.4288581
Gastrotheca andaquiensis 34.56584 23.5809943 0.1281272 0.9898232
Gastrotheca albolineata 34.57962 25.6352730 0.1298539 0.9873758
Gastrotheca ernestoi 34.66122 24.3174161 0.1312579 0.9276907
Gastrotheca fulvorufa 34.49178 29.4431550 0.1312102 1.1429041
Gastrotheca microdiscus 34.60941 25.5402561 0.1309193 0.9953408
Gastrotheca bufona 34.67515 27.0417716 0.1291942 1.1087082
Gastrotheca orophylax 34.67111 17.0220437 0.1321581 0.7419172
Gastrotheca plumbea 34.74530 13.4528106 0.1307451 0.5776861
Gastrotheca monticola 34.61704 21.1744789 0.1300415 0.9649301
Gastrotheca antoniiochoai 34.09274 5.7276409 0.1287888 0.3883122
Gastrotheca excubitor 34.52338 8.7065442 0.1293675 0.4998297
Gastrotheca ochoai 34.55610 6.7128728 0.1276579 0.4095321
Gastrotheca rebeccae 34.57305 10.5338478 0.1300334 0.6137367
Gastrotheca christiani 34.47775 11.6920974 0.1300104 0.5061076
Gastrotheca lauzuricae 34.52446 10.5371604 0.1276594 0.7249293
Gastrotheca chrysosticta 34.50692 13.7222597 0.1285002 0.6038999
Gastrotheca gracilis 34.56504 10.8165197 0.1283245 0.5145499
Gastrotheca griswoldi 34.64950 15.2889359 0.1289115 0.8658442
Gastrotheca marsupiata 34.62355 11.2556627 0.1252733 0.6542410
Gastrotheca peruana 34.65060 12.9704776 0.1309823 0.6725602
Gastrotheca zeugocystis 34.71925 7.7139149 0.1295110 0.4890067
Gastrotheca argenteovirens 34.50982 23.3043458 0.1310027 0.9621841
Gastrotheca trachyceps 35.03534 15.1678023 0.1278924 0.6588496
Gastrotheca aureomaculata 35.03696 20.8021639 0.1300020 0.8638971
Gastrotheca ruizi 34.94694 23.1779787 0.1307120 0.9464769
Gastrotheca dunni 34.97256 15.2805881 0.1294114 0.6839024
Gastrotheca nicefori 34.97905 23.6373251 0.1286049 0.9487338
Gastrotheca ovifera 34.85726 32.2830048 0.1299070 1.2048624
Gastrotheca phalarosa 34.95434 25.6549950 0.1275888 1.1265608
Gastrotheca atympana 34.73194 20.7954446 0.1316460 1.0842008
Gastrotheca testudinea 34.69487 22.7867574 0.1341781 1.0865989
Gastrotheca pacchamama 34.82379 16.1404324 0.1332817 0.9029973
Gastrotheca carinaceps 34.55792 23.9112349 0.1318031 1.1215633
Gastrotheca cornuta 34.58276 29.4483830 0.1319376 1.1470594
Gastrotheca dendronastes 34.60016 32.7404202 0.1303671 1.3235572
Gastrotheca helenae 34.72906 20.7255119 0.1305414 0.9227873
Gastrotheca longipes 34.72895 27.3742739 0.1304180 1.1128383
Gastrotheca guentheri 34.66014 30.7428117 0.1284365 1.2183656
Gastrotheca weinlandii 34.61154 24.2510485 0.1304663 0.9991158
Gastrotheca flamma 34.59701 26.6631112 0.1297532 1.0583976
Gastrotheca walkeri 34.52942 32.5493440 0.1318676 1.2174994
Gastrotheca espeletia 34.62116 28.3031275 0.1294402 1.1932873
Gastrotheca galeata 34.78753 28.2192200 0.1298139 1.2341526
Gastrotheca ossilaginis 34.60371 35.4511880 0.1289539 1.5601059
Gastrotheca piperata 34.62996 22.7151537 0.1314472 1.2239941
Gastrotheca psychrophila 34.76084 20.4800341 0.1296127 0.9040243
Gastrotheca stictopleura 34.55268 20.3249337 0.1314575 1.0048639
Gastrotheca splendens 34.49187 29.5261524 0.1327770 1.3090819
Gastrotheca williamsoni 34.22110 37.1849974 0.1267121 1.3805588
Gastrotheca fissipes 34.59296 30.2933894 0.1305928 1.1902523
Ceuthomantis aracamuni 32.97257 43.1753157 0.1336323 1.5898698
Ceuthomantis cavernibardus 33.38327 45.3885499 0.1373008 1.6606742
Ceuthomantis duellmani 33.40053 38.8911786 0.1381000 1.5143239
Brachycephalus alipioi 33.30038 35.6460847 0.1378796 1.3754189
Brachycephalus hermogenesi 33.33264 21.9299348 0.1369150 0.8396983
Brachycephalus nodoterga 33.32197 21.9903606 0.1366643 0.8398567
Brachycephalus vertebralis 33.30704 26.6640836 0.1382490 1.0291822
Brachycephalus ephippium 33.28044 33.5853700 0.1354015 1.3091142
Brachycephalus brunneus 33.29685 17.9410911 0.1379066 0.7441361
Brachycephalus izecksohni 33.28797 19.0624504 0.1368802 0.7746389
Brachycephalus ferruginus 33.34646 19.0020529 0.1348666 0.7849402
Brachycephalus pernix 33.33639 17.6287230 0.1364256 0.7307519
Brachycephalus pombali 33.35256 18.4599459 0.1364535 0.7654852
Brachycephalus didactylus 33.30648 29.5435096 0.1368015 1.1383836
Ischnocnema bolbodactyla 33.30903 24.1973731 0.1373578 0.9335292
Ischnocnema octavioi 33.29301 28.3181084 0.1358354 1.0834051
Ischnocnema verrucosa 33.21203 29.0420044 0.1385755 1.1257596
Ischnocnema juipoca 33.23612 25.4961078 0.1357755 0.9767278
Ischnocnema spanios 33.26558 23.4379964 0.1386399 0.9334098
Ischnocnema holti 33.25279 25.8471110 0.1378891 0.9674667
Ischnocnema lactea 33.22066 23.7263086 0.1389881 0.9122168
Ischnocnema epipeda 33.26854 38.6397859 0.1369340 1.4982539
Ischnocnema erythromera 33.36710 27.7880672 0.1369651 1.0448100
Ischnocnema guentheri 33.40207 23.3775271 0.1363155 0.9032156
Ischnocnema henselii 33.39599 20.3412054 0.1359400 0.7974926
Ischnocnema izecksohni 33.31401 21.9277052 0.1363505 0.8676826
Ischnocnema nasuta 33.14609 27.7318004 0.1349741 1.0733742
Ischnocnema oea 33.38717 33.7076064 0.1370350 1.3066510
Ischnocnema gehrti 33.33749 19.4576635 0.1361501 0.7551562
Ischnocnema gualteri 33.35102 29.8814599 0.1379621 1.1247292
Ischnocnema hoehnei 33.22889 25.0216474 0.1382141 0.9681161
Ischnocnema venancioi 33.30172 28.7115378 0.1376060 1.0880819
Ischnocnema parva 33.13100 30.8469202 0.1387158 1.1806635
Ischnocnema sambaqui 33.32814 18.4136921 0.1379980 0.7632770
Ischnocnema manezinho 33.32807 18.4417656 0.1380127 0.7467580
Ischnocnema nigriventris 33.23786 19.7955615 0.1384111 0.7674988
Ischnocnema paranaensis 33.24821 17.9959975 0.1353770 0.7476307
Ischnocnema penaxavantinho 33.22492 23.5917040 0.1380943 0.9004356
Ischnocnema pusilla 33.29682 26.1145356 0.1364954 1.0072161
Ischnocnema randorum 33.34734 27.3671130 0.1390678 1.1145228
Adelophryne adiastola 33.51711 41.0170086 0.1394791 1.4183359
Adelophryne gutturosa 33.40044 47.6839116 0.1373160 1.7410893
Adelophryne patamona 33.53229 40.6185118 0.1376247 1.5080327
Adelophryne baturitensis 33.65920 38.6176856 0.1369892 1.4646804
Adelophryne maranguapensis 33.69841 36.8580353 0.1366468 1.3810891
Adelophryne pachydactyla 33.50738 31.1655777 0.1386930 1.2392251
Phyzelaphryne miriamae 33.55165 41.0660959 0.1343612 1.4202560
Diasporus anthrax 33.67504 33.7682123 0.1396770 1.3826545
Diasporus diastema 33.70274 41.6231071 0.1383534 1.5414118
Diasporus hylaeformis 33.74170 36.9207273 0.1370314 1.4151089
Diasporus quidditus 33.72092 45.0857364 0.1390029 1.6991083
Diasporus gularis 33.77150 30.8193147 0.1377158 1.2143280
Diasporus tigrillo 33.77030 22.6838548 0.1375616 1.3273238
Diasporus tinker 33.71304 37.5128454 0.1380057 1.4460792
Diasporus ventrimaculatus 33.78389 32.4957492 0.1372176 1.4420366
Diasporus vocator 33.93977 46.1882315 0.1356614 1.7785940
Eleutherodactylus abbotti 34.19560 76.6903959 0.1365821 2.7889798
Eleutherodactylus audanti 34.16644 77.1753849 0.1375711 2.7867941
Eleutherodactylus parabates 34.09474 88.5348797 0.1393630 3.2397076
Eleutherodactylus haitianus 34.13218 70.9711829 0.1395964 2.6212815
Eleutherodactylus pituinus 34.11873 58.7716689 0.1396248 2.1396545
Eleutherodactylus acmonis 34.19226 68.8355138 0.1374399 2.4966305
Eleutherodactylus bresslerae 34.19291 73.3345262 0.1376827 2.6645703
Eleutherodactylus ricordii 34.20682 84.8754567 0.1375104 3.0639713
Eleutherodactylus grahami 34.17072 65.9577534 0.1337917 2.3367003
Eleutherodactylus rhodesi 34.15481 72.2981788 0.1365707 2.6189534
Eleutherodactylus weinlandi 34.08702 69.0443312 0.1363177 2.5263881
Eleutherodactylus pictissimus 34.14206 79.2793811 0.1376412 2.8696176
Eleutherodactylus lentus 34.05680 53.2739932 0.1401181 1.9690445
Eleutherodactylus monensis 34.04805 66.0321282 0.1378764 2.4457745
Eleutherodactylus probolaeus 34.15993 67.8098791 0.1360203 2.4805456
Eleutherodactylus adelus 35.00125 50.7105258 0.1347276 1.8521599
Eleutherodactylus pezopetrus 35.02178 60.2130758 0.1354191 2.1768813
Eleutherodactylus blairhedgesi 35.12605 45.5610486 0.1332077 1.6694588
Eleutherodactylus thomasi 35.06192 46.3695412 0.1373782 1.6894973
Eleutherodactylus pinarensis 35.05453 46.2616557 0.1378305 1.6854971
Eleutherodactylus casparii 35.25627 42.6612580 0.1365266 1.5426426
Eleutherodactylus guanahacabibes 35.20926 49.3305295 0.1338452 1.7957194
Eleutherodactylus simulans 34.53639 59.9065679 0.1373206 2.1782425
Eleutherodactylus tonyi 35.13255 65.9300254 0.1352619 2.4035457
Eleutherodactylus rogersi 35.17356 41.2410770 0.1365616 1.4960274
Eleutherodactylus goini 35.05567 50.0245958 0.1372652 1.8235221
Eleutherodactylus albipes 34.25515 89.0547297 0.1361641 3.2248712
Eleutherodactylus maestrensis 34.31022 82.0000166 0.1383002 2.9733476
Eleutherodactylus dimidiatus 34.39340 67.7981098 0.1358391 2.4629411
Eleutherodactylus emiliae 34.37713 60.0904067 0.1371572 2.1681272
Eleutherodactylus albolabris 33.97423 26.3211598 0.1388343 1.0210543
Eleutherodactylus alcoae 34.31604 76.2243584 0.1380236 2.7662471
Eleutherodactylus armstrongi 34.09719 82.4847890 0.1384037 2.9951535
Eleutherodactylus leoncei 34.26328 75.4079093 0.1367890 2.7339106
Eleutherodactylus alticola 33.01581 64.1673574 0.1364158 2.3134977
Eleutherodactylus nubicola 32.91943 60.5942750 0.1388863 2.1852605
Eleutherodactylus fuscus 32.93249 65.7719544 0.1369169 2.3927812
Eleutherodactylus junori 32.91370 66.9993406 0.1377689 2.4397747
Eleutherodactylus andrewsi 32.34757 62.3412039 0.1365716 2.2471612
Eleutherodactylus griphus 33.01608 64.4844062 0.1379762 2.3493329
Eleutherodactylus glaucoreius 33.00645 58.0348725 0.1358199 2.1056670
Eleutherodactylus pantoni 33.02377 60.0508929 0.1379543 2.1778367
Eleutherodactylus pentasyringos 32.94606 62.2621595 0.1366010 2.2559140
Eleutherodactylus jamaicensis 32.91497 60.6383508 0.1348369 2.2015530
Eleutherodactylus luteolus 33.05118 71.6617032 0.1362047 2.6061372
Eleutherodactylus cavernicola 33.06467 62.9254586 0.1390614 2.2906738
Eleutherodactylus grabhami 33.11560 71.0286030 0.1396835 2.5823776
Eleutherodactylus sisyphodemus 33.09827 72.8593840 0.1325106 2.6547135
Eleutherodactylus gundlachi 33.17635 62.9231090 0.1375119 2.2795873
Eleutherodactylus amadeus 34.17544 78.7505189 0.1366999 2.8301177
Eleutherodactylus caribe 34.25552 79.9929763 0.1363638 2.9063685
Eleutherodactylus eunaster 34.04570 82.2038964 0.1370432 2.9543053
Eleutherodactylus corona 34.08537 86.1442198 0.1358549 3.1295750
Eleutherodactylus heminota 34.09124 81.7574523 0.1369530 2.9516617
Eleutherodactylus bakeri 34.06073 90.9191653 0.1395704 3.2685873
Eleutherodactylus dolomedes 34.11448 80.9629672 0.1365374 2.9427826
Eleutherodactylus glaphycompus 34.25005 73.1409879 0.1373582 2.6278011
Eleutherodactylus thorectes 34.25213 79.5321115 0.1389329 2.8581871
Eleutherodactylus jugans 34.22544 78.6783529 0.1380853 2.8524280
Eleutherodactylus apostates 34.30705 74.6156796 0.1375506 2.6810590
Eleutherodactylus oxyrhyncus 34.25715 76.5579788 0.1368193 2.7510020
Eleutherodactylus furcyensis 34.23949 72.5807486 0.1358931 2.6338532
Eleutherodactylus rufifemoralis 34.32642 85.1537818 0.1346393 3.1166851
Eleutherodactylus amplinympha 34.76564 52.1956501 0.1338745 1.9738637
Eleutherodactylus martinicensis 34.85868 51.4943363 0.1353800 1.9032658
Eleutherodactylus barlagnei 34.27277 57.0767847 0.1342250 2.1318203
Eleutherodactylus pinchoni 34.79571 53.5232982 0.1369495 1.9968022
Eleutherodactylus angustidigitorum 34.14822 27.0714068 0.1371818 1.1124768
Eleutherodactylus cochranae 35.68667 49.5503530 0.1363806 1.8255627
Eleutherodactylus hedricki 35.66892 51.2594000 0.1364973 1.9062659
Eleutherodactylus schwartzi 35.88839 37.4983447 0.1359282 1.3721762
Eleutherodactylus gryllus 35.80298 45.4362578 0.1353052 1.6898124
Eleutherodactylus cooki 35.66715 50.1059489 0.1383177 1.8607483
Eleutherodactylus locustus 35.72672 48.7952098 0.1369479 1.8107139
Eleutherodactylus atkinsi 34.20496 61.3529731 0.1396300 2.2282589
Eleutherodactylus intermedius 34.14569 76.7429418 0.1364265 2.7683350
Eleutherodactylus varleyi 33.97955 60.5291451 0.1381717 2.1979228
Eleutherodactylus cubanus 34.25196 83.8538130 0.1376569 3.0369511
Eleutherodactylus iberia 34.23556 70.6299507 0.1356487 2.5659451
Eleutherodactylus jaumei 34.23933 81.4395315 0.1372243 2.9454155
Eleutherodactylus limbatus 34.21400 63.5897961 0.1360122 2.3146804
Eleutherodactylus orientalis 34.24879 71.0477500 0.1354361 2.5834101
Eleutherodactylus etheridgei 34.24604 76.1399093 0.1350517 2.7300512
Eleutherodactylus auriculatoides 34.03494 74.2596300 0.1378354 2.7512876
Eleutherodactylus montanus 34.05452 68.5798744 0.1377232 2.5420409
Eleutherodactylus patriciae 34.28123 78.8339374 0.1372248 2.9123482
Eleutherodactylus fowleri 33.99833 73.8635469 0.1384583 2.6766726
Eleutherodactylus lamprotes 33.95746 82.6089315 0.1405603 2.9690275
Eleutherodactylus guantanamera 34.03666 73.1280078 0.1373866 2.6343551
Eleutherodactylus ionthus 34.01713 75.8185078 0.1362259 2.7385903
Eleutherodactylus varians 34.03409 62.2930736 0.1377147 2.2630922
Eleutherodactylus leberi 34.21908 79.1819752 0.1348272 2.8712580
Eleutherodactylus melacara 34.16367 78.4648292 0.1353888 2.8444056
Eleutherodactylus sommeri 34.10231 85.2992348 0.1363152 3.1151709
Eleutherodactylus wetmorei 34.07305 78.0828198 0.1377044 2.8192740
Eleutherodactylus auriculatus 34.05710 60.2108549 0.1356870 2.1878314
Eleutherodactylus principalis 34.04368 73.6854526 0.1355340 2.6718759
Eleutherodactylus glamyrus 34.05442 78.0962873 0.1387500 2.8216037
Eleutherodactylus bartonsmithi 34.07341 66.6496879 0.1384803 2.4157121
Eleutherodactylus mariposa 34.13386 73.2025927 0.1361783 2.6461370
Eleutherodactylus ronaldi 34.07737 84.6018135 0.1362627 3.0618915
Eleutherodactylus eileenae 34.09105 61.9684009 0.1381573 2.2532410
Eleutherodactylus ruthae 34.15409 75.9627480 0.1337257 2.7851547
Eleutherodactylus hypostenor 35.14163 86.7553606 0.1348429 3.1671040
Eleutherodactylus parapelates 35.14228 78.7809204 0.1370150 2.8307548
Eleutherodactylus chlorophenax 34.16898 78.7717883 0.1394919 2.8314935
Eleutherodactylus nortoni 34.06726 93.0397171 0.1356821 3.3592794
Eleutherodactylus inoptatus 34.13071 70.9958686 0.1386482 2.5929060
Eleutherodactylus brevirostris 34.22747 86.9732385 0.1380891 3.1257339
Eleutherodactylus ventrilineatus 34.21584 82.3612534 0.1356437 2.9601442
Eleutherodactylus glandulifer 33.50925 81.6321217 0.1353736 2.9325431
Eleutherodactylus sciagraphus 34.18256 80.6766765 0.1351904 2.9297432
Eleutherodactylus counouspeus 34.23031 79.5408552 0.1358981 2.8583363
Eleutherodactylus cuneatus 34.13848 80.7052337 0.1377659 2.9215853
Eleutherodactylus turquinensis 33.47824 75.3679691 0.1351991 2.7338769
Eleutherodactylus cystignathoides 34.11010 26.2224468 0.1374746 1.0701787
Eleutherodactylus nitidus 34.26001 24.0342524 0.1366349 0.9814810
Eleutherodactylus pipilans 34.16562 28.3393238 0.1373181 1.0603717
Eleutherodactylus marnockii 34.22803 19.7703772 0.1408141 0.7985254
Eleutherodactylus symingtoni 34.14253 56.1196473 0.1379990 2.0450244
Eleutherodactylus zeus 34.11312 58.2242646 0.1357702 2.1230366
Eleutherodactylus dennisi 34.14548 25.7218422 0.1380123 1.0678177
Eleutherodactylus dilatus 34.16681 23.9285533 0.1373832 0.9388503
Eleutherodactylus diplasius 33.87868 78.6098878 0.1391345 2.8252608
Eleutherodactylus flavescens 34.16800 70.6613606 0.1376350 2.6038762
Eleutherodactylus grandis 34.09815 14.3228542 0.1366509 0.7057085
Eleutherodactylus greyi 34.10643 60.6691924 0.1379047 2.2004891
Eleutherodactylus guttilatus 34.27201 20.9816579 0.1358491 0.9137672
Eleutherodactylus interorbitalis 34.25566 17.1918329 0.1376943 0.6891302
Eleutherodactylus juanariveroi 34.04331 71.6911179 0.1373299 2.6545609
Eleutherodactylus klinikowskii 34.04589 63.9685225 0.1364940 2.3323114
Eleutherodactylus zugi 34.18544 55.0671308 0.1377547 2.0071290
Eleutherodactylus paralius 34.25252 73.6385599 0.1374949 2.7080984
Eleutherodactylus leprus 34.13239 25.1702035 0.1351682 0.9452428
Eleutherodactylus longipes 34.24932 20.7187645 0.1351860 0.8674530
Eleutherodactylus maurus 34.06991 20.1831657 0.1388656 0.8498321
Eleutherodactylus michaelschmidi 34.16529 77.8572012 0.1355058 2.8211181
Eleutherodactylus minutus 34.26385 70.3165984 0.1339219 2.6066321
Eleutherodactylus poolei 34.14585 72.8558017 0.1362629 2.6413594
Eleutherodactylus modestus 34.12113 28.6223621 0.1410178 1.0855799
Eleutherodactylus notidodes 34.24065 89.3138355 0.1376222 3.2704390
Eleutherodactylus pallidus 34.28849 24.7443954 0.1357858 0.9686514
Eleutherodactylus paulsoni 34.16458 75.6123631 0.1370396 2.7193591
Eleutherodactylus unicolor 33.45074 57.1274136 0.1383278 2.1231752
Eleutherodactylus verruculatus 33.43880 33.4774865 0.1390113 1.2981615
Eleutherodactylus riparius 34.19333 64.6715284 0.1356640 2.3528637
Eleutherodactylus rivularis 33.49852 82.6897142 0.1392230 2.9968552
Eleutherodactylus rubrimaculatus 34.06339 25.4110221 0.1372637 0.9615723
Eleutherodactylus rufescens 34.19602 31.9847543 0.1367656 1.2834953
Eleutherodactylus saxatilis 34.14346 17.2655143 0.1376637 0.7117833
Eleutherodactylus semipalmatus 33.59104 77.4961810 0.1375850 2.8152207
Eleutherodactylus syristes 34.19424 23.5073865 0.1326690 0.9140743
Eleutherodactylus teretistes 34.29862 27.0413894 0.1337991 1.0350234
Eleutherodactylus tetajulia 34.16412 71.8157804 0.1346562 2.6102357
Eleutherodactylus toa 33.61037 78.4808731 0.1374701 2.8445490
Eleutherodactylus verrucipes 34.19577 22.5662590 0.1385539 0.9647845
Eleutherodactylus warreni 34.26238 72.3930523 0.1374461 2.6281541
Craugastor stadelmani 32.54460 44.8317663 0.1379641 1.7006892
Craugastor alfredi 32.85835 31.3930176 0.1391476 1.1571501
Craugastor amniscola 32.36895 23.5775582 0.1380888 0.9138948
Craugastor batrachylus 33.03946 28.7285461 0.1377177 1.2026252
Craugastor cuaquero 33.04162 37.0803480 0.1385456 1.3381668
Craugastor melanostictus 33.02351 39.4236727 0.1398068 1.4886887
Craugastor emcelae 32.97345 56.6851125 0.1404182 2.0235056
Craugastor angelicus 32.52642 38.2053963 0.1370338 1.3775607
Craugastor rugulosus 32.31670 28.5446470 0.1383769 1.0793734
Craugastor ranoides 32.39132 40.5159959 0.1350330 1.4782330
Craugastor fleischmanni 32.37784 35.9455317 0.1398375 1.2965041
Craugastor rupinius 32.93959 29.2822312 0.1376742 1.0977649
Craugastor obesus 32.44713 52.9833879 0.1377967 1.8905620
Craugastor megacephalus 32.93500 39.5198393 0.1373078 1.4683340
Craugastor aphanus 33.13679 38.6882175 0.1388923 1.5178784
Craugastor augusti 33.04495 20.8096166 0.1350989 0.8618718
Craugastor tarahumaraensis 33.01960 16.3792391 0.1383896 0.6748367
Craugastor polymniae 32.89774 15.7222882 0.1394241 0.6929358
Craugastor aurilegulus 32.40371 48.7612518 0.1370779 1.8535727
Craugastor azueroensis 32.52390 61.4918045 0.1372537 2.3356449
Craugastor vocalis 32.98812 20.9623035 0.1385180 0.8382171
Craugastor berkenbuschii 32.43783 25.6806058 0.1389558 1.0130943
Craugastor vulcani 32.39074 28.4365141 0.1380027 1.0396822
Craugastor bocourti 32.92133 25.3243751 0.1372032 0.9699198
Craugastor spatulatus 33.04887 22.9400257 0.1380450 0.9137511
Craugastor stuarti 32.34121 27.1460077 0.1387208 1.0443087
Craugastor uno 33.02721 29.1827040 0.1395668 1.1249821
Craugastor xucanebi 33.03407 24.4639064 0.1385753 0.9570893
Craugastor bransfordii 33.09500 34.9150158 0.1363967 1.3044643
Craugastor polyptychus 33.09647 34.5327202 0.1370455 1.4202570
Craugastor underwoodi 33.07727 37.6030536 0.1363851 1.4603536
Craugastor lauraster 32.98463 32.4477726 0.1405734 1.2090412
Craugastor stejnegerianus 33.01010 41.5224498 0.1388932 1.7338913
Craugastor persimilis 33.13160 34.0726449 0.1378908 1.3984726
Craugastor brocchi 32.47756 26.1601030 0.1379676 1.0268556
Craugastor gollmeri 33.04251 43.4232567 0.1388766 1.6201393
Craugastor chac 33.00962 33.7352821 0.1382157 1.2739807
Craugastor lineatus 32.97425 25.1022669 0.1423376 0.9548249
Craugastor laticeps 33.01585 32.0847510 0.1387118 1.1922721
Craugastor mimus 33.02388 35.2997130 0.1391593 1.3264720
Craugastor noblei 33.06979 36.4392593 0.1402555 1.3586909
Craugastor campbelli 32.90334 38.7923000 0.1397026 1.5224498
Craugastor decoratus 32.88711 23.5181324 0.1393569 0.9584475
Craugastor charadra 32.43189 29.9327514 0.1360710 1.1348674
Craugastor opimus 32.98083 43.9830088 0.1381550 1.6604917
Craugastor chingopetaca 33.09325 34.9026178 0.1385504 1.2594097
Craugastor hobartsmithi 33.09049 25.1657294 0.1356426 0.9948942
Craugastor pelorus 32.43279 34.3136805 0.1405464 1.2262817
Craugastor coffeus 32.99070 36.8212510 0.1355017 1.4089640
Craugastor pozo 33.01953 26.3277944 0.1374691 0.9618698
Craugastor talamancae 33.68696 33.0203920 0.1373429 1.2264611
Craugastor raniformis 33.86502 27.9913133 0.1374773 1.0694514
Craugastor taurus 32.22367 53.9575559 0.1377025 1.9683146
Craugastor cyanochthebius 32.92284 44.4367521 0.1374627 1.7441489
Craugastor silvicola 33.14492 29.1285717 0.1346024 1.0352862
Craugastor escoces 32.44561 43.4481788 0.1359770 1.5670803
Craugastor nefrens 33.04722 42.3447755 0.1360166 1.6630943
Craugastor podiciferus 33.01987 33.9969288 0.1380213 1.3200426
Craugastor glaucus 33.12726 34.4469264 0.1371570 1.2684859
Craugastor monnichorum 33.05331 50.9654457 0.1393656 1.8818193
Craugastor greggi 32.52343 19.4123964 0.1371735 0.8095799
Craugastor guerreroensis 33.11791 21.8409880 0.1338076 0.8566576
Craugastor montanus 33.03742 24.9624916 0.1363767 0.9282526
Craugastor gulosus 33.01284 37.7253758 0.1405307 1.5472147
Craugastor laevissimus 32.45304 34.6010495 0.1393995 1.2984763
Craugastor inachus 32.48136 32.1334212 0.1383839 1.1813018
Craugastor mexicanus 32.40634 23.3418758 0.1408477 0.9369822
Craugastor omiltemanus 32.48007 25.4847283 0.1392213 0.9967778
Craugastor rugosus 32.55895 34.4811323 0.1385017 1.3788806
Craugastor tabasarae 34.91731 40.4133754 0.1351445 1.5147262
Craugastor rayo 34.46486 18.2233854 0.1362573 1.0584899
Craugastor matudai 33.04772 24.1811164 0.1350177 0.9222646
Craugastor yucatanensis 33.07091 48.7303341 0.1356898 1.7572805
Craugastor megalotympanum 33.08394 27.5424818 0.1401974 1.0085666
Craugastor rivulus 32.57216 24.5437395 0.1348465 0.9834539
Craugastor milesi 32.42644 36.4114977 0.1381337 1.4278034
Craugastor sandersoni 32.45310 41.9619112 0.1363635 1.5846957
Craugastor occidentalis 33.00712 23.2594663 0.1378412 0.9228384
Craugastor palenque 32.45036 25.4639851 0.1383190 0.9617506
Craugastor pygmaeus 33.08485 26.7490052 0.1367078 1.0271019
Craugastor pechorum 32.49705 51.0783966 0.1393804 1.9324618
Craugastor rostralis 33.06383 30.6416837 0.1377206 1.1567857
Craugastor sabrinus 33.04590 38.5898198 0.1375365 1.4434965
Craugastor psephosypharus 32.99635 32.9182797 0.1395676 1.2408720
Craugastor taylori 33.01306 33.1837623 0.1396888 1.1747134
Craugastor emleni 33.06084 24.9537659 0.1377288 0.9757055
Craugastor daryi 32.11286 23.8949959 0.1364409 0.9380682
Haddadus aramunha 32.14352 20.5280869 0.1419641 0.8286955
Haddadus plicifer 32.23821 37.1005038 0.1365546 1.4350708
Haddadus binotatus 32.19703 25.2466605 0.1412767 0.9762676
Atopophrynus syntomopus 30.40407 26.2409352 0.1435007 1.1374410
Lynchius flavomaculatus 31.05335 20.3001025 0.1410373 0.8840710
Lynchius parkeri 31.06531 29.5991143 0.1422289 1.2930717
Lynchius nebulanastes 31.00911 30.5155513 0.1420281 1.3317674
Lynchius simmonsi 31.00131 23.6212170 0.1416692 0.9130420
Oreobates choristolemma 30.63426 20.4929917 0.1435685 1.0252949
Oreobates sanderi 30.49013 18.4007066 0.1445349 0.9651658
Oreobates sanctaecrucis 30.72970 26.0937158 0.1443957 1.1676830
Oreobates discoidalis 31.26671 12.2145187 0.1426223 0.6057706
Oreobates ibischi 31.20331 21.8903035 0.1432378 1.0031578
Oreobates madidi 31.57724 26.0250394 0.1397522 1.2381649
Oreobates crepitans 31.02233 24.3533452 0.1439698 0.8633323
Oreobates heterodactylus 31.00478 24.5159946 0.1419569 0.8648747
Oreobates zongoensis 30.98797 18.1487598 0.1414221 1.0068208
Oreobates ayacucho 30.05873 8.6003057 0.1442044 0.4629368
Oreobates pereger 30.11452 15.9480006 0.1448353 0.9484073
Oreobates lehri 28.86025 12.1998367 0.1480912 0.6823610
Oreobates saxatilis 32.58474 20.7626925 0.1421630 0.9864399
Oreobates lundbergi 30.96600 23.9341056 0.1403660 1.1244708
Phrynopus auriculatus 30.94564 21.7371775 0.1458508 1.0165771
Phrynopus barthlenae 31.02695 20.5312930 0.1417058 1.0664669
Phrynopus horstpauli 30.83386 18.8120775 0.1448950 0.9603277
Phrynopus bracki 30.99864 24.8311009 0.1434229 1.1669239
Phrynopus bufoides 31.00962 27.2046414 0.1430047 1.2775163
Phrynopus dagmarae 31.09069 21.1616454 0.1428701 1.0570421
Phrynopus heimorum 31.11492 13.7647467 0.1435079 0.7864765
Phrynopus juninensis 31.10100 21.1436886 0.1404008 1.2392884
Phrynopus kauneorum 31.12668 17.3581274 0.1425808 0.8806904
Phrynopus kotosh 31.10345 10.1806788 0.1409672 0.6415663
Phrynopus miroslawae 31.08431 24.3708998 0.1438048 1.1481364
Phrynopus montium 31.08734 24.3510930 0.1449391 1.4289828
Phrynopus nicoleae 31.04121 24.2113104 0.1425874 1.1371319
Phrynopus oblivius 31.07902 22.3814578 0.1440299 1.3120083
Phrynopus paucari 30.94626 26.5086479 0.1435683 1.2423607
Phrynopus peruanus 31.05001 24.2558208 0.1410505 1.4208783
Phrynopus pesantesi 30.98881 24.6460823 0.1429989 1.1554234
Phrynopus tautzorum 31.09016 19.6199269 0.1432684 1.0166757
Phrynopus thompsoni 31.05169 26.7655932 0.1422638 1.1888917
Phrynopus tribulosus 30.99638 25.0626384 0.1419077 1.1764501
Pristimantis aaptus 30.95994 37.2030331 0.1428969 1.2672434
Pristimantis acatallelus 31.02705 32.1152779 0.1400274 1.2964490
Pristimantis acerus 31.02550 12.3832311 0.1399670 0.5831368
Pristimantis lymani 33.58544 23.3295034 0.1369500 0.9756402
Pristimantis achuar 31.05306 33.6155247 0.1432525 1.2956451
Pristimantis actinolaimus 30.96865 31.3553826 0.1441149 1.3595317
Pristimantis acuminatus 30.95901 29.5025306 0.1406255 1.1589599
Pristimantis acutirostris 30.93173 24.5787460 0.1410068 1.1036814
Pristimantis adiastolus 31.11892 25.1628478 0.1405954 1.1866906
Pristimantis aemulatus 30.97097 39.9816661 0.1428983 1.5111978
Pristimantis affinis 30.97316 26.7545320 0.1432875 1.1499077
Pristimantis alalocophus 30.87875 24.8399306 0.1422200 1.0967516
Pristimantis albertus 31.10975 21.0345578 0.1432981 1.0955798
Pristimantis altae 31.10450 36.9209426 0.1412287 1.4076376
Pristimantis pardalis 31.11355 49.3030010 0.1411488 1.8671264
Pristimantis altamazonicus 31.16287 35.3392159 0.1417507 1.3012572
Pristimantis altamnis 31.03799 26.2958542 0.1408640 1.0981102
Pristimantis kichwarum 31.19753 24.2103057 0.1424735 0.9810199
Pristimantis amydrotus 31.02993 40.4142411 0.1387836 1.6497648
Pristimantis anemerus 31.03599 28.2176326 0.1424342 1.2369122
Pristimantis angustilineatus 31.05913 35.1433965 0.1413532 1.4390497
Pristimantis brevifrons 31.01253 27.6516291 0.1426514 1.1544845
Pristimantis aniptopalmatus 31.15142 23.7081778 0.1429563 1.1116588
Pristimantis anolirex 31.07175 27.3743792 0.1410377 1.1675032
Pristimantis lutitus 31.09801 28.2869077 0.1404867 1.1990568
Pristimantis merostictus 30.99038 29.5944726 0.1424692 1.2853439
Pristimantis apiculatus 31.04317 19.9597526 0.1425599 0.8760373
Pristimantis appendiculatus 31.06541 19.0155735 0.1428780 0.8409400
Pristimantis aquilonaris 31.17808 30.9646073 0.1435307 1.3229092
Pristimantis ardalonychus 31.06247 24.7398071 0.1417702 1.1003935
Pristimantis atrabracus 31.10902 33.1005603 0.1406093 1.3656788
Pristimantis atratus 31.00365 20.2336312 0.1396026 0.8712450
Pristimantis aurantiguttatus 30.99009 41.5982567 0.1409746 1.5897359
Pristimantis aureolineatus 30.92176 32.7261235 0.1424466 1.2300623
Pristimantis aureoventris 30.87043 32.3252216 0.1442124 1.2086975
Pristimantis jester 30.94281 34.6005518 0.1393975 1.2835393
Pristimantis avicuporum 31.07202 30.6938180 0.1427237 1.2625471
Pristimantis avius 31.02279 36.0548125 0.1390048 1.3170407
Pristimantis bacchus 31.03811 24.9611577 0.1432617 1.1041283
Pristimantis baiotis 31.03474 39.4088515 0.1413999 1.4918856
Pristimantis balionotus 30.81574 21.0365375 0.1424633 0.9274955
Pristimantis bambu 30.92799 13.8593682 0.1410047 0.6659163
Pristimantis simonbolivari 31.14823 15.5351711 0.1409164 0.6925558
Pristimantis baryecuus 30.96588 17.9520077 0.1425589 0.7708194
Pristimantis batrachites 31.03453 24.3496435 0.1411403 1.0884552
Pristimantis bearsei 30.57383 37.5718450 0.1402095 1.5500493
Pristimantis bellator 30.92736 28.4994290 0.1421808 1.2129472
Pristimantis bellona 30.91696 40.2918659 0.1421661 1.5200168
Pristimantis bicumulus 31.10025 37.4609995 0.1409600 1.4060560
Pristimantis bipunctatus 31.19477 29.7655853 0.1399146 1.4733341
Pristimantis boulengeri 30.95917 30.9816412 0.1432564 1.2956178
Pristimantis simoterus 31.18782 26.8643573 0.1414538 1.1897259
Pristimantis chloronotus 30.99825 21.0683397 0.1419105 0.9168338
Pristimantis bromeliaceus 30.86549 23.0566865 0.1414344 1.0024918
Pristimantis buckleyi 29.41748 21.5701118 0.1440273 0.8922839
Pristimantis cabrerai 30.94467 26.6444778 0.1429298 1.0920688
Pristimantis cacao 31.16323 19.5951888 0.1411689 0.8499632
Pristimantis caeruleonotus 31.03145 29.6069015 0.1415763 1.2329962
Pristimantis cajamarcensis 31.00148 28.4707168 0.1426197 1.2252203
Pristimantis calcaratus 31.19696 34.6535559 0.1432507 1.4097169
Pristimantis calcarulatus 30.87311 16.7416286 0.1414114 0.7196606
Pristimantis cantitans 31.08417 37.2044163 0.1398356 1.3770015
Pristimantis capitonis 31.20890 25.3271254 0.1412860 1.0547215
Pristimantis caprifer 31.03352 35.0222419 0.1410470 1.3993003
Pristimantis carlossanchezi 30.98460 30.9783634 0.1397317 1.2808453
Pristimantis carmelitae 31.15569 30.4831321 0.1413436 1.0786346
Pristimantis carranguerorum 31.25381 21.8134727 0.1380979 0.9600976
Pristimantis lynchi 31.15393 25.0259858 0.1405114 1.1141361
Pristimantis caryophyllaceus 31.24009 36.9405566 0.1384617 1.3786685
Pristimantis celator 30.89284 20.6153495 0.1415571 0.8718425
Pristimantis cerasinus 31.06272 38.3138345 0.1421030 1.4245649
Pristimantis ceuthospilus 30.99335 34.5828807 0.1431215 1.4589830
Pristimantis chalceus 31.09815 30.7954614 0.1431853 1.2228797
Pristimantis charlottevillensis 31.15658 79.0619032 0.1430672 2.9625604
Pristimantis chiastonotus 31.11341 40.7042320 0.1420649 1.4782386
Pristimantis chimu 30.93309 45.6842114 0.1437884 1.8647202
Pristimantis chrysops 30.95494 34.9657504 0.1410602 1.4219056
Pristimantis citriogaster 30.62897 25.6361752 0.1393321 1.0759542
Pristimantis malkini 31.22066 34.0979980 0.1418956 1.2427784
Pristimantis colodactylus 31.02357 22.5702050 0.1410491 0.9621669
Pristimantis colomai 32.93913 18.6425875 0.1407217 0.7931583
Pristimantis colonensis 31.00632 28.8610059 0.1431424 1.1933034
Pristimantis colostichos 31.04084 33.5923418 0.1421005 1.3069882
Pristimantis condor 31.01457 21.1184165 0.1388079 0.8965223
Pristimantis paramerus 31.15880 35.0137152 0.1408077 1.3229796
Pristimantis cordovae 31.16194 20.0028159 0.1436338 0.9589794
Pristimantis corniger 31.02328 36.3688192 0.1433105 1.4424695
Pristimantis coronatus 31.03566 31.6592002 0.1422709 1.3499494
Pristimantis corrugatus 30.97727 24.3656389 0.1434329 1.1305623
Pristimantis cosnipatae 30.95193 7.6168291 0.1411423 0.5180947
Pristimantis cremnobates 30.44370 26.7569728 0.1463648 1.1228828
Pristimantis labiosus 31.17826 21.9126590 0.1422062 0.8931156
Pristimantis cristinae 30.88459 29.2485436 0.1414059 1.0757136
Pristimantis croceoinguinis 31.06083 30.8948159 0.1420859 1.1830624
Pristimantis crucifer 31.14937 27.8871191 0.1420879 1.1570619
Pristimantis cruciocularis 31.10232 32.6326170 0.1438612 1.5287425
Pristimantis cruentus 31.08236 43.2159564 0.1412237 1.6058982
Pristimantis cryophilius 31.15515 17.0449637 0.1409967 0.7169602
Pristimantis cryptomelas 31.16007 21.7266719 0.1420954 0.9377878
Pristimantis cuentasi 31.01403 25.8834269 0.1424709 0.9643038
Pristimantis cuneirostris 30.96409 29.8044873 0.1433572 1.2272826
Pristimantis gentryi 31.40691 11.8101416 0.1422761 0.5176634
Pristimantis truebae 31.23313 11.3262511 0.1431146 0.5034856
Pristimantis degener 30.89072 23.0006242 0.1437536 0.9928935
Pristimantis deinops 31.01503 31.8307929 0.1408342 1.2933234
Pristimantis delicatus 30.97379 33.6232031 0.1389803 1.1903973
Pristimantis delius 31.12685 31.7619861 0.1409002 1.1603182
Pristimantis dendrobatoides 30.95337 38.8781100 0.1446995 1.4416745
Pristimantis devillei 30.93010 15.2608702 0.1420018 0.6951410
Pristimantis surdus 31.10737 13.1757987 0.1411520 0.6420217
Pristimantis diadematus 30.87864 33.9074858 0.1454086 1.3609584
Pristimantis diaphonus 30.95767 35.2797427 0.1448384 1.4094873
Pristimantis diogenes 30.59947 31.6922415 0.1387077 1.3001261
Pristimantis dissimulatus 30.96219 10.6822216 0.1393313 0.5288955
Pristimantis divnae 30.89074 21.7218139 0.1425388 1.1306351
Pristimantis dorsopictus 31.01974 22.1717376 0.1406153 1.0261234
Pristimantis duellmani 31.03791 24.0969444 0.1416439 1.0391486
Pristimantis quinquagesimus 31.02702 20.1027963 0.1394137 0.8516707
Pristimantis duende 31.12746 38.2836313 0.1420369 1.5812650
Pristimantis dundeei 30.98373 32.0687946 0.1421031 1.2073473
Pristimantis epacrus 31.13871 34.4603154 0.1430720 1.3692084
Pristimantis eremitus 31.05696 19.8995859 0.1388207 0.8727069
Pristimantis eriphus 30.88579 18.0022558 0.1433050 0.7859408
Pristimantis ernesti 30.96070 27.8789449 0.1428195 1.1666442
Pristimantis erythropleura 30.95855 33.2708610 0.1402391 1.3678111
Pristimantis esmeraldas 31.00188 31.1101486 0.1412322 1.2529121
Pristimantis eugeniae 31.01564 17.3497239 0.1407453 0.7705952
Pristimantis euphronides 31.10420 55.4705066 0.1425644 1.9878044
Pristimantis shrevei 31.03947 62.6456620 0.1388183 2.3031677
Pristimantis eurydactylus 30.89513 37.3792488 0.1412482 1.3321057
Pristimantis exoristus 31.11290 32.5521196 0.1396677 1.3071759
Pristimantis factiosus 31.02638 29.0847804 0.1417635 1.2248051
Pristimantis fasciatus 31.11034 30.9478806 0.1417463 1.1414593
Pristimantis fetosus 30.98010 28.0848159 0.1414207 1.2142406
Pristimantis floridus 30.97654 10.7545091 0.1422311 0.5384819
Pristimantis gaigei 31.11979 39.2503184 0.1396281 1.5303223
Pristimantis galdi 30.89531 23.7534747 0.1421262 1.0024282
Pristimantis ganonotus 31.04577 11.4329810 0.1415401 0.5615751
Pristimantis gladiator 32.09258 19.8547177 0.1407485 0.8669631
Pristimantis glandulosus 31.12857 16.1265285 0.1430663 0.7313217
Pristimantis inusitatus 30.97910 15.8326305 0.1423543 0.7186755
Pristimantis gracilis 31.03441 33.0100886 0.1363854 1.3977053
Pristimantis grandiceps 30.98616 25.0017438 0.1411065 1.1079352
Pristimantis gutturalis 31.03603 43.8059575 0.1434507 1.5865285
Pristimantis hectus 31.03819 19.2007100 0.1431320 0.8401856
Pristimantis helvolus 30.94958 26.9358098 0.1431268 1.1387968
Pristimantis hernandezi 30.90182 25.2623794 0.1432197 1.0338119
Pristimantis huicundo 31.01221 22.8578875 0.1430645 1.0129607
Pristimantis hybotragus 30.96826 35.5914915 0.1409165 1.4197549
Pristimantis ignicolor 30.95864 15.8921168 0.1421994 0.7204050
Pristimantis illotus 31.00542 18.1408776 0.1413864 0.8149204
Pristimantis imitatrix 31.17198 35.8426560 0.1429683 1.5922203
Pristimantis incanus 31.10567 17.7980146 0.1427471 0.8087484
Pristimantis infraguttatus 30.87681 16.8190598 0.1431446 0.8131664
Pristimantis inguinalis 30.97935 33.9561596 0.1428909 1.2313619
Pristimantis insignitus 31.12924 29.2764024 0.1436091 1.0798418
Pristimantis ixalus 30.49587 35.3385936 0.1418652 1.4322975
Pristimantis jaimei 31.00442 27.9871144 0.1403284 1.1458831
Pristimantis johannesdei 31.03024 36.1278311 0.1405464 1.4223960
Pristimantis jorgevelosai 30.41636 27.7473935 0.1429881 1.1724203
Pristimantis juanchoi 31.08469 33.9087260 0.1405530 1.3806122
Pristimantis palmeri 31.08964 29.6292785 0.1427813 1.2298588
Pristimantis jubatus 31.01363 28.4354079 0.1404870 1.1682270
Pristimantis kareliae 30.62263 31.4207196 0.1420042 1.1652421
Pristimantis katoptroides 30.98854 20.6591759 0.1401472 0.8655198
Pristimantis lacrimosus 31.02499 35.2857229 0.1400527 1.4349018
Pristimantis lanthanites 31.15526 36.2419637 0.1413025 1.3310129
Pristimantis thectopternus 30.96342 27.5176553 0.1387615 1.1506663
Pristimantis lasalleorum 30.99091 38.1523427 0.1412322 1.4455790
Pristimantis lemur 30.94577 29.5296102 0.1426418 1.2089632
Pristimantis leoni 31.17578 20.4060313 0.1410074 0.8917304
Pristimantis leptolophus 30.99297 32.8452337 0.1415071 1.3396492
Pristimantis leucopus 30.94169 22.3285497 0.1424323 0.9692936
Pristimantis librarius 29.52542 24.7320189 0.1429483 0.9607851
Pristimantis lichenoides 30.56387 27.7422474 0.1416321 1.2033160
Pristimantis lirellus 30.85436 25.3456675 0.1393980 1.0699250
Pristimantis lividus 30.92449 16.0975712 0.1421044 0.7362307
Pristimantis llojsintuta 31.06710 24.8913510 0.1395217 1.2775557
Pristimantis loustes 31.03870 22.8780460 0.1418456 0.9787711
Pristimantis lucasi 30.95016 22.3386536 0.1431706 1.0447456
Pristimantis luscombei 30.99602 31.9487270 0.1432344 1.2146376
Pristimantis luteolateralis 30.94180 10.9410833 0.1400919 0.5452063
Pristimantis walkeri 31.05436 20.7722034 0.1419659 0.8629004
Pristimantis lythrodes 31.06595 41.5520988 0.1408350 1.4174492
Pristimantis maculosus 30.88284 22.1050325 0.1458932 1.0201969
Pristimantis marahuaka 31.09973 36.0792122 0.1406780 1.3917722
Pristimantis marmoratus 31.15084 37.1581950 0.1431021 1.3582951
Pristimantis pulvinatus 30.99623 32.0297065 0.1408281 1.1998580
Pristimantis mars 31.13492 29.9757437 0.1410705 1.2998724
Pristimantis martiae 31.14181 33.9794823 0.1428153 1.2430232
Pristimantis megalops 31.28653 28.5724611 0.1393332 1.0535391
Pristimantis melanogaster 31.11472 29.9788783 0.1411899 1.3623086
Pristimantis melanoproctus 30.89197 24.7123419 0.1402746 1.0987402
Pristimantis memorans 30.57459 38.7427324 0.1426958 1.4201082
Pristimantis mendax 30.97976 25.3237794 0.1400269 1.2093054
Pristimantis meridionalis 30.97244 15.3689050 0.1430115 0.7427748
Pristimantis metabates 30.50830 27.8598748 0.1416548 1.1114250
Pristimantis minutulus 30.92100 30.5944178 0.1395620 1.3868822
Pristimantis miyatai 30.98044 24.7035167 0.1426732 1.0581394
Pristimantis mnionaetes 30.99009 23.2522444 0.1417250 1.0267805
Pristimantis modipeplus 31.00112 14.5615419 0.1393807 0.6449877
Pristimantis molybrignus 30.92677 31.0381219 0.1409734 1.2670585
Pristimantis mondolfii 30.98396 24.5716902 0.1410532 1.0927788
Pristimantis moro 31.04167 40.6527797 0.1401642 1.4894951
Pristimantis muricatus 30.99879 19.3788663 0.1418374 0.8340209
Pristimantis muscosus 30.47629 27.5694699 0.1393743 1.1638503
Pristimantis museosus 30.85969 47.6611803 0.1424272 1.7378639
Pristimantis myersi 31.10556 26.0797398 0.1419671 1.0869093
Pristimantis myops 31.09031 38.7731987 0.1435862 1.5991370
Pristimantis nephophilus 31.00351 27.5857737 0.1405419 1.1682081
Pristimantis nicefori 30.95316 24.4018390 0.1419596 1.0582320
Pristimantis nigrogriseus 30.56277 18.0240662 0.1405156 0.7865081
Pristimantis nyctophylax 30.99949 15.6362817 0.1427595 0.6716046
Pristimantis subsigillatus 31.04304 28.9475421 0.1397987 1.1571046
Pristimantis obmutescens 30.94886 27.4318754 0.1422884 1.1432767
Pristimantis ocellatus 30.94326 29.2316722 0.1419846 1.2047933
Pristimantis ocreatus 32.16620 24.6420530 0.1418018 1.1112376
Pristimantis thymelensis 31.21232 20.4512962 0.1419016 0.9122795
Pristimantis pyrrhomerus 31.22721 19.9091226 0.1405021 0.8555781
Pristimantis olivaceus 31.03730 26.1817107 0.1396743 1.2909148
Pristimantis orcesi 30.95721 13.1145989 0.1441066 0.6231991
Pristimantis orcus 31.01646 35.0385029 0.1407863 1.3142737
Pristimantis orestes 31.09210 18.4353512 0.1433152 0.7741260
Pristimantis ornatissimus 31.12050 20.0956209 0.1425152 0.8658250
Pristimantis ornatus 31.09393 24.0478056 0.1404676 1.1306961
Pristimantis orpacobates 31.02967 33.3363512 0.1423085 1.3467948
Pristimantis orphnolaimus 30.98756 33.0610276 0.1427460 1.2607054
Pristimantis ortizi 31.05697 21.6701433 0.1421378 0.9749166
Pristimantis padrecarlosi 30.48498 30.8618487 0.1383178 1.2806937
Pristimantis paisa 30.54892 23.5428405 0.1424895 1.0840128
Pristimantis pardalinus 31.13152 24.5383503 0.1427251 1.4377926
Pristimantis parectatus 30.96102 25.7633283 0.1433979 1.1350445
Pristimantis parvillus 31.17982 23.2446669 0.1411135 0.9405880
Pristimantis pastazensis 31.08526 15.0864337 0.1396667 0.6723420
Pristimantis pataikos 30.96814 24.4920676 0.1394702 1.1278775
Pristimantis paulodutrai 31.04842 24.7864975 0.1398485 0.9781370
Pristimantis paululus 31.14335 25.8415530 0.1410945 1.0429326
Pristimantis pecki 30.86925 23.6925658 0.1420322 0.9757362
Pristimantis pedimontanus 31.17358 30.0254388 0.1418013 1.1746082
Pristimantis penelopus 30.98589 31.4197683 0.1433690 1.2376760
Pristimantis peraticus 31.20949 35.4678967 0.1423991 1.4100212
Pristimantis percnopterus 30.95001 29.5502153 0.1414836 1.2552033
Pristimantis percultus 30.94087 21.9192782 0.1400704 0.9623358
Pristimantis permixtus 30.96150 29.9036583 0.1423132 1.2551718
Pristimantis uranobates 30.54872 25.7850434 0.1399484 1.1182820
Pristimantis peruvianus 31.16337 35.1613759 0.1382450 1.2881087
Pristimantis petersi 31.11697 24.7322169 0.1430740 1.0363554
Pristimantis petrobardus 30.99813 34.8430202 0.1423793 1.5259349
Pristimantis phalaroinguinis 31.02674 39.8946293 0.1419069 1.6276096
Pristimantis phalarus 30.93226 40.9695158 0.1413561 1.6929737
Pristimantis philipi 31.03378 27.3652477 0.1418737 1.0141438
Pristimantis piceus 31.07969 27.4780217 0.1426077 1.1613276
Pristimantis pinguis 31.10027 34.6462867 0.1431135 1.5509297
Pristimantis pirrensis 31.02866 36.4143273 0.1411202 1.3784711
Pristimantis platychilus 30.97487 31.3591842 0.1444373 1.2511241
Pristimantis pleurostriatus 30.91447 29.8297626 0.1408134 1.1603466
Pristimantis polemistes 30.61866 40.3445245 0.1412440 1.5262871
Pristimantis polychrus 31.02767 30.0960965 0.1419844 1.2054404
Pristimantis prolatus 31.01668 20.5522148 0.1423454 0.8786745
Pristimantis proserpens 31.03421 20.9047080 0.1388187 0.9012766
Pristimantis pruinatus 31.05500 42.0822268 0.1412989 1.5544402
Pristimantis pseudoacuminatus 31.12590 34.8864740 0.1401397 1.3565517
Pristimantis pteridophilus 30.86879 12.4784324 0.1441286 0.6109418
Pristimantis ptochus 30.99640 34.0689748 0.1388606 1.3936774
Pristimantis zophus 30.94868 27.5019361 0.1397991 1.1073337
Pristimantis pugnax 30.47241 29.9969420 0.1404515 1.2399931
Pristimantis quantus 30.98312 36.2395981 0.1419822 1.5027146
Pristimantis racemus 31.04980 30.0880680 0.1425358 1.2590947
Pristimantis ramagii 31.05375 28.6680858 0.1436519 1.1204309
Pristimantis repens 31.02180 30.2625146 0.1401814 1.2364915
Pristimantis restrepoi 31.14422 33.5623603 0.1399311 1.3463781
Pristimantis reticulatus 30.99040 35.0464910 0.1415182 1.2914588
Pristimantis rhabdocnemus 31.03103 24.7378210 0.1385865 1.1587276
Pristimantis rhabdolaemus 30.92747 18.4053309 0.1430371 1.0340326
Pristimantis rhodoplichus 31.16764 30.5367960 0.1392635 1.3016393
Pristimantis rhodostichus 30.96886 26.3299548 0.1402941 1.0948365
Pristimantis ridens 30.99763 41.5837228 0.1430745 1.5524930
Pristimantis rivasi 31.21831 33.9846475 0.1415384 1.2667887
Pristimantis riveroi 30.92312 34.4652495 0.1414861 1.2781512
Pristimantis versicolor 31.42295 19.5516500 0.1388369 0.8198424
Pristimantis rosadoi 30.99328 22.0879682 0.1427403 0.9157437
Pristimantis roseus 30.52836 36.2713502 0.1437693 1.3911811
Pristimantis rozei 31.01680 39.7664240 0.1373163 1.4634694
Pristimantis rubicundus 30.90412 16.8638550 0.1424053 0.7343336
Pristimantis ruedai 30.54214 33.2981122 0.1409599 1.3368777
Pristimantis rufioculis 30.99144 29.8754013 0.1402570 1.2689262
Pristimantis ruidus 30.87723 28.8857227 0.1425415 1.0710738
Pristimantis ruthveni 31.19762 27.6191251 0.1424867 1.0178320
Pristimantis saltissimus 30.96813 35.7762609 0.1375490 1.3274306
Pristimantis samaipatae 30.97920 31.1765705 0.1407612 1.3964413
Pristimantis sanctaemartae 30.85661 28.2367332 0.1441712 1.0418106
Pristimantis sanguineus 30.98081 33.5913789 0.1436832 1.3372392
Pristimantis satagius 31.08973 39.6979813 0.1420466 1.5012303
Pristimantis schultei 31.04123 26.2972190 0.1399164 1.1798861
Pristimantis scitulus 30.89022 18.5430376 0.1410441 1.1873176
Pristimantis scoloblepharus 30.37945 25.5260604 0.1424168 1.1274270
Pristimantis scolodiscus 31.02411 26.1583929 0.1429243 1.1030193
Pristimantis scopaeus 30.91041 25.7972223 0.1424425 1.1472714
Pristimantis seorsus 30.98178 47.3745814 0.1427000 2.3061583
Pristimantis serendipitus 31.06410 23.2633857 0.1438600 1.0354008
Pristimantis signifer 31.08860 39.0486327 0.1426785 1.6137226
Pristimantis silverstonei 31.06195 36.4513936 0.1419594 1.4542824
Pristimantis simonsii 31.04819 32.0209609 0.1408939 1.4323920
Pristimantis simoteriscus 31.13892 25.4689256 0.1398859 1.1893082
Pristimantis siopelus 30.85026 38.7212530 0.1436912 1.5601065
Pristimantis skydmainos 30.98755 34.4289783 0.1407689 1.4345369
Pristimantis sobetes 30.89730 10.8251927 0.1444545 0.5424297
Pristimantis spectabilis 31.04663 25.1600341 0.1414419 1.1859598
Pristimantis spilogaster 30.94591 32.9770680 0.1436661 1.3381266
Pristimantis spinosus 30.99944 16.2417290 0.1428378 0.6972266
Pristimantis stenodiscus 31.07251 35.2668011 0.1422943 1.2952023
Pristimantis sternothylax 30.95866 32.7328081 0.1418117 1.3534177
Pristimantis stictoboubonus 31.08280 32.4137441 0.1429509 1.4256550
Pristimantis stictogaster 31.26460 24.9480628 0.1416979 1.1703742
Pristimantis suetus 30.97820 25.1537636 0.1415244 1.0492079
Pristimantis sulculus 31.03502 41.2071863 0.1424858 1.6599008
Pristimantis supernatis 30.38250 27.4479094 0.1422440 1.1640589
Pristimantis susaguae 30.88780 30.4476306 0.1436859 1.2856409
Pristimantis taciturnus 30.40151 22.5335381 0.1441158 0.9785597
Pristimantis yukpa 32.55746 24.1231741 0.1385697 0.9112438
Pristimantis tamsitti 31.10146 32.5721074 0.1394898 1.2956865
Pristimantis tantanti 30.94483 42.3491186 0.1435596 1.9075121
Pristimantis tanyrhynchus 31.02337 41.6188034 0.1459125 2.0253399
Pristimantis tayrona 31.06285 31.2994848 0.1418545 1.1549187
Pristimantis telefericus 31.19927 27.9885284 0.1416909 1.0903882
Pristimantis tenebrionis 30.99324 22.7475794 0.1426276 0.9372821
Pristimantis thymalopsoides 30.97237 10.3808888 0.1435540 0.5188797
Pristimantis torrenticola 31.01695 28.8436363 0.1419078 1.2521610
Pristimantis tribulosus 30.97391 31.9106293 0.1414754 1.3833169
Pristimantis tubernasus 31.00483 29.4958275 0.1422894 1.1656341
Pristimantis turik 30.97903 31.0461470 0.1437846 1.1183692
Pristimantis turpinorum 31.05377 91.3204466 0.1407496 3.4215602
Pristimantis turumiquirensis 31.07634 38.6896189 0.1417143 1.4255265
Pristimantis uisae 30.93802 26.3068015 0.1404259 1.1239710
Pristimantis urichi 31.20113 61.4565628 0.1440819 2.3181679
Pristimantis variabilis 30.95869 35.6481018 0.1424229 1.3216277
Pristimantis veletis 30.96942 29.3768716 0.1429881 1.2721732
Pristimantis ventriguttatus 31.05523 44.6782600 0.1422234 1.8216824
Pristimantis ventrimarmoratus 31.03863 29.1816350 0.1432615 1.2175494
Pristimantis verecundus 31.01718 22.7997633 0.1419316 1.0007582
Pristimantis vicarius 31.16592 31.7754836 0.1384869 1.3167770
Pristimantis vidua 31.17648 14.2408757 0.1408012 0.6604716
Pristimantis viejas 31.10940 35.1952321 0.1405209 1.3858712
Pristimantis vilarsi 31.12640 37.2334883 0.1407786 1.3339770
Pristimantis vilcabambae 31.19602 41.4015047 0.1415052 2.0130128
Pristimantis vinhai 31.12242 25.8692048 0.1430886 1.0241214
Pristimantis viridicans 31.17356 28.0927504 0.1431327 1.1428555
Pristimantis viridis 30.88892 38.9709360 0.1419723 1.4875418
Pristimantis wagteri 31.22214 29.5078329 0.1418191 1.3394063
Pristimantis waoranii 30.95652 38.0958077 0.1428619 1.4690242
Pristimantis wiensi 30.88954 28.3655121 0.1409499 1.2401467
Pristimantis xeniolum 31.02246 33.6941104 0.1414176 1.3907970
Pristimantis xestus 31.04127 39.3914174 0.1404471 1.5157500
Pristimantis xylochobates 30.97269 34.6848787 0.1438149 1.4329821
Pristimantis yaviensis 31.13343 33.9921211 0.1388608 1.2550159
Pristimantis yustizi 31.00409 28.0476600 0.1435642 1.1013728
Pristimantis zeuctotylus 31.06773 38.6334764 0.1411715 1.3971515
Pristimantis zimmermanae 31.20215 34.2278168 0.1424212 1.1976894
Pristimantis zoilae 31.07241 25.8954192 0.1413943 1.0743381
Dischidodactylus colonnelloi 29.74155 30.8703075 0.1448719 1.1878822
Dischidodactylus duidensis 29.90281 35.4053376 0.1435711 1.3635790
Geobatrachus walkeri 29.84019 30.3138705 0.1427746 1.1181233
Niceforonia adenobrachia 29.87077 24.9120149 0.1430067 1.1695673
Niceforonia nana 29.93929 27.0819074 0.1445564 1.1521140
Strabomantis anatipes 29.23740 28.9460745 0.1426928 1.1812103
Strabomantis ingeri 29.84504 30.0653342 0.1444690 1.2733725
Strabomantis cheiroplethus 29.23801 40.6758501 0.1455520 1.5894479
Strabomantis anomalus 29.24815 35.9188515 0.1417881 1.4136362
Strabomantis bufoniformis 29.21992 39.8614863 0.1453446 1.5188789
Strabomantis cadenai 29.90465 38.5093787 0.1445026 1.4583771
Strabomantis ruizi 29.89065 37.5370451 0.1434772 1.5286478
Strabomantis helonotus 29.99954 16.0279693 0.1432090 0.7229732
Strabomantis zygodactylus 29.41606 38.2636596 0.1420161 1.4927472
Strabomantis cornutus 29.90696 25.0424044 0.1437065 1.0411542
Strabomantis laticorpus 29.94447 38.7313240 0.1434167 1.3764923
Strabomantis biporcatus 29.96997 37.5653163 0.1435798 1.3910374
Strabomantis cerastes 29.93989 37.0092946 0.1423630 1.5048930
Strabomantis necopinus 29.88907 24.1951147 0.1428273 1.0604300
Strabomantis sulcatus 29.91077 35.3412344 0.1446140 1.3158555
Barycholos pulcher 28.79422 22.8095685 0.1470936 0.9044686
Barycholos ternetzi 28.68012 25.5851096 0.1480911 0.9386009
Noblella heyeri 29.01416 23.5237046 0.1439845 1.0127522
Noblella lochites 28.96411 27.0173966 0.1459307 1.0833723
Noblella lynchi 28.74718 32.1515731 0.1459776 1.3722798
Noblella ritarasquinae 28.82412 20.4614312 0.1450143 1.1038921
Noblella carrascoicola 28.78725 21.0469598 0.1441390 1.1326133
Noblella coloma 28.77911 9.9057673 0.1456369 0.4926721
Noblella duellmani 28.71363 23.4573231 0.1456906 1.0983695
Bryophryne bustamantei 26.60975 13.0464913 0.1521829 0.7013680
Bryophryne zonalis 26.66583 6.5073402 0.1489830 0.4048702
Euparkerella brasiliensis 28.76907 25.4585616 0.1443181 0.9588340
Euparkerella cochranae 28.81875 27.3426448 0.1417638 1.0475478
Euparkerella tridactyla 28.76712 31.9229835 0.1460796 1.2388806
Euparkerella robusta 28.79471 35.5500151 0.1426558 1.4203507
Holoaden bradei 28.75090 23.0015136 0.1459631 0.8644424
Holoaden pholeter 28.73927 23.9808557 0.1449454 0.8919926
Holoaden luederwaldti 28.79675 22.2710348 0.1453019 0.8635545
Psychrophrynella bagrecito 28.47030 7.6683419 0.1477262 0.4710627
Ceratophrys testudo 36.79448 12.5892948 0.1294958 0.5625136
Ceratophrys calcarata 37.71563 29.9213878 0.1306390 1.0997181
Ceratophrys cornuta 36.71653 33.4218218 0.1331219 1.2116541
Ceratophrys stolzmanni 37.70877 20.5614047 0.1301364 0.8397476
Ceratophrys ornata 37.77087 8.0353426 0.1267859 0.3511068
Chacophrys pierottii 38.07281 16.9679853 0.1280263 0.6721132
Lepidobatrachus asper 37.47809 15.0414316 0.1289875 0.5634447
Lepidobatrachus laevis 37.51986 16.1196060 0.1289666 0.5973382
Insuetophrynus acarpicus 33.83549 10.1114811 0.1320892 0.5647997
Rhinoderma darwinii 34.42020 8.4885805 0.1319995 0.5506988
Rhinoderma rufum 34.41090 14.1063158 0.1312037 0.7221340
Telmatobius arequipensis 34.66308 11.7285360 0.1329023 0.7477356
Telmatobius oxycephalus 34.63942 16.3229382 0.1340871 0.8980337
Telmatobius sanborni 34.73773 21.2165792 0.1330462 1.2988733
Telmatobius verrucosus 34.65678 25.9555200 0.1327813 1.3855662
Telmatobius atacamensis 34.55270 10.8900981 0.1319866 0.7496478
Telmatobius ignavus 34.59028 35.0948030 0.1335104 1.5369616
Telmatobius atahualpai 34.70419 26.8943991 0.1319562 1.3173212
Telmatobius rimac 34.75774 24.1389553 0.1283266 1.2681115
Telmatobius yuracare 34.56443 39.0527171 0.1356199 1.7297011
Telmatobius simonsi 34.61906 27.2821549 0.1319229 1.3566826
Telmatobius brevipes 34.71546 22.1351107 0.1293928 1.0999859
Telmatobius colanensis 33.70486 35.1712204 0.1357734 1.4529040
Telmatobius brevirostris 34.70112 23.4735871 0.1340476 1.1730307
Telmatobius carrillae 34.67065 14.1355751 0.1313056 0.8690727
Telmatobius peruvianus 34.64273 10.8204129 0.1337382 0.7361577
Telmatobius hockingi 33.80141 13.3636187 0.1327139 0.7644904
Telmatobius chusmisensis 33.85149 11.7761023 0.1321257 0.7416641
Telmatobius intermedius 34.69791 19.7768738 0.1316179 1.2962607
Telmatobius scrocchii 34.62945 15.6321810 0.1326299 0.7424888
Telmatobius contrerasi 33.89042 10.8989015 0.1320430 0.5140180
Telmatobius philippii 34.69283 6.0106151 0.1307274 0.5767083
Telmatobius culeus 34.54217 16.2800182 0.1320651 0.9988798
Telmatobius gigas 33.79863 13.9437135 0.1333855 0.8863709
Telmatobius hintoni 34.57949 22.9998124 0.1335229 1.2532377
Telmatobius huayra 34.58479 10.4513398 0.1323496 0.7052357
Telmatobius zapahuirensis 34.64117 8.9078332 0.1321290 0.5250326
Telmatobius dankoi 34.58644 13.6696395 0.1326362 0.9306192
Telmatobius vilamensis 34.69893 13.1325514 0.1324396 0.8934568
Telmatobius degener 34.56807 28.8520380 0.1336764 1.2803406
Telmatobius fronteriensis 33.77814 8.1448506 0.1314647 0.6754697
Telmatobius schreiteri 34.51829 13.4149906 0.1338666 0.6573820
Telmatobius halli 34.74289 5.7731376 0.1307878 0.5621666
Telmatobius jelskii 34.66788 13.1387238 0.1319360 0.7879927
Telmatobius hauthali 34.65375 5.9141444 0.1341665 0.4672283
Telmatobius necopinus 33.90055 19.0730176 0.1323916 0.9179413
Telmatobius hypselocephalus 34.62748 11.4581677 0.1309177 0.7895836
Telmatobius mayoloi 34.57327 21.4243544 0.1358135 0.9740227
Telmatobius platycephalus 34.49522 14.1934119 0.1334609 0.9052351
Telmatobius latirostris 34.66668 39.4240321 0.1308527 1.7212200
Telmatobius timens 34.66383 16.0434680 0.1312002 0.9738447
Telmatobius marmoratus 34.65960 12.1862336 0.1326062 0.7712763
Telmatobius stephani 34.59154 16.4196090 0.1309627 0.7813183
Telmatobius niger 34.58312 19.7923450 0.1362756 0.8428839
Telmatobius pefauri 33.67388 8.7938029 0.1338766 0.5259015
Telmatobius punctatus 34.54418 21.0255468 0.1352885 1.0776961
Telmatobius pinguiculus 34.54978 12.2220735 0.1322846 0.6231694
Telmatobius pisanoi 34.56154 6.2354584 0.1312654 0.4216268
Telmatobius thompsoni 34.66865 31.0705354 0.1335804 1.3737733
Telmatobius truebae 34.64204 35.8516899 0.1329205 1.6489196
Cycloramphus acangatan 34.12301 21.6349533 0.1335735 0.8209827
Cycloramphus valae 33.50463 16.9667079 0.1317982 0.6851981
Cycloramphus eleutherodactylus 34.03766 21.2664114 0.1341898 0.8142754
Cycloramphus juimirim 33.46189 21.2050638 0.1339627 0.8002706
Cycloramphus asper 33.57773 17.8178319 0.1349373 0.7245525
Cycloramphus izecksohni 33.53925 18.5282720 0.1354966 0.7473979
Cycloramphus bolitoglossus 34.13196 18.2337843 0.1358806 0.7253940
Cycloramphus granulosus 33.50223 24.3637207 0.1344150 0.9497888
Cycloramphus boraceiensis 33.56138 27.5805190 0.1348102 1.0631708
Cycloramphus brasiliensis 33.56526 27.2649647 0.1347321 1.0266068
Cycloramphus diringshofeni 34.20279 18.7078672 0.1352356 0.7476095
Cycloramphus organensis 34.14389 25.6001728 0.1332857 0.9743229
Zachaenus carvalhoi 34.13853 36.2444704 0.1359304 1.4046595
Zachaenus parvulus 34.09740 31.0236825 0.1338144 1.2019479
Cycloramphus carvalhoi 34.15596 25.3284932 0.1344062 0.9466716
Cycloramphus stejnegeri 34.20689 25.0442978 0.1319044 0.9416714
Cycloramphus catarinensis 34.11660 19.3080578 0.1334979 0.7765676
Cycloramphus faustoi 33.51151 24.6110986 0.1346158 1.0035638
Cycloramphus cedrensis 33.55917 18.4372829 0.1345789 0.7373661
Cycloramphus lutzorum 33.52594 19.4661935 0.1333052 0.7568050
Cycloramphus semipalmatus 33.51292 20.7729623 0.1345247 0.8052103
Cycloramphus dubius 33.48138 19.2039047 0.1342796 0.7366764
Cycloramphus duseni 33.54028 17.2132126 0.1337542 0.7063795
Cycloramphus migueli 34.15050 33.8958246 0.1331605 1.3338345
Cycloramphus rhyakonastes 33.45096 17.0250230 0.1337780 0.6949129
Cycloramphus mirandaribeiroi 33.54921 17.1865192 0.1335203 0.7137500
Cycloramphus ohausi 33.54305 25.0778105 0.1351217 0.9435750
Cycloramphus bandeirensis 33.64941 30.9880660 0.1316952 1.2000347
Cycloramphus fuliginosus 33.55294 34.2914633 0.1307345 1.3343813
Thoropa lutzi 33.65193 33.8151049 0.1325176 1.2990627
Thoropa megatympanum 33.62663 21.4759799 0.1313875 0.8452134
Thoropa miliaris 33.61804 26.8397553 0.1324745 1.0469858
Thoropa petropolitana 33.62222 28.5760550 0.1343982 1.1072662
Thoropa saxatilis 33.66718 17.0913060 0.1302905 0.6842781
Atelognathus ceii 33.79099 4.2604501 0.1324595 0.3419694
Atelognathus solitarius 33.60786 5.4256441 0.1348514 0.3492398
Atelognathus patagonicus 33.90485 6.3085395 0.1325440 0.3564903
Atelognathus nitoi 33.93817 6.2375667 0.1318028 0.3863246
Atelognathus praebasalticus 33.66939 7.0367074 0.1354662 0.3954727
Atelognathus salai 33.90844 4.1258330 0.1331864 0.3237586
Atelognathus reverberii 33.95265 7.2730845 0.1336527 0.4377798
Batrachyla antartandica 33.59883 4.0081742 0.1329361 0.2879331
Batrachyla nibaldoi 33.54891 2.7578507 0.1327929 0.2678902
Batrachyla fitzroya 33.56875 4.6930384 0.1349649 0.2961448
Batrachyla leptopus 33.49616 5.9522479 0.1370922 0.4019248
Chaltenobatrachus grandisonae 33.08801 3.2564232 0.1334558 0.3311840
Crossodactylus aeneus 33.03931 19.3980863 0.1325571 0.7471191
Crossodactylus dantei 33.07561 36.5151546 0.1312715 1.4185454
Crossodactylus gaudichaudii 33.00234 21.2012612 0.1345407 0.8187714
Crossodactylus grandis 32.99339 21.1473391 0.1344911 0.7887769
Crossodactylus bokermanni 32.99551 16.1472118 0.1328247 0.6539075
Crossodactylus lutzorum 33.00105 25.1715950 0.1326672 1.0119094
Crossodactylus caramaschii 32.96558 16.2066705 0.1327531 0.6169999
Crossodactylus cyclospinus 33.63075 23.5619804 0.1344478 0.9239673
Crossodactylus trachystomus 32.99812 17.1069889 0.1355959 0.6795105
Crossodactylus dispar 33.07296 19.8449613 0.1348048 0.7693472
Hylodes amnicola 33.26054 25.1951568 0.1329818 0.9596823
Hylodes mertensi 33.13434 20.8070055 0.1341468 0.8060029
Hylodes asper 33.18229 21.3591567 0.1353130 0.8292778
Hylodes meridionalis 33.21663 16.1572754 0.1341140 0.6618359
Hylodes babax 33.23440 31.5711243 0.1379123 1.2213458
Hylodes vanzolinii 33.25446 32.0644809 0.1332977 1.2414066
Hylodes cardosoi 33.22776 17.8819083 0.1346555 0.6991830
Hylodes charadranaetes 33.24967 26.4071192 0.1346674 0.9903258
Hylodes dactylocinus 33.12486 19.8216317 0.1332626 0.7406102
Hylodes perplicatus 33.15274 17.6525428 0.1322037 0.7161140
Hylodes fredi 33.30878 24.5281065 0.1304366 0.9774280
Hylodes pipilans 33.25016 26.5077883 0.1345352 0.9893390
Hylodes glaber 33.17275 24.2238513 0.1341457 0.9065383
Hylodes lateristrigatus 33.19856 26.0610939 0.1360003 1.0116100
Hylodes heyeri 33.15231 18.5530664 0.1356004 0.7223787
Hylodes regius 33.13088 20.9581048 0.1356388 0.7912548
Hylodes magalhaesi 33.20012 21.2253273 0.1362685 0.8110364
Hylodes ornatus 33.16573 22.4364833 0.1342891 0.8663419
Hylodes sazimai 33.16375 23.0436813 0.1325119 0.8863607
Hylodes uai 33.10539 18.5518362 0.1346628 0.7322748
Hylodes otavioi 33.25009 19.0276260 0.1362875 0.7758962
Hylodes phyllodes 33.23579 22.4995719 0.1339317 0.8661196
Hylodes nasus 33.30200 24.3117269 0.1332004 0.9420113
Megaelosia apuana 33.23314 35.5487469 0.1325719 1.3726256
Megaelosia boticariana 33.19707 18.5348761 0.1356496 0.7200281
Megaelosia bocainensis 33.21438 25.0557720 0.1343462 0.9370434
Megaelosia lutzae 33.25773 23.5638712 0.1327781 0.8818992
Megaelosia goeldii 33.18083 27.4775029 0.1338668 1.0539028
Megaelosia jordanensis 33.79370 21.5187628 0.1332010 0.8224678
Megaelosia massarti 33.22356 21.5867717 0.1350110 0.8568488
Alsodes australis 31.39514 4.2016182 0.1355631 0.3762410
Alsodes verrucosus 32.19784 5.6692131 0.1358589 0.3426585
Alsodes monticola 31.36293 5.8989446 0.1357136 0.5092634
Alsodes valdiviensis 32.19046 6.8029304 0.1378034 0.3905143
Alsodes barrioi 31.10564 6.1060052 0.1353818 0.3382625
Alsodes norae 31.92911 5.9453398 0.1371442 0.3293470
Alsodes kaweshkari 31.97485 2.6963586 0.1369013 0.3407571
Alsodes igneus 31.12352 5.5897085 0.1366191 0.3182264
Alsodes pehuenche 31.07655 2.8902746 0.1343183 0.2114210
Alsodes hugoi 31.23788 3.3154068 0.1369974 0.2188243
Alsodes tumultuosus 31.24015 7.1153953 0.1367095 0.3769423
Alsodes montanus 31.23196 6.1115248 0.1379114 0.3516474
Alsodes vittatus 31.35911 4.8671479 0.1365626 0.2900594
Alsodes nodosus 31.76241 8.5791622 0.1329496 0.4468066
Alsodes vanzolinii 31.74138 9.9543427 0.1360826 0.5550421
Eupsophus insularis 32.79304 7.7904031 0.1360533 0.4376135
Eupsophus roseus 32.71224 7.6123335 0.1348966 0.4286785
Eupsophus calcaratus 32.74084 5.4939991 0.1328178 0.4247834
Eupsophus emiliopugini 32.13768 5.9912373 0.1325728 0.4194907
Eupsophus vertebralis 32.11695 7.0178534 0.1360022 0.4072087
Agalychnis annae 35.47595 21.7307647 0.1377952 0.8552259
Agalychnis moreletii 35.49295 18.6119169 0.1390192 0.7043014
Agalychnis callidryas 35.46635 24.6658990 0.1378682 0.9136052
Agalychnis saltator 35.53590 24.9487564 0.1392233 0.9612892
Agalychnis lemur 35.42286 36.0530176 0.1381264 1.3621485
Hylomantis granulosa 35.51649 21.7888801 0.1338314 0.8543579
Phasmahyla cochranae 35.26789 16.2494800 0.1400592 0.6240021
Phasmahyla exilis 35.25150 25.6349160 0.1376125 0.9991345
Phasmahyla timbo 34.85490 20.4312450 0.1387339 0.8216759
Phasmahyla guttata 35.24952 16.8384604 0.1378225 0.6523626
Phasmahyla jandaia 34.79290 15.1642315 0.1348960 0.5942568
Phyllomedusa araguari 36.78356 16.3478947 0.1345944 0.6264157
Phyllomedusa venusta 36.67512 24.0391666 0.1328591 0.9051186
Phyllomedusa bahiana 37.46621 15.6093130 0.1323714 0.6202348
Phyllomedusa distincta 37.45942 11.0313647 0.1351765 0.4342228
Phyllomedusa boliviana 37.24130 21.3919988 0.1351453 0.7998789
Phyllomedusa neildi 37.33844 36.9711490 0.1354774 1.3970832
Phyllomedusa trinitatis 37.39728 23.1154661 0.1341718 0.8651376
Phyllomedusa tarsius 37.37684 25.3369124 0.1366957 0.9159539
Phyllomedusa bicolor 36.79756 27.4327153 0.1360620 0.9839575
Cruziohyla craspedopus 36.04068 26.1267109 0.1331726 0.9381570
Phrynomedusa appendiculata 35.77274 15.0669657 0.1374314 0.6082185
Phrynomedusa bokermanni 35.23619 16.6763554 0.1349133 0.6405881
Phrynomedusa marginata 35.81030 26.7517034 0.1331679 1.0349627
Phrynomedusa vanzolinii 35.25220 21.6983404 0.1371892 0.8355787
Cyclorana novaehollandiae 36.62636 11.6760214 0.1363513 0.4630402
Cyclorana cryptotis 36.40147 18.0697052 0.1375290 0.6527935
Cyclorana cultripes 36.51184 12.2815609 0.1374808 0.4870637
Cyclorana vagitus 35.52266 20.4505835 0.1373674 0.7350059
Cyclorana longipes 36.36642 19.5243469 0.1387786 0.7044470
Cyclorana maculosa 36.46326 16.0148025 0.1350608 0.5934515
Cyclorana maini 36.46833 11.5163360 0.1346441 0.4785642
Cyclorana manya 35.50570 19.8376449 0.1368140 0.7206911
Cyclorana verrucosa 35.50926 12.3910915 0.1333482 0.5159383
Cyclorana platycephala 36.45699 11.7447001 0.1328896 0.4871091
Litoria dahlii 35.63756 21.9273141 0.1372429 0.7838874
Litoria adelaidensis 34.56871 12.9613984 0.1341716 0.6278135
Litoria chloronota 34.88285 46.0113504 0.1382960 1.6553817
Litoria albolabris 35.87275 30.7547785 0.1382209 1.1857489
Litoria amboinensis 34.28117 25.3710899 0.1396543 0.9324738
Litoria darlingtoni 34.33866 19.0481028 0.1397804 0.7324970
Litoria tyleri 34.44840 11.5604450 0.1397056 0.5225625
Litoria andiirrmalin 33.06679 24.1191675 0.1414683 0.8771848
Litoria booroolongensis 32.54526 9.5025834 0.1413699 0.4348241
Litoria jungguy 32.52507 17.2176598 0.1389910 0.6530966
Litoria wilcoxii 32.41874 12.4185176 0.1408122 0.5177384
Litoria angiana 33.89547 30.7483950 0.1354555 1.1516082
Litoria modica 33.91796 32.2630302 0.1386312 1.2003862
Litoria micromembrana 33.92882 32.9276142 0.1355646 1.2331947
Litoria arfakiana 34.33398 33.5531152 0.1384407 1.2463831
Litoria wollastoni 34.41827 32.2387701 0.1364934 1.2080966
Litoria aruensis 34.41840 53.0065734 0.1374050 1.9761438
Litoria auae 34.42847 28.5941703 0.1390678 1.0456826
Litoria cyclorhyncha 33.92190 8.7270222 0.1359640 0.4328572
Litoria moorei 33.90328 9.7643759 0.1386557 0.4737825
Litoria raniformis 33.97392 8.2958497 0.1363918 0.4483297
Litoria nudidigita 31.94183 7.7004185 0.1429406 0.3930123
Litoria daviesae 31.91986 10.8165756 0.1398442 0.4879416
Litoria subglandulosa 31.80385 11.4648456 0.1407635 0.5002891
Litoria spenceri 31.70601 6.4917917 0.1402190 0.3314426
Litoria becki 33.78152 36.0183304 0.1369968 1.3585991
Litoria biakensis 34.31695 36.5353790 0.1358574 1.3348660
Litoria bibonius 34.27108 50.1959080 0.1387285 1.8328126
Litoria brevipalmata 34.57752 18.4237001 0.1343379 0.8018960
Nyctimystes avocalis 33.85325 45.9892241 0.1379688 1.6800082
Nyctimystes montanus 33.88460 41.4931738 0.1356912 1.4894596
Nyctimystes granti 33.98304 38.7761886 0.1361292 1.4339137
Nyctimystes oktediensis 34.35186 32.2549028 0.1366004 1.1786519
Nyctimystes cheesmani 33.91736 29.8069769 0.1356161 1.1343102
Nyctimystes disruptus 33.88131 32.1929471 0.1386057 1.2366929
Nyctimystes daymani 33.80714 37.5985390 0.1393249 1.3568406
Nyctimystes obsoletus 33.79340 34.1908306 0.1380862 1.3017244
Nyctimystes gularis 33.89493 29.1709682 0.1351875 1.0584922
Nyctimystes fluviatilis 33.90823 37.9991063 0.1365274 1.4148124
Nyctimystes foricula 33.86420 29.9356382 0.1389367 1.1272608
Nyctimystes semipalmatus 33.89322 31.1146108 0.1376987 1.1678932
Nyctimystes kuduki 33.91309 27.3844895 0.1357435 1.0262793
Nyctimystes humeralis 33.94722 31.5532902 0.1344753 1.1829709
Nyctimystes zweifeli 33.89966 33.4669902 0.1375929 1.2448100
Nyctimystes trachydermis 33.96424 32.9371019 0.1349677 1.2117463
Nyctimystes kubori 33.85603 33.0439511 0.1362131 1.2392769
Nyctimystes narinosus 33.82928 28.3817989 0.1394475 1.0955891
Nyctimystes papua 33.91715 33.8437386 0.1380027 1.2427070
Nyctimystes pulcher 33.96124 31.7299571 0.1370853 1.1897238
Nyctimystes perimetri 33.88310 51.1329156 0.1376957 1.8650627
Nyctimystes persimilis 33.86861 40.2270704 0.1387029 1.4556658
Litoria vocivincens 34.54076 30.4691024 0.1373203 1.1116980
Litoria brongersmai 33.91654 34.7519021 0.1370514 1.3485671
Litoria bulmeri 33.97262 31.9206708 0.1364831 1.1716787
Litoria burrowsi 34.40313 10.4576515 0.1371166 0.6423641
Litoria rivicola 33.99323 40.7957838 0.1363307 1.4920107
Litoria gilleni 35.29913 8.2436143 0.1375664 0.3463059
Litoria splendida 35.32556 18.3940177 0.1363003 0.6570168
Litoria cavernicola 35.33586 19.3313320 0.1344013 0.6989115
Litoria xanthomera 35.74034 14.3805445 0.1339717 0.5513774
Litoria kumae 35.50268 22.2849718 0.1335262 0.8605660
Litoria capitula 34.38833 49.4674988 0.1374311 1.7997341
Litoria chrisdahli 34.40004 53.5842201 0.1381011 2.0561371
Litoria christianbergmanni 34.46719 43.1693380 0.1384740 1.5769720
Litoria congenita 35.40031 27.6691851 0.1372389 1.0126055
Litoria dentata 35.40423 13.9174755 0.1393712 0.6176792
Litoria electrica 35.61147 13.7327723 0.1373122 0.5291707
Litoria contrastens 34.64045 31.0332057 0.1380672 1.1656807
Litoria cooloolensis 34.43370 20.0091681 0.1376102 0.8358511
Litoria coplandi 34.49964 21.4511751 0.1405612 0.7759248
Litoria watjulumensis 34.66101 23.0631251 0.1376811 0.8318037
Litoria dayi 33.95445 23.5317299 0.1387405 0.8995317
Litoria nannotis 34.01955 23.8994366 0.1358748 0.9123804
Litoria rheocola 34.46527 25.2886636 0.1367399 0.9594076
Litoria dorsalis 34.43132 29.3182761 0.1350157 1.0724705
Litoria microbelos 34.60495 27.2932412 0.1375245 0.9788371
Litoria longirostris 34.38518 26.6484283 0.1361397 0.9603987
Litoria meiriana 34.80546 27.9504552 0.1367451 0.9925733
Litoria dorsivena 33.96933 37.2269162 0.1354863 1.3989288
Litoria dux 34.34950 34.0099804 0.1383026 1.3207053
Litoria infrafrenata 34.25473 38.2743269 0.1408580 1.3995550
Litoria elkeae 34.28429 40.0043951 0.1372282 1.4923684
Litoria exophthalmia 33.83282 31.2394706 0.1358261 1.1810704
Litoria genimaculata 33.69161 36.5967994 0.1400485 1.3574537
Litoria everetti 34.42237 43.0347525 0.1355075 1.5634242
Litoria littlejohni 32.03423 9.9147732 0.1366586 0.4714633
Litoria paraewingi 31.80644 6.8696885 0.1392745 0.3419022
Litoria revelata 31.95735 10.9141180 0.1378464 0.4779377
Litoria jervisiensis 32.24358 9.7053279 0.1408213 0.4707773
Litoria olongburensis 35.64970 15.0922804 0.1314272 0.6405639
Litoria flavescens 34.27629 46.5780852 0.1371099 1.6807672
Litoria latopalmata 33.32841 11.9282491 0.1430788 0.4899689
Litoria tornieri 33.42798 20.9821733 0.1421217 0.7456327
Litoria inermis 33.45651 18.7539399 0.1401776 0.6989206
Litoria pallida 33.44624 19.4673420 0.1390279 0.7134374
Litoria fuscula 33.93755 25.7570502 0.1400799 1.0725603
Litoria graminea 34.37358 28.8906251 0.1352862 1.0641404
Litoria havina 34.28958 37.9247290 0.1376408 1.3697513
Litoria multiplica 33.90346 30.1344680 0.1383382 1.1580794
Litoria hilli 34.50591 52.3961127 0.1373465 1.9118585
Litoria humboldtorum 34.43073 55.0213647 0.1369179 2.0487354
Litoria hunti 34.26085 42.8781883 0.1379234 1.5902385
Litoria impura 34.36548 36.0175244 0.1386799 1.3170243
Litoria thesaurensis 34.35765 40.0562098 0.1374701 1.4641767
Litoria iris 34.39136 30.8227994 0.1366960 1.1630343
Litoria majikthise 34.35603 36.1587230 0.1359901 1.3002362
Litoria pronimia 34.46236 28.7833054 0.1355963 1.1003130
Litoria spartacus 34.50042 28.2560440 0.1351854 1.0379625
Litoria leucova 33.95164 32.7222252 0.1351515 1.1786638
Litoria longicrus 34.33817 49.4808081 0.1363212 1.7972594
Litoria lorica 33.76113 21.0218235 0.1411879 0.7870691
Litoria louisiadensis 33.86261 59.2685304 0.1370633 2.1519637
Litoria lutea 34.38152 53.7744025 0.1378593 1.9329296
Litoria macki 33.98095 25.4410098 0.1368840 1.0597930
Litoria mareku 34.33430 41.2857838 0.1386902 1.4727284
Litoria megalops 33.95849 25.8038685 0.1380934 1.0730146
Litoria mucro 34.38009 40.5241305 0.1369829 1.4999837
Litoria multicolor 34.43905 42.9149028 0.1360904 1.5351112
Litoria myola 33.84474 20.7563156 0.1356030 0.7774444
Litoria mystax 34.47550 33.1045349 0.1377497 1.3110890
Litoria napaea 33.99120 31.6134145 0.1368258 1.2230782
Litoria nigropunctata 34.47245 35.9168761 0.1367859 1.3344141
Litoria prora 34.43259 32.5798781 0.1370245 1.1720574
Litoria obtusirostris 34.35535 56.9416670 0.1389100 2.1172412
Litoria oenicolen 33.90378 31.6607464 0.1354217 1.1883628
Litoria ollauro 34.48269 39.1036916 0.1352771 1.4128959
Litoria personata 34.52800 23.9717226 0.1389277 0.8381001
Litoria pratti 34.02126 40.8346460 0.1370433 1.4656320
Litoria purpureolata 34.48590 36.5252845 0.1345970 1.3943708
Litoria pygmaea 34.37449 34.7643120 0.1356451 1.2791899
Litoria quadrilineata 34.46674 41.2564129 0.1379536 1.5031164
Litoria rara 34.42414 47.3062222 0.1383436 1.7785869
Litoria richardsi 34.40021 29.0652929 0.1340893 1.1095474
Litoria rubrops 34.47745 52.8612424 0.1359437 1.9123655
Litoria sanguinolenta 34.34622 36.6838166 0.1373189 1.3251363
Litoria scabra 33.93824 27.3811981 0.1377052 1.1417792
Litoria singadanae 34.35055 36.5439047 0.1364680 1.4207738
Litoria spinifera 33.99348 29.0820642 0.1392352 1.1245569
Litoria staccato 34.62259 29.2903588 0.1361268 1.0424061
Litoria timida 34.45432 31.6376686 0.1376413 1.1327788
Litoria umarensis 34.20532 44.0800556 0.1403844 1.5751367
Litoria umbonata 34.46287 32.1501885 0.1337076 1.2444563
Litoria vagabunda 34.32877 52.6112532 0.1385369 1.9248896
Litoria verae 34.37421 37.4788258 0.1388088 1.3378527
Litoria wapogaensis 33.95359 26.9601978 0.1357371 1.1204543
Litoria wisselensis 34.82594 33.1411966 0.1373963 1.2866762
Aplastodiscus albofrenatus 35.33240 20.3250798 0.1307744 0.7795935
Aplastodiscus arildae 35.18881 16.3001585 0.1302993 0.6301407
Aplastodiscus eugenioi 35.27582 17.9723730 0.1338066 0.7000611
Aplastodiscus albosignatus 35.78877 18.6115691 0.1298782 0.7304514
Aplastodiscus callipygius 35.67863 18.2155470 0.1320354 0.7049619
Aplastodiscus cavicola 35.76235 23.1318426 0.1297349 0.8972836
Aplastodiscus leucopygius 35.77449 19.8871301 0.1272130 0.7619592
Aplastodiscus cochranae 35.62193 15.0797830 0.1331663 0.6107997
Aplastodiscus perviridis 35.71998 18.0896407 0.1289706 0.6902654
Aplastodiscus flumineus 35.67362 24.6001390 0.1287063 0.9261954
Aplastodiscus ehrhardti 35.67202 15.0550427 0.1309081 0.6122547
Aplastodiscus musicus 35.68463 20.2298984 0.1282314 0.7620841
Bokermannohyla ahenea 36.07138 22.3887675 0.1253062 0.8387458
Bokermannohyla alvarengai 35.51556 19.6206311 0.1308643 0.7670183
Bokermannohyla astartea 35.94180 20.4598305 0.1288613 0.7864081
Bokermannohyla circumdata 35.90272 20.4954888 0.1285404 0.7957107
Bokermannohyla hylax 35.40984 19.8133410 0.1313214 0.7855217
Bokermannohyla caramaschii 36.06320 23.7575152 0.1288822 0.9212416
Bokermannohyla carvalhoi 35.59383 25.9286051 0.1304673 1.0019757
Bokermannohyla diamantina 35.56467 18.6156746 0.1276306 0.7303353
Bokermannohyla feioi 36.06267 22.8319546 0.1287303 0.8806784
Bokermannohyla gouveai 36.03101 24.1414306 0.1289058 0.9046368
Bokermannohyla ibitiguara 35.61096 20.0721323 0.1278937 0.7750212
Bokermannohyla ibitipoca 36.13045 23.8379573 0.1283928 0.9140955
Bokermannohyla itapoty 35.64710 20.0857575 0.1280698 0.7962547
Bokermannohyla izecksohni 35.57566 21.5395889 0.1294244 0.8079637
Bokermannohyla langei 35.55492 14.8146572 0.1298984 0.6116591
Bokermannohyla lucianae 35.99929 32.8489254 0.1302390 1.2841420
Bokermannohyla luctuosa 35.61299 18.2444494 0.1284547 0.6945208
Bokermannohyla martinsi 35.64902 19.7081358 0.1280637 0.7750122
Bokermannohyla nanuzae 35.47203 18.6930612 0.1283204 0.7439832
Bokermannohyla oxente 35.59029 19.9776932 0.1283076 0.7959585
Bokermannohyla pseudopseudis 35.60257 23.4504348 0.1270604 0.8674198
Bokermannohyla ravida 35.57673 21.8507392 0.1265930 0.8450101
Bokermannohyla sagarana 35.46541 20.2508751 0.1285067 0.7971357
Bokermannohyla saxicola 35.52226 18.5452902 0.1310319 0.7171447
Bokermannohyla sazimai 35.56909 21.8580124 0.1290888 0.8386992
Bokermannohyla vulcaniae 35.60033 19.0340956 0.1282447 0.7257257
Hyloscirtus albopunctulatus 35.12230 29.7363726 0.1292869 1.1072201
Hyloscirtus simmonsi 33.99949 25.5839380 0.1305199 1.0407144
Hyloscirtus armatus 34.64187 25.2381312 0.1324225 1.3094483
Hyloscirtus charazani 34.70742 16.7384078 0.1293086 0.9712474
Hyloscirtus bogotensis 34.70741 29.4720155 0.1311527 1.2384526
Hyloscirtus callipeza 34.81613 25.4691696 0.1308195 1.0479139
Hyloscirtus caucanus 34.74606 25.9672947 0.1314196 1.0727838
Hyloscirtus colymba 34.77521 44.6069812 0.1310816 1.6312194
Hyloscirtus pacha 34.69278 17.6373318 0.1307139 0.7535529
Hyloscirtus staufferorum 34.60247 21.6908443 0.1297649 0.9026940
Hyloscirtus psarolaimus 34.65811 14.9433319 0.1331065 0.6851455
Hyloscirtus ptychodactylus 34.70486 15.0665752 0.1305090 0.6493997
Hyloscirtus larinopygion 35.15042 22.0085923 0.1285779 0.9737390
Hyloscirtus denticulentus 34.75396 23.8254929 0.1311317 1.0369854
Hyloscirtus jahni 34.70482 30.2780590 0.1328984 1.1422981
Hyloscirtus lascinius 35.28913 27.3940692 0.1276584 1.0634048
Hyloscirtus palmeri 34.73932 30.5531491 0.1284372 1.2060454
Hyloscirtus lynchi 34.61581 24.0277616 0.1295506 1.0868809
Hyloscirtus pantostictus 34.70244 18.7244558 0.1323430 0.8405147
Hyloscirtus piceigularis 34.63632 34.2525242 0.1304538 1.3761607
Hyloscirtus platydactylus 34.69989 30.9067338 0.1303817 1.1720610
Hyloscirtus sarampiona 34.62299 18.9659027 0.1302610 0.8262349
Hyloscirtus tapichalaca 34.65990 30.7870405 0.1315416 1.2780611
Hyloscirtus torrenticola 34.77631 24.6636654 0.1319696 1.0146415
Myersiohyla inparquesi 35.86779 37.8353963 0.1285346 1.4542093
Myersiohyla loveridgei 35.92467 36.2201647 0.1289176 1.3916432
Myersiohyla aromatica 35.85684 34.4519857 0.1275184 1.3274508
Dendropsophus acreanus 36.18855 32.0866876 0.1242998 1.1736457
Dendropsophus amicorum 36.07928 27.3603620 0.1230869 1.0324181
Dendropsophus anataliasiasi 36.11750 24.4693837 0.1238478 0.8702360
Dendropsophus aperomeus 36.01973 20.3014066 0.1254132 0.9137795
Dendropsophus haraldschultzi 36.05439 32.5699599 0.1245656 1.1538842
Dendropsophus araguaya 36.15145 20.3380103 0.1238158 0.7240167
Dendropsophus battersbyi 36.11607 33.2612121 0.1234282 1.2774821
Dendropsophus berthalutzae 36.07595 21.3302249 0.1223425 0.8272814
Dendropsophus bipunctatus 36.03257 28.4391004 0.1231013 1.1126774
Dendropsophus bogerti 36.05560 23.6519502 0.1231974 0.9596930
Dendropsophus timbeba 36.13977 33.4837718 0.1226164 1.1923797
Dendropsophus yaracuyanus 36.13586 26.3141496 0.1216315 0.9886954
Dendropsophus cachimbo 36.01816 28.6745568 0.1237980 1.0372220
Dendropsophus meridensis 35.97408 19.1978523 0.1238004 0.7289553
Dendropsophus cerradensis 36.02560 21.7879492 0.1254101 0.7672028
Dendropsophus columbianus 35.98783 23.8575497 0.1235225 1.0177715
Dendropsophus gaucheri 36.03876 37.7857130 0.1246711 1.3827138
Dendropsophus cruzi 36.02306 21.6343626 0.1228821 0.7868631
Dendropsophus miyatai 36.08560 31.4709480 0.1239774 1.1163378
Dendropsophus delarivai 36.08994 27.9153749 0.1247030 1.3014303
Dendropsophus robertmertensi 36.02487 26.7353389 0.1266181 0.9782746
Dendropsophus sartori 36.07689 24.1668918 0.1252171 0.9286314
Dendropsophus dutrai 36.06977 28.8124607 0.1232015 1.1256798
Dendropsophus elianeae 36.04104 20.8794898 0.1238974 0.7557221
Dendropsophus garagoensis 36.09001 16.3057829 0.1260465 0.7542740
Dendropsophus giesleri 36.11374 23.1493018 0.1251230 0.8932843
Dendropsophus oliveirai 36.03967 22.8038557 0.1260836 0.8952594
Dendropsophus gryllatus 36.06762 24.9380309 0.1250600 0.9405408
Dendropsophus jimi 36.10953 16.5012451 0.1214886 0.6267661
Dendropsophus joannae 36.10004 29.2219141 0.1242635 1.1195722
Dendropsophus juliani 35.66632 25.9732748 0.1277859 0.9171136
Dendropsophus minusculus 35.73028 26.0590521 0.1225644 0.9710849
Dendropsophus rubicundulus 35.70116 19.7915509 0.1238339 0.7167989
Dendropsophus tritaeniatus 35.64413 25.4814765 0.1258088 0.9253715
Dendropsophus leali 36.04682 31.6739856 0.1239677 1.1437316
Dendropsophus minimus 36.08628 35.3134371 0.1259283 1.2734360
Dendropsophus meridianus 36.85214 19.9202910 0.1225206 0.7615189
Dendropsophus limai 36.08216 15.6166906 0.1229719 0.5991290
Dendropsophus luteoocellatus 36.03197 25.9179713 0.1251967 0.9694633
Dendropsophus melanargyreus 36.89654 23.1584752 0.1228259 0.8267914
Dendropsophus seniculus 36.71052 18.9293016 0.1228402 0.7338620
Dendropsophus mathiassoni 36.07086 26.6123490 0.1217639 1.0281608
Dendropsophus microcephalus 36.01692 32.7127516 0.1261844 1.1780278
Dendropsophus phlebodes 36.04030 35.9961770 0.1230212 1.3363461
Dendropsophus rhodopeplus 35.95224 30.8370318 0.1272645 1.1599976
Dendropsophus microps 36.09094 21.7920173 0.1237755 0.8561194
Dendropsophus nahdereri 36.04618 13.7793390 0.1227479 0.5564025
Dendropsophus nanus 36.07027 23.7810963 0.1256010 0.8689221
Dendropsophus walfordi 36.12327 30.5552987 0.1241167 1.0748362
Dendropsophus riveroi 36.08500 29.0111371 0.1252634 1.0507804
Dendropsophus reichlei 36.18218 29.7206588 0.1234288 1.2296603
Dendropsophus padreluna 36.15527 31.8598550 0.1233229 1.2592411
Dendropsophus pauiniensis 36.01703 31.3680963 0.1240364 1.0758182
Dendropsophus praestans 36.01742 18.5435692 0.1231229 0.7878785
Dendropsophus pseudomeridianus 36.04716 22.3805163 0.1237927 0.8515267
Dendropsophus rhea 36.15376 18.7787081 0.1215142 0.7118680
Dendropsophus rossalleni 35.99282 33.8524670 0.1264913 1.2294194
Dendropsophus ruschii 35.57986 27.3552364 0.1251641 1.0530949
Dendropsophus soaresi 35.96477 24.0961566 0.1248126 0.9018840
Dendropsophus stingi 35.98018 20.6431575 0.1238243 0.9090066
Dendropsophus studerae 36.07498 25.8776510 0.1251041 1.0113299
Dendropsophus subocularis 36.07090 32.3280049 0.1238494 1.2373128
Dendropsophus tintinnabulum 36.05999 29.7469538 0.1216924 1.0365114
Dendropsophus virolinensis 36.06626 20.7034061 0.1233165 0.9276185
Dendropsophus werneri 36.04193 15.0839799 0.1239788 0.5934441
Dendropsophus xapuriensis 36.00131 34.0019069 0.1243003 1.2107159
Xenohyla eugenioi 36.09163 20.6659664 0.1225269 0.8151871
Xenohyla truncata 36.15373 27.1266433 0.1242621 1.0508772
Lysapsus caraya 37.49673 20.3035152 0.1230542 0.7209548
Lysapsus laevis 37.13526 28.4058534 0.1275284 1.0967342
Pseudis bolbodactyla 37.39067 17.8542790 0.1245552 0.6758156
Pseudis fusca 37.31971 15.9711309 0.1268182 0.6240809
Pseudis tocantins 37.39707 18.4122779 0.1251603 0.6600416
Pseudis cardosoi 36.48704 10.3617898 0.1263417 0.4149430
Scarthyla vigilans 35.55531 26.9025742 0.1289407 1.0056342
Scinax altae 37.28313 50.5623916 0.1270889 1.8321075
Scinax auratus 37.23595 31.0215705 0.1240500 1.2153146
Scinax baumgardneri 37.27187 35.1553125 0.1252595 1.3004644
Scinax blairi 37.48959 30.6291268 0.1236650 1.1556848
Scinax boesemani 37.31603 38.5292075 0.1269832 1.3736310
Scinax parkeri 37.52481 29.5266844 0.1246339 1.0801206
Scinax boulengeri 37.41123 32.8445099 0.1234203 1.2149956
Scinax sugillatus 37.40679 25.8506468 0.1236863 1.0348867
Scinax cabralensis 37.19207 17.3360187 0.1261003 0.6790775
Scinax caldarum 37.38856 20.7164910 0.1254622 0.7938904
Scinax crospedospilus 37.29257 23.5907806 0.1255119 0.9111811
Scinax camposseabrai 37.28560 19.6986231 0.1280473 0.7840392
Scinax cardosoi 37.32709 25.6406240 0.1246497 0.9846302
Scinax castroviejoi 36.54622 14.7800341 0.1267195 0.6976126
Scinax chiquitanus 37.19378 26.3552140 0.1259775 1.0265368
Scinax funereus 37.25128 29.6162447 0.1264295 1.1188718
Scinax oreites 37.24678 19.0291850 0.1257351 0.8715794
Scinax constrictus 37.38135 21.5978410 0.1267617 0.7895648
Scinax cretatus 37.16772 28.4346473 0.1289224 1.1100186
Scinax cruentommus 37.22195 35.5060340 0.1251393 1.2779144
Scinax staufferi 37.34679 27.6861099 0.1261632 1.0393495
Scinax curicica 37.21406 18.2588272 0.1283218 0.7249243
Scinax cuspidatus 37.17583 29.5625744 0.1260405 1.1531715
Scinax danae 37.27958 26.5602944 0.1263593 1.0218728
Scinax duartei 37.43625 19.8900755 0.1232691 0.7652289
Scinax similis 37.28576 25.8687770 0.1274680 1.0101367
Scinax hayii 37.40840 22.1912528 0.1242489 0.8610538
Scinax exiguus 37.29382 29.2602401 0.1243173 1.1141432
Scinax karenanneae 37.25809 36.0481751 0.1271123 1.2761368
Scinax lindsayi 37.27116 37.6805825 0.1266800 1.3057933
Scinax fuscomarginatus 37.32667 24.4716997 0.1250333 0.9001568
Scinax proboscideus 36.68456 27.7348603 0.1303256 1.0046744
Scinax jolyi 36.69636 38.2847223 0.1277195 1.4128154
Scinax rostratus 36.75887 29.3169669 0.1307867 1.0932253
Scinax iquitorum 37.26045 36.0899120 0.1236808 1.3089043
Scinax kennedyi 37.30217 34.4545673 0.1258850 1.2378596
Scinax manriquei 37.20795 27.8534860 0.1275088 1.1006340
Scinax maracaya 37.25614 21.4169608 0.1272055 0.8267333
Scinax nebulosus 37.78960 32.5666208 0.1237381 1.1617482
Scinax pedromedinae 37.30524 34.6419012 0.1260900 1.4511128
Scinax perereca 37.32696 17.3168449 0.1256568 0.6748810
Scinax tigrinus 37.65315 20.3067300 0.1289706 0.7562200
Scinax trilineatus 37.28839 33.8754443 0.1262280 1.2665054
Scinax wandae 37.39095 28.5568998 0.1251582 1.0593828
Sphaenorhynchus bromelicola 37.20375 14.5084768 0.1264238 0.5807061
Sphaenorhynchus caramaschii 37.51727 14.9804380 0.1250851 0.5863574
Sphaenorhynchus palustris 37.31475 27.1899417 0.1277738 1.0674073
Sphaenorhynchus carneus 37.46770 32.9084772 0.1282533 1.1880383
Sphaenorhynchus dorisae 37.42989 36.3072307 0.1283073 1.3005768
Sphaenorhynchus planicola 37.66935 24.7059018 0.1260851 0.9633148
Sphaenorhynchus mirim 37.15788 23.5592492 0.1242493 0.9163662
Sphaenorhynchus surdus 37.17566 14.0151114 0.1263878 0.5619788
Sphaenorhynchus orophilus 37.23194 17.9288543 0.1245663 0.6946707
Nyctimantis rugiceps 36.56708 23.8816052 0.1281675 0.9203655
Corythomantis greeningi 36.71461 21.9741545 0.1299461 0.8423136
Trachycephalus coriaceus 37.06664 28.5234286 0.1255911 1.0274072
Trachycephalus dibernardoi 37.05328 14.3678013 0.1284856 0.5587666
Trachycephalus hadroceps 37.01270 29.4769606 0.1265791 1.0708623
Trachycephalus resinifictrix 37.03802 28.1098403 0.1257001 1.0078257
Trachycephalus imitatrix 36.97395 13.4192481 0.1290884 0.5217342
Trachycephalus nigromaculatus 37.04663 17.6059170 0.1263934 0.6776350
Trachycephalus lepidus 37.07888 14.3184283 0.1269164 0.5341874
Trachycephalus jordani 36.98972 20.0952268 0.1247778 0.8105600
Dryaderces pearsoni 36.70667 31.3523912 0.1254760 1.2823154
Itapotihyla langsdorffii 36.52514 20.1479478 0.1276448 0.7779178
Osteocephalus alboguttatus 36.34898 23.6811824 0.1267887 0.9588912
Osteocephalus heyeri 36.32726 29.4954475 0.1283991 1.0053536
Osteocephalus subtilis 36.43382 31.1986274 0.1289442 1.0862022
Osteocephalus verruciger 35.93347 20.4371571 0.1250937 0.8204113
Osteocephalus cabrerai 36.35760 26.0996037 0.1255321 0.9489319
Osteocephalus castaneicola 36.30612 28.0867745 0.1268045 1.2520978
Osteocephalus deridens 36.27057 25.7379383 0.1284203 0.9503331
Osteocephalus fuscifacies 36.27606 27.4665861 0.1270348 1.0284745
Osteocephalus leoniae 36.29917 19.4885616 0.1272156 0.8861471
Osteocephalus planiceps 36.25402 25.7523356 0.1304283 0.9698427
Osteocephalus leprieurii 36.27085 27.4637851 0.1294768 0.9864510
Osteocephalus yasuni 36.32279 31.0683869 0.1283486 1.0981215
Osteocephalus oophagus 36.36374 28.7410206 0.1267177 1.0175931
Osteocephalus taurinus 36.39764 28.1716296 0.1259697 1.0145041
Tepuihyla aecii 36.40476 29.5267147 0.1274721 1.1355523
Tepuihyla edelcae 36.30893 24.3441698 0.1282128 0.9473377
Tepuihyla rodriguezi 36.38435 28.3811830 0.1255790 1.0744206
Tepuihyla exophthalma 36.40093 27.9519061 0.1259160 1.0605680
Tepuihyla luteolabris 36.36707 27.7172174 0.1279345 1.0675046
Osteopilus crucialis 36.30672 70.6986334 0.1282017 2.5697962
Osteopilus marianae 36.35382 74.1706688 0.1275226 2.7036141
Osteopilus wilderi 36.29378 64.5726666 0.1284708 2.3434735
Osteopilus ocellatus 36.31627 71.6339618 0.1280216 2.6006254
Osteopilus dominicensis 36.38663 58.9026546 0.1277055 2.1424083
Osteopilus pulchrilineatus 36.38508 63.0070722 0.1291889 2.3050757
Osteopilus vastus 35.88509 55.4024447 0.1307992 2.0326437
Phyllodytes acuminatus 36.56279 26.5010442 0.1273006 1.0398870
Phyllodytes brevirostris 36.59005 32.0567351 0.1267425 1.2408872
Phyllodytes edelmoi 36.56512 27.4258950 0.1293519 1.0652777
Phyllodytes gyrinaethes 36.64828 28.7537445 0.1263215 1.1153790
Phyllodytes kautskyi 36.58838 29.3774726 0.1246911 1.1487833
Phyllodytes maculosus 36.57212 24.5349681 0.1276410 0.9598108
Phyllodytes punctatus 36.59047 37.8642029 0.1260196 1.4805931
Phyllodytes tuberculosus 36.52061 16.1464899 0.1291743 0.6460697
Phyllodytes wuchereri 36.58344 27.3104935 0.1266546 1.0749943
Phytotriades auratus 36.43872 41.1594202 0.1298135 1.5423305
Pseudacris brachyphona 35.38471 9.3375931 0.1265851 0.3730978
Pseudacris brimleyi 35.35055 6.4440702 0.1262738 0.2550310
Pseudacris clarkii 35.43851 10.9579696 0.1251977 0.4340129
Pseudacris maculata 35.68126 4.4653375 0.1245638 0.2306718
Pseudacris kalmi 35.37562 4.6662589 0.1258860 0.1983079
Pseudacris nigrita 35.42830 10.0487058 0.1250397 0.3734595
Pseudacris fouquettei 35.42805 11.7611822 0.1267439 0.4318869
Pseudacris streckeri 35.34790 11.8360462 0.1290029 0.4550012
Pseudacris ornata 35.39345 13.0503144 0.1276962 0.4794677
Pseudacris ocularis 35.19177 11.3650206 0.1276570 0.4265106
Triprion petasatus 36.30095 30.8547377 0.1293621 1.1134153
Smilisca cyanosticta 36.38276 18.5759239 0.1323309 0.6881534
Smilisca puma 36.64592 21.2157475 0.1374102 0.8151012
Smilisca dentata 36.29829 14.2692840 0.1338812 0.6025948
Smilisca sila 36.27392 30.8767394 0.1332556 1.1509169
Smilisca sordida 35.74569 25.6978768 0.1334889 0.9652028
Isthmohyla angustilineata 36.39756 39.2847741 0.1307875 1.4092991
Isthmohyla debilis 36.30098 36.9850137 0.1337652 1.3510577
Isthmohyla graceae 36.46532 31.3714046 0.1333846 1.2027008
Isthmohyla infucata 36.35565 44.3700196 0.1295075 1.5876761
Isthmohyla insolita 35.93677 32.8302358 0.1314407 1.2461114
Isthmohyla lancasteri 36.48293 31.1823892 0.1298117 1.2348731
Isthmohyla picadoi 36.39547 29.7831161 0.1327408 1.1553551
Isthmohyla pictipes 35.82071 31.9910882 0.1337814 1.2432834
Isthmohyla pseudopuma 36.44968 31.5192734 0.1286519 1.2222338
Isthmohyla rivularis 35.95807 37.1468162 0.1313743 1.3325080
Isthmohyla tica 35.83487 40.0523797 0.1305406 1.4364009
Isthmohyla xanthosticta 36.44082 30.6917375 0.1288788 1.1067991
Isthmohyla zeteki 36.35976 32.5454775 0.1309296 1.2640934
Tlalocohyla godmani 36.11358 18.4678507 0.1304522 0.7318871
Tlalocohyla loquax 36.92453 27.1827848 0.1304950 1.0019723
Tlalocohyla picta 36.65109 23.9145866 0.1324528 0.8989314
Hyla annectans 36.30189 16.7338288 0.1307993 0.6989753
Hyla tsinlingensis 36.27943 8.9267444 0.1310659 0.3830658
Hyla chinensis 36.42974 16.0876824 0.1336184 0.5911377
Hyla savignyi 36.34427 11.0752858 0.1285036 0.4995423
Hyla hallowellii 36.35567 41.5412719 0.1321892 1.5162549
Hyla intermedia 36.35491 9.7858207 0.1321228 0.4130477
Hyla sanchiangensis 36.39020 17.0147920 0.1292033 0.6158972
Hyla sarda 36.34809 12.2671101 0.1329907 0.5115061
Hyla simplex 36.31108 23.6456891 0.1302864 0.8450204
Hyla zhaopingensis 36.35195 20.0475156 0.1312882 0.7100984
Charadrahyla altipotens 35.88012 25.6333377 0.1287761 0.9572468
Charadrahyla chaneque 35.88984 26.6889970 0.1304316 0.9550003
Charadrahyla nephila 35.86304 17.2816670 0.1308017 0.6925581
Charadrahyla taeniopus 35.79620 18.7658759 0.1295825 0.7704689
Charadrahyla trux 35.98842 23.6808045 0.1292333 0.9505629
Megastomatohyla mixe 35.79827 14.0970907 0.1301363 0.6225722
Megastomatohyla mixomaculata 35.79643 21.7498069 0.1277705 0.8739939
Megastomatohyla nubicola 35.75959 35.9078335 0.1315057 1.3929500
Megastomatohyla pellita 35.79703 29.6363042 0.1301177 1.1001625
Bromeliohyla bromeliacia 36.25882 25.5220330 0.1298923 0.9905229
Bromeliohyla dendroscarta 36.35686 20.2534334 0.1304015 0.8156058
Duellmanohyla chamulae 35.72670 29.1434740 0.1289529 1.0441584
Duellmanohyla ignicolor 35.73936 14.2483314 0.1301460 0.6287999
Duellmanohyla lythrodes 35.75116 29.2279807 0.1294935 1.2903439
Duellmanohyla rufioculis 35.77619 36.6789243 0.1305319 1.3880428
Duellmanohyla salvavida 35.80672 43.0686206 0.1309868 1.6353137
Duellmanohyla schmidtorum 36.24058 26.4939885 0.1293373 0.9705055
Duellmanohyla soralia 35.74044 32.9708365 0.1322100 1.2937716
Duellmanohyla uranochroa 35.75090 38.4199115 0.1309023 1.4922178
Ptychohyla dendrophasma 35.74018 25.3100428 0.1305101 0.9348130
Ptychohyla euthysanota 35.78012 23.2429833 0.1301791 0.8797630
Ptychohyla hypomykter 36.27286 25.7439834 0.1294949 0.9854358
Ptychohyla legleri 35.83081 33.5684138 0.1292556 1.3431014
Ptychohyla leonhardschultzei 35.69761 24.9066349 0.1312504 0.9675596
Ptychohyla zophodes 35.75869 23.4063254 0.1294377 0.9176485
Ptychohyla macrotympanum 35.80959 25.0118332 0.1283930 0.9364599
Ptychohyla salvadorensis 36.20431 23.4041821 0.1273174 0.8870587
Ecnomiohyla fimbrimembra 36.28329 33.6246822 0.1304625 1.2064000
Ecnomiohyla miliaria 36.25588 34.6787448 0.1302707 1.3125983
Ecnomiohyla minera 36.21461 21.4742376 0.1306053 0.8422098
Ecnomiohyla phantasmagoria 36.11689 27.7000628 0.1302793 1.0211321
Ecnomiohyla salvaje 36.22711 30.8280397 0.1275333 1.1677039
Ecnomiohyla thysanota 36.23362 31.7022036 0.1289401 1.1289280
Ecnomiohyla valancifer 36.29746 25.2061227 0.1278830 0.9246893
Exerodonta abdivita 36.16902 19.0944716 0.1297714 0.7645945
Exerodonta perkinsi 35.70656 22.8085523 0.1295126 0.9155717
Exerodonta bivocata 35.79278 28.8059400 0.1300936 1.0289608
Exerodonta catracha 36.23689 20.5160392 0.1294441 0.8097971
Exerodonta chimalapa 35.80917 26.8118844 0.1280912 0.9676089
Exerodonta smaragdina 36.27409 21.6251683 0.1300978 0.8678886
Exerodonta xera 36.22949 20.8334730 0.1310199 0.8499939
Exerodonta melanomma 36.18757 26.4148975 0.1327651 1.0007692
Exerodonta sumichrasti 36.25448 25.1262501 0.1299272 0.9412093
Plectrohyla acanthodes 35.74814 22.2742608 0.1271328 0.8411552
Plectrohyla avia 36.33623 25.2976613 0.1263734 0.9620606
Plectrohyla chrysopleura 35.79293 32.3035436 0.1306272 1.2317754
Plectrohyla dasypus 36.31160 37.5068249 0.1285260 1.4735509
Plectrohyla exquisita 36.21985 35.9698205 0.1300386 1.4123350
Plectrohyla glandulosa 35.87680 16.5127757 0.1272233 0.7258745
Plectrohyla guatemalensis 35.83873 26.1513088 0.1282470 1.0036151
Plectrohyla hartwegi 35.66568 23.4440821 0.1302450 0.8984077
Plectrohyla ixil 35.79679 24.4111357 0.1277748 0.9290309
Plectrohyla lacertosa 35.79025 25.3556320 0.1277927 0.9658139
Plectrohyla matudai 36.42826 24.8582674 0.1291381 0.9495347
Plectrohyla pokomchi 35.78591 19.5008893 0.1313972 0.7670001
Plectrohyla psiloderma 35.82578 26.5620015 0.1290014 0.9926284
Plectrohyla quecchi 35.76981 23.5396556 0.1299098 0.9030847
Plectrohyla sagorum 35.88773 22.9207972 0.1271048 0.8950539
Plectrohyla tecunumani 35.82252 15.7832729 0.1281341 0.6986712
Plectrohyla teuchestes 35.79805 28.0297476 0.1294877 1.0445040
Macrogenioglottus alipioi 34.44562 22.0377546 0.1362890 0.8563499
Odontophrynus achalensis 33.52875 7.6299610 0.1369397 0.3286903
Odontophrynus cultripes 34.94441 16.4934296 0.1377662 0.6276932
Odontophrynus cordobae 33.34824 9.0808516 0.1385828 0.3769552
Odontophrynus lavillai 34.92755 12.6825034 0.1385553 0.5035816
Odontophrynus carvalhoi 34.09205 19.9299517 0.1399994 0.7693879
Proceratophrys appendiculata 34.71142 21.0698292 0.1344052 0.8147374
Proceratophrys melanopogon 34.75770 19.6566663 0.1345028 0.7591571
Proceratophrys phyllostomus 34.64535 26.3346165 0.1388588 1.0185003
Proceratophrys moehringi 34.09244 27.8651749 0.1367349 1.0754932
Proceratophrys boiei 34.70858 20.0427994 0.1370544 0.7818353
Proceratophrys laticeps 34.69035 27.0542486 0.1345743 1.0609415
Proceratophrys cururu 34.72845 16.8869013 0.1374471 0.6865940
Proceratophrys concavitympanum 34.08240 27.5527400 0.1360164 0.9745240
Proceratophrys moratoi 34.92411 18.4263401 0.1343595 0.6906081
Proceratophrys goyana 34.67940 19.7328865 0.1364530 0.7329793
Proceratophrys brauni 34.74574 14.6821439 0.1328168 0.5894116
Proceratophrys cristiceps 34.81870 24.3074429 0.1328736 0.9412419
Proceratophrys paviotii 34.30599 25.0228660 0.1336683 0.9697462
Proceratophrys subguttata 34.72842 15.7428270 0.1334230 0.6412752
Proceratophrys palustris 34.68781 18.5682717 0.1366288 0.7042751
Proceratophrys vielliardi 34.75149 19.7936817 0.1341758 0.7488271
Proceratophrys bigibbosa 34.70944 15.0033454 0.1357548 0.5818948
Proceratophrys avelinoi 34.91764 16.7093291 0.1352624 0.6360931
Adenomus kandianus 34.83116 26.1842095 0.1337408 0.9476342
Adenomus kelaartii 35.44174 24.4031983 0.1299752 0.8749833
Duttaphrynus atukoralei 35.49324 24.5606931 0.1313116 0.8694519
Duttaphrynus scaber 35.47492 20.5888928 0.1316486 0.7440006
Duttaphrynus beddomii 35.45664 28.6915754 0.1328672 1.0453207
Duttaphrynus brevirostris 35.40791 20.9651121 0.1321670 0.7784718
Duttaphrynus crocus 35.44068 41.7205463 0.1321471 1.4872305
Duttaphrynus dhufarensis 35.52021 23.1427248 0.1312352 0.8753369
Duttaphrynus himalayanus 35.49113 9.0108450 0.1302522 0.5197369
Duttaphrynus hololius 35.44901 20.2704884 0.1328466 0.7383462
Duttaphrynus kotagamai 34.83293 27.4632775 0.1334500 0.9912224
Duttaphrynus microtympanum 35.39216 23.5055180 0.1326525 0.8485894
Duttaphrynus noellerti 35.41764 27.1365255 0.1340493 0.9829927
Duttaphrynus olivaceus 35.47707 16.2699191 0.1321593 0.6341331
Duttaphrynus parietalis 35.45754 23.0788995 0.1289141 0.8369255
Duttaphrynus scorteccii 35.40414 21.8322749 0.1309286 0.8770401
Duttaphrynus silentvalleyensis 34.86731 18.5387310 0.1339422 0.6781613
Duttaphrynus stomaticus 35.50623 15.7353099 0.1315224 0.6156946
Duttaphrynus stuarti 35.45289 9.5167431 0.1318204 0.5808769
Duttaphrynus sumatranus 34.80952 37.8935658 0.1315079 1.3097801
Duttaphrynus valhallae 35.47308 40.0893193 0.1301658 1.4463941
Xanthophryne koynayensis 35.44790 21.9372423 0.1296164 0.8096123
Xanthophryne tigerina 35.45819 21.6271405 0.1319866 0.7988646
Pedostibes tuberculosus 34.90501 24.2477407 0.1314003 0.8779811
Churamiti maridadi 35.36998 17.6719482 0.1330606 0.7590519
Nectophrynoides cryptus 35.55099 28.7700417 0.1324099 1.1812039
Nectophrynoides frontierei 35.48748 33.5450891 0.1320883 1.3371220
Nectophrynoides laevis 35.52930 27.7279626 0.1337202 1.1295344
Nectophrynoides laticeps 35.44879 19.3933666 0.1354803 0.8380736
Nectophrynoides minutus 35.55512 29.2285633 0.1311665 1.2004596
Nectophrynoides paulae 35.32712 18.5679913 0.1330366 0.8007157
Nectophrynoides poyntoni 35.50548 19.7349453 0.1325848 0.9093152
Nectophrynoides pseudotornieri 35.52724 25.7424721 0.1312193 1.0633890
Nectophrynoides tornieri 35.51649 26.3465992 0.1310407 1.1025268
Nectophrynoides vestergaardi 35.56446 35.1902039 0.1305145 1.4037319
Nectophrynoides viviparus 35.50325 23.7370450 0.1309774 1.0324758
Nectophrynoides wendyae 35.53465 20.2788087 0.1305281 0.9367257
Schismaderma carens 35.47861 18.3585386 0.1306169 0.7726606
Bufotes balearicus 35.92672 8.9156582 0.1322525 0.3848462
Bufotes latastii 35.86421 4.3472691 0.1332363 0.3577085
Bufotes luristanicus 35.87598 13.5829088 0.1318907 0.5669184
Bufotes oblongus 35.88093 12.3247348 0.1312245 0.6050177
Bufotes pseudoraddei 35.86388 6.2134026 0.1315311 0.3707296
Bufotes surdus 35.81908 12.9674056 0.1313877 0.5331983
Bufotes turanensis 35.84372 11.8703914 0.1309352 0.5707624
Bufotes variabilis 35.88808 7.3455794 0.1330371 0.3549572
Bufotes zamdaensis 35.85896 4.2025584 0.1320657 0.4070099
Bufotes zugmayeri 35.83644 9.6141509 0.1317252 0.4752614
Ansonia albomaculata 35.45973 32.9388709 0.1288913 1.1916879
Ansonia torrentis 34.83762 34.7191770 0.1290963 1.2747820
Ansonia longidigita 35.42961 38.0945815 0.1305750 1.3637423
Ansonia endauensis 34.79720 34.2530289 0.1348732 1.1902274
Ansonia inthanon 34.75501 24.9263460 0.1343161 0.9033635
Ansonia kraensis 34.73042 28.5629390 0.1309107 1.0048334
Ansonia thinthinae 34.71803 29.0896010 0.1341639 1.0456740
Ansonia siamensis 34.77164 33.7082682 0.1298668 1.2171627
Ansonia fuliginea 35.44563 53.0207873 0.1301011 1.9498358
Ansonia mcgregori 34.83211 44.9449377 0.1331824 1.6325199
Ansonia muelleri 34.82216 42.1637505 0.1316447 1.5234089
Ansonia glandulosa 34.81630 43.5587892 0.1306315 1.5233275
Ansonia hanitschi 35.39329 35.9988732 0.1291911 1.3041720
Ansonia platysoma 34.70233 37.6593015 0.1328630 1.3874372
Ansonia minuta 34.82512 35.0660163 0.1303776 1.2408649
Ansonia spinulifer 35.25841 37.0728633 0.1332720 1.3187325
Ansonia jeetsukumarani 34.75835 35.5892108 0.1324118 1.2839052
Ansonia latidisca 35.22528 46.6036052 0.1310725 1.6642784
Ansonia latiffi 34.83990 36.6627491 0.1300009 1.2857743
Ansonia latirostra 35.28152 33.8208869 0.1330092 1.1778800
Ansonia tiomanica 34.81097 32.4750177 0.1293184 1.1301003
Ansonia malayana 34.86449 30.8246420 0.1331900 1.0973843
Pelophryne albotaeniata 35.27559 52.8827503 0.1348140 1.9016986
Pelophryne api 35.45578 38.0781631 0.1306146 1.3943337
Pelophryne brevipes 35.26789 39.1598379 0.1321559 1.4111199
Pelophryne guentheri 35.50379 36.3692664 0.1316714 1.3226200
Pelophryne lighti 35.37515 44.7198579 0.1317720 1.6243426
Pelophryne linanitensis 35.50204 25.5019904 0.1316496 0.9753959
Pelophryne misera 35.43199 39.5522271 0.1318021 1.4677972
Pelophryne murudensis 35.47933 27.6235428 0.1342736 1.0594310
Pelophryne rhopophilia 35.43954 33.5759111 0.1328983 1.2165770
Pelophryne signata 35.46660 40.4323489 0.1295018 1.4585897
Ghatophryne ornata 34.79937 27.8241103 0.1307217 1.0288273
Ghatophryne rubigina 34.79559 21.1485505 0.1294982 0.7583687
Ingerophrynus biporcatus 35.43267 39.4730892 0.1331929 1.4102894
Ingerophrynus claviger 35.39554 50.3036397 0.1284326 1.8322506
Ingerophrynus divergens 35.40473 37.2803835 0.1317261 1.3236362
Ingerophrynus galeatus 35.37127 26.7547701 0.1345437 0.9664523
Ingerophrynus philippinicus 35.44300 49.0407572 0.1314224 1.7556065
Ingerophrynus gollum 34.73786 38.5508883 0.1332794 1.3614489
Ingerophrynus kumquat 35.42490 37.0724759 0.1304510 1.3005243
Ingerophrynus macrotis 35.42031 25.1849275 0.1323409 0.9224505
Ingerophrynus parvus 34.79179 28.5698542 0.1312255 0.9992073
Ingerophrynus quadriporcatus 35.43527 38.6672668 0.1294823 1.3621191
Ingerophrynus celebensis 35.32215 43.1281065 0.1341643 1.5940275
Bufo ailaoanus 35.11008 16.2315680 0.1331076 0.7121010
Bufo aspinius 34.99632 12.6750566 0.1324399 0.6429680
Bufo cryptotympanicus 35.07303 16.3741942 0.1332996 0.6012758
Bufo tuberculatus 35.14395 5.9428029 0.1332374 0.3912064
Bufo eichwaldi 35.11257 10.9620459 0.1314125 0.5551417
Bufo japonicus 35.02680 9.8121464 0.1331707 0.3995011
Bufo torrenticola 34.99901 10.1603136 0.1329419 0.4078581
Bufo pageoti 35.01504 15.7046443 0.1334151 0.6538492
Bufo stejnegeri 35.03142 5.3514813 0.1334447 0.2446396
Bufo verrucosissimus 35.09905 7.3669016 0.1299747 0.3661210
Strauchbufo raddei 35.33320 6.4613252 0.1307411 0.3407825
Didynamipus sjostedti 35.36204 36.2415991 0.1317457 1.3345330
Nimbaphrynoides occidentalis 35.33423 34.5548060 0.1317484 1.2489595
Nectophryne afra 35.29632 30.2568469 0.1314945 1.1056800
Nectophryne batesii 35.21549 27.3610370 0.1313974 0.9999211
Werneria bambutensis 34.79556 29.8629285 0.1307255 1.1380191
Werneria iboundji 34.71272 24.4815701 0.1322958 0.8734771
Werneria mertensiana 34.68638 30.1247915 0.1330718 1.1216648
Werneria tandyi 34.72225 38.1690669 0.1293262 1.4080948
Werneria preussi 34.76748 42.8263233 0.1326891 1.5749690
Werneria submontana 34.72081 36.1757093 0.1281752 1.3305559
Wolterstorffina chirioi 35.35492 26.5678603 0.1323167 1.0284082
Wolterstorffina mirei 35.34803 26.0428791 0.1317892 1.0099529
Wolterstorffina parvipalmata 34.69579 34.8673425 0.1297824 1.3007498
Leptophryne borbonica 35.31562 31.0109553 0.1313269 1.0984341
Leptophryne cruentata 34.66755 25.1875364 0.1323389 0.8801180
Pedostibes kempi 35.22684 23.5270451 0.1318985 0.9212173
Altiphrynoides malcolmi 35.12554 26.1305976 0.1323037 1.3224118
Amazophrynella bokermanni 35.26772 38.6463966 0.1315749 1.3762122
Amazophrynella minuta 35.11771 36.4867157 0.1335164 1.3203282
Dendrophryniscus berthalutzae 35.25474 17.1300094 0.1301212 0.6877008
Dendrophryniscus krausae 35.28414 14.6391078 0.1307613 0.5969076
Dendrophryniscus leucomystax 35.21689 21.1483054 0.1306496 0.8147212
Dendrophryniscus brevipollicatus 35.22112 27.0801940 0.1329571 1.0497258
Dendrophryniscus carvalhoi 35.30652 33.4581266 0.1291717 1.2977836
Dendrophryniscus proboscideus 35.30108 27.9994706 0.1313786 1.0947255
Dendrophryniscus stawiarskyi 35.20643 17.1561836 0.1329137 0.6808884
Vandijkophrynus amatolicus 35.13563 14.6690928 0.1329065 0.7104059
Vandijkophrynus inyangae 35.17968 18.7344848 0.1321497 0.7827564
Vandijkophrynus angusticeps 35.25651 14.5603680 0.1316464 0.6887052
Vandijkophrynus gariepensis 35.19048 13.1927653 0.1329832 0.6251869
Vandijkophrynus robinsoni 35.18982 16.1237826 0.1328317 0.7881477
Anaxyrus hemiophrys 36.03568 3.5127715 0.1266966 0.1864475
Anaxyrus houstonensis 36.06607 12.9177991 0.1250382 0.4753305
Anaxyrus microscaphus 35.91994 5.9666803 0.1233382 0.2893595
Anaxyrus californicus 35.97774 9.2482868 0.1236505 0.4343909
Anaxyrus debilis 37.34067 10.4459130 0.1241215 0.4451499
Anaxyrus kelloggi 35.94267 12.9084480 0.1258540 0.5089264
Anaxyrus mexicanus 35.97549 10.3105342 0.1253500 0.4285197
Anaxyrus quercicus 35.99303 11.0426034 0.1242137 0.4093134
Anaxyrus speciosus 36.95540 13.5656368 0.1249515 0.5542702
Incilius occidentalis 36.56727 14.9322438 0.1249271 0.6147031
Incilius aucoinae 36.42283 25.2077376 0.1285786 0.9850586
Incilius melanochlorus 36.39641 26.5945011 0.1261243 1.0047342
Incilius campbelli 35.81029 23.4543529 0.1250094 0.8864794
Incilius leucomyos 36.45645 22.6175565 0.1254232 0.8634570
Incilius macrocristatus 36.39801 21.9684919 0.1274942 0.7892096
Incilius tutelarius 35.79579 17.4063241 0.1266969 0.6580238
Incilius cristatus 36.41486 16.5809990 0.1253855 0.6740380
Incilius perplexus 36.42000 19.2652799 0.1281327 0.7622893
Incilius cavifrons 35.72291 19.3603137 0.1274821 0.7080481
Incilius spiculatus 35.78535 12.3396634 0.1279790 0.5495362
Incilius chompipe 36.45748 22.6075211 0.1256610 0.9347218
Incilius coniferus 36.47094 25.7656633 0.1258667 0.9811312
Incilius coccifer 36.47462 23.0188273 0.1264908 0.8608147
Incilius cycladen 36.46317 19.2111144 0.1280446 0.7615384
Incilius signifer 36.49145 36.3191163 0.1251882 1.3413723
Incilius porteri 36.41310 19.0897241 0.1281373 0.7316909
Incilius ibarrai 36.46950 15.2924597 0.1260149 0.5955546
Incilius pisinnus 36.45051 21.1882556 0.1264693 0.8646359
Incilius epioticus 36.37982 28.8997244 0.1272831 1.1859751
Incilius gemmifer 36.34127 18.2918366 0.1275401 0.6998054
Incilius guanacaste 36.49205 30.7865999 0.1239423 1.1505372
Incilius holdridgei 36.42661 27.4510376 0.1248283 0.9895505
Incilius luetkenii 36.54825 20.5933574 0.1261011 0.7659573
Incilius nebulifer 36.47617 16.4420008 0.1234030 0.6336554
Incilius valliceps 36.41210 22.1386149 0.1267956 0.8167254
Incilius tacanensis 35.82957 20.5965002 0.1263616 0.8026630
Incilius bocourti 36.25522 19.7438448 0.1274121 0.7677863
Rhinella abei 36.74118 10.9006551 0.1250059 0.4422981
Rhinella pombali 36.73158 12.6038887 0.1258480 0.4868344
Rhinella achalensis 36.56378 9.2358866 0.1254394 0.4037417
Rhinella achavali 36.33822 9.2366831 0.1257520 0.3775466
Rhinella rubescens 36.30004 15.6322267 0.1270945 0.5804241
Rhinella acrolopha 36.58573 29.6183883 0.1279110 1.0863324
Rhinella acutirostris 36.55210 27.0238589 0.1253891 0.9912560
Rhinella alata 36.55634 28.6108924 0.1281364 1.0656376
Rhinella amabilis 36.77235 16.0817288 0.1227261 0.7061256
Rhinella amboroensis 35.92321 25.7658186 0.1260679 1.1382094
Rhinella veraguensis 36.38182 19.9748464 0.1245394 1.0017442
Rhinella arborescandens 36.44619 19.9164431 0.1252602 0.8842629
Rhinella arunco 36.58646 6.5553694 0.1243358 0.3597176
Rhinella atacamensis 36.73836 7.9825023 0.1273904 0.4647936
Rhinella bergi 36.61275 14.1256223 0.1251814 0.5131944
Rhinella castaneotica 36.50196 29.3272895 0.1274228 1.0339638
Rhinella cerradensis 36.88074 16.2019138 0.1300585 0.5961285
Rhinella jimi 36.92436 20.6675136 0.1279403 0.7976637
Rhinella chavin 36.26387 14.7937596 0.1277133 0.7500062
Rhinella cristinae 36.59081 23.8683145 0.1240037 0.9543205
Rhinella dapsilis 36.52199 30.7889875 0.1261454 1.1367972
Rhinella martyi 36.48259 30.6358918 0.1265049 1.1133777
Rhinella lescurei 36.46705 26.1032499 0.1284349 0.9416199
Rhinella fernandezae 36.62106 10.1486347 0.1274424 0.4042829
Rhinella festae 36.54807 18.4408916 0.1263924 0.7672607
Rhinella fissipes 36.55785 27.0848024 0.1242610 1.3145953
Rhinella gallardoi 36.53532 14.7574086 0.1255248 0.6378595
Rhinella gnustae 35.90304 10.5053631 0.1255695 0.6733245
Rhinella henseli 36.56727 12.5891118 0.1236895 0.5032778
Rhinella inca 36.59360 14.4939129 0.1254214 0.7679543
Rhinella iserni 36.58299 33.7080666 0.1254464 1.5206741
Rhinella justinianoi 36.61049 21.7624209 0.1243031 1.0379407
Rhinella limensis 36.62087 16.5562114 0.1267166 0.7978144
Rhinella lindae 36.51077 32.4465646 0.1262431 1.2265709
Rhinella macrorhina 36.57904 16.9897702 0.1245416 0.7508256
Rhinella magnussoni 36.54605 29.7752626 0.1272717 1.0721354
Rhinella manu 36.41346 13.9183784 0.1239475 0.7987639
Rhinella nesiotes 36.41072 28.0665866 0.1249733 1.2301770
Rhinella multiverrucosa 36.67430 16.1909410 0.1240422 0.7992260
Rhinella nicefori 36.62631 19.6204974 0.1246888 0.8145986
Rhinella ocellata 36.53135 18.9153753 0.1290079 0.6911417
Rhinella poeppigii 35.97371 22.1110522 0.1254827 1.0079103
Rhinella proboscidea 36.56427 30.7713671 0.1263980 1.0756777
Rhinella pygmaea 37.60213 21.3453837 0.1261858 0.8261741
Rhinella quechua 36.59143 19.1981559 0.1242515 0.9725297
Rhinella roqueana 36.59808 25.8749781 0.1262069 0.9670665
Rhinella rubropunctata 36.49576 6.5069626 0.1247295 0.3759096
Rhinella ruizi 36.54606 18.4635004 0.1276507 0.8216101
Rhinella rumbolli 36.52757 12.3867523 0.1247267 0.6037890
Rhinella scitula 35.93582 19.4902777 0.1276981 0.6786503
Rhinella sclerocephala 36.50792 30.0610050 0.1249136 1.1233049
Rhinella stanlaii 36.55036 22.0940579 0.1258570 1.0952267
Rhinella sternosignata 36.53616 26.7701103 0.1254493 1.0423964
Rhinella tacana 36.39047 19.3228360 0.1261228 0.9903784
Rhinella tenrec 36.63820 31.9649818 0.1278191 1.2105331
Rhinella vellardi 36.60368 18.9458447 0.1265229 0.9124408
Rhinella veredas 36.51014 21.4275160 0.1275405 0.8099315
Rhinella yanachaga 36.35901 19.6494314 0.1278061 0.9217852
Atelopus andinus 34.06506 31.0179838 0.1292850 1.2652389
Atelopus arsyecue 34.03874 24.8585896 0.1319212 0.9719388
Atelopus balios 34.11297 25.3318181 0.1317062 0.9366497
Atelopus bomolochos 34.03672 24.3493433 0.1318013 0.9404351
Atelopus carauta 34.06963 34.1492387 0.1311225 1.2908873
Atelopus carrikeri 34.06437 22.6337810 0.1312048 0.8848571
Atelopus certus 34.00020 40.6724222 0.1342495 1.5065238
Atelopus chirripoensis 34.60864 20.5143212 0.1332328 1.1926495
Atelopus chrysocorallus 34.00709 32.5008370 0.1315493 1.2141573
Atelopus coynei 34.02234 14.1365382 0.1341127 0.6785297
Atelopus cruciger 33.98903 35.8526972 0.1328973 1.3223540
Atelopus dimorphus 33.94101 30.7028714 0.1331727 1.2986456
Atelopus epikeisthos 34.00278 30.5688673 0.1328530 1.3019853
Atelopus exiguus 34.11752 16.6565610 0.1321631 0.6873446
Atelopus nanay 34.03939 24.0409860 0.1320415 0.8916065
Atelopus famelicus 34.00060 38.6532743 0.1323010 1.5007234
Atelopus flavescens 33.97791 42.1774196 0.1302802 1.5557586
Atelopus franciscus 33.93599 38.1371634 0.1318867 1.3978159
Atelopus galactogaster 33.99630 39.2769887 0.1320713 1.5006033
Atelopus glyphus 34.09901 37.8502923 0.1333644 1.3879053
Atelopus guitarraensis 34.06035 27.0039560 0.1317352 1.1298309
Atelopus podocarpus 34.00932 22.6235005 0.1336568 0.9753269
Atelopus ignescens 34.00267 14.3235103 0.1323225 0.6624398
Atelopus laetissimus 34.01285 24.9460089 0.1332165 0.9196353
Atelopus varius 34.03504 30.4175552 0.1322922 1.1641835
Atelopus longibrachius 33.97460 39.9737087 0.1330707 1.5494301
Atelopus longirostris 34.05749 14.9405009 0.1310903 0.7164462
Atelopus lozanoi 34.06518 22.9352889 0.1329542 1.0080147
Atelopus mandingues 34.03856 21.7852784 0.1325289 0.9566417
Atelopus mittermeieri 34.01800 22.2853383 0.1328151 0.9997384
Atelopus mucubajiensis 34.03360 32.9783224 0.1310608 1.2276675
Atelopus muisca 33.94503 22.3668116 0.1336363 0.9802376
Atelopus nahumae 34.06169 26.7210462 0.1294103 0.9951222
Atelopus nepiozomus 34.03237 18.0309055 0.1318183 0.7819804
Atelopus oxapampae 34.09185 24.4569945 0.1311606 1.1461191
Atelopus palmatus 33.98059 13.4533184 0.1323026 0.6061020
Atelopus pulcher 34.05379 30.6512219 0.1321735 1.3051953
Atelopus pyrodactylus 34.02039 30.1750495 0.1313364 1.3290152
Atelopus reticulatus 33.93513 32.8544393 0.1342825 1.3820456
Atelopus sanjosei 34.03727 35.9306282 0.1326413 1.3873888
Atelopus seminiferus 34.03931 25.3804922 0.1336049 1.0993165
Atelopus simulatus 34.59110 19.5458522 0.1320218 0.8784981
Atelopus siranus 33.98550 29.4302308 0.1300840 1.2888447
Atelopus spurrelli 33.99211 36.0476699 0.1316730 1.3901254
Atelopus tricolor 34.20716 28.2780888 0.1309765 1.3237664
Atelopus walkeri 34.10185 23.9435394 0.1295980 0.9176342
Bufoides meghalayanus 34.53861 20.8875595 0.1303711 0.9024287
Capensibufo rosei 35.36222 15.0531153 0.1299875 0.6953415
Capensibufo tradouwi 35.24606 14.5823029 0.1324625 0.6970616
Mertensophryne anotis 35.40258 30.2090552 0.1299873 1.1390197
Mertensophryne loveridgei 35.37932 29.2078640 0.1311046 1.1328756
Mertensophryne howelli 35.38804 35.8273827 0.1312162 1.3681549
Mertensophryne lindneri 35.37464 28.4242457 0.1302679 1.1156163
Mertensophryne lonnbergi 35.42195 24.3886497 0.1310555 1.1275070
Mertensophryne melanopleura 35.35607 23.9283755 0.1294696 0.9796604
Mertensophryne micranotis 35.39079 36.2062661 0.1318627 1.4405390
Mertensophryne mocquardi 35.36637 22.9446172 0.1312119 1.0788321
Mertensophryne nairobiensis 35.32911 20.2577120 0.1331775 0.9368216
Mertensophryne nyikae 35.31917 29.6097408 0.1328933 1.3331982
Mertensophryne schmidti 35.34364 27.5050661 0.1312202 1.0690126
Mertensophryne taitana 35.35328 23.8059777 0.1328414 1.0079207
Mertensophryne usambarae 35.37390 42.6742199 0.1326641 1.7002332
Mertensophryne uzunguensis 35.35692 27.8758475 0.1305444 1.2590174
Poyntonophrynus beiranus 35.34691 25.6031542 0.1305638 1.0007942
Poyntonophrynus damaranus 36.28962 14.5353404 0.1323482 0.6281741
Poyntonophrynus dombensis 35.26536 15.0459453 0.1315523 0.6445383
Poyntonophrynus fenoulheti 35.40372 19.5790174 0.1314857 0.8118549
Poyntonophrynus grandisonae 35.12522 15.1499942 0.1290208 0.6161834
Poyntonophrynus hoeschi 35.33731 15.6976632 0.1302224 0.7065102
Poyntonophrynus kavangensis 35.30309 20.2473354 0.1317571 0.8375877
Poyntonophrynus lughensis 35.35574 35.9273091 0.1306500 1.4674106
Poyntonophrynus parkeri 35.28589 23.0327126 0.1301360 1.0333644
Poyntonophrynus vertebralis 35.34119 15.2917074 0.1299599 0.7189934
Laurentophryne parkeri 35.35262 24.9690131 0.1276237 1.0166798
Metaphryniscus sosai 35.19916 33.3965564 0.1329798 1.2781440
Nannophryne apolobambica 35.22024 19.8485574 0.1325793 1.2144922
Nannophryne corynetes 35.31629 15.8997972 0.1281268 0.8539352
Nannophryne variegata 35.23681 5.9891532 0.1328576 0.5111197
Oreophrynella cryptica 35.35178 35.5940544 0.1289411 1.3583891
Oreophrynella dendronastes 35.15019 41.2420761 0.1324181 1.5332423
Oreophrynella huberi 35.31137 32.3328036 0.1300325 1.2300338
Oreophrynella macconnelli 35.17633 36.6938071 0.1295490 1.3623021
Oreophrynella nigra 35.31341 37.9192576 0.1309872 1.4252345
Oreophrynella quelchii 35.32884 36.5569119 0.1309520 1.3691920
Oreophrynella vasquezi 35.36308 31.0314516 0.1304765 1.1930045
Oreophrynella weiassipuensis 35.10860 34.4702840 0.1294893 1.2920565
Osornophryne bufoniformis 35.18577 20.9226885 0.1309626 0.9222589
Osornophryne antisana 35.19835 14.0327177 0.1291933 0.6346783
Osornophryne percrassa 35.19785 27.9778520 0.1316896 1.2337678
Osornophryne puruanta 35.14500 21.6381936 0.1324441 0.9730545
Osornophryne cofanorum 35.03366 22.8309617 0.1317262 1.0237140
Osornophryne guacamayo 35.23698 17.1980768 0.1292414 0.7813464
Osornophryne sumacoensis 35.25214 25.2131921 0.1317810 1.0549256
Osornophryne talipes 35.20451 23.2108239 0.1325689 1.0102005
Parapelophryne scalpta 35.35914 49.5028869 0.1344618 1.7582776
Peltophryne cataulaciceps 35.24405 62.3058731 0.1311330 2.2699611
Peltophryne longinasus 35.27440 69.8530066 0.1311419 2.5321490
Peltophryne gundlachi 35.16998 56.5105847 0.1306993 2.0512004
Peltophryne empusa 35.22459 67.4290361 0.1323866 2.4438947
Peltophryne florentinoi 35.24879 57.5275787 0.1304691 2.0916729
Peltophryne peltocephala 35.15934 63.1083825 0.1318917 2.2895180
Peltophryne fustiger 35.19928 54.5700891 0.1317842 1.9878861
Peltophryne taladai 35.23140 61.7744614 0.1306144 2.2342201
Peltophryne guentheri 35.17545 71.4539488 0.1315157 2.5995771
Peltophryne lemur 35.24856 64.0283991 0.1324287 2.3658546
Pseudobufo subasper 35.25779 44.5693186 0.1300819 1.5371435
Rhaebo blombergi 35.02381 33.1122153 0.1342978 1.3133197
Rhaebo caeruleostictus 35.08212 19.5248911 0.1323861 0.8149009
Rhaebo glaberrimus 34.52886 32.9897688 0.1310494 1.3025697
Rhaebo guttatus 35.04955 32.1869704 0.1319600 1.1606890
Rhaebo hypomelas 35.15661 32.0599884 0.1293464 1.2829509
Rhaebo lynchi 35.14797 35.8580456 0.1289433 1.3573454
Rhaebo nasicus 34.54102 31.7859953 0.1301990 1.1968849
Truebella skoptes 35.21988 23.5191369 0.1288299 1.3761998
Truebella tothastes 35.29795 13.1134919 0.1300858 0.7611042
Frostius erythrophthalmus 35.23968 23.3056253 0.1316565 0.9325698
Frostius pernambucensis 35.33719 32.2575386 0.1313048 1.2702542
Melanophryniscus admirabilis 34.47497 18.5628400 0.1305944 0.7323096
Melanophryniscus alipioi 34.96327 14.3530842 0.1332953 0.5930302
Melanophryniscus atroluteus 35.06521 14.8178376 0.1304168 0.5909739
Melanophryniscus cambaraensis 34.54404 15.0002144 0.1317050 0.6090524
Melanophryniscus cupreuscapularis 34.99878 18.1978181 0.1339878 0.6688359
Melanophryniscus dorsalis 35.09563 16.4661500 0.1347633 0.6751854
Melanophryniscus fulvoguttatus 34.96883 23.1011827 0.1335668 0.8248919
Melanophryniscus klappenbachi 35.03516 19.2080286 0.1317283 0.6907243
Melanophryniscus stelzneri 35.06464 13.1682181 0.1309114 0.6048878
Melanophryniscus langonei 34.31513 12.7911251 0.1325819 0.5129390
Melanophryniscus macrogranulosus 34.92130 13.9372789 0.1336346 0.5579309
Melanophryniscus montevidensis 34.94778 14.6986493 0.1333500 0.6602740
Melanophryniscus moreirae 35.02925 22.6717783 0.1317277 0.8489025
Melanophryniscus orejasmirandai 35.07922 16.2706869 0.1345130 0.7446443
Melanophryniscus pachyrhynus 35.06597 13.6447880 0.1332251 0.5620936
Melanophryniscus peritus 35.05050 20.0662530 0.1315102 0.7580169
Melanophryniscus sanmartini 35.02358 15.3394157 0.1341816 0.6615833
Melanophryniscus simplex 35.07852 15.7040571 0.1337984 0.6273214
Melanophryniscus spectabilis 35.08245 16.5594161 0.1306124 0.6565784
Melanophryniscus tumifrons 35.09568 16.1232335 0.1335948 0.6433429
Edalorhina nasuta 36.27354 18.7073421 0.1336140 0.8775205
Engystomops montubio 36.75920 20.9416756 0.1318696 0.8433883
Engystomops pustulatus 36.52844 20.7153230 0.1311398 0.8279026
Physalaemus caete 36.60964 23.8326373 0.1346209 0.9297250
Physalaemus aguirrei 36.42675 27.1870611 0.1326818 1.0610349
Physalaemus irroratus 36.45277 23.3728622 0.1289947 0.9104527
Physalaemus maculiventris 36.65234 20.1923446 0.1320654 0.7842384
Physalaemus moreirae 36.40766 18.6662134 0.1306764 0.7170901
Physalaemus albifrons 36.44264 18.6270143 0.1344178 0.7165931
Physalaemus centralis 35.71338 17.3289629 0.1347089 0.6323514
Physalaemus ephippifer 35.51333 27.8340813 0.1345210 0.9960033
Physalaemus erythros 35.75214 14.5871336 0.1352921 0.5664967
Physalaemus maximus 35.80934 13.9773065 0.1315266 0.5465853
Physalaemus angrensis 36.34619 20.2441362 0.1332388 0.7540133
Physalaemus rupestris 36.36991 22.3137614 0.1311286 0.8548396
Physalaemus atlanticus 37.23987 18.9222066 0.1304566 0.7567729
Physalaemus santafecinus 37.35823 12.5667334 0.1312305 0.4703211
Physalaemus spiniger 37.12182 16.3974819 0.1288403 0.6387528
Physalaemus barrioi 36.00508 16.3526960 0.1321302 0.6147210
Physalaemus biligonigerus 35.99251 14.9144893 0.1333020 0.5753734
Physalaemus jordanensis 36.18298 13.8948056 0.1312580 0.5376260
Physalaemus bokermanni 36.51876 15.5032536 0.1324882 0.6069186
Physalaemus cuqui 36.88809 13.7514444 0.1307270 0.5746019
Physalaemus kroyeri 36.57926 19.8800535 0.1304654 0.7815604
Physalaemus fernandezae 35.63700 10.0327272 0.1343204 0.4576415
Physalaemus deimaticus 36.37199 16.7975844 0.1325630 0.6825474
Physalaemus insperatus 36.40970 15.2627911 0.1308695 0.6223080
Physalaemus evangelistai 36.33540 18.9471721 0.1325540 0.7509364
Physalaemus nanus 36.34017 15.4228533 0.1319849 0.6235099
Physalaemus fischeri 36.31729 30.6358561 0.1319181 1.1435621
Physalaemus olfersii 36.34164 18.7908411 0.1310271 0.7323787
Physalaemus lisei 36.29943 13.3395395 0.1327246 0.5407885
Physalaemus marmoratus 37.67312 18.4800678 0.1318215 0.6833972
Physalaemus obtectus 36.39366 20.4123343 0.1307354 0.7901597
Physalaemus soaresi 36.38070 23.3504734 0.1312349 0.8921354
Pleurodema borellii 37.19611 9.4766966 0.1304718 0.4497366
Pleurodema cinereum 37.18823 10.1241881 0.1319652 0.5951182
Pleurodema fuscomaculatum 37.11748 24.3630327 0.1322985 0.8558101
Pleurodema bibroni 35.81643 9.4333641 0.1355485 0.3851898
Pleurodema kriegi 35.82267 8.3331792 0.1342764 0.3586660
Pleurodema guayapae 36.75042 9.4540861 0.1301690 0.3999375
Pseudopaludicola mystacalis 36.48101 22.5266996 0.1314382 0.8436858
Pseudopaludicola boliviana 36.52567 27.0261197 0.1286960 0.9712619
Pseudopaludicola pusilla 36.54700 29.0485252 0.1307580 1.0836532
Pseudopaludicola saltica 36.59960 23.9164955 0.1311752 0.8913482
Pseudopaludicola canga 36.45520 33.4551916 0.1303129 1.1916364
Pseudopaludicola mineira 36.50494 16.1948245 0.1275396 0.6513831
Pseudopaludicola llanera 36.53589 29.7731036 0.1260592 1.1084553
Pseudopaludicola ternetzi 36.74930 18.2225275 0.1291552 0.6874762
Crossodactylodes bokermanni 35.93615 31.2561428 0.1300625 1.2095514
Crossodactylodes izecksohni 36.02075 30.8111683 0.1311206 1.1942098
Crossodactylodes pintoi 36.02339 24.6480102 0.1322302 0.9178945
Paratelmatobius mantiqueira 35.97587 21.0712641 0.1322453 0.8060755
Paratelmatobius cardosoi 36.00188 20.6151656 0.1296190 0.8191506
Paratelmatobius gaigeae 36.03135 20.1367167 0.1306995 0.7539061
Paratelmatobius poecilogaster 36.01358 20.5583116 0.1333081 0.8183076
Paratelmatobius lutzii 36.08054 21.5212628 0.1281960 0.8069389
Scythrophrys sawayae 36.03073 18.3497075 0.1326686 0.7458269
Rupirana cardosoi 35.47791 21.4557465 0.1317179 0.8537356
Adenomera ajurauna 34.86067 14.6966572 0.1342320 0.5730912
Adenomera araucaria 35.34419 14.3138952 0.1296895 0.5740153
Adenomera thomei 35.33126 30.6957497 0.1331121 1.2008729
Adenomera nana 35.45841 15.8875116 0.1324253 0.6393327
Adenomera bokermanni 35.38564 17.4913737 0.1320983 0.6773274
Adenomera coca 35.36697 13.6877537 0.1311980 0.9425057
Adenomera diptyx 35.41116 18.9506071 0.1323430 0.6927039
Adenomera hylaedactyla 35.39350 28.5709900 0.1318151 1.0388234
Adenomera martinezi 35.35206 29.3326675 0.1323411 1.0562728
Adenomera marmorata 35.44286 19.1578594 0.1302786 0.7402232
Adenomera heyeri 35.52512 35.0187468 0.1319803 1.2725990
Adenomera lutzi 35.39185 32.1575265 0.1337709 1.1919543
Hydrolaetare caparu 37.47125 23.5290065 0.1312401 0.8200392
Hydrolaetare schmidti 36.41392 34.7324765 0.1317690 1.2220515
Hydrolaetare dantasi 36.43028 33.5043130 0.1301014 1.1899950
Leptodactylus poecilochilus 35.44867 27.8375641 0.1311916 1.0329955
Leptodactylus chaquensis 36.46040 15.8663046 0.1312637 0.6006834
Leptodactylus fragilis 38.12338 23.2250674 0.1281574 0.8738531
Leptodactylus longirostris 37.86599 27.3308171 0.1301427 1.0053962
Leptodactylus caatingae 36.52327 19.7394692 0.1291798 0.7641990
Leptodactylus camaquara 37.51463 17.3861291 0.1317728 0.6857897
Leptodactylus colombiensis 36.52463 27.2707592 0.1315883 1.0973239
Leptodactylus cunicularius 36.56946 15.7825899 0.1331705 0.6086664
Leptodactylus cupreus 37.47964 17.9185419 0.1293163 0.6931035
Leptodactylus notoaktites 35.69695 13.4284133 0.1345796 0.5205640
Leptodactylus mystaceus 35.65891 28.0110860 0.1329157 1.0121382
Leptodactylus spixi 35.77497 21.1334840 0.1321075 0.8250210
Leptodactylus elenae 35.93795 16.6512071 0.1303876 0.6068650
Leptodactylus diedrus 36.85951 28.8186537 0.1297745 1.0026669
Leptodactylus discodactylus 37.05933 25.9589457 0.1300614 0.9414296
Leptodactylus griseigularis 37.08923 17.8783008 0.1285516 0.9103298
Leptodactylus validus 36.61205 46.8360418 0.1304273 1.7394302
Leptodactylus fallax 36.54158 50.0406161 0.1276546 1.8428222
Leptodactylus labyrinthicus 36.70459 23.0400565 0.1291108 0.8373426
Leptodactylus myersi 36.54907 35.3933862 0.1293879 1.2894410
Leptodactylus knudseni 36.45353 29.5357300 0.1303475 1.0706648
Leptodactylus pentadactylus 36.52621 32.0494970 0.1272322 1.1593204
Leptodactylus flavopictus 36.55520 18.5246859 0.1318682 0.7228278
Leptodactylus furnarius 36.01523 16.9262046 0.1327488 0.6346320
Leptodactylus plaumanni 37.00816 12.8390123 0.1295658 0.4976682
Leptodactylus stenodema 36.58751 31.7404305 0.1322606 1.1325103
Leptodactylus hylodes 36.52889 29.1891845 0.1305304 1.1552490
Leptodactylus jolyi 36.95606 15.5142791 0.1303924 0.5889605
Leptodactylus magistris 35.72640 25.2738961 0.1316250 0.9538428
Leptodactylus laticeps 36.52204 17.1724795 0.1300341 0.6440944
Leptodactylus lauramiriamae 36.51318 26.3310022 0.1313425 0.9354005
Leptodactylus nesiotus 36.15059 33.2402846 0.1322601 1.2262868
Leptodactylus marambaiae 36.59740 26.6407296 0.1317241 1.0451368
Leptodactylus natalensis 36.56315 26.0646455 0.1291910 1.0003491
Leptodactylus paraensis 36.56970 29.7467355 0.1276516 1.0603802
Leptodactylus rhodonotus 36.56169 31.1960747 0.1293562 1.3259194
Leptodactylus peritoaktites 36.60434 25.5879783 0.1308053 0.9949166
Leptodactylus pustulatus 36.54849 26.9850301 0.1308207 0.9652710
Leptodactylus rhodomerus 36.52562 26.4311472 0.1330671 1.0487722
Leptodactylus riveroi 36.66225 35.2499035 0.1332207 1.2396965
Leptodactylus silvanimbus 36.53498 20.1309761 0.1307332 0.7513414
Leptodactylus rugosus 36.46688 29.9879909 0.1319459 1.1369092
Leptodactylus sabanensis 36.53384 25.4411414 0.1307931 0.9718616
Leptodactylus savagei 36.53853 29.9965660 0.1326507 1.1094368
Leptodactylus sertanejo 36.46835 19.4521157 0.1308334 0.7249981
Leptodactylus tapiti 36.57346 20.3920147 0.1300997 0.7666681
Leptodactylus turimiquensis 36.55808 32.6062338 0.1338481 1.2156383
Leptodactylus vastus 36.56575 29.4784507 0.1303024 1.0949815
Leptodactylus viridis 36.59207 28.5884327 0.1315597 1.1228650
Leptodactylus syphax 36.32011 23.8139313 0.1302545 0.8818460
Celsiella revocata 33.59445 30.2473216 0.1319174 1.1203549
Celsiella vozmedianoi 33.57724 34.0007747 0.1340820 1.2507006
Hyalinobatrachium aureoguttatum 33.75471 34.9245864 0.1314458 1.3696993
Hyalinobatrachium valerioi 33.70486 28.4329683 0.1316411 1.1305481
Hyalinobatrachium talamancae 33.76946 22.7034810 0.1312049 1.0083848
Hyalinobatrachium chirripoi 33.74315 34.0922573 0.1298248 1.3184243
Hyalinobatrachium colymbiphyllum 33.66930 38.3861401 0.1356566 1.4758901
Hyalinobatrachium pellucidum 33.71843 24.2402472 0.1323760 1.0559132
Hyalinobatrachium cappellei 33.70430 32.5999234 0.1331762 1.1679981
Hyalinobatrachium taylori 33.71546 32.8023305 0.1315167 1.2125471
Hyalinobatrachium iaspidiense 33.82644 35.3569542 0.1300873 1.2610273
Hyalinobatrachium fleischmanni 33.67869 27.8809743 0.1334762 1.0533266
Hyalinobatrachium tatayoi 33.71788 31.2067637 0.1314051 1.1992357
Hyalinobatrachium duranti 33.75107 29.5262997 0.1312392 1.1216104
Hyalinobatrachium ibama 33.74308 25.3915557 0.1305276 1.0573921
Hyalinobatrachium pallidum 33.70107 29.8096139 0.1313788 1.1082223
Hyalinobatrachium fragile 33.72649 31.6683085 0.1326616 1.1715144
Hyalinobatrachium orientale 33.65906 42.3936855 0.1332026 1.5763922
Hyalinobatrachium esmeralda 33.70004 21.9109343 0.1329656 0.9659856
Hyalinobatrachium guairarepanense 33.76369 33.2854090 0.1296200 1.2497908
Hyalinobatrachium vireovittatum 33.67809 39.1076646 0.1335969 1.4941840
Centrolene acanthidiocephalum 33.56235 31.0213760 0.1289939 1.2577944
Centrolene antioquiense 33.52348 24.0636861 0.1292905 1.0163093
Centrolene azulae 33.48108 33.0360028 0.1333791 1.3986593
Centrolene ballux 33.51296 11.5281489 0.1291011 0.5603604
Centrolene buckleyi 34.04653 14.4738132 0.1296972 0.6655512
Centrolene condor 33.53394 25.4278217 0.1315202 1.0185657
Centrolene heloderma 33.56788 17.8731470 0.1299826 0.7749041
Centrolene hybrida 33.51465 26.3560149 0.1333397 1.0941952
Centrolene lemniscatum 33.53547 16.0569976 0.1311840 0.7781381
Centrolene lynchi 33.55699 8.8729783 0.1333436 0.4422597
Centrolene medemi 33.57195 31.5485991 0.1335595 1.2830998
Centrolene muelleri 33.52655 20.8804870 0.1345394 0.9617397
Centrolene paezorum 34.04636 19.0990298 0.1301078 0.8295609
Centrolene petrophilum 33.39959 18.7257594 0.1327058 0.8255692
Centrolene quindianum 33.45856 18.5789911 0.1321669 0.8454177
Centrolene robledoi 33.50243 25.5310536 0.1332775 1.0741351
Centrolene sanchezi 33.51600 24.1393106 0.1324069 0.9965511
Centrolene savagei 33.55084 25.6710013 0.1334923 1.0850944
Centrolene solitaria 33.53706 23.9737663 0.1335561 0.9586484
Centrolene venezuelense 34.01799 24.9621253 0.1303068 0.9532852
Cochranella duidaeana 33.95681 31.8392833 0.1319011 1.2242865
Cochranella euhystrix 33.46035 40.0444288 0.1345661 1.6349650
Cochranella euknemos 33.43706 32.9860585 0.1352981 1.2155807
Cochranella geijskesi 33.53152 28.4736682 0.1312317 1.0220581
Cochranella granulosa 33.52127 33.8827171 0.1333937 1.2654572
Cochranella litoralis 33.98621 26.9844058 0.1331085 1.1158439
Cochranella mache 33.54007 30.9934531 0.1342575 1.2394563
Cochranella nola 33.57136 24.1292901 0.1305334 1.1756881
Cochranella phryxa 33.99242 29.0584477 0.1316217 1.3598975
Cochranella ramirezi 33.53914 32.4230110 0.1281267 1.2058125
Cochranella resplendens 34.00929 27.5751301 0.1313065 1.1215230
Cochranella riveroi 33.96465 34.4720388 0.1313320 1.2707465
Cochranella xanthocheridia 33.51965 31.0082225 0.1304633 1.1766791
Espadarana andina 32.93952 22.1287174 0.1337244 0.8789090
Nymphargus anomalus 33.57746 14.7545104 0.1301123 0.6368559
Nymphargus armatus 33.56525 33.9568255 0.1311198 1.4068493
Nymphargus bejaranoi 34.00337 18.8823229 0.1302266 1.0158312
Nymphargus buenaventura 33.58370 16.6931279 0.1290615 0.6889654
Nymphargus cariticommatus 33.56190 22.5395739 0.1315369 0.9446151
Nymphargus chami 34.15276 29.7998923 0.1291957 1.1325691
Nymphargus chancas 33.64313 30.9300213 0.1294515 1.2701655
Nymphargus cochranae 33.59961 18.4562212 0.1295591 0.8016269
Nymphargus cristinae 34.03662 32.8586582 0.1295367 1.2437920
Nymphargus garciae 33.99754 22.7226207 0.1303345 0.9667561
Nymphargus grandisonae 34.09310 23.0020416 0.1316130 0.9606836
Nymphargus griffithsi 34.02555 22.3764741 0.1337472 0.9360996
Nymphargus ignotus 34.02742 34.0692113 0.1306729 1.3400367
Nymphargus laurae 34.08030 20.2859901 0.1307589 0.8494245
Nymphargus luminosus 34.04031 35.8204327 0.1311932 1.3546895
Nymphargus luteopunctatus 34.06061 25.0695188 0.1302325 1.0287332
Nymphargus mariae 34.03570 21.8423626 0.1294726 0.9187595
Nymphargus mixomaculatus 33.63044 8.3937700 0.1296293 0.5285483
Nymphargus nephelophila 33.57627 32.2929450 0.1335325 1.2512676
Nymphargus ocellatus 34.01167 21.6039355 0.1313471 1.0104324
Nymphargus oreonympha 33.94544 31.4195653 0.1329938 1.2122743
Nymphargus phenax 33.98207 16.6999489 0.1348004 1.0697550
Nymphargus pluvialis 33.58883 13.5383549 0.1304636 0.7525625
Nymphargus posadae 33.96597 22.3316210 0.1312346 0.9521315
Nymphargus prasinus 34.10865 28.3088928 0.1314722 1.1354919
Nymphargus rosada 34.05368 23.6030944 0.1322461 1.0146644
Nymphargus ruizi 34.06113 28.1315625 0.1293330 1.1463311
Nymphargus siren 34.07226 23.0414835 0.1329945 0.9853339
Nymphargus spilotus 34.04584 26.8981304 0.1309198 1.1637275
Nymphargus vicenteruedai 33.63274 21.6648934 0.1297451 0.9580684
Nymphargus wileyi 33.61895 21.2219849 0.1307580 0.8858312
Rulyrana adiazeta 33.54789 27.1227342 0.1323136 1.1106908
Rulyrana flavopunctata 33.57823 24.5788701 0.1327662 0.9984697
Rulyrana mcdiarmidi 33.58246 24.1208738 0.1325285 1.0172382
Rulyrana saxiscandens 33.55754 34.5779275 0.1316568 1.4227051
Rulyrana spiculata 33.55302 20.3113832 0.1316330 1.0587415
Rulyrana susatamai 33.52427 23.9128699 0.1318612 0.9951632
Sachatamia albomaculata 33.59582 32.8936200 0.1313854 1.2408345
Sachatamia punctulata 33.53492 26.1877340 0.1298624 1.0786850
Sachatamia ilex 33.54502 34.0039896 0.1337593 1.2889473
Sachatamia orejuela 33.52034 23.2957129 0.1316319 0.9675690
Teratohyla adenocheira 33.52901 30.4338026 0.1318884 1.0677716
Teratohyla midas 34.03799 33.4719206 0.1304343 1.2000599
Teratohyla spinosa 33.48893 29.0493603 0.1316793 1.1163530
Teratohyla amelie 33.99686 26.0830798 0.1322524 1.1530136
Teratohyla pulverata 34.05080 33.4100301 0.1313171 1.2614253
Vitreorana antisthenesi 33.97020 29.7596738 0.1321794 1.0929259
Vitreorana castroviejoi 34.00469 40.3900527 0.1322055 1.5149458
Vitreorana eurygnatha 34.05657 18.6423756 0.1313641 0.7241542
Vitreorana gorzulae 33.95219 27.5287611 0.1305876 1.0498714
Vitreorana helenae 33.95521 27.3819766 0.1316355 1.0506371
Vitreorana parvula 33.60416 14.4410698 0.1298535 0.5826125
Vitreorana uranoscopa 33.97157 17.8931107 0.1318042 0.6940331
Ikakogi tayrona 33.68114 25.2362574 0.1319845 0.9270119
Allophryne ruthveni 34.86452 39.3270059 0.1313495 1.4095369
Nasikabatrachus sahyadrensis 34.82301 54.9376927 0.1378779 1.9800722
Sooglossus thomasseti 33.04035 83.6734624 0.1439995 3.1109872
Sooglossus sechellensis 33.67137 68.0749385 0.1399717 2.5311973
Sechellophryne pipilodryas 33.71747 82.2796604 0.1368449 3.0595760
Sechellophryne gardineri 33.72120 81.5350018 0.1395661 3.0334675
Hemisus barotseensis 35.79353 28.1055685 0.1359514 1.1211405
Hemisus microscaphus 35.73402 38.1810443 0.1380210 1.7537569
Hemisus marmoratus 35.71051 35.0837494 0.1371161 1.3614321
Hemisus perreti 35.72752 39.5264331 0.1361005 1.4033935
Hemisus guineensis 35.79207 34.9421450 0.1358858 1.3594011
Hemisus guttatus 35.67424 27.2605956 0.1354178 1.1876249
Hemisus olivaceus 35.65563 43.1094499 0.1397306 1.6219021
Hemisus wittei 35.75737 33.9785588 0.1348518 1.3988209
Hemisus brachydactylus 35.73151 33.6910987 0.1370942 1.4733160
Balebreviceps hillmani 34.70304 34.9789873 0.1380883 1.7282497
Callulina dawida 34.75004 50.5295266 0.1380835 2.0607378
Callulina kanga 34.66336 35.5990381 0.1371881 1.5299259
Callulina laphami 34.64254 39.4392598 0.1374285 1.7119877
Callulina shengena 34.57035 39.3099916 0.1381138 1.6642275
Callulina hanseni 34.60071 44.1097703 0.1380014 1.8193115
Callulina meteora 34.70775 45.3761590 0.1362309 1.8713381
Callulina kisiwamsitu 34.67543 62.3819675 0.1370054 2.4871144
Callulina kreffti 34.84795 41.4880151 0.1345883 1.7146473
Callulina stanleyi 34.71140 37.7826305 0.1362243 1.6049301
Spelaeophryne methneri 35.73386 39.5177068 0.1367333 1.6320828
Probreviceps durirostris 34.83201 33.7202110 0.1360786 1.4322101
Probreviceps rungwensis 34.73775 36.3813624 0.1371007 1.5966054
Probreviceps loveridgei 34.78774 34.6554621 0.1353526 1.4713924
Probreviceps macrodactylus 34.76842 45.7511136 0.1382357 1.8719997
Probreviceps uluguruensis 34.80866 48.4917600 0.1367397 1.9903792
Probreviceps rhodesianus 34.78480 28.7997779 0.1345239 1.1779153
Breviceps acutirostris 35.67384 21.9471107 0.1355879 1.0569648
Breviceps adspersus 35.71574 24.5137172 0.1407068 1.0392960
Breviceps gibbosus 35.86239 18.1486407 0.1347297 0.8642603
Breviceps fichus 35.85923 36.7440927 0.1369120 1.6152186
Breviceps mossambicus 35.81952 34.7057860 0.1361835 1.4061223
Breviceps rosei 35.78204 21.7085581 0.1393421 1.0448792
Breviceps bagginsi 35.81801 28.1614249 0.1357996 1.2416005
Breviceps sopranus 35.80348 28.7132304 0.1367409 1.1947798
Breviceps macrops 35.85938 28.2495325 0.1358909 1.4231804
Breviceps namaquensis 35.84358 23.9618268 0.1344599 1.1664561
Breviceps fuscus 35.83721 19.6559430 0.1373618 0.9183382
Breviceps montanus 35.85552 21.4474881 0.1350397 1.0206009
Breviceps verrucosus 35.80662 24.8357444 0.1374861 1.1216026
Breviceps poweri 35.76370 34.0141292 0.1368826 1.3754296
Breviceps sylvestris 35.76447 26.3794311 0.1358075 1.1154490
Acanthixalus sonjae 36.59167 51.6181482 0.1332141 1.8607160
Acanthixalus spinosus 36.63873 42.8472917 0.1326268 1.5507902
Kassina arboricola 36.92329 51.2763592 0.1330270 1.8497572
Kassina cassinoides 36.93828 33.6974302 0.1336074 1.2163902
Kassina cochranae 36.55626 40.4177593 0.1342822 1.4582999
Kassina decorata 37.01313 39.4138639 0.1332270 1.4822666
Kassina fusca 36.66873 34.0030871 0.1323139 1.2166450
Kassina jozani 36.60006 57.3365910 0.1338105 2.2146759
Kassina kuvangensis 36.85133 24.2587229 0.1359604 1.0037801
Kassina lamottei 36.63582 43.6421448 0.1327194 1.5751488
Kassina maculata 36.66236 31.1939014 0.1332083 1.2159382
Kassina maculifer 36.77888 36.5449612 0.1314430 1.4889781
Kassina maculosa 36.75993 37.0685627 0.1317801 1.3728386
Kassina senegalensis 36.64983 28.4550247 0.1344795 1.1121046
Kassina mertensi 36.71940 35.9751835 0.1358149 1.3523890
Kassina schioetzi 36.66120 42.9768777 0.1323849 1.5420220
Kassina somalica 36.65806 38.0314115 0.1356341 1.5627796
Kassina wazae 36.88812 30.5817810 0.1338199 1.0977716
Phlyctimantis boulengeri 36.57775 52.1815435 0.1307973 1.8987014
Phlyctimantis keithae 36.52227 30.0272046 0.1329033 1.3811358
Phlyctimantis leonardi 36.46806 40.3148878 0.1323268 1.4370516
Phlyctimantis verrucosus 36.42668 42.2882514 0.1339175 1.6170789
Semnodactylus wealii 36.67494 20.4800166 0.1342323 0.9417606
Afrixalus aureus 36.87966 26.0274986 0.1337013 1.0531562
Afrixalus clarkei 36.97334 26.4535463 0.1316232 1.1509294
Afrixalus delicatus 36.92683 30.8919211 0.1327453 1.2225539
Afrixalus stuhlmanni 36.88507 34.0315162 0.1373384 1.3592707
Afrixalus dorsalis 36.95161 46.4584725 0.1329001 1.6791809
Afrixalus paradorsalis 36.87952 43.4832250 0.1336730 1.5974380
Afrixalus dorsimaculatus 36.81169 50.0531289 0.1335487 1.9974560
Afrixalus enseticola 36.87780 28.8333460 0.1344113 1.3906403
Afrixalus equatorialis 36.89360 38.2090696 0.1344354 1.3533810
Afrixalus fornasini 36.84030 31.4144325 0.1335014 1.2394150
Afrixalus fulvovittatus 36.87776 40.9448976 0.1362940 1.4791173
Afrixalus knysnae 36.87086 16.9037395 0.1345712 0.7834226
Afrixalus lacteus 36.75401 42.3237598 0.1344446 1.5876983
Afrixalus laevis 36.87310 39.7353481 0.1344759 1.4561906
Afrixalus leucostictus 36.98109 36.2132589 0.1323208 1.3586509
Afrixalus lindholmi 36.77158 43.7091365 0.1331304 1.5765322
Afrixalus morerei 36.88745 30.4586180 0.1294019 1.3169145
Afrixalus nigeriensis 36.93278 46.8940709 0.1325526 1.6853257
Afrixalus orophilus 36.97633 35.3719266 0.1310591 1.5270030
Afrixalus osorioi 36.96926 33.7594059 0.1329192 1.2395072
Afrixalus quadrivittatus 36.97393 36.8536233 0.1313655 1.3939420
Afrixalus schneideri 37.00360 54.7395402 0.1321463 2.0118218
Afrixalus septentrionalis 36.98934 34.5778330 0.1341833 1.4624006
Afrixalus spinifrons 36.86668 24.6355575 0.1325143 1.1063868
Afrixalus sylvaticus 36.91101 48.1453431 0.1327800 1.8936222
Afrixalus uluguruensis 36.89942 26.5868095 0.1323810 1.1729433
Afrixalus upembae 36.81538 30.3006397 0.1328588 1.2064739
Afrixalus vibekensis 36.97691 51.3753933 0.1315131 1.8489759
Afrixalus vittiger 36.92826 39.8456384 0.1333688 1.4292342
Afrixalus weidholzi 36.87074 33.6502442 0.1309985 1.2160403
Afrixalus wittei 36.97494 27.0587155 0.1315661 1.1025384
Heterixalus alboguttatus 36.89993 36.5530817 0.1308601 1.4289955
Heterixalus boettgeri 36.91633 35.7400913 0.1310560 1.3945025
Heterixalus madagascariensis 36.84144 33.2464547 0.1328767 1.2798283
Heterixalus punctatus 36.82754 33.0636293 0.1338707 1.2732622
Heterixalus andrakata 36.83661 32.5684942 0.1334174 1.2376404
Heterixalus tricolor 36.82486 29.7015053 0.1312809 1.0795702
Heterixalus variabilis 36.82993 38.9416906 0.1324176 1.4394919
Heterixalus betsileo 36.78709 38.7217657 0.1318456 1.5055508
Heterixalus carbonei 36.79538 46.9468559 0.1361661 1.7325497
Heterixalus luteostriatus 36.78368 37.4047677 0.1364461 1.3961464
Heterixalus rutenbergi 36.85479 36.7847091 0.1343548 1.4286546
Tachycnemis seychellensis 36.82922 69.6320926 0.1341037 2.5901278
Alexteroon hypsiphonus 36.51623 36.6826332 0.1372875 1.3306723
Alexteroon jynx 36.48939 48.3296902 0.1361137 1.7774334
Alexteroon obstetricans 36.66812 36.8782542 0.1340075 1.3494611
Hyperolius acuticeps 37.20839 26.7615240 0.1302870 1.1306801
Hyperolius howelli 37.17460 25.1406250 0.1326657 1.1545143
Hyperolius friedemanni 37.09227 25.5797656 0.1336246 1.1029649
Hyperolius adspersus 37.11112 36.2757874 0.1335238 1.3092144
Hyperolius dartevellei 37.15889 33.5203643 0.1325556 1.2431798
Hyperolius acutirostris 37.04827 41.4797791 0.1336428 1.5451002
Hyperolius ademetzi 37.08702 39.9750483 0.1356038 1.4992230
Hyperolius discodactylus 37.06743 30.6180643 0.1325390 1.3050701
Hyperolius lateralis 37.09088 32.9684231 0.1322550 1.3957749
Hyperolius nitidulus 37.12084 31.5760113 0.1347930 1.1468582
Hyperolius tuberculatus 37.15207 38.6811566 0.1324808 1.4074033
Hyperolius argus 37.09790 28.5866001 0.1317531 1.1119825
Hyperolius atrigularis 37.14824 30.0146661 0.1320260 1.2825263
Hyperolius balfouri 37.12298 30.9961706 0.1315891 1.1786176
Hyperolius baumanni 37.16273 50.4793880 0.1359916 1.7686657
Hyperolius sylvaticus 37.24995 46.4208469 0.1334469 1.6677847
Hyperolius bobirensis 37.23257 50.3195501 0.1326316 1.8167042
Hyperolius picturatus 37.14442 44.9103898 0.1329717 1.6192554
Hyperolius benguellensis 37.13080 21.6765669 0.1329131 0.8796280
Hyperolius nasutus 37.16213 19.0618130 0.1331124 0.7718556
Hyperolius inyangae 37.15150 21.8313699 0.1338025 0.9119184
Hyperolius bicolor 37.04217 24.4663071 0.1330079 0.9045241
Hyperolius bolifambae 37.14400 41.4498288 0.1338595 1.5394893
Hyperolius bopeleti 37.23821 42.6233535 0.1320311 1.5794913
Hyperolius brachiofasciatus 37.11994 36.1390433 0.1337665 1.3302401
Hyperolius camerunensis 37.10153 40.8064678 0.1348237 1.5394260
Hyperolius castaneus 37.21255 35.6747452 0.1331962 1.5257446
Hyperolius frontalis 37.20947 29.7881459 0.1307263 1.2509582
Hyperolius cystocandicans 37.11323 25.8480382 0.1332789 1.2022076
Hyperolius cinereus 37.07079 21.2551491 0.1334424 0.8866154
Hyperolius chlorosteus 37.13837 45.0978504 0.1309040 1.6302424
Hyperolius laurenti 37.14118 49.3463233 0.1298524 1.7657596
Hyperolius torrentis 37.05693 38.7627412 0.1322748 1.3684802
Hyperolius chrysogaster 36.99037 35.2199681 0.1342530 1.4781501
Hyperolius cinnamomeoventris 37.01104 35.8652476 0.1361989 1.3478353
Hyperolius veithi 37.02626 38.3697817 0.1339644 1.3513444
Hyperolius molleri 37.04655 55.1433132 0.1347808 2.0275973
Hyperolius thomensis 37.04479 59.7003757 0.1339741 2.2011949
Hyperolius concolor 37.05386 38.2448373 0.1336048 1.3753955
Hyperolius zonatus 37.42831 49.1566544 0.1336381 1.7730883
Hyperolius constellatus 37.19017 32.2382159 0.1299481 1.3523748
Hyperolius diaphanus 37.16198 28.0784389 0.1348398 1.1212139
Hyperolius dintelmanni 37.22202 47.7595794 0.1318838 1.7552411
Hyperolius endjami 37.08282 38.8596878 0.1321272 1.4589627
Hyperolius fasciatus 37.10187 22.9221690 0.1347153 0.8563173
Hyperolius ferreirai 37.22861 22.7555719 0.1313046 0.8510682
Hyperolius ferrugineus 37.12408 32.3423936 0.1327786 1.2806211
Hyperolius fuscigula 37.13353 23.9311252 0.1337892 0.9104172
Hyperolius fusciventris 37.04878 42.3574443 0.1348227 1.5271737
Hyperolius guttulatus 37.04218 45.6707179 0.1332727 1.6472699
Hyperolius ghesquieri 37.07555 35.8831805 0.1327243 1.2653708
Hyperolius glandicolor 37.09721 28.6897062 0.1317361 1.2190091
Hyperolius phantasticus 37.05302 40.1539645 0.1342843 1.4372641
Hyperolius gularis 37.10746 25.0165020 0.1333334 0.9153504
Hyperolius horstockii 36.95791 18.4117432 0.1338018 0.8701121
Hyperolius hutsebauti 37.19428 36.1338365 0.1335588 1.3697089
Hyperolius igbettensis 37.02939 37.8218924 0.1320159 1.3660902
Hyperolius jacobseni 37.00830 36.5365899 0.1332200 1.3197883
Hyperolius poweri 36.98934 25.9749326 0.1341923 1.1241137
Hyperolius inornatus 37.10337 27.4322545 0.1342523 0.9669384
Hyperolius jackie 37.18467 38.8903984 0.1308117 1.7741277
Hyperolius kachalolae 37.11521 22.8710500 0.1308082 0.9408278
Hyperolius kibarae 37.21616 27.1329821 0.1333360 1.0801941
Hyperolius kihangensis 37.09734 25.7794961 0.1335530 1.1868824
Hyperolius kivuensis 37.11825 26.7064848 0.1322865 1.1003553
Hyperolius quinquevittatus 37.14174 24.6900194 0.1337519 1.0053623
Hyperolius kuligae 37.04199 34.0136622 0.1357450 1.2868506
Hyperolius lamottei 37.06951 35.5469343 0.1330998 1.2889961
Hyperolius langi 37.09406 33.1234364 0.1316785 1.3068738
Hyperolius leleupi 37.14278 30.6418754 0.1325603 1.2797770
Hyperolius leucotaenius 37.11100 31.5327635 0.1349557 1.2899584
Hyperolius lupiroensis 37.11219 31.2359963 0.1303869 1.3130102
Hyperolius major 37.20603 23.1980220 0.1324220 0.9365792
Hyperolius marginatus 37.06968 23.8452650 0.1322992 0.9644378
Hyperolius mariae 37.04839 38.3615497 0.1327230 1.5359404
Hyperolius minutissimus 37.12965 25.5269025 0.1329595 1.1265217
Hyperolius spinigularis 37.07535 25.5826312 0.1349440 0.9902846
Hyperolius tanneri 37.21578 51.1266794 0.1331288 2.0361249
Hyperolius mitchelli 37.19978 28.5248607 0.1371942 1.1262108
Hyperolius puncticulatus 37.14804 48.4951518 0.1349791 1.8937846
Hyperolius substriatus 37.18365 28.3740023 0.1339130 1.1424449
Hyperolius montanus 37.08714 24.7072587 0.1345370 1.1646426
Hyperolius mosaicus 37.14728 38.0688182 0.1336485 1.4060675
Hyperolius ocellatus 37.22244 34.8070411 0.1338864 1.2685641
Hyperolius nasicus 37.07904 23.9717635 0.1331329 0.9884722
Hyperolius nienokouensis 37.10543 57.5502939 0.1342489 2.0803883
Hyperolius nimbae 37.08105 41.9799488 0.1340824 1.5193183
Hyperolius obscurus 37.16807 27.5998814 0.1353737 1.0760335
Hyperolius occidentalis 37.11388 33.9909732 0.1327641 1.2390530
Hyperolius parallelus 37.09793 26.3611564 0.1318480 1.0267848
Hyperolius pardalis 37.08399 37.1306491 0.1309046 1.3574560
Hyperolius parkeri 36.99542 34.7423600 0.1356012 1.3321870
Hyperolius pickersgilli 37.04100 24.9530483 0.1330992 1.0859663
Hyperolius pictus 37.15723 29.8731464 0.1337286 1.3287661
Hyperolius platyceps 37.07444 37.6256578 0.1351567 1.3585695
Hyperolius polli 37.12413 34.6891859 0.1346818 1.2416524
Hyperolius polystictus 37.13361 24.1817852 0.1344665 0.9885255
Hyperolius pseudargus 37.04068 27.9907804 0.1320108 1.2321190
Hyperolius pusillus 37.00136 29.8554637 0.1335966 1.1848987
Hyperolius pustulifer 37.09632 38.4558151 0.1337551 1.7541904
Hyperolius pyrrhodictyon 37.07787 22.4168520 0.1317420 0.9144053
Hyperolius quadratomaculatus 37.12622 31.7643569 0.1334512 1.1996302
Hyperolius rhizophilus 37.14197 28.1973481 0.1316782 0.9741723
Hyperolius rhodesianus 37.01844 23.9714812 0.1332680 0.9850147
Hyperolius riggenbachi 37.08023 34.6109296 0.1325592 1.3061640
Hyperolius robustus 37.20032 35.0136120 0.1330028 1.2345266
Hyperolius rubrovermiculatus 37.04952 46.4456919 0.1321302 1.8229297
Hyperolius rwandae 37.14905 32.2732942 0.1332528 1.4440311
Hyperolius sankuruensis 37.18702 30.6700271 0.1328842 1.0899661
Hyperolius schoutedeni 37.16605 39.5515944 0.1340367 1.4334885
Hyperolius semidiscus 37.11475 19.1482232 0.1344652 0.8522129
Hyperolius sheldricki 37.11562 46.9758262 0.1329719 1.8930729
Hyperolius soror 37.11635 36.9509027 0.1308565 1.3334898
Hyperolius steindachneri 37.09007 24.9440468 0.1340476 0.9886350
Hyperolius stenodactylus 37.16103 41.4375658 0.1325815 1.5416645
Hyperolius swynnertoni 37.21241 24.3473246 0.1341434 0.9608220
Hyperolius vilhenai 37.19931 28.0334711 0.1363334 1.0869691
Hyperolius viridigulosus 37.15034 57.9730729 0.1321200 2.1030127
Hyperolius viridis 37.16559 25.5809335 0.1331469 1.1342291
Hyperolius watsonae 37.13228 57.2129916 0.1354533 2.2465329
Hyperolius xenorhinus 37.16636 31.3080580 0.1329212 1.2396781
Kassinula wittei 37.03875 24.1916716 0.1335150 0.9954662
Morerella cyanophthalma 36.53373 68.2890338 0.1340592 2.4969336
Arlequinus krebsi 36.86743 44.5161434 0.1348209 1.6842174
Callixalus pictus 36.89619 34.2582818 0.1325987 1.4141995
Chrysobatrachus cupreonitens 37.03148 30.3785095 0.1328967 1.2302892
Opisthothylax immaculatus 36.84972 36.8736589 0.1348565 1.3354770
Paracassina kounhiensis 36.86362 29.0154492 0.1307108 1.4213177
Paracassina obscura 36.84252 26.1485867 0.1351887 1.1929484
Cryptothylax greshoffii 35.97842 42.2161510 0.1362011 1.5062205
Cryptothylax minutus 36.05622 47.4308070 0.1345187 1.6729987
Arthroleptis adelphus 35.44509 43.6712739 0.1353371 1.5986619
Arthroleptis bioko 35.50142 66.8759475 0.1327832 2.5317331
Arthroleptis brevipes 35.42441 58.6844775 0.1348888 2.0574517
Arthroleptis poecilonotus 35.44303 51.4447934 0.1346504 1.8673845
Arthroleptis crusculum 35.35360 38.7178173 0.1345585 1.3963767
Arthroleptis nimbaensis 35.37514 49.4693622 0.1348608 1.7903410
Arthroleptis langeri 35.36851 57.6664391 0.1352291 2.0935717
Arthroleptis adolfifriederici 35.45880 39.8070681 0.1328052 1.7601885
Arthroleptis krokosua 35.41069 53.3101296 0.1347926 1.9176950
Arthroleptis palava 35.47704 45.0675651 0.1337666 1.6968296
Arthroleptis variabilis 35.41354 47.0911673 0.1343272 1.7140183
Arthroleptis perreti 35.41894 62.8287039 0.1359034 2.3164573
Arthroleptis affinis 35.58132 41.9487389 0.1323463 1.7767102
Arthroleptis nikeae 35.45062 29.9811961 0.1352302 1.2929058
Arthroleptis reichei 35.46057 33.4097969 0.1317544 1.4618724
Arthroleptis anotis 35.41907 42.0368611 0.1365440 1.7848029
Arthroleptis aureoli 34.61850 38.5634027 0.1368513 1.3961423
Arthroleptis formosus 35.21415 32.0619002 0.1346854 1.1446549
Arthroleptis sylvaticus 35.41208 46.4684848 0.1375806 1.6855270
Arthroleptis taeniatus 35.38621 47.1515065 0.1321313 1.7139675
Arthroleptis bivittatus 35.47882 49.2662984 0.1341733 1.7862302
Arthroleptis carquejai 35.31685 32.3425615 0.1372072 1.2710286
Arthroleptis stenodactylus 35.44277 33.4836101 0.1341497 1.3559660
Arthroleptis fichika 35.43384 54.3346514 0.1344582 2.1642669
Arthroleptis kidogo 35.45445 45.8928626 0.1368365 1.8931530
Arthroleptis xenochirus 35.60829 29.7207050 0.1318225 1.2160053
Arthroleptis francei 35.45409 33.8662338 0.1344485 1.2978256
Arthroleptis wahlbergii 35.31783 30.6407343 0.1371571 1.3365790
Arthroleptis hematogaster 35.34148 41.8488401 0.1354049 1.7246176
Arthroleptis kutogundua 35.39726 37.0435684 0.1373625 1.7106303
Arthroleptis lameerei 35.47645 30.4605973 0.1340168 1.2033221
Arthroleptis lonnbergi 35.45212 52.6671987 0.1336510 2.1229409
Arthroleptis tanneri 35.44242 60.1893114 0.1334142 2.3997313
Arthroleptis loveridgei 35.33380 47.1018388 0.1387237 1.7958469
Arthroleptis mossoensis 35.42962 50.6616787 0.1349511 2.1637481
Arthroleptis nguruensis 35.54869 43.2581117 0.1350916 1.7843481
Arthroleptis nlonakoensis 35.34690 49.7179677 0.1360804 1.8828371
Arthroleptis phrynoides 35.39094 41.1410074 0.1338236 1.4725384
Arthroleptis pyrrhoscelis 35.41522 39.8516716 0.1341749 1.6664317
Arthroleptis schubotzi 35.45087 43.8260803 0.1341352 1.8925030
Arthroleptis xenodactyloides 35.49078 32.6466562 0.1360625 1.3127458
Arthroleptis xenodactylus 35.42790 58.2748801 0.1356460 2.3224174
Arthroleptis spinalis 35.47819 56.0243514 0.1358391 2.3879873
Arthroleptis stridens 35.37645 62.8625785 0.1348653 2.5082058
Arthroleptis troglodytes 35.39370 29.5932915 0.1339139 1.1555920
Arthroleptis tuberosus 35.27564 50.1102237 0.1376250 1.8262309
Arthroleptis vercammeni 35.35276 36.0094898 0.1350865 1.4654786
Arthroleptis zimmeri 35.34958 74.7589094 0.1356053 2.7452890
Cardioglossa alsco 34.83491 41.5196838 0.1348409 1.5855757
Cardioglossa nigromaculata 35.47592 53.5616641 0.1352480 1.9847200
Cardioglossa cyaneospila 34.77455 38.5675579 0.1376159 1.7030297
Cardioglossa gratiosa 34.81474 44.8539841 0.1350119 1.6211896
Cardioglossa elegans 34.83243 49.9842402 0.1353782 1.8323498
Cardioglossa leucomystax 34.87616 42.3037531 0.1346551 1.5352075
Cardioglossa trifasciata 34.81293 55.9375011 0.1360942 2.0640396
Cardioglossa escalerae 35.39084 48.0559523 0.1370707 1.7758605
Cardioglossa manengouba 34.86353 58.0268738 0.1319735 2.1391097
Cardioglossa oreas 34.74090 48.8500178 0.1350017 1.8638499
Cardioglossa pulchra 34.81289 48.9714422 0.1336167 1.8242696
Cardioglossa venusta 34.82891 54.6651784 0.1381922 2.0503487
Cardioglossa gracilis 34.76170 45.0312904 0.1341311 1.6372529
Cardioglossa melanogaster 34.73286 48.0583483 0.1316667 1.7905296
Cardioglossa schioetzi 35.32152 46.6348053 0.1342617 1.7289018
Astylosternus batesi 35.41696 42.7133211 0.1345081 1.5433531
Astylosternus schioetzi 34.87757 50.3310687 0.1317373 1.8714233
Astylosternus diadematus 34.77234 51.7016981 0.1349952 1.9324435
Astylosternus perreti 34.83057 51.2498588 0.1344841 1.9150933
Astylosternus rheophilus 34.78408 44.0995075 0.1345976 1.6584236
Astylosternus nganhanus 35.35185 42.6731303 0.1369280 1.6169060
Trichobatrachus robustus 34.76022 41.8068420 0.1348104 1.5230549
Astylosternus fallax 34.89950 54.5269762 0.1328839 2.0164494
Astylosternus laurenti 34.91213 60.7981082 0.1333397 2.2595122
Astylosternus montanus 34.80023 47.4606270 0.1337770 1.7977603
Astylosternus ranoides 35.35537 42.0872786 0.1358309 1.6074816
Astylosternus laticephalus 35.41386 63.2166875 0.1331742 2.2919013
Astylosternus occidentalis 35.38251 56.9697149 0.1348139 2.0600365
Nyctibates corrugatus 35.34812 55.4099510 0.1339744 2.0599851
Scotobleps gabonicus 34.63941 44.6696101 0.1338934 1.6155646
Leptodactylodon albiventris 34.73324 51.2113777 0.1360018 1.9112737
Leptodactylodon boulengeri 34.74019 54.0014680 0.1342259 2.0280771
Leptodactylodon erythrogaster 34.72139 61.0466991 0.1343134 2.2497241
Leptodactylodon stevarti 34.69303 45.5076221 0.1346618 1.6710015
Leptodactylodon axillaris 35.34713 47.7846643 0.1351260 1.8595532
Leptodactylodon perreti 34.77058 43.1199877 0.1319666 1.6443265
Leptodactylodon bueanus 34.77235 50.6638821 0.1350595 1.8616579
Leptodactylodon bicolor 34.70906 44.9349795 0.1371978 1.6858790
Leptodactylodon ornatus 34.75138 49.0389204 0.1346625 1.8425693
Leptodactylodon mertensi 34.79674 51.4047474 0.1343089 1.9311745
Leptodactylodon polyacanthus 34.73695 45.2340851 0.1356841 1.7077960
Leptodactylodon ovatus 34.77798 53.0121334 0.1355692 1.9771559
Leptodactylodon wildi 34.81806 58.3719268 0.1356830 2.1502111
Leptodactylodon blanci 34.80709 48.0698705 0.1345760 1.6934031
Leptodactylodon ventrimarmoratus 35.39303 50.7955064 0.1360034 1.8855970
Leptopelis anchietae 35.33692 26.0970784 0.1339190 1.0519754
Leptopelis lebeaui 35.20733 37.4180383 0.1337201 1.4457643
Leptopelis argenteus 35.36796 41.1194074 0.1348992 1.6137958
Leptopelis cynnamomeus 35.19029 31.1928692 0.1353020 1.2674787
Leptopelis ocellatus 35.34202 44.7326355 0.1354051 1.6036965
Leptopelis spiritusnoctis 35.25623 54.8154835 0.1342984 1.9723581
Leptopelis aubryi 35.23641 41.7507235 0.1348448 1.5049915
Leptopelis marginatus 35.12915 28.3185274 0.1356792 1.1708763
Leptopelis aubryioides 35.18851 49.4621260 0.1371899 1.8027921
Leptopelis susanae 34.74945 33.1423050 0.1347791 1.5471701
Leptopelis bequaerti 35.30443 49.5478670 0.1328800 1.7952586
Leptopelis uluguruensis 35.29125 39.7509814 0.1347431 1.6595445
Leptopelis bocagii 36.29791 28.9437515 0.1375596 1.2028930
Leptopelis concolor 35.18509 56.0239670 0.1371070 2.2312725
Leptopelis vermiculatus 35.21525 44.0110224 0.1347844 1.8638320
Leptopelis boulengeri 35.21635 45.3037840 0.1352856 1.6355120
Leptopelis brevipes 35.16872 61.9514295 0.1371247 2.3471631
Leptopelis notatus 35.15884 37.5015505 0.1341017 1.3607264
Leptopelis brevirostris 35.15957 45.4404293 0.1353211 1.6607520
Leptopelis palmatus 34.64935 78.1914566 0.1356026 2.8679039
Leptopelis mossambicus 35.17405 31.7063301 0.1345674 1.2591395
Leptopelis parvus 35.25764 32.6902303 0.1340289 1.3016617
Leptopelis rufus 35.23188 47.5318885 0.1341437 1.7222526
Leptopelis bufonides 36.46827 34.9138024 0.1307695 1.2562831
Leptopelis nordequatorialis 35.23494 40.1269088 0.1338758 1.5266810
Leptopelis christyi 35.18790 43.3785002 0.1344181 1.7648961
Leptopelis flavomaculatus 35.27317 36.7644281 0.1358658 1.4597566
Leptopelis calcaratus 35.24396 43.2271302 0.1364498 1.5724526
Leptopelis yaldeni 35.25580 28.1521411 0.1350419 1.2150077
Leptopelis crystallinoron 35.14362 42.7701573 0.1350355 1.5703362
Leptopelis parkeri 35.17442 43.1574371 0.1367748 1.7983179
Leptopelis fiziensis 35.08515 41.7390281 0.1349985 1.7089279
Leptopelis karissimbensis 35.10423 38.2903551 0.1363078 1.6929354
Leptopelis kivuensis 35.07224 44.3294631 0.1361227 1.9045315
Leptopelis millsoni 35.16738 48.7933937 0.1326765 1.7651200
Leptopelis fenestratus 35.21476 35.8616544 0.1351930 1.4208478
Leptopelis mackayi 35.21528 38.3828582 0.1367115 1.5540645
Leptopelis gramineus 36.38146 31.9276933 0.1356314 1.5561849
Leptopelis natalensis 35.27063 27.0454880 0.1329986 1.1960350
Leptopelis jordani 35.15965 34.7005486 0.1342382 1.3523121
Leptopelis occidentalis 35.13866 59.5489548 0.1329759 2.1486398
Leptopelis macrotis 34.73208 58.3336363 0.1365483 2.1050120
Leptopelis ragazzii 34.78849 33.9590528 0.1370239 1.6662951
Leptopelis modestus 34.76736 47.2415363 0.1367145 1.7781550
Leptopelis xenodactylus 35.17911 23.6620484 0.1369113 1.0770848
Leptopelis parbocagii 36.22020 32.6615331 0.1368041 1.3327823
Leptopelis viridis 35.09904 41.0938391 0.1364177 1.4888277
Leptopelis vannutellii 35.13280 34.8239581 0.1344651 1.5719258
Leptopelis zebra 35.16346 48.4944753 0.1360101 1.8088003
Leptopelis oryi 35.16424 38.7488035 0.1338467 1.4868343
Phrynomantis affinis 34.13351 26.6131851 0.1394993 1.0959718
Phrynomantis annectens 34.10403 20.4703732 0.1384481 0.9137037
Phrynomantis bifasciatus 34.09161 28.8523704 0.1419318 1.1905813
Phrynomantis microps 34.15308 35.2517758 0.1407385 1.2734795
Phrynomantis somalicus 34.13479 44.7301009 0.1411336 1.7377854
Hoplophryne rogersi 34.61374 46.2765196 0.1376124 1.8904587
Hoplophryne uluguruensis 34.65228 37.1060444 0.1389930 1.5415260
Parhoplophryne usambarica 34.88426 49.5893642 0.1370555 1.9790978
Adelastes hylonomos 36.10297 39.2847261 0.1377924 1.4084867
Arcovomer passarellii 36.22562 28.7459645 0.1346833 1.1151482
Elachistocleis ovalis 36.63905 22.2941958 0.1332599 0.8154826
Elachistocleis surinamensis 36.65243 27.4135324 0.1340948 1.0200209
Elachistocleis bumbameuboi 36.38913 35.2587509 0.1360326 1.2519301
Elachistocleis erythrogaster 37.31863 14.4438872 0.1359066 0.5804027
Elachistocleis carvalhoi 36.37817 33.0310856 0.1330727 1.1750865
Elachistocleis piauiensis 37.35115 27.8400148 0.1358138 1.0319189
Elachistocleis helianneae 36.36812 29.7595193 0.1333209 1.0438990
Elachistocleis pearsei 36.40749 34.5251777 0.1332881 1.2999779
Elachistocleis matogrosso 36.36281 23.7513823 0.1354273 0.8386752
Elachistocleis skotogaster 36.40853 14.5130728 0.1345493 0.6844652
Elachistocleis panamensis 36.37106 31.6862942 0.1332960 1.1791274
Elachistocleis surumu 36.37498 26.7021721 0.1345492 0.9887196
Gastrophryne olivacea 36.24391 11.8789410 0.1364330 0.4816355
Gastrophryne elegans 36.26468 21.6220531 0.1353152 0.8145452
Hypopachus barberi 36.20669 23.0881811 0.1350815 0.8851707
Hypopachus variolosus 36.27605 23.3299284 0.1374070 0.8868556
Hypopachus pictiventris 36.28144 29.2757396 0.1360199 1.1079126
Hamptophryne alios 36.27497 28.6462912 0.1354807 1.1508375
Stereocyclops histrio 36.21366 29.9751137 0.1363778 1.1786455
Stereocyclops parkeri 36.42693 20.2757840 0.1342884 0.7791642
Dasypops schirchi 35.78579 38.2476392 0.1354380 1.5051413
Myersiella microps 35.81668 27.8094659 0.1352932 1.0770361
Chiasmocleis cordeiroi 35.44969 27.6880722 0.1355253 1.0943920
Chiasmocleis crucis 35.42064 29.2248716 0.1366478 1.1525062
Chiasmocleis schubarti 35.41271 27.3568317 0.1367868 1.0665315
Chiasmocleis capixaba 35.40284 29.5757451 0.1353241 1.1604706
Chiasmocleis carvalhoi 35.32893 36.6592366 0.1374456 1.2708580
Chiasmocleis mehelyi 35.32001 24.6425743 0.1385155 0.8668989
Chiasmocleis albopunctata 35.38668 23.6245895 0.1364636 0.8545727
Chiasmocleis leucosticta 35.30664 17.4900391 0.1369009 0.6788107
Chiasmocleis mantiqueira 35.36454 18.0853389 0.1368406 0.7124682
Chiasmocleis centralis 36.39830 24.9103237 0.1383082 0.9049684
Chiasmocleis gnoma 35.40312 31.0378138 0.1399731 1.2167682
Chiasmocleis anatipes 35.38656 32.1626727 0.1378422 1.2495967
Chiasmocleis devriesi 35.40239 32.6090119 0.1371097 1.1144085
Chiasmocleis sapiranga 35.36375 28.6171432 0.1370152 1.1308372
Chiasmocleis atlantica 35.27940 20.8241722 0.1391891 0.8064832
Chiasmocleis avilapiresae 35.40653 35.1720427 0.1358403 1.2296575
Chiasmocleis shudikarensis 35.30627 36.3582983 0.1364380 1.2839830
Ctenophryne aequatorialis 35.25964 16.1765194 0.1388052 0.7018206
Ctenophryne carpish 35.36454 30.0858932 0.1347060 1.3253573
Ctenophryne aterrima 35.19703 34.1441397 0.1391114 1.3365610
Ctenophryne minor 35.19699 42.7893241 0.1393567 1.6606936
Ctenophryne barbatula 35.32390 20.3158678 0.1386453 0.9553269
Paradoxophyla palmata 35.29666 41.0287822 0.1399237 1.5937607
Paradoxophyla tiarano 34.33984 36.6103283 0.1394592 1.3605616
Scaphiophryne boribory 34.32502 28.6536912 0.1406592 1.1075828
Scaphiophryne madagascariensis 35.25543 34.7826030 0.1418875 1.3450212
Scaphiophryne menabensis 34.53743 41.6055877 0.1423899 1.5495280
Scaphiophryne marmorata 34.29899 35.9720318 0.1403543 1.4257548
Scaphiophryne gottlebei 35.29939 33.3574373 0.1398984 1.2736364
Scaphiophryne spinosa 34.29622 38.5136991 0.1405176 1.4931059
Scaphiophryne calcarata 34.41123 39.4282469 0.1386824 1.4839563
Scaphiophryne brevis 34.35354 36.1918298 0.1399173 1.3768605
Anodonthyla boulengerii 34.28335 34.4348646 0.1409215 1.3286724
Anodonthyla vallani 34.24426 37.5353419 0.1390983 1.4503303
Anodonthyla hutchisoni 34.24954 36.3078207 0.1389831 1.3520340
Anodonthyla moramora 34.28511 28.0168128 0.1391493 1.0808742
Anodonthyla nigrigularis 34.29802 38.4632165 0.1385915 1.4996147
Anodonthyla pollicaris 34.36713 35.5087435 0.1356396 1.4224756
Anodonthyla theoi 34.29026 38.0976429 0.1381298 1.4328998
Anodonthyla jeanbai 34.26787 41.4493393 0.1382044 1.6027590
Anodonthyla emilei 34.39653 32.8081054 0.1373680 1.2682875
Anodonthyla montana 34.31641 36.2178789 0.1402798 1.3742065
Anodonthyla rouxae 34.36214 39.4803407 0.1389056 1.5177742
Cophyla berara 34.21660 48.7574504 0.1387455 1.8098823
Cophyla occultans 34.15788 35.6644772 0.1402276 1.3349754
Cophyla phyllodactyla 34.22043 38.8720311 0.1400607 1.4486149
Rhombophryne minuta 35.35812 32.4289102 0.1387983 1.2273604
Plethodontohyla fonetana 34.30479 39.4300520 0.1399030 1.4418528
Plethodontohyla guentheri 34.38116 35.3969190 0.1419844 1.3339045
Plethodontohyla notosticta 34.18025 39.7140211 0.1420828 1.5217102
Plethodontohyla bipunctata 35.42609 42.9857626 0.1365352 1.6819134
Plethodontohyla tuberata 34.39289 33.5660931 0.1402885 1.3115953
Plethodontohyla brevipes 34.34467 35.4746950 0.1406144 1.3607687
Plethodontohyla ocellata 34.37605 37.5074540 0.1398365 1.4499865
Plethodontohyla inguinalis 34.14395 35.2123768 0.1420183 1.3566608
Plethodontohyla mihanika 34.33885 37.9065144 0.1375529 1.4802165
Rhombophryne laevipes 35.43492 34.4159494 0.1395258 1.3044559
Rhombophryne coudreaui 35.44866 34.1990564 0.1387013 1.2856744
Rhombophryne testudo 34.50153 34.7658519 0.1395498 1.2630148
Rhombophryne coronata 35.39954 37.9924997 0.1374460 1.4847747
Rhombophryne serratopalpebrosa 34.43301 36.6540548 0.1391830 1.3812968
Rhombophryne guentherpetersi 34.39779 32.8365144 0.1408160 1.2268019
Rhombophryne mangabensis 35.33623 30.1903939 0.1410622 1.1095828
Rhombophryne matavy 34.38392 50.3432108 0.1378488 1.8932153
Stumpffia analamaina 34.35181 30.2443705 0.1399739 1.1104830
Stumpffia be 34.32863 41.2747980 0.1403470 1.5281456
Stumpffia hara 34.43267 52.3442065 0.1386798 1.9648005
Stumpffia megsoni 34.32989 58.6050607 0.1405778 2.1992739
Stumpffia staffordi 34.35743 47.8540668 0.1389321 1.7947364
Stumpffia gimmeli 34.29132 35.0937290 0.1400087 1.3105731
Stumpffia psologlossa 34.23199 30.0003666 0.1400295 1.1296293
Stumpffia madagascariensis 34.41780 56.3201164 0.1368325 2.1145802
Stumpffia pygmaea 34.31829 35.4653276 0.1412816 1.2866861
Stumpffia grandis 34.39826 38.6301357 0.1386395 1.4820583
Stumpffia roseifemoralis 34.41914 31.6314943 0.1406395 1.1930096
Stumpffia tetradactyla 34.32417 33.1866919 0.1420185 1.2676903
Stumpffia miery 34.37511 31.5877497 0.1416859 1.2191371
Stumpffia tridactyla 34.34681 40.0680773 0.1408173 1.5672738
Madecassophryne truebae 34.31743 39.0380794 0.1424803 1.5149442
Melanobatrachus indicus 33.92412 43.7891387 0.1380146 1.5683498
Otophryne pyburni 33.74014 40.1669527 0.1403386 1.4582106
Otophryne robusta 33.79596 37.4127536 0.1404056 1.4259233
Otophryne steyermarki 33.85214 34.8465532 0.1382144 1.3352130
Synapturanus mirandaribeiroi 33.86087 47.1403061 0.1354057 1.6869606
Synapturanus salseri 33.80237 47.5871258 0.1395724 1.6662851
Synapturanus rabus 34.79044 42.5518893 0.1389849 1.5351738
Kalophrynus baluensis 33.15001 48.8735297 0.1392074 1.8127693
Kalophrynus intermedius 33.09635 39.2337879 0.1429450 1.3778278
Kalophrynus subterrestris 33.12900 40.9319977 0.1402047 1.4546748
Kalophrynus heterochirus 33.10163 41.4701093 0.1428299 1.4832854
Kalophrynus palmatissimus 33.02490 36.3274963 0.1425832 1.2879557
Kalophrynus bunguranus 33.21721 69.8185299 0.1426661 2.5346032
Kalophrynus orangensis 33.23990 35.9937282 0.1408618 1.3179996
Kalophrynus nubicola 33.19617 39.1403367 0.1403970 1.4374320
Kalophrynus eok 33.17114 31.3307694 0.1428788 1.1980225
Kalophrynus interlineatus 33.15182 29.6543749 0.1418527 1.0754930
Kalophrynus punctatus 33.20645 53.2840614 0.1397237 1.9186066
Kalophrynus minusculus 33.24594 45.1789054 0.1428596 1.5977562
Kalophrynus robinsoni 33.23255 48.5041528 0.1428330 1.6960443
Kalophrynus pleurostigma 33.40101 46.6826336 0.1401591 1.6411839
Choerophryne allisoni 31.42857 29.7086676 0.1445558 1.0683566
Choerophryne burtoni 31.53731 31.6305860 0.1425616 1.1867104
Choerophryne longirostris 31.49185 46.7440166 0.1477251 1.7507428
Choerophryne proboscidea 31.44849 37.1858529 0.1440739 1.3868028
Choerophryne rostellifer 31.55942 42.9320010 0.1458863 1.5859349
Aphantophryne minuta 31.44847 28.6778476 0.1450950 1.0651116
Aphantophryne sabini 31.47264 29.9388308 0.1440747 1.0674233
Aphantophryne pansa 31.40979 38.7493892 0.1470964 1.4696364
Asterophrys leucopus 31.53603 34.8754011 0.1437192 1.2747020
Asterophrys turpicola 31.52008 37.9183562 0.1460157 1.3888682
Xenorhina adisca 31.52857 38.9578595 0.1422696 1.4327745
Xenorhina anorbis 31.54126 33.3640330 0.1412189 1.2658281
Xenorhina arboricola 31.32316 41.0100400 0.1444935 1.5176237
Xenorhina arfakiana 31.56758 53.2000207 0.1469989 1.9140149
Xenorhina bidens 31.53964 33.4754772 0.1443199 1.2028872
Xenorhina bouwensi 31.45077 39.0338312 0.1451639 1.4394624
Xenorhina eiponis 31.37106 33.7653216 0.1472845 1.3152171
Xenorhina fuscigula 32.47355 35.3789832 0.1435701 1.3510223
Xenorhina gigantea 31.49060 35.6495039 0.1425712 1.3582037
Xenorhina huon 31.39578 32.2859910 0.1446089 1.2293352
Xenorhina lanthanites 31.39696 70.2897410 0.1436707 2.6652127
Xenorhina macrodisca 31.50695 28.5323596 0.1452598 1.1903677
Xenorhina macrops 31.55226 38.4691226 0.1414434 1.4477885
Xenorhina mehelyi 31.52860 32.2789788 0.1445829 1.2073574
Xenorhina minima 31.49127 38.9487255 0.1426918 1.4724475
Xenorhina multisica 31.47723 30.0216329 0.1425843 1.2082065
Xenorhina obesa 31.48522 37.8454625 0.1450005 1.4072921
Xenorhina ocellata 31.44946 38.5666956 0.1482900 1.4592920
Xenorhina ophiodon 31.46776 50.3482163 0.1442356 1.8062403
Xenorhina oxycephala 31.44983 42.0518570 0.1471554 1.5543458
Xenorhina parkerorum 31.51868 33.0516554 0.1423084 1.2405323
Xenorhina rostrata 31.48351 36.6501122 0.1436908 1.3670052
Xenorhina scheepstrai 31.48177 36.8570499 0.1446639 1.3991008
Xenorhina schiefenhoeveli 31.55202 36.1056593 0.1450989 1.4097450
Xenorhina similis 31.42989 36.1920424 0.1477656 1.3274247
Xenorhina subcrocea 31.38787 33.6916246 0.1426807 1.2562966
Xenorhina tumulus 32.49871 38.4178078 0.1447076 1.4345430
Xenorhina varia 31.55541 83.2890085 0.1441274 3.1566062
Xenorhina zweifeli 31.49103 42.2470952 0.1435812 1.5340709
Austrochaperina adamantina 31.52177 42.6757525 0.1438428 1.5995625
Austrochaperina adelphe 31.46002 31.4801134 0.1444541 1.1028638
Austrochaperina aquilonia 31.52513 43.9999599 0.1459638 1.6494328
Austrochaperina archboldi 31.54071 31.7504332 0.1435945 1.1603387
Austrochaperina basipalmata 30.89936 47.1057688 0.1457973 1.7602207
Austrochaperina blumi 31.59039 34.1460275 0.1426773 1.3331852
Austrochaperina brevipes 31.57449 30.1314464 0.1442401 1.1165581
Austrochaperina derongo 31.37923 35.2774805 0.1425568 1.3256471
Austrochaperina fryi 31.50280 24.7779723 0.1445022 0.9307821
Austrochaperina gracilipes 31.47781 31.5710335 0.1438343 1.1320266
Austrochaperina hooglandi 31.54703 37.1253948 0.1437708 1.3709492
Austrochaperina kosarek 31.53965 40.0919511 0.1433067 1.5217180
Austrochaperina macrorhyncha 30.84358 37.9768480 0.1437988 1.4137417
Austrochaperina mehelyi 31.46260 35.7708079 0.1435975 1.3473438
Austrochaperina minutissima 31.51766 44.4175183 0.1465363 1.5861601
Austrochaperina novaebritanniae 31.45760 47.2915559 0.1447115 1.6800421
Austrochaperina palmipes 30.83750 44.1866268 0.1437677 1.6260831
Austrochaperina parkeri 31.47133 36.8922230 0.1460500 1.3636504
Austrochaperina pluvialis 31.46543 27.4494048 0.1451126 1.0478267
Austrochaperina polysticta 31.40498 36.9221406 0.1447782 1.4062653
Austrochaperina rivularis 31.67985 35.5441935 0.1471025 1.2948445
Austrochaperina robusta 31.50751 24.3943404 0.1406233 0.9589234
Austrochaperina septentrionalis 31.57799 44.0864281 0.1426421 1.6644176
Austrochaperina yelaensis 31.57864 60.5556139 0.1452234 2.1974335
Barygenys atra 31.54228 36.8736218 0.1424263 1.3557257
Barygenys cheesmanae 31.45260 23.4733898 0.1462694 0.9098055
Barygenys exsul 31.39611 57.7321587 0.1480174 2.0955228
Barygenys flavigularis 31.53790 37.4348337 0.1441401 1.3806595
Barygenys maculata 31.51015 40.8795703 0.1472740 1.4818701
Barygenys nana 31.47197 37.8375563 0.1456746 1.4489271
Barygenys parvula 31.49779 34.1059774 0.1445192 1.2679881
Callulops boettgeri 31.43637 45.9942563 0.1443199 1.6514719
Callulops comptus 31.47199 31.7398324 0.1453606 1.2384217
Callulops doriae 32.44182 42.4603216 0.1422923 1.5518660
Callulops dubius 31.56435 46.2760257 0.1431930 1.6704439
Callulops fuscus 31.43041 52.1690114 0.1432365 1.8967550
Callulops glandulosus 31.46722 31.9555621 0.1431143 1.2666898
Callulops humicola 31.32318 31.6562494 0.1478319 1.2123459
Callulops kopsteini 31.46917 61.6507305 0.1463771 2.2495394
Callulops marmoratus 31.33584 32.4234632 0.1461105 1.2544321
Callulops personatus 31.42031 43.2850836 0.1430884 1.6266841
Callulops robustus 31.45055 49.0615608 0.1451887 1.7502096
Callulops sagittatus 31.42530 37.7313875 0.1439256 1.3560807
Callulops stictogaster 31.46707 37.0387651 0.1443836 1.4159524
Callulops wilhelmanus 31.36225 33.5432702 0.1447448 1.2966818
Cophixalus ateles 31.45423 34.9126943 0.1450849 1.2334794
Cophixalus balbus 31.61504 42.9108814 0.1440659 1.5997801
Cophixalus bewaniensis 31.52874 44.1744595 0.1430706 1.6083261
Cophixalus biroi 31.30278 41.5955075 0.1441531 1.5457049
Cophixalus cheesmanae 31.33819 34.4527497 0.1458730 1.2793585
Cophixalus crepitans 31.43987 30.8911945 0.1462439 1.1117582
Cophixalus cryptotympanum 31.30216 41.8290824 0.1452251 1.5083284
Cophixalus daymani 31.59013 41.3789695 0.1429301 1.4934431
Cophixalus humicola 31.52569 49.5998890 0.1443003 1.8079078
Cophixalus kaindiensis 31.57949 36.6660650 0.1415466 1.3521367
Cophixalus misimae 31.49021 49.3771749 0.1458559 1.7617815
Cophixalus montanus 31.46389 42.1646042 0.1446234 1.5148210
Cophixalus nubicola 31.63740 34.6358917 0.1440155 1.3685851
Cophixalus parkeri 31.42820 33.9144478 0.1449466 1.2767317
Cophixalus peninsularis 31.46315 31.5306532 0.1418661 1.1364150
Cophixalus pipilans 31.59718 42.3461637 0.1395511 1.6020185
Cophixalus pulchellus 31.42912 38.3284424 0.1466110 1.3865849
Cophixalus riparius 31.47128 32.1612444 0.1428800 1.2101550
Cophixalus shellyi 31.34679 34.8734610 0.1442290 1.3119823
Cophixalus sphagnicola 31.39612 31.3128754 0.1454748 1.1556557
Cophixalus tagulensis 30.87435 60.0800506 0.1430648 2.1918100
Cophixalus tetzlaffi 31.31037 65.2982914 0.1435823 2.4144510
Cophixalus timidus 31.32523 43.9634214 0.1448354 1.5955451
Cophixalus tridactylus 31.47920 46.3582964 0.1428823 1.6521702
Cophixalus variabilis 31.45940 48.7607793 0.1429633 1.7557562
Cophixalus verecundus 31.40441 29.6355307 0.1440143 1.0566657
Cophixalus verrucosus 31.43217 41.3460220 0.1452742 1.5078487
Cophixalus zweifeli 31.46106 32.8188575 0.1450997 1.1787970
Copiula exspectata 31.50219 69.8503842 0.1439819 2.6485887
Copiula fistulans 31.55234 36.9918052 0.1449070 1.3698067
Copiula major 31.44036 42.5934635 0.1449135 1.5193018
Copiula minor 31.63352 55.7403646 0.1408642 2.0355797
Copiula obsti 31.49846 41.9962969 0.1428708 1.4975308
Copiula oxyrhina 31.58767 49.4097889 0.1440741 1.7538058
Copiula pipiens 31.51164 43.8408024 0.1451935 1.6221857
Copiula tyleri 31.65140 40.8539408 0.1437746 1.5208904
Hylophorbus picoides 31.50086 56.0622791 0.1474798 2.0404816
Hylophorbus tetraphonus 31.53175 55.3475220 0.1453231 1.9970230
Hylophorbus sextus 31.48934 52.9457845 0.1467539 1.9089442
Hylophorbus rainerguentheri 31.57252 32.8976062 0.1438551 1.2368143
Hylophorbus richardsi 31.58562 33.8483176 0.1433513 1.2713280
Hylophorbus wondiwoi 31.60003 41.9931279 0.1452670 1.4981043
Hylophorbus rufescens 31.63592 31.5092673 0.1440181 1.1345434
Hylophorbus nigrinus 31.57711 42.6753731 0.1426618 1.7146969
Mantophryne louisiadensis 31.46049 62.2843736 0.1434801 2.2603167
Mantophryne lateralis 31.45534 37.5086317 0.1451445 1.3785718
Oreophryne albopunctata 31.33845 42.5429493 0.1450618 1.5535040
Oreophryne alticola 31.56606 33.4308117 0.1435795 1.3052731
Oreophryne anthonyi 31.38881 33.8692371 0.1433707 1.2311253
Oreophryne anulata 31.45271 49.2541217 0.1430503 1.7781645
Oreophryne asplenicola 31.30327 66.5045399 0.1445012 2.5215113
Oreophryne pseudasplenicola 31.28329 76.5766185 0.1456252 2.9042387
Oreophryne atrigularis 31.49835 43.7021335 0.1438838 1.6200673
Oreophryne biroi 31.31094 35.6187346 0.1441785 1.3316757
Oreophryne brachypus 31.26216 44.7086281 0.1440878 1.6216231
Oreophryne brevicrus 31.33832 37.1534155 0.1459689 1.4160215
Oreophryne brevirostris 31.62540 34.3085333 0.1448027 1.3390104
Oreophryne celebensis 31.26794 57.8021932 0.1455319 2.1058360
Oreophryne clamata 31.36345 44.4692265 0.1469432 1.5861210
Oreophryne crucifer 31.38515 41.2641267 0.1452418 1.5232139
Oreophryne flava 31.35103 34.0498438 0.1423549 1.3101069
Oreophryne frontifasciata 31.38185 61.7005246 0.1435547 2.2708093
Oreophryne geislerorum 31.36849 33.4094191 0.1428946 1.2317310
Oreophryne geminus 31.45611 34.0146276 0.1449099 1.2224417
Oreophryne habbemensis 31.37077 44.6863001 0.1435517 1.6272477
Oreophryne hypsiops 31.40381 37.2024138 0.1449140 1.3756911
Oreophryne idenburgensis 31.29067 50.3886603 0.1452339 1.7747809
Oreophryne inornata 31.25730 58.3261766 0.1458377 2.1305910
Oreophryne insulana 31.35804 52.3154154 0.1449642 1.9076513
Oreophryne jeffersoniana 31.28742 46.4396012 0.1445091 1.6894428
Oreophryne kampeni 31.31377 33.0291898 0.1441258 1.1781026
Oreophryne kapisa 31.24820 56.6529750 0.1466964 2.1048813
Oreophryne loriae 31.36167 32.5033685 0.1450744 1.1597552
Oreophryne minuta 31.27951 29.3501556 0.1436887 1.2247821
Oreophryne moluccensis 31.45978 57.8264484 0.1439794 2.0969053
Oreophryne monticola 31.37129 50.9007000 0.1458107 1.8366306
Oreophryne notata 31.38859 32.5836767 0.1456658 1.2408017
Oreophryne rookmaakeri 31.46035 55.0870668 0.1413766 2.0450889
Oreophryne sibilans 31.29745 49.8243759 0.1464590 1.7816628
Oreophryne terrestris 31.41994 41.2056895 0.1435241 1.4828212
Oreophryne unicolor 31.27945 55.6450618 0.1449580 2.0254048
Oreophryne variabilis 31.41023 54.5035500 0.1453649 2.0065418
Oreophryne waira 31.34143 69.3086306 0.1471936 2.6276977
Oreophryne wapoga 31.31891 47.9910324 0.1446059 1.8631736
Sphenophryne cornuta 31.48107 40.4228897 0.1447414 1.4875396
Gastrophrynoides borneensis 33.54990 44.7153966 0.1416813 1.5927881
Glyphoglossus molossus 35.41039 32.8539643 0.1393871 1.1543116
Microhyla achatina 34.11878 40.3050338 0.1419448 1.4615475
Microhyla borneensis 34.18975 37.6551146 0.1388445 1.3145615
Microhyla berdmorei 34.73556 28.4866664 0.1396299 1.0367755
Microhyla pulchra 34.70529 27.1429613 0.1396997 0.9887275
Microhyla rubra 34.63915 23.5947787 0.1405643 0.8629311
Microhyla maculifera 34.71924 33.7670363 0.1397449 1.1944547
Microhyla chakrapanii 34.67672 36.9975025 0.1386860 1.2901080
Microhyla karunaratnei 34.75358 29.9963796 0.1403607 1.0897901
Microhyla palmipes 34.77981 41.0632690 0.1383021 1.4577030
Microhyla mixtura 34.64310 12.8776242 0.1393478 0.5245570
Microhyla okinavensis 34.67116 45.9770808 0.1410245 1.6746815
Microhyla superciliaris 34.66862 41.2251256 0.1428557 1.4521951
Microhyla picta 34.80536 30.8705602 0.1394597 1.1062737
Microhyla pulverata 34.66977 30.1833264 0.1412639 1.1076868
Microhyla sholigari 34.58847 20.3475942 0.1412893 0.7379431
Microhyla zeylanica 34.86178 29.7191929 0.1394084 1.0786052
Micryletta inornata 34.04029 50.6518136 0.1414811 1.7806164
Micryletta steinegeri 34.09604 49.0608493 0.1408159 1.7497632
Chaperina fusca 33.87773 45.2145262 0.1456986 1.6053328
Kaloula assamensis 34.54892 29.8132354 0.1396028 1.1349785
Kaloula aureata 34.35252 31.5787044 0.1417123 1.1035409
Kaloula baleata 34.29719 34.4168247 0.1456301 1.2531531
Kaloula mediolineata 34.42634 25.5855790 0.1437211 0.8902809
Kaloula conjuncta 34.33421 41.7495089 0.1425138 1.5106543
Kaloula rigida 34.23789 42.5530409 0.1407510 1.5209516
Kaloula kokacii 33.88272 42.2681944 0.1413494 1.5153457
Kaloula picta 34.33331 43.0779750 0.1414160 1.5526764
Kaloula borealis 34.68825 9.1803141 0.1397242 0.3954540
Kaloula rugifera 34.60171 11.3464789 0.1443856 0.5276955
Kaloula verrucosa 34.70987 17.6060275 0.1411184 0.8112818
Uperodon globulosus 35.36601 26.5223341 0.1428534 0.9692793
Uperodon systoma 35.37920 25.2206096 0.1392109 0.9383407
Metaphrynella pollicaris 34.07621 43.2505223 0.1412248 1.5235831
Metaphrynella sundana 33.99698 44.3691898 0.1436834 1.5816560
Phrynella pulchra 34.17476 45.9222159 0.1423197 1.6143390
Dyscophus insularis 33.90136 35.9036211 0.1410256 1.3432572
Dyscophus antongilii 33.74328 37.5274206 0.1432157 1.4431594
Dyscophus guineti 33.74005 39.4547693 0.1419993 1.5229277
Hildebrandtia macrotympanum 35.12332 45.8539520 0.1356085 1.8157680
Hildebrandtia ornatissima 35.15858 29.4523866 0.1354883 1.1990081
Hildebrandtia ornata 35.25022 29.2659767 0.1367635 1.1473379
Lanzarana largeni 34.32664 41.2909699 0.1338031 1.6034896
Ptychadena aequiplicata 34.51013 50.2731527 0.1358422 1.8242025
Ptychadena obscura 34.24577 33.3299579 0.1346635 1.3863214
Ptychadena mahnerti 34.54463 29.1063760 0.1369122 1.3564248
Ptychadena uzungwensis 34.56566 32.9466014 0.1354140 1.3440274
Ptychadena porosissima 34.35059 30.7034338 0.1342288 1.2854285
Ptychadena perreti 34.20796 47.7007467 0.1352801 1.7265756
Ptychadena anchietae 34.41599 30.7087572 0.1371922 1.2621208
Ptychadena oxyrhynchus 34.30453 35.9795818 0.1340022 1.4009835
Ptychadena tellinii 34.29064 35.0729805 0.1357888 1.2821619
Ptychadena longirostris 34.12407 53.6117389 0.1386989 1.9313092
Ptychadena bunoderma 34.26234 30.9597100 0.1364392 1.2333718
Ptychadena upembae 34.58833 32.7609578 0.1348723 1.3414934
Ptychadena ansorgii 34.62683 33.0290769 0.1342158 1.3450539
Ptychadena arnei 34.33260 51.6637591 0.1330813 1.8715246
Ptychadena pumilio 34.45743 41.4822145 0.1357350 1.5134181
Ptychadena retropunctata 34.45188 37.7480761 0.1368602 1.3640585
Ptychadena bibroni 34.18541 43.7987100 0.1356981 1.5883899
Ptychadena christyi 34.18287 46.4199023 0.1340218 1.8776250
Ptychadena stenocephala 34.13407 44.3796978 0.1351132 1.7034210
Ptychadena broadleyi 34.17774 32.6808604 0.1343348 1.2592392
Ptychadena keilingi 34.12788 32.8820741 0.1350488 1.3178058
Ptychadena chrysogaster 34.07876 43.2070671 0.1370446 1.9486551
Ptychadena harenna 34.14297 37.5856072 0.1356911 1.8616188
Ptychadena cooperi 34.52393 32.9403782 0.1366553 1.6488029
Ptychadena erlangeri 34.30785 33.9447841 0.1351183 1.5811355
Ptychadena nana 34.28650 31.6450689 0.1362041 1.6502863
Ptychadena wadei 34.39133 29.0667459 0.1324439 1.2379214
Ptychadena filwoha 34.39244 33.3665870 0.1363476 1.6445811
Ptychadena subpunctata 34.31268 33.5374443 0.1366012 1.3652181
Ptychadena gansi 34.22042 57.3045671 0.1350798 2.1743459
Ptychadena grandisonae 34.19510 33.4833555 0.1357304 1.3724005
Ptychadena guibei 34.17967 30.7528521 0.1377485 1.2275603
Ptychadena neumanni 34.47589 34.5045217 0.1369694 1.5921999
Ptychadena ingeri 34.44032 42.0491959 0.1345563 1.5729967
Ptychadena submascareniensis 34.19531 44.4192161 0.1356811 1.6080379
Ptychadena mapacha 34.18963 29.0163695 0.1360337 1.1604276
Ptychadena straeleni 34.13279 37.7634307 0.1385246 1.3908702
Ptychadena mascareniensis 34.44350 35.8642954 0.1361977 1.3826998
Ptychadena newtoni 34.42073 68.6269244 0.1390415 2.5317953
Ptychadena nilotica 34.43075 36.2385547 0.1360738 1.4945216
Ptychadena taenioscelis 34.10469 32.9099015 0.1360064 1.3218140
Ptychadena trinodis 34.16060 38.5469428 0.1352686 1.3950151
Ptychadena mossambica 34.11509 32.7866635 0.1364944 1.3479541
Ptychadena tournieri 34.37629 43.6882735 0.1360967 1.5729977
Ptychadena perplicata 34.14250 30.6738120 0.1389880 1.2370911
Ptychadena schillukorum 34.12936 35.6889468 0.1383778 1.3806037
Ptychadena pujoli 34.13759 40.1109001 0.1369247 1.4415594
Ptychadena superciliaris 34.20858 56.3516066 0.1361110 2.0346590
Odontobatrachus natator 33.35491 43.6153557 0.1384920 1.5763228
Phrynobatrachus latifrons 34.12659 40.9039556 0.1347678 1.4679129
Phrynobatrachus asper 34.40365 34.0644413 0.1374922 1.4060368
Phrynobatrachus acridoides 34.40285 34.6421240 0.1339562 1.4127760
Phrynobatrachus pakenhami 34.44659 56.9478262 0.1347458 2.2399780
Phrynobatrachus bullans 34.34010 30.0884612 0.1371434 1.3612173
Phrynobatrachus francisci 34.02063 41.3987802 0.1349921 1.4921553
Phrynobatrachus natalensis 34.13362 31.7553134 0.1367491 1.2615441
Phrynobatrachus bequaerti 34.28499 38.1756398 0.1365249 1.6517268
Phrynobatrachus africanus 34.36054 47.4107762 0.1380031 1.7267261
Phrynobatrachus elberti 34.19922 37.9360219 0.1342591 1.3938459
Phrynobatrachus brevipalmatus 34.15825 34.8289172 0.1346156 1.3104699
Phrynobatrachus albomarginatus 34.10522 43.4204712 0.1371429 1.6143780
Phrynobatrachus mababiensis 34.28429 30.3121194 0.1378338 1.2576095
Phrynobatrachus alleni 34.19658 59.6490279 0.1393333 2.1564541
Phrynobatrachus phyllophilus 34.06799 55.6911132 0.1351814 2.0137539
Phrynobatrachus ghanensis 34.06750 63.6501882 0.1329366 2.3076371
Phrynobatrachus guineensis 33.87805 50.9295338 0.1368139 1.8421043
Phrynobatrachus annulatus 34.37724 54.9350435 0.1352215 1.9872169
Phrynobatrachus calcaratus 34.28502 46.8870268 0.1371833 1.7021712
Phrynobatrachus villiersi 34.12632 61.0213661 0.1368073 2.2076739
Phrynobatrachus cornutus 34.14066 42.7336905 0.1347038 1.5523922
Phrynobatrachus anotis 33.99312 35.6077155 0.1352364 1.4120200
Phrynobatrachus nanus 33.98225 46.4965890 0.1352925 1.7090345
Phrynobatrachus auritus 34.02804 40.3368299 0.1352004 1.4697983
Phrynobatrachus plicatus 34.32558 58.8450710 0.1357758 2.1148221
Phrynobatrachus gastoni 34.09697 50.3868607 0.1354139 1.8134110
Phrynobatrachus batesii 34.06346 45.5010607 0.1346390 1.6739078
Phrynobatrachus werneri 33.48294 49.4114026 0.1332490 1.8514563
Phrynobatrachus cricogaster 34.30016 55.8899347 0.1353784 2.0703618
Phrynobatrachus steindachneri 34.34474 39.7731649 0.1347676 1.5220064
Phrynobatrachus chukuchuku 34.21231 38.7298599 0.1384828 1.5023784
Phrynobatrachus breviceps 34.02771 31.5004284 0.1341242 1.4484241
Phrynobatrachus hylaios 34.28624 45.5001714 0.1359389 1.6632009
Phrynobatrachus graueri 34.49886 39.6128498 0.1361448 1.7346878
Phrynobatrachus kinangopensis 34.45527 32.6889796 0.1349918 1.5314706
Phrynobatrachus cryptotis 34.18320 34.2350650 0.1332178 1.3511684
Phrynobatrachus irangi 34.09930 27.4151842 0.1360126 1.2513703
Phrynobatrachus dalcqi 34.01251 34.3576094 0.1374166 1.3533759
Phrynobatrachus intermedius 34.37871 79.1472842 0.1353511 2.8690836
Phrynobatrachus liberiensis 34.28112 57.2153868 0.1365893 2.0780066
Phrynobatrachus tokba 34.06317 49.6070178 0.1371728 1.7924068
Phrynobatrachus dispar 34.32351 74.7507588 0.1339797 2.7403813
Phrynobatrachus leveleve 34.31233 71.4087300 0.1345111 2.6341905
Phrynobatrachus inexpectatus 34.02583 33.3254557 0.1378371 1.6815939
Phrynobatrachus minutus 34.29046 32.8015570 0.1390414 1.5450022
Phrynobatrachus scheffleri 34.28045 33.9214845 0.1390162 1.4639367
Phrynobatrachus rungwensis 34.25707 30.1150825 0.1366595 1.2744464
Phrynobatrachus uzungwensis 33.42862 36.3455260 0.1364463 1.5710306
Phrynobatrachus parvulus 34.05103 31.2215891 0.1371204 1.2843086
Phrynobatrachus keniensis 34.31648 28.8461975 0.1377458 1.3506711
Phrynobatrachus fraterculus 34.25902 48.4895326 0.1351435 1.7524974
Phrynobatrachus gutturosus 34.28823 49.9918446 0.1359689 1.7933322
Phrynobatrachus pintoi 33.95382 33.5961575 0.1374982 1.1986232
Phrynobatrachus kakamikro 33.97179 28.6956023 0.1372650 1.2562565
Phrynobatrachus taiensis 34.11620 63.7653371 0.1367258 2.3114594
Phrynobatrachus giorgii 34.03563 41.6553444 0.1372642 1.4676635
Phrynobatrachus scapularis 34.24865 45.3981763 0.1357113 1.6815594
Phrynobatrachus ogoensis 34.14309 41.6701227 0.1364115 1.4477210
Phrynobatrachus perpalmatus 34.29422 33.4595628 0.1351265 1.3010064
Phrynobatrachus pallidus 34.37978 60.0408490 0.1365370 2.3531526
Phrynobatrachus rouxi 34.17976 43.1977053 0.1339384 2.0517233
Phrynobatrachus parkeri 34.10655 44.0105413 0.1337862 1.5836497
Phrynobatrachus sternfeldi 34.02050 39.3670229 0.1349916 1.4307976
Phrynobatrachus pygmaeus 33.99578 39.5930401 0.1348249 1.4568488
Phrynobatrachus sulfureogularis 34.06998 45.9769920 0.1334260 1.9929721
Phrynobatrachus stewartae 34.21832 31.1405704 0.1349107 1.3456232
Phrynobatrachus ukingensis 34.27768 38.1238026 0.1350735 1.6576982
Phrynobatrachus ungujae 34.03877 56.6652720 0.1355771 2.2342485
Phrynobatrachus acutirostris 33.51066 38.7784651 0.1361306 1.6779777
Phrynobatrachus dendrobates 34.08270 42.5485698 0.1344518 1.7030948
Phrynobatrachus petropedetoides 34.10609 37.2758949 0.1348853 1.5039353
Phrynobatrachus versicolor 34.15861 42.6159078 0.1354856 1.9129899
Phrynobatrachus krefftii 34.08610 60.0734843 0.1375360 2.3961861
Phrynobatrachus sandersoni 34.26580 57.3629340 0.1375449 2.1346664
Conraua alleni 33.39344 49.7806786 0.1359365 1.7962485
Conraua robusta 33.47538 57.6570525 0.1368379 2.1535655
Conraua derooi 33.46948 57.9150428 0.1365373 2.0310324
Conraua beccarii 34.19674 27.8011971 0.1357926 1.2233781
Conraua crassipes 33.42519 47.0548566 0.1362573 1.7120396
Conraua goliath 33.40466 52.4409113 0.1351742 1.9453345
Micrixalus elegans 33.48744 32.8118682 0.1350687 1.2201041
Micrixalus nudis 34.31438 37.2979109 0.1345866 1.3421065
Micrixalus fuscus 33.37829 35.9191232 0.1370533 1.3016405
Micrixalus kottigeharensis 34.30138 35.4144876 0.1363030 1.3193445
Micrixalus saxicola 33.42494 30.9494938 0.1388976 1.1474530
Micrixalus phyllophilus 33.40551 34.5428860 0.1348498 1.2490760
Micrixalus swamianus 34.04723 30.7538397 0.1351242 1.1436448
Micrixalus silvaticus 33.45805 38.7141425 0.1363653 1.3977850
Micrixalus thampii 33.42677 27.7727653 0.1365916 1.0150051
Micrixalus gadgili 33.44447 45.3248303 0.1364512 1.6448377
Micrixalus narainensis 33.49511 33.7317431 0.1347999 1.2534167
Arthroleptides martiensseni 33.37953 53.0629266 0.1347459 2.1131117
Arthroleptides yakusini 33.43919 35.2567099 0.1342516 1.4922359
Petropedetes cameronensis 33.29735 52.3231649 0.1359186 1.9365547
Petropedetes parkeri 34.16068 47.9266658 0.1368210 1.7796575
Petropedetes perreti 33.27119 46.8508804 0.1392700 1.7586516
Petropedetes johnstoni 33.96312 54.4211449 0.1361962 2.0147939
Petropedetes palmipes 34.18371 48.8588461 0.1393948 1.8039886
Ericabatrachus baleensis 33.30504 35.0565464 0.1375822 1.7317577
Aubria masako 34.35765 43.6881006 0.1341188 1.5683095
Aubria occidentalis 34.39129 53.9618882 0.1342332 1.9469832
Aubria subsigillata 34.37881 42.3424795 0.1370176 1.5311714
Pyxicephalus adspersus 35.11601 23.8780098 0.1343861 1.0274677
Pyxicephalus edulis 34.95854 31.2777004 0.1378963 1.2379313
Pyxicephalus angusticeps 34.34674 35.5024949 0.1362021 1.3683620
Pyxicephalus obbianus 35.03760 38.3869729 0.1377434 1.5051965
Amietia tenuoplicata 33.45135 38.0049031 0.1359969 1.6125052
Amietia angolensis 34.29228 25.8139852 0.1352157 1.0446312
Amietia desaegeri 34.28500 34.9400299 0.1375508 1.4481439
Amietia inyangae 33.41188 25.5398388 0.1376740 1.0444134
Amietia johnstoni 33.44028 28.7875467 0.1344562 1.1125411
Amietia vertebralis 34.16374 22.3554251 0.1377993 1.0620521
Amietia ruwenzorica 33.37046 43.0524678 0.1356381 1.7779528
Amietia wittei 33.35622 30.3898921 0.1373278 1.3972975
Amietia fuscigula 34.43164 20.6296147 0.1337904 0.9783156
Amietia vandijki 33.58481 17.8516660 0.1328858 0.8299731
Strongylopus bonaespei 34.40294 20.2740969 0.1339964 0.9713654
Strongylopus fuelleborni 34.40114 32.8093107 0.1373934 1.4167363
Strongylopus kilimanjaro 33.44635 39.5167742 0.1334243 1.7427764
Strongylopus fasciatus 34.33593 25.4491278 0.1357069 1.0992561
Strongylopus springbokensis 34.33834 20.8540270 0.1351556 1.0160654
Strongylopus rhodesianus 33.51390 28.8021640 0.1339422 1.1581941
Strongylopus kitumbeine 34.38173 24.0575917 0.1343695 1.1374046
Strongylopus wageri 34.41544 24.4744749 0.1346591 1.1001983
Strongylopus merumontanus 33.49870 26.2618751 0.1355786 1.1945499
Strongylopus grayii 34.37534 20.8866231 0.1341118 0.9617047
Arthroleptella bicolor 34.25090 18.2093026 0.1318380 0.8917577
Arthroleptella subvoce 34.11975 19.0111306 0.1369268 0.9130022
Arthroleptella drewesii 33.62898 21.4272928 0.1362208 1.0647422
Arthroleptella landdrosia 34.18618 19.2252861 0.1368808 0.9266355
Arthroleptella lightfooti 34.22507 19.3312238 0.1365418 0.9088354
Arthroleptella villiersi 34.27388 20.3121670 0.1313506 0.9729909
Arthroleptella rugosa 34.23703 24.3028594 0.1347815 1.2075042
Natalobatrachus bonebergi 33.53030 27.2141634 0.1357380 1.2171325
Nothophryne broadleyi 33.61491 30.3615809 0.1371495 1.1707027
Cacosternum leleupi 34.11454 31.3235393 0.1354544 1.2719753
Cacosternum boettgeri 34.16867 22.9713900 0.1358708 1.0184075
Cacosternum kinangopensis 34.15118 28.8117207 0.1363883 1.4461586
Cacosternum plimptoni 34.08835 31.2937704 0.1394555 1.4617981
Cacosternum striatum 34.07393 27.7795993 0.1365365 1.2180283
Cacosternum parvum 34.11397 26.0285531 0.1385302 1.1607369
Cacosternum nanum 34.11088 24.2111344 0.1368893 1.1099696
Cacosternum capense 35.10027 19.3311869 0.1358415 0.9217407
Cacosternum namaquense 34.06226 18.5077661 0.1355596 0.9103051
Cacosternum karooicum 34.05224 16.7832757 0.1372535 0.8094466
Cacosternum platys 34.09928 20.8175025 0.1347344 0.9793799
Microbatrachella capensis 34.42249 21.8143853 0.1340197 1.0435054
Poyntonia paludicola 33.62631 20.1989917 0.1344109 0.9698318
Anhydrophryne hewitti 34.04609 26.9063729 0.1337215 1.2024679
Anhydrophryne ngongoniensis 34.07517 26.0260314 0.1355856 1.1931215
Anhydrophryne rattrayi 34.04633 19.9500130 0.1348657 0.9736964
Tomopterna cryptotis 33.97739 25.9038471 0.1371976 1.0210312
Tomopterna tandyi 34.01049 20.3580175 0.1339464 0.9064900
Tomopterna damarensis 35.02620 19.7263866 0.1355686 0.8383672
Tomopterna delalandii 34.29160 17.8084239 0.1373458 0.8574217
Tomopterna gallmanni 34.09943 29.4628026 0.1347839 1.3348449
Tomopterna tuberculosa 34.33107 28.8082955 0.1345512 1.2105001
Tomopterna elegans 34.03412 34.2800066 0.1361414 1.3196785
Tomopterna wambensis 34.31302 37.9029697 0.1333458 1.6728265
Tomopterna kachowskii 34.09091 26.9468785 0.1368839 1.2341690
Tomopterna krugerensis 34.06616 23.2158149 0.1350281 0.9753391
Tomopterna luganga 34.19561 27.0969805 0.1382727 1.2151130
Tomopterna marmorata 34.03222 25.9373949 0.1361907 1.0788291
Tomopterna milletihorsini 34.09921 31.2682106 0.1323098 1.1226135
Tomopterna natalensis 34.07637 22.4909648 0.1366263 1.0012662
Platymantis levigatus 32.49000 64.2156808 0.1386834 2.3270955
Platymantis mimulus 31.19574 50.8023880 0.1375590 1.8221222
Platymantis naomii 31.13705 58.6281680 0.1391270 2.1343940
Platymantis panayensis 31.95491 51.6517162 0.1395452 1.8827949
Platymantis rabori 32.29815 57.9067285 0.1352910 2.0937246
Platymantis isarog 32.20459 59.2659013 0.1393669 2.1284204
Platymantis cornutus 32.24133 62.6924104 0.1397108 2.2351576
Platymantis cagayanensis 32.40326 64.2567178 0.1372403 2.3062093
Platymantis diesmosi 32.41051 61.2997425 0.1362882 2.2012827
Platymantis lawtoni 32.29263 70.1405636 0.1366256 2.5412813
Platymantis guentheri 32.20571 47.4084257 0.1376539 1.7129896
Platymantis subterrestris 32.16013 58.5738147 0.1394075 2.0841596
Platymantis hazelae 31.68087 36.7352119 0.1377532 1.3436300
Platymantis pygmaeus 31.78836 43.8313865 0.1395946 1.5645022
Platymantis indeprensus 32.25571 72.3073111 0.1402421 2.6350431
Platymantis paengi 32.25421 66.9584438 0.1399407 2.4360320
Platymantis insulatus 32.22886 52.3068128 0.1374243 1.9082688
Platymantis taylori 32.34143 67.2561365 0.1365442 2.4077103
Platymantis negrosensis 32.33301 63.2262457 0.1392691 2.3058752
Platymantis pseudodorsalis 32.32437 71.7357768 0.1375975 2.6145745
Platymantis polillensis 32.22787 63.2038140 0.1363746 2.2667281
Platymantis sierramadrensis 32.27245 68.5290334 0.1378534 2.4366492
Platymantis spelaeus 32.45737 73.3797571 0.1373798 2.6360579
Lankanectes corrugatus 33.45824 37.7526869 0.1369577 1.3450510
Nyctibatrachus sylvaticus 32.91046 43.1922244 0.1348500 1.5941856
Nyctibatrachus major 32.86054 36.2476877 0.1368283 1.3228206
Nyctibatrachus dattatreyaensis 32.85307 30.3266047 0.1365032 1.1330925
Nyctibatrachus karnatakaensis 32.79677 28.1254197 0.1365983 1.0456971
Nyctibatrachus sanctipalustris 33.67398 36.9455816 0.1358358 1.3751247
Nyctibatrachus kempholeyensis 32.83313 37.8503993 0.1385259 1.4001205
Nyctibatrachus humayuni 32.95900 34.8496728 0.1368973 1.2944740
Nyctibatrachus petraeus 32.92886 31.9082733 0.1366137 1.1715529
Nyctibatrachus aliciae 33.74247 38.6959195 0.1336159 1.4156174
Nyctibatrachus vasanthi 32.82412 46.2580852 0.1387027 1.6634327
Nyctibatrachus deccanensis 33.68978 33.6648735 0.1351962 1.2252789
Nyctibatrachus minor 33.72791 30.7280790 0.1351213 1.1158207
Nyctibatrachus beddomii 33.72757 34.1962686 0.1363631 1.2297687
Nyctibatrachus minimus 33.50434 43.0199321 0.1347260 1.5607476
Indirana beddomii 34.70178 35.6756257 0.1320385 1.3024483
Indirana brachytarsus 34.03380 32.7483408 0.1342447 1.1867229
Indirana leithii 34.74526 35.6861318 0.1323513 1.3129141
Indirana semipalmata 34.05621 37.2658682 0.1333498 1.3549693
Indirana gundia 34.08508 40.9310975 0.1315131 1.5128096
Indirana longicrus 34.02124 35.6992366 0.1321526 1.3272403
Indirana diplosticta 33.91454 43.2315783 0.1330741 1.5430480
Indirana leptodactyla 34.58953 37.0531686 0.1309783 1.3356239
Indirana phrynoderma 34.49028 32.2078070 0.1328029 1.1376044
Ingerana borealis 35.02161 30.1115658 0.1321959 1.2132064
Ingerana tenasserimensis 34.80948 39.7470783 0.1330537 1.4215323
Ingerana charlesdarwini 34.63531 42.8084502 0.1308568 1.4908037
Ingerana reticulata 34.10374 12.9483144 0.1317647 0.7833483
Occidozyga baluensis 34.68477 44.8004348 0.1311474 1.5997167
Occidozyga celebensis 34.50370 49.6520095 0.1380648 1.8366578
Occidozyga lima 34.57823 34.5010184 0.1337142 1.2459697
Occidozyga magnapustulosa 34.36191 32.8969354 0.1342109 1.1817891
Occidozyga martensii 34.30022 29.4147490 0.1352992 1.0657763
Occidozyga semipalmata 34.46961 53.3847917 0.1319218 1.9693544
Occidozyga sumatrana 34.55165 48.0340453 0.1323231 1.7273137
Occidozyga floresiana 33.76592 38.7497278 0.1378544 1.4229301
Occidozyga diminutiva 33.62624 70.6251411 0.1335460 2.5934102
Allopaa hazarensis 36.15805 8.0308111 0.1317630 0.5390387
Chrysopaa sternosignata 35.99743 14.5742383 0.1315267 0.6680340
Ombrana sikimensis 35.30282 21.3415366 0.1328674 1.0461706
Euphlyctis hexadactylus 37.25920 26.8930182 0.1265245 0.9605230
Euphlyctis cyanophlyctis 37.29928 20.6055432 0.1295874 0.7815540
Euphlyctis ehrenbergii 37.20970 26.5049417 0.1320721 1.0673109
Euphlyctis ghoshi 37.32430 36.2422143 0.1305215 1.2377183
Hoplobatrachus crassus 38.70098 25.0543542 0.1287983 0.9078453
Hoplobatrachus tigerinus 38.14047 19.5993064 0.1285650 0.7324167
Hoplobatrachus occipitalis 37.29963 24.9587237 0.1280308 0.9315330
Nannophrys ceylonensis 37.00743 34.9566510 0.1302394 1.2627574
Nannophrys marmorata 37.11432 32.0122983 0.1279112 1.1545068
Nannophrys naeyakai 36.21617 34.5655676 0.1325771 1.2161116
Fejervarya iskandari 36.55580 33.9712129 0.1297710 1.1969067
Fejervarya orissaensis 36.61933 25.9183864 0.1304905 0.9197083
Fejervarya moodiei 36.88813 44.6599842 0.1307736 1.5828174
Fejervarya multistriata 36.81537 37.4927863 0.1299125 1.3585629
Fejervarya triora 36.54477 28.1120171 0.1304501 0.9658406
Fejervarya verruculosa 36.53754 46.0123487 0.1300220 1.6738751
Fejervarya vittigera 36.57534 58.0512162 0.1301323 2.0923317
Sphaerotheca breviceps 36.53970 21.8497554 0.1297897 0.7990234
Sphaerotheca dobsonii 37.61181 28.4813684 0.1279225 1.0279084
Sphaerotheca leucorhynchus 37.57133 28.2175995 0.1286579 1.0390981
Sphaerotheca maskeyi 37.53500 23.7307846 0.1282568 1.0645302
Sphaerotheca rolandae 37.57086 29.6659137 0.1291156 1.0419848
Sphaerotheca swani 37.49241 29.3647618 0.1302325 1.1322224
Limnonectes acanthi 34.44401 55.6630538 0.1338317 1.9943316
Limnonectes arathooni 35.11627 52.2113846 0.1306163 1.9201727
Limnonectes microtympanum 34.44107 55.0133429 0.1312404 2.0478908
Limnonectes asperatus 35.16511 34.5447996 0.1311728 1.2040242
Limnonectes kuhlii 34.47027 39.4174466 0.1297016 1.4346676
Limnonectes fujianensis 35.38096 22.8255888 0.1325458 0.8220447
Limnonectes namiyei 34.38404 42.6603034 0.1332658 1.5418342
Limnonectes poilani 33.66618 23.6156966 0.1348330 0.8296146
Limnonectes dabanus 35.37863 28.4703074 0.1334018 0.9950351
Limnonectes gyldenstolpei 35.16379 29.2669736 0.1299188 1.0390572
Limnonectes dammermani 34.49331 48.0850726 0.1327683 1.7538915
Limnonectes diuatus 34.58059 38.7031689 0.1294570 1.3918886
Limnonectes doriae 35.13648 31.7199951 0.1306393 1.1307667
Limnonectes hascheanus 35.09663 30.1139396 0.1293106 1.0885989
Limnonectes limborgi 35.03804 28.5896592 0.1325599 1.0489193
Limnonectes plicatellus 34.41098 39.2894812 0.1329640 1.3785826
Limnonectes kohchangae 35.12461 32.1030839 0.1312360 1.1015934
Limnonectes finchi 34.67839 33.9911165 0.1334289 1.2165516
Limnonectes ingeri 34.05377 35.6451176 0.1346465 1.2823785
Limnonectes fragilis 34.41589 44.1930039 0.1316866 1.5682648
Limnonectes grunniens 35.33754 43.1207372 0.1335321 1.5851052
Limnonectes ibanorum 35.26941 38.5313945 0.1328489 1.3680019
Limnonectes heinrichi 33.76309 48.8059733 0.1351175 1.7815615
Limnonectes modestus 34.71537 45.2907328 0.1329494 1.6634801
Limnonectes macrocephalus 34.47581 41.9777377 0.1329869 1.5006307
Limnonectes visayanus 33.63521 46.6364251 0.1333593 1.7020624
Limnonectes magnus 33.71071 46.4844881 0.1351523 1.6881487
Limnonectes kadarsani 34.45193 45.9444302 0.1328861 1.6637835
Limnonectes microdiscus 35.03233 41.4203732 0.1302215 1.4943610
Limnonectes kenepaiensis 35.19292 53.4031672 0.1361679 1.9138477
Limnonectes khammonensis 35.23892 25.4834122 0.1327094 0.8863826
Limnonectes khasianus 35.07850 29.7632624 0.1309254 1.1509533
Limnonectes leporinus 35.18808 36.6054542 0.1319113 1.3022261
Limnonectes leytensis 34.46943 48.7484639 0.1338404 1.7695419
Limnonectes macrodon 35.30781 36.0185261 0.1326843 1.2956634
Limnonectes shompenorum 35.04021 47.8784479 0.1327002 1.7311020
Limnonectes paramacrodon 35.29052 42.0443652 0.1321673 1.4876662
Limnonectes macrognathus 35.16612 30.2022167 0.1305009 1.0783926
Limnonectes mawlyndipi 35.15350 18.2756559 0.1325025 0.7884142
Limnonectes micrixalus 34.50135 65.8155149 0.1348462 2.4446146
Limnonectes nitidus 34.53354 36.6612099 0.1315586 1.3186284
Limnonectes palavanensis 34.54376 42.8569963 0.1316625 1.5361607
Limnonectes parvus 34.55071 48.9127860 0.1302589 1.7730775
Limnonectes tweediei 35.09340 38.3581428 0.1315665 1.3533739
Nanorana aenea 38.30122 22.5923405 0.1266960 0.8905850
Nanorana unculuanus 37.73238 18.9848412 0.1262629 0.8094385
Nanorana annandalii 37.77073 18.2242826 0.1260667 0.9204034
Nanorana arnoldi 37.66528 11.1721405 0.1288648 0.6490755
Nanorana maculosa 37.70801 21.4449328 0.1258660 0.9389666
Nanorana medogensis 37.70224 11.8912729 0.1292209 0.7226686
Nanorana blanfordii 37.63530 14.1877133 0.1275141 0.7469903
Nanorana conaensis 37.54010 16.5356630 0.1299967 0.8937617
Nanorana ercepeae 37.68616 14.4120764 0.1279254 0.6941810
Nanorana taihangnica 37.67919 10.6194119 0.1269075 0.4642796
Nanorana liebigii 37.70313 10.8571474 0.1273497 0.6391476
Nanorana minica 37.65472 10.7043254 0.1287109 0.5902483
Nanorana mokokchungensis 37.63107 29.1160221 0.1262916 1.0873220
Nanorana parkeri 38.28232 6.4722284 0.1291963 0.5658316
Nanorana pleskei 38.34453 7.0121322 0.1295869 0.5078671
Nanorana ventripunctata 38.50914 13.1122005 0.1270620 0.7928125
Nanorana polunini 37.75378 12.1118927 0.1270595 0.6801575
Nanorana quadranus 37.72184 11.7460693 0.1258683 0.4914523
Nanorana rarica 38.54830 6.6668713 0.1287705 0.5230524
Nanorana rostandi 37.66914 9.6025447 0.1273421 0.5772400
Nanorana vicina 37.68358 8.4120234 0.1252208 0.5365041
Nanorana yunnanensis 37.68984 18.1172162 0.1274181 0.7834525
Quasipaa boulengeri 38.86486 14.0472303 0.1277544 0.5730122
Quasipaa verrucospinosa 38.87653 24.3724097 0.1256713 0.9395367
Quasipaa jiulongensis 38.80290 15.3137436 0.1277208 0.5638494
Quasipaa shini 38.88512 20.3390285 0.1266756 0.7513675
Quasipaa exilispinosa 39.34434 17.2478674 0.1231967 0.6229766
Quasipaa yei 38.69298 13.0545008 0.1268549 0.4703952
Quasipaa delacouri 38.20034 22.9954239 0.1257979 0.8686169
Quasipaa fasciculispina 38.25535 25.1284889 0.1256282 0.8565287
Amolops archotaphus 33.07479 26.0451714 0.1343301 1.0051289
Amolops aniqiaoensis 33.17955 13.4790490 0.1319989 0.8170666
Amolops assamensis 33.18172 36.6570338 0.1345106 1.3840981
Amolops bellulus 33.13002 20.9923716 0.1351592 1.0541397
Amolops chakrataensis 33.11484 19.4655196 0.1344752 0.9117390
Amolops chunganensis 33.87965 16.4236573 0.1309472 0.6790184
Amolops compotrix 33.07249 32.3982041 0.1376847 1.1462722
Amolops cucae 33.07143 24.4868244 0.1343076 0.9398164
Amolops vitreus 33.16521 25.7935049 0.1316995 1.0364661
Amolops cremnobatus 33.32288 29.9003321 0.1289623 1.0850643
Amolops daiyunensis 33.05568 24.0106627 0.1341384 0.8738968
Amolops iriodes 33.92502 29.0342717 0.1329873 1.0936796
Amolops formosus 33.18429 16.7207543 0.1335122 0.8485461
Amolops gerbillus 33.18895 20.3652108 0.1325792 0.9753305
Amolops granulosus 33.74674 11.5421489 0.1316467 0.5290846
Amolops lifanensis 33.04941 10.2333069 0.1374920 0.5320435
Amolops hainanensis 33.14426 49.0627889 0.1320012 1.7410919
Amolops hongkongensis 33.09714 40.9462832 0.1360458 1.4800370
Amolops jaunsari 33.14461 17.2128486 0.1341782 0.8029931
Amolops jinjiangensis 33.12608 14.7236644 0.1336047 0.8744822
Amolops tuberodepressus 33.14968 24.5858093 0.1325232 1.0735413
Amolops loloensis 33.09788 17.6094523 0.1343013 0.8500152
Amolops mantzorum 33.12913 12.2131612 0.1341193 0.6624975
Amolops kaulbacki 33.04899 17.4332208 0.1371004 0.9095366
Amolops larutensis 33.11471 44.8531343 0.1365602 1.5865765
Amolops longimanus 33.72273 25.8073179 0.1365734 1.1436013
Amolops marmoratus 33.20643 23.4696824 0.1341763 1.0112268
Amolops medogensis 33.21921 13.3786966 0.1341189 0.8121172
Amolops mengyangensis 33.02641 23.8186119 0.1364861 1.0209959
Amolops minutus 33.19330 28.7126511 0.1335837 1.1162751
Amolops monticola 33.03901 13.7608384 0.1361774 0.7896819
Amolops panhai 33.22372 33.5909936 0.1302906 1.1787383
Amolops ricketti 33.15176 22.5995992 0.1351319 0.8216175
Amolops wuyiensis 33.25416 22.2176829 0.1316525 0.8203297
Amolops spinapectoralis 33.15246 31.2106695 0.1344849 1.1119492
Amolops splendissimus 33.23531 26.0387289 0.1325000 1.0245921
Amolops torrentis 33.07230 52.3421529 0.1348497 1.8582779
Amolops viridimaculatus 33.14203 21.2838301 0.1367685 1.0126647
Babina holsti 33.42207 44.9970826 0.1350286 1.6325056
Babina subaspera 33.13875 41.8340602 0.1362651 1.5364482
Odorrana absita 32.57304 29.8235633 0.1330908 1.0633775
Odorrana khalam 32.57789 26.8160651 0.1333100 0.9458925
Odorrana amamiensis 32.66202 40.0118410 0.1328575 1.4676651
Odorrana narina 32.58249 47.0774461 0.1353837 1.7030618
Odorrana supranarina 32.57679 41.5222249 0.1334412 1.4794741
Odorrana jingdongensis 32.60008 21.4208297 0.1351254 0.9194860
Odorrana grahami 32.63454 18.0768137 0.1324823 0.8383472
Odorrana junlianensis 32.64752 19.4468490 0.1339170 0.8016456
Odorrana anlungensis 32.64521 19.4867443 0.1325801 0.7954388
Odorrana aureola 32.61765 27.0670084 0.1345619 0.9797208
Odorrana livida 32.59824 29.3198362 0.1369741 1.0321092
Odorrana chloronota 32.57719 23.8318769 0.1363539 0.8809783
Odorrana leporipes 32.50690 27.0667424 0.1352392 0.9511375
Odorrana graminea 32.60172 32.9823782 0.1347148 1.1686813
Odorrana bacboensis 32.59256 23.3479389 0.1348466 0.8807860
Odorrana hainanensis 32.65427 50.7123178 0.1338131 1.8015070
Odorrana banaorum 32.56605 25.8259550 0.1324327 0.9038989
Odorrana morafkai 32.60684 29.2396120 0.1329602 1.0295655
Odorrana bolavensis 32.57741 28.8966072 0.1339446 1.0065076
Odorrana chapaensis 32.59398 21.9248746 0.1360166 0.8441888
Odorrana geminata 32.55539 24.6162680 0.1338928 0.9516788
Odorrana exiliversabilis 32.72082 16.4137263 0.1336788 0.6000984
Odorrana nasuta 32.68486 45.9310077 0.1334406 1.6346439
Odorrana versabilis 32.72928 20.4742590 0.1344829 0.7544039
Odorrana gigatympana 32.59192 30.1221354 0.1352696 1.0652620
Odorrana hejiangensis 32.57692 14.1698372 0.1344244 0.5702983
Odorrana hosii 32.56841 41.2821509 0.1335087 1.4604710
Odorrana schmackeri 32.59093 14.9017318 0.1353297 0.5721473
Odorrana indeprensa 32.65667 31.1677668 0.1330867 1.0666658
Odorrana ishikawae 32.56161 42.3212467 0.1358735 1.5315015
Odorrana kuangwuensis 32.60661 10.8042194 0.1331159 0.4518653
Odorrana margaretae 32.61945 14.6376738 0.1364481 0.5997134
Odorrana lungshengensis 32.59254 20.4169065 0.1339699 0.7686470
Odorrana mawphlangensis 32.52967 25.9830096 0.1364090 1.0499308
Odorrana monjerai 32.53542 40.2578116 0.1334687 1.3977162
Odorrana nasica 32.69270 26.8312802 0.1316796 0.9680645
Odorrana orba 32.55738 28.2458097 0.1348538 1.0014831
Odorrana splendida 32.54850 41.0444391 0.1359049 1.5077505
Odorrana utsunomiyaorum 32.51471 33.1015976 0.1356877 1.1812941
Odorrana tiannanensis 32.57726 27.5651492 0.1343450 1.0407415
Odorrana tormota 32.60910 14.5706917 0.1369549 0.5300616
Odorrana trankieni 32.55970 27.2969817 0.1358834 0.9951674
Odorrana wuchuanensis 32.64199 17.4305450 0.1327089 0.6712679
Odorrana yentuensis 32.61404 27.0193922 0.1342587 0.9734683
Rana amurensis 33.00096 4.2394106 0.1318924 0.2464539
Rana coreana 33.02578 10.0496838 0.1336311 0.4260121
Rana sakuraii 32.09859 10.6889121 0.1371526 0.4326171
Rana tagoi 32.80907 11.6617416 0.1336728 0.4692583
Rana pyrenaica 31.82601 5.9804209 0.1329434 0.2903853
Rana italica 31.73597 7.1800944 0.1340469 0.3138864
Rana asiatica 32.66387 5.5201404 0.1340863 0.3488347
Rana macrocnemis 32.63539 7.3767640 0.1339631 0.3644144
Rana tavasensis 31.88346 9.9276168 0.1311046 0.4582389
Rana pseudodalmatina 32.72514 9.5893504 0.1332046 0.4771051
Rana aurora 32.38134 5.6018105 0.1324466 0.3312136
Rana muscosa 31.51051 8.5783049 0.1344169 0.4246923
Rana sierrae 32.39104 7.5541213 0.1358650 0.4192967
Rana draytonii 32.37649 8.4820316 0.1386862 0.4304917
Rana chaochiaoensis 32.97634 13.0649104 0.1329623 0.6106310
Rana zhenhaiensis 33.17701 13.3911016 0.1331765 0.4890543
Rana omeimontis 32.91606 10.0770380 0.1318776 0.4310531
Rana hanluica 33.13891 13.5768357 0.1334667 0.5048711
Rana japonica 33.20863 9.9594583 0.1315259 0.4015722
Rana kukunoris 30.52672 3.6827245 0.1397259 0.2654785
Rana huanrensis 29.54801 6.8367098 0.1368803 0.3059040
Rana pirica 29.36064 4.8586117 0.1402077 0.2746369
Rana ornativentris 29.91526 8.5711169 0.1399334 0.3498978
Rana dalmatina 33.02775 7.6503805 0.1344551 0.3780462
Rana latastei 32.83497 8.9256854 0.1339196 0.4166030
Rana graeca 32.91905 10.6812868 0.1354888 0.5107871
Rana johnsi 32.80924 18.8277604 0.1344104 0.7217826
Rana tsushimensis 32.94718 12.5451933 0.1351112 0.4937246
Rana sangzhiensis 32.14614 18.3420526 0.1326363 0.6874427
Rana shuchinae 32.08207 11.2516102 0.1345247 0.6434477
Glandirana minima 33.67199 23.3289536 0.1335388 0.8580812
Pterorana khare 33.65817 28.7939915 0.1343344 1.1133573
Sanguirana everetti 32.69940 45.3944045 0.1336807 1.6447996
Sanguirana igorota 32.72852 48.9131068 0.1320049 1.7460662
Sanguirana sanguinea 32.72760 46.4155884 0.1328430 1.6643249
Sanguirana tipanan 33.51510 53.6608063 0.1346740 1.9065739
Hylarana chitwanensis 33.53630 23.6614627 0.1313977 1.0775179
Hylarana garoensis 33.52155 22.8546308 0.1356110 1.0033888
Hylarana macrodactyla 33.46014 32.4126321 0.1329293 1.1555581
Hylarana margariana 32.84083 25.3822606 0.1337270 0.9581327
Hylarana montivaga 32.91624 33.7271775 0.1347548 1.2154664
Hylarana persimilis 33.64623 33.6910382 0.1306178 1.1491573
Hylarana taipehensis 33.52070 28.3584151 0.1337640 1.0169368
Hylarana tytleri 33.61876 28.3796188 0.1331199 1.0440570
Pelophylax bedriagae 34.61256 15.0951917 0.1322584 0.6540504
Pelophylax caralitanus 34.69599 11.2044652 0.1321087 0.5150636
Pelophylax cerigensis 34.71231 22.5849008 0.1305984 0.9189920
Pelophylax kurtmuelleri 34.66453 12.1823997 0.1299983 0.5415747
Pelophylax ridibundus 34.68801 7.7036209 0.1317450 0.3833080
Pelophylax bergeri 34.65935 9.3080097 0.1321746 0.3925843
Pelophylax shqipericus 34.56027 9.1337703 0.1314194 0.4068579
Pelophylax chosenicus 34.64755 9.7332115 0.1332570 0.4288022
Pelophylax plancyi 34.68506 10.5971311 0.1304076 0.4233562
Pelophylax nigromaculatus 34.61127 10.4226533 0.1295350 0.4563814
Pelophylax hubeiensis 34.61296 14.1484946 0.1355375 0.5250549
Pelophylax cretensis 34.63876 21.0623690 0.1332766 0.8458434
Pelophylax epeiroticus 34.56774 13.2097610 0.1339338 0.6366595
Pelophylax fukienensis 34.59532 17.8147584 0.1329365 0.6514172
Pelophylax porosus 34.69703 11.9042867 0.1297662 0.4803182
Pelophylax tenggerensis 34.57188 9.2949087 0.1315838 0.4913381
Pelophylax terentievi 34.61304 9.7079506 0.1313005 0.6572904
Clinotarsus alticola 33.22293 31.5811226 0.1360188 1.1983108
Clinotarsus curtipes 33.86592 29.8464878 0.1338127 1.0866341
Huia cavitympanum 33.90005 49.2057770 0.1326085 1.7607586
Meristogenys amoropalamus 33.18998 44.3222762 0.1369138 1.6153975
Meristogenys orphnocnemis 33.24455 48.5226699 0.1346864 1.7428979
Meristogenys whiteheadi 33.25898 50.4395525 0.1312296 1.8063013
Meristogenys poecilus 33.28508 41.8108780 0.1331460 1.4713918
Meristogenys macrophthalmus 33.30939 50.4592370 0.1314740 1.7886923
Meristogenys jerboa 33.25331 51.1942699 0.1338703 1.7973844
Meristogenys phaeomerus 33.25006 44.0716977 0.1339396 1.5614177
Meristogenys kinabaluensis 33.24449 48.4273587 0.1311321 1.7595068
Staurois parvus 33.52683 55.5664515 0.1343101 2.0298614
Staurois tuberilinguis 33.50374 48.1562514 0.1355964 1.7198447
Staurois latopalmatus 33.45530 49.9996804 0.1345455 1.7831465
Buergeria buergeri 35.53063 13.2187867 0.1310527 0.5283378
Buergeria oxycephala 35.51347 48.5880696 0.1311981 1.7254816
Buergeria robusta 35.45206 45.1765667 0.1334165 1.6357832
Chiromantis kelleri 34.34138 26.1610641 0.1342566 1.0812862
Chiromantis petersii 34.28138 23.5261330 0.1332454 1.0403425
Chiromantis xerampelina 34.27738 22.7577252 0.1302941 0.9252885
Chiromantis rufescens 34.24738 36.7560763 0.1329333 1.3397171
Feihyla kajau 34.23177 39.1486093 0.1340809 1.3949759
Feihyla palpebralis 34.24272 28.1783855 0.1334098 1.0497809
Ghatixalus asterops 34.28458 29.6735875 0.1343876 1.0577111
Ghatixalus variabilis 34.20414 20.7813556 0.1373084 0.7619503
Polypedates chlorophthalmus 34.48901 38.9850892 0.1327587 1.3880337
Polypedates colletti 35.02408 37.2350438 0.1343483 1.3241167
Polypedates cruciger 34.95848 30.4012616 0.1329198 1.0782838
Polypedates insularis 35.01122 47.1666120 0.1308848 1.6873475
Polypedates macrotis 34.94310 40.8463746 0.1325272 1.4480928
Polypedates maculatus 34.99914 21.0567314 0.1335008 0.7791250
Polypedates megacephalus 35.05278 22.9054732 0.1336873 0.8414945
Polypedates mutus 35.01386 22.9082478 0.1326270 0.8514266
Polypedates occidentalis 34.91986 24.7931042 0.1340832 0.8665060
Polypedates otilophus 35.00593 43.3527401 0.1314744 1.5535475
Polypedates pseudocruciger 35.06188 26.6378681 0.1306674 0.9616056
Polypedates taeniatus 35.06703 20.9256390 0.1299878 0.8542592
Polypedates zed 34.97955 23.5289908 0.1331363 1.0708110
Taruga eques 34.87960 30.9534438 0.1337377 1.1170447
Taruga fastigo 34.94060 27.8826277 0.1314375 1.0117671
Taruga longinasus 34.88801 33.1563582 0.1328128 1.1971205
Gracixalus ananjevae 34.18389 31.4186660 0.1311553 1.1291754
Gracixalus jinxiuensis 34.22680 25.7041817 0.1323061 0.9347917
Gracixalus medogensis 34.23031 12.9567041 0.1304974 0.7859256
Gracixalus gracilipes 34.12446 28.4634327 0.1373368 1.0906111
Gracixalus quangi 34.15759 32.0604396 0.1333532 1.2188761
Gracixalus supercornutus 34.20360 31.5019639 0.1328328 1.1219696
Rhacophorus vampyrus 34.26833 30.4880075 0.1350440 1.0723643
Kurixalus appendiculatus 33.62933 48.7688137 0.1355145 1.7689886
Kurixalus baliogaster 33.45191 27.7273637 0.1309766 0.9768165
Kurixalus banaensis 33.49511 29.0667894 0.1311191 1.0349718
Kurixalus bisacculus 33.56770 31.8585202 0.1323910 1.1181280
Kurixalus odontotarsus 33.51163 22.4818070 0.1320775 0.8930485
Kurixalus verrucosus 33.43671 26.5657733 0.1318992 0.9764279
Kurixalus naso 33.42328 18.9194816 0.1364593 0.9078617
Kurixalus idiootocus 32.97881 33.0368928 0.1357364 1.1948722
Pseudophilautus abundus 34.25310 30.1980291 0.1336262 1.0889111
Pseudophilautus alto 34.18249 33.4910045 0.1340856 1.2090538
Pseudophilautus amboli 34.26727 19.9114120 0.1335834 0.7469849
Pseudophilautus wynaadensis 34.30476 32.2989270 0.1356874 1.1743121
Pseudophilautus asankai 34.26951 32.1618591 0.1363632 1.1608209
Pseudophilautus auratus 34.26863 32.6656861 0.1355667 1.1852392
Pseudophilautus caeruleus 34.25403 28.0954084 0.1368206 1.0199254
Pseudophilautus cavirostris 34.34421 30.5461669 0.1326215 1.1032235
Pseudophilautus cuspis 34.43293 31.9212738 0.1346475 1.1526645
Pseudophilautus decoris 34.27354 29.2194346 0.1344528 1.0627913
Pseudophilautus mittermeieri 34.32208 32.8577026 0.1340431 1.1840891
Pseudophilautus femoralis 34.36389 30.2126967 0.1352023 1.0910137
Pseudophilautus poppiae 34.39935 29.9913492 0.1313006 1.0881275
Pseudophilautus mooreorum 34.30495 35.1876284 0.1325986 1.2653367
Pseudophilautus fergusonianus 34.25549 30.1877331 0.1340485 1.0717810
Pseudophilautus folicola 34.27601 32.8112075 0.1322098 1.1850514
Pseudophilautus frankenbergi 34.25750 30.6765462 0.1306174 1.0971043
Pseudophilautus fulvus 34.16010 30.1707649 0.1351568 1.0862951
Pseudophilautus schmarda 34.29825 32.6048120 0.1335525 1.1781872
Pseudophilautus kani 34.21064 44.8468944 0.1329923 1.6151481
Pseudophilautus limbus 34.29267 33.4422061 0.1348423 1.2077911
Pseudophilautus lunatus 34.28278 30.0171342 0.1342868 1.0857800
Pseudophilautus macropus 33.76313 31.8521691 0.1343414 1.1479329
Pseudophilautus microtympanum 34.35567 29.4925346 0.1339203 1.0666129
Pseudophilautus steineri 34.25480 33.4867649 0.1339260 1.2042118
Pseudophilautus nemus 34.33321 31.7540911 0.1340080 1.1496005
Pseudophilautus ocularis 34.31650 27.7206503 0.1324595 1.0056702
Pseudophilautus reticulatus 34.27698 32.6738768 0.1331543 1.1824134
Pseudophilautus pleurotaenia 34.29362 33.8006262 0.1333342 1.2126163
Pseudophilautus popularis 34.29252 29.8661115 0.1341081 1.0635059
Pseudophilautus regius 34.24579 30.9862663 0.1352956 1.1074024
Pseudophilautus rus 34.27489 31.4038627 0.1319665 1.1306975
Pseudophilautus sarasinorum 33.80154 31.8914351 0.1330379 1.1399887
Pseudophilautus semiruber 34.48474 31.3821533 0.1335145 1.1310128
Pseudophilautus simba 34.39360 29.9716299 0.1349421 1.0875275
Pseudophilautus singu 34.34080 32.3879094 0.1329781 1.1691694
Pseudophilautus sordidus 34.31275 29.9130318 0.1346543 1.0807674
Pseudophilautus stellatus 34.35611 30.9200396 0.1321691 1.1240310
Pseudophilautus stictomerus 34.22797 33.9138275 0.1344049 1.2078419
Pseudophilautus stuarti 34.26899 29.4516889 0.1338642 1.0571128
Pseudophilautus tanu 34.29012 28.6644322 0.1332671 1.0395377
Pseudophilautus viridis 34.33474 31.3679822 0.1332078 1.1368796
Pseudophilautus zorro 34.47227 31.0119183 0.1348226 1.1200387
Raorchestes akroparallagi 34.28904 30.4172663 0.1322251 1.1082105
Raorchestes bobingeri 34.19220 39.1007654 0.1333842 1.4096064
Raorchestes glandulosus 34.14888 30.7768668 0.1360912 1.1240610
Raorchestes anili 34.41560 34.4946708 0.1338031 1.2474013
Raorchestes kaikatti 34.28907 29.0763346 0.1324870 1.0201374
Raorchestes sushili 34.24295 28.7785882 0.1341557 1.0050397
Raorchestes beddomii 34.33428 32.3873150 0.1333225 1.1579987
Raorchestes munnarensis 34.41927 32.8394718 0.1340069 1.1694862
Raorchestes resplendens 34.48363 27.5319984 0.1336291 0.9840720
Raorchestes dubois 34.24146 31.3442262 0.1344996 1.1170372
Raorchestes bombayensis 34.31682 26.1674111 0.1284632 0.9688925
Raorchestes tuberohumerus 34.28785 24.1306239 0.1315863 0.8850969
Raorchestes charius 34.28398 33.7616691 0.1310064 1.2569264
Raorchestes griet 34.27462 27.1200340 0.1329062 0.9668984
Raorchestes coonoorensis 34.35610 19.9393726 0.1327912 0.7335199
Raorchestes chlorosomma 34.27637 31.2039627 0.1344517 1.1237528
Raorchestes luteolus 34.29101 23.0531019 0.1313639 0.8476617
Raorchestes travancoricus 34.28469 43.0788144 0.1315133 1.5632392
Raorchestes chotta 34.20215 40.0222138 0.1348330 1.4365240
Raorchestes chromasynchysi 34.28074 29.9076402 0.1302659 1.1007476
Raorchestes signatus 34.36663 22.9901152 0.1321500 0.8303023
Raorchestes tinniens 34.36823 23.0401163 0.1358839 0.8472012
Raorchestes graminirupes 34.42840 40.9733399 0.1358570 1.4744403
Raorchestes gryllus 34.25946 31.5105348 0.1330607 1.1180049
Raorchestes menglaensis 33.67226 25.8341394 0.1332146 1.0471452
Raorchestes longchuanensis 34.23274 24.0018132 0.1316562 0.9778726
Raorchestes marki 34.24917 28.9378452 0.1321800 1.0123274
Raorchestes nerostagona 34.19729 21.2009078 0.1351085 0.7796698
Raorchestes ochlandrae 34.30312 30.0058043 0.1335718 1.0877171
Raorchestes parvulus 34.28412 31.3970794 0.1347159 1.1442962
Raorchestes ponmudi 34.24369 32.6061583 0.1355034 1.1792607
Nyctixalus margaritifer 33.96612 32.7674855 0.1334370 1.1785866
Nyctixalus spinosus 34.08559 49.3313274 0.1351343 1.7904617
Philautus abditus 33.08146 26.8708730 0.1328078 0.9510400
Philautus acutirostris 32.27012 36.1578249 0.1361468 1.3104637
Philautus acutus 33.50546 42.0587075 0.1340149 1.5427405
Philautus aurantium 33.49888 48.4938794 0.1374585 1.7613234
Philautus amoenus 33.56342 54.5597952 0.1347763 2.0044806
Philautus mjobergi 33.53594 50.3045151 0.1372959 1.8434940
Philautus aurifasciatus 33.47546 41.7225055 0.1361537 1.4949362
Philautus bunitus 33.63437 44.3226821 0.1342997 1.6020782
Philautus kerangae 33.59180 40.9480741 0.1357995 1.5162208
Philautus cardamonus 33.56965 30.6275375 0.1353598 1.0456830
Philautus cornutus 33.56883 42.4874141 0.1356628 1.4589507
Philautus davidlabangi 33.55836 38.8261442 0.1325805 1.3781809
Philautus disgregus 33.57289 50.6179386 0.1341868 1.7928139
Philautus erythrophthalmus 33.49827 44.5322800 0.1361097 1.5985048
Philautus everetti 33.46413 55.7098764 0.1340567 2.0008963
Philautus garo 33.48596 28.5457645 0.1312356 1.1151553
Philautus gunungensis 33.46584 56.1725888 0.1376262 2.0682973
Philautus hosii 33.45371 39.6693542 0.1360454 1.4235797
Philautus ingeri 33.57186 42.2114237 0.1347566 1.5474563
Philautus kempiae 33.49445 28.5019185 0.1355009 1.1130475
Philautus kempii 33.51911 12.4601912 0.1352888 0.6987453
Philautus leitensis 33.57469 47.2218274 0.1325023 1.7124781
Philautus longicrus 33.49009 61.0206571 0.1359094 2.2066619
Philautus maosonensis 33.44663 29.0234107 0.1353771 1.0678661
Philautus microdiscus 33.51359 21.8556822 0.1327521 1.0414129
Philautus namdaphaensis 33.48893 26.3953524 0.1351760 1.1798584
Philautus pallidipes 33.56452 28.1236791 0.1351250 0.9823343
Philautus petersi 33.69632 62.1534248 0.1327375 2.2544019
Philautus poecilius 33.54884 35.3226529 0.1345371 1.2746567
Philautus refugii 33.52199 47.5268615 0.1350634 1.6871277
Philautus saueri 33.58897 58.3663617 0.1359725 2.1467695
Philautus schmackeri 33.52931 48.5492307 0.1343325 1.7453368
Philautus similipalensis 33.70881 27.7287218 0.1344276 0.9194723
Philautus surrufus 33.35210 43.0827088 0.1372878 1.5614544
Philautus tectus 33.51703 42.5047621 0.1357995 1.5136641
Philautus tytthus 33.54514 27.0965083 0.1329037 1.1209666
Philautus umbra 33.61853 42.9312718 0.1341892 1.5696680
Philautus vermiculatus 33.48937 39.3626831 0.1356311 1.3913814
Philautus vittiger 33.53057 34.7732031 0.1346622 1.2351075
Philautus worcesteri 33.67986 47.9581764 0.1359593 1.7296716
Rhacophorus angulirostris 34.21538 46.5301808 0.1347259 1.7263865
Rhacophorus annamensis 33.73781 29.3746198 0.1359779 1.0251321
Rhacophorus exechopygus 34.20079 28.5283785 0.1349877 1.0111370
Rhacophorus baluensis 34.31363 40.2214663 0.1339015 1.4631954
Rhacophorus barisani 33.79648 46.9312302 0.1329860 1.6523611
Rhacophorus gauni 34.28807 43.7150709 0.1352133 1.5545693
Rhacophorus gadingensis 34.26541 52.2521692 0.1340214 1.8672722
Rhacophorus bifasciatus 33.74028 49.7472039 0.1323424 1.7744960
Rhacophorus bimaculatus 34.22539 52.3500046 0.1353855 1.8913175
Rhacophorus bipunctatus 34.18711 28.9020166 0.1345694 1.1152326
Rhacophorus rhodopus 34.19711 25.8419551 0.1346370 1.0096799
Rhacophorus reinwardtii 34.20950 42.3511962 0.1350358 1.5416306
Rhacophorus calcadensis 34.29437 30.7263597 0.1337252 1.0917939
Rhacophorus calcaneus 34.15291 35.0887982 0.1329451 1.2660191
Rhacophorus catamitus 33.78570 43.4451977 0.1325237 1.5332590
Rhacophorus translineatus 34.30934 14.3463192 0.1318332 0.7827558
Rhacophorus pardalis 34.23761 43.5602210 0.1328676 1.5634456
Rhacophorus fasciatus 34.15076 50.7193236 0.1329237 1.8249644
Rhacophorus harrissoni 34.24655 42.6567105 0.1322725 1.5169530
Rhacophorus rufipes 34.22895 42.8755721 0.1313595 1.5134232
Rhacophorus georgii 34.31250 46.8593344 0.1340060 1.7273817
Rhacophorus helenae 34.29469 26.1352044 0.1334346 0.8898189
Rhacophorus kio 34.25836 27.0833690 0.1335241 1.0388316
Rhacophorus hoanglienensis 34.35968 27.3055371 0.1343087 1.0630306
Rhacophorus lateralis 34.29864 25.8537975 0.1337109 0.9500845
Rhacophorus malabaricus 34.25791 28.2036569 0.1345907 1.0280316
Rhacophorus pseudomalabaricus 34.31042 32.5703932 0.1330654 1.1621785
Rhacophorus margaritifer 33.72706 37.8540545 0.1346667 1.3586963
Rhacophorus marmoridorsum 34.25166 35.9397960 0.1303003 1.2860451
Rhacophorus modestus 33.69630 49.0610570 0.1363611 1.7039393
Rhacophorus monticola 33.79878 58.6567400 0.1341880 2.1933935
Rhacophorus nigropalmatus 34.16209 40.7907944 0.1354595 1.4367601
Rhacophorus orlovi 33.81781 32.5561589 0.1317460 1.1529287
Rhacophorus verrucopus 34.33080 13.0317001 0.1318897 0.7894793
Rhacophorus poecilonotus 34.28803 43.2178927 0.1332314 1.5622328
Rhacophorus robertingeri 33.78444 33.4458313 0.1320646 1.1851400
Rhacophorus robinsonii 34.29187 40.0922422 0.1327725 1.4168280
Rhacophorus spelaeus 34.16999 30.5257348 0.1356809 1.0698763
Rhacophorus tuberculatus 34.19721 17.2979458 0.1347610 0.8474985
Rhacophorus turpes 34.24761 27.7063315 0.1328231 1.1444056
Theloderma asperum 34.36683 37.9820408 0.1364111 1.3523752
Theloderma rhododiscus 34.25124 22.0733284 0.1352557 0.8249338
Theloderma bicolor 34.50427 22.4749187 0.1353173 0.9397243
Theloderma corticale 34.39695 25.3003852 0.1331091 0.9164720
Theloderma gordoni 34.47766 32.2603370 0.1324899 1.1950127
Theloderma leporosum 34.24921 38.2935419 0.1353218 1.3462841
Theloderma horridum 34.27303 41.6439930 0.1346373 1.4841784
Theloderma laeve 34.29306 29.9164081 0.1319626 1.0544573
Theloderma lateriticum 34.23879 27.4200061 0.1330211 1.0240944
Theloderma licin 34.25980 41.6557903 0.1344783 1.4797533
Theloderma moloch 34.30166 14.7865597 0.1341532 0.8029772
Theloderma nagalandense 34.20684 26.2502075 0.1330357 1.0309790
Theloderma nebulosum 34.06100 32.5014440 0.1341250 1.1561129
Theloderma truongsonense 33.68407 31.0461196 0.1349781 1.0951407
Theloderma phrynoderma 34.27567 29.5363079 0.1340946 1.0558458
Theloderma ryabovi 34.28939 32.6979523 0.1355901 1.1834989
Theloderma stellatum 34.15408 34.9758181 0.1337790 1.2126933
Liuixalus hainanus 34.57256 48.9988299 0.1329657 1.7472446
Liuixalus ocellatus 34.58056 49.8857885 0.1347608 1.7705730
Liuixalus romeri 34.56632 37.9318605 0.1317228 1.3703468
Boophis albilabris 34.06437 38.9554940 0.1338597 1.4885053
Boophis occidentalis 33.67070 37.1508958 0.1311617 1.3938193
Boophis albipunctatus 33.72313 39.0904497 0.1324941 1.5239013
Boophis tampoka 34.16652 41.8103370 0.1334125 1.5184275
Boophis jaegeri 34.17109 40.8562277 0.1349567 1.5044736
Boophis anjanaharibeensis 34.18583 29.7782832 0.1360104 1.1101449
Boophis septentrionalis 33.68424 36.0138983 0.1356782 1.3496565
Boophis englaenderi 33.64994 34.7881677 0.1369490 1.3005209
Boophis ankaratra 33.67656 34.4800195 0.1345590 1.3410974
Boophis schuboeae 33.64515 35.2884911 0.1372963 1.3624588
Boophis andreonei 34.09384 32.2603144 0.1340973 1.2026965
Boophis sibilans 33.69541 35.4499497 0.1333474 1.3606438
Boophis blommersae 34.11188 38.8762896 0.1353567 1.4589149
Boophis andohahela 34.21935 35.6031592 0.1301002 1.3701271
Boophis elenae 34.11134 34.7150799 0.1351387 1.3692929
Boophis axelmeyeri 33.62996 34.0543554 0.1361582 1.2730890
Boophis burgeri 34.09968 38.2517764 0.1354536 1.5365388
Boophis reticulatus 33.66026 36.5767871 0.1344820 1.4028022
Boophis rufioculis 33.61280 36.6301004 0.1343463 1.4424695
Boophis boehmei 33.68131 37.0553398 0.1336642 1.4459310
Boophis quasiboehmei 33.63817 35.6705036 0.1348702 1.3721913
Boophis popi 33.61279 32.1633218 0.1357799 1.2399767
Boophis fayi 34.07399 37.4406178 0.1367128 1.4020448
Boophis brachychir 33.73740 41.1841114 0.1321448 1.5396988
Boophis entingae 33.75033 37.6843553 0.1335486 1.4294428
Boophis goudotii 34.11725 36.2411670 0.1350650 1.3915042
Boophis obscurus 34.10277 35.2090538 0.1329744 1.3561371
Boophis luciae 33.71429 38.9369364 0.1334978 1.5344392
Boophis luteus 33.60363 38.8003663 0.1337557 1.5012660
Boophis madagascariensis 34.08954 39.4038484 0.1342462 1.5146443
Boophis roseipalmatus 33.59170 35.1516803 0.1372713 1.3126439
Boophis liami 33.78635 31.8098389 0.1329460 1.2785338
Boophis sambirano 33.69325 31.9103594 0.1350377 1.1973406
Boophis mandraka 33.79446 41.2425777 0.1321183 1.5958477
Boophis andrangoloaka 34.06832 37.7594008 0.1343904 1.4589295
Boophis rhodoscelis 34.08922 36.4168672 0.1330470 1.4284374
Boophis laurenti 33.74421 36.7093774 0.1342507 1.3950964
Boophis lilianae 33.68272 29.8478706 0.1326108 1.1520277
Boophis arcanus 34.19453 38.4792269 0.1359567 1.5098720
Boophis feonnyala 34.17979 41.1879760 0.1334815 1.6500919
Boophis haematopus 34.23794 40.8525549 0.1339867 1.5928057
Boophis pyrrhus 33.84013 36.2357293 0.1301170 1.4107740
Boophis miniatus 33.75028 34.9717947 0.1327482 1.3442918
Boophis baetkei 34.16742 53.4121383 0.1337327 2.0042278
Boophis ulftunni 33.79853 35.1595309 0.1320958 1.3167583
Boophis majori 33.68672 33.0197520 0.1356375 1.2673485
Boophis narinsi 33.69647 30.0414017 0.1351719 1.1606470
Boophis picturatus 33.68199 36.6046261 0.1361604 1.4295148
Boophis microtympanum 33.63778 32.9544343 0.1349497 1.2717185
Boophis williamsi 33.66518 30.9365195 0.1342654 1.2322619
Boophis marojezensis 33.76504 30.0626098 0.1334899 1.1560176
Boophis vittatus 33.75071 33.9834500 0.1311072 1.2697035
Boophis bottae 33.78434 36.8025712 0.1327857 1.4392038
Boophis erythrodactylus 34.12429 32.9632432 0.1359858 1.2902973
Boophis rappiodes 33.67440 36.6384831 0.1338380 1.4304516
Boophis tasymena 33.69537 37.8841106 0.1327288 1.4694289
Boophis viridis 33.67003 34.1668393 0.1328601 1.3178431
Boophis periegetes 33.67379 34.8227070 0.1349447 1.3391560
Boophis solomaso 34.10433 41.4496339 0.1362846 1.6266619
Boophis haingana 33.74841 38.2940902 0.1340857 1.4824043
Boophis miadana 33.71870 39.8451102 0.1306540 1.5398452
Boophis piperatus 34.17757 31.6565999 0.1328687 1.2203205
Boophis sandrae 33.82765 30.1851884 0.1305287 1.1645161
Boophis spinophis 34.19421 34.4608425 0.1322576 1.3261784
Boophis tsilomaro 33.73504 57.8668049 0.1352057 2.1530137
Boophis opisthodon 34.14313 37.8788858 0.1332763 1.4648096
Boophis calcaratus 33.65685 35.9931077 0.1341058 1.4058575
Boophis guibei 34.14298 34.9191057 0.1334765 1.3577247
Boophis lichenoides 34.11431 37.2128291 0.1351705 1.4322248
Boophis doulioti 34.12625 35.4959227 0.1338699 1.3391923
Boophis tephraeomystax 34.13946 37.7725089 0.1312206 1.4412637
Boophis xerophilus 34.14841 38.4444079 0.1336789 1.4560324
Boophis idae 34.08289 36.6155387 0.1361890 1.4305991
Boophis pauliani 34.14750 37.1088922 0.1359723 1.4501845
Blommersia angolafa 34.14743 37.9024626 0.1346279 1.4320384
Blommersia grandisonae 34.20587 39.6795913 0.1353647 1.5299468
Blommersia kely 34.33049 37.4355846 0.1379339 1.4620689
Blommersia sarotra 34.35878 35.2472346 0.1341046 1.3964496
Blommersia blommersae 34.08131 36.6364861 0.1357203 1.4486589
Blommersia dejongi 34.27211 37.4299970 0.1338896 1.4126265
Blommersia galani 34.23268 29.8483964 0.1352150 1.1267219
Blommersia domerguei 34.24222 32.7337852 0.1358007 1.2734232
Blommersia variabilis 34.08967 37.0838899 0.1360047 1.3698919
Blommersia wittei 34.04916 43.0392219 0.1313395 1.6038493
Guibemantis albolineatus 34.13170 36.2847924 0.1323553 1.4121303
Guibemantis bicalcaratus 34.10449 37.9020362 0.1343464 1.4627794
Guibemantis methueni 34.10817 37.6956880 0.1344766 1.4656979
Guibemantis annulatus 34.13967 41.5122676 0.1327365 1.6175596
Guibemantis flavobrunneus 34.04706 35.6776623 0.1351191 1.3741055
Guibemantis pulcher 34.07965 37.5099974 0.1330232 1.4425973
Guibemantis tasifotsy 34.08494 35.4420066 0.1354543 1.3511566
Guibemantis punctatus 34.11883 42.7559830 0.1366924 1.6540575
Guibemantis wattersoni 34.10903 42.3740010 0.1353871 1.6510022
Guibemantis liber 34.12419 37.6438550 0.1323148 1.4437087
Guibemantis timidus 34.11925 35.6695311 0.1315710 1.3839937
Guibemantis depressiceps 34.08095 37.4167172 0.1329741 1.4444187
Guibemantis kathrinae 34.11303 33.6383729 0.1369639 1.3064926
Guibemantis tornieri 34.11147 39.6400987 0.1351273 1.5423541
Mantella crocea 34.56518 38.5275457 0.1332642 1.4957375
Mantella milotympanum 34.29375 36.2390093 0.1338406 1.4523111
Mantella pulchra 34.29880 35.2245238 0.1330841 1.3543522
Mantella madagascariensis 33.64387 35.8604304 0.1348189 1.4053537
Mantella betsileo 34.21755 40.5493298 0.1335361 1.5224461
Mantella ebenaui 34.26994 35.0762348 0.1325249 1.3064694
Mantella viridis 33.64132 53.4413621 0.1351426 2.0023389
Mantella expectata 33.64466 37.4414194 0.1346029 1.4271150
Mantella laevigata 34.20989 37.0130123 0.1337572 1.4066421
Mantella manery 34.23192 31.8089731 0.1335527 1.1729046
Mantella baroni 34.29344 33.3278419 0.1359808 1.3056258
Mantella haraldmeieri 33.68039 37.2617535 0.1349767 1.4341173
Mantella nigricans 33.68705 34.0767397 0.1333467 1.2800040
Mantella cowanii 33.72641 36.4550923 0.1340966 1.4269322
Mantella bernhardi 34.28862 37.5965059 0.1336858 1.4428693
Wakea madinika 34.22710 34.9638227 0.1351968 1.2699450
Boehmantis microtympanum 33.58289 39.4722532 0.1364827 1.5286143
Gephyromantis ambohitra 33.54949 38.1544158 0.1358140 1.4247573
Gephyromantis asper 34.23005 34.5245328 0.1350531 1.3410421
Gephyromantis tahotra 33.68942 29.8189369 0.1358867 1.1146836
Gephyromantis horridus 34.31959 37.1265958 0.1336272 1.3942004
Gephyromantis malagasius 34.04047 38.5288434 0.1363550 1.4944752
Gephyromantis striatus 34.15220 36.6378008 0.1361099 1.3898223
Gephyromantis ventrimaculatus 34.30115 41.3434576 0.1345964 1.6137372
Gephyromantis klemmeri 34.31366 32.1829501 0.1344881 1.2102013
Gephyromantis rivicola 33.65692 40.1579343 0.1339820 1.5125511
Gephyromantis silvanus 33.67959 33.0310121 0.1350812 1.2309118
Gephyromantis webbi 33.63809 35.0415782 0.1358031 1.3035448
Gephyromantis atsingy 34.10730 37.6406590 0.1364643 1.3758593
Gephyromantis azzurrae 33.69919 36.9543227 0.1315305 1.4093634
Gephyromantis corvus 34.22860 37.8599530 0.1371713 1.4309832
Gephyromantis pseudoasper 34.07166 38.0997375 0.1348831 1.4276450
Gephyromantis blanci 34.22089 34.5501231 0.1345743 1.3331056
Gephyromantis runewsweeki 34.17763 32.9895992 0.1357077 1.2765962
Gephyromantis enki 34.18756 35.9806166 0.1355563 1.3868298
Gephyromantis boulengeri 34.15368 35.6513114 0.1332648 1.3770796
Gephyromantis eiselti 34.07231 35.4928269 0.1353647 1.4157856
Gephyromantis mafy 33.98416 41.8352760 0.1357996 1.6489214
Gephyromantis thelenae 34.08517 39.8846099 0.1320861 1.5992640
Gephyromantis decaryi 33.98624 36.5601859 0.1371059 1.4097783
Gephyromantis hintelmannae 34.01144 38.8920330 0.1364066 1.5269919
Gephyromantis verrucosus 34.04441 33.6588640 0.1351796 1.2777173
Gephyromantis leucocephalus 34.24599 42.7014476 0.1338787 1.6557973
Gephyromantis ranjomavo 33.66289 31.3014835 0.1346679 1.1825109
Gephyromantis spiniferus 34.30883 42.1018165 0.1337423 1.6182287
Gephyromantis cornutus 33.50278 39.1076784 0.1342327 1.5515885
Gephyromantis tschenki 34.02949 37.6510606 0.1347823 1.4597015
Gephyromantis redimitus 33.99142 40.0604852 0.1359301 1.5382619
Gephyromantis granulatus 34.19031 37.1653185 0.1365775 1.3925261
Gephyromantis moseri 34.03625 35.3342509 0.1341706 1.3532881
Gephyromantis leucomaculatus 34.14442 35.5544092 0.1357843 1.3391123
Gephyromantis zavona 33.58406 32.4633388 0.1335833 1.2100552
Gephyromantis salegy 34.09330 35.0445412 0.1338625 1.3152886
Gephyromantis schilfi 34.00196 34.6257679 0.1350030 1.2895591
Gephyromantis tandroka 33.58216 33.1136373 0.1340923 1.2413554
Gephyromantis luteus 34.27442 37.1948302 0.1344481 1.4325199
Gephyromantis sculpturatus 34.32264 36.3899797 0.1330565 1.4225320
Gephyromantis plicifer 34.00912 34.9796505 0.1356264 1.3470014
Mantidactylus aerumnalis 34.20646 36.2351846 0.1351758 1.4062689
Mantidactylus albofrenatus 33.56801 35.1420010 0.1357779 1.4108255
Mantidactylus brevipalmatus 33.56565 38.5534333 0.1350136 1.4878144
Mantidactylus delormei 33.65246 36.0594471 0.1331606 1.3748473
Mantidactylus paidroa 33.62583 33.2821313 0.1309444 1.2851184
Mantidactylus alutus 34.33717 37.4036551 0.1367543 1.4484701
Mantidactylus curtus 33.55380 40.0025550 0.1338267 1.5201414
Mantidactylus madecassus 33.62834 39.3632699 0.1352063 1.5113206
Mantidactylus pauliani 33.58380 35.0716629 0.1361633 1.3991732
Mantidactylus bellyi 33.56414 42.2556622 0.1332361 1.5815824
Mantidactylus ulcerosus 33.53829 36.4278942 0.1347924 1.3729053
Mantidactylus betsileanus 33.55022 41.1804098 0.1339119 1.5709119
Mantidactylus noralottae 34.02794 36.0873812 0.1360314 1.3781139
Mantidactylus ambohimitombi 33.67438 32.6715781 0.1345807 1.2739447
Mantidactylus ambreensis 33.61719 39.0962875 0.1350499 1.4639378
Mantidactylus femoralis 33.50601 36.5425589 0.1367609 1.3953814
Mantidactylus zolitschka 33.56451 40.1238617 0.1359249 1.6095425
Mantidactylus mocquardi 33.51014 39.6624523 0.1388057 1.5220648
Mantidactylus biporus 33.64820 37.1399010 0.1323105 1.4249316
Mantidactylus bourgati 33.59725 37.0357471 0.1365414 1.4248153
Mantidactylus charlotteae 33.63082 38.4699491 0.1337205 1.4863225
Mantidactylus opiparis 33.55528 38.6968745 0.1358116 1.4791247
Mantidactylus melanopleura 33.52597 39.7596543 0.1354068 1.5309768
Mantidactylus zipperi 33.62946 40.1211153 0.1350144 1.5648265
Mantidactylus lugubris 33.60169 34.7079673 0.1349328 1.3370649
Mantidactylus tricinctus 33.57395 40.9118440 0.1346862 1.5814150
Mantidactylus majori 33.59785 38.3543017 0.1353503 1.4875496
Mantidactylus argenteus 34.08681 32.2897188 0.1319842 1.2486756
Mantidactylus cowanii 33.63801 39.0745812 0.1325754 1.5295839
Mantidactylus grandidieri 33.55878 36.3214311 0.1343737 1.4022044
Mantidactylus guttulatus 33.57074 35.1740986 0.1363710 1.3454306
Spinomantis aglavei 33.68267 36.5159729 0.1323347 1.4065561
Spinomantis fimbriatus 34.12157 35.7744988 0.1333992 1.3722590
Spinomantis tavaratra 34.08525 31.0912842 0.1332289 1.1556551
Spinomantis phantasticus 33.69033 37.9419334 0.1360104 1.4474296
Spinomantis bertini 33.72554 35.4064425 0.1343952 1.3657610
Spinomantis guibei 33.67211 43.3145221 0.1361180 1.6868688
Spinomantis microtis 33.66020 39.5837116 0.1339489 1.5354941
Spinomantis brunae 33.65240 43.7996976 0.1339881 1.7076971
Spinomantis elegans 33.74601 39.7176563 0.1336128 1.5282744
Spinomantis peraccae 34.02520 35.9703421 0.1357367 1.3769420
Spinomantis massi 34.14283 31.9997567 0.1361332 1.1968339
Tsingymantis antitra 34.32781 39.6708299 0.1348581 1.4707729
Laliostoma labrosum 34.29460 36.0655586 0.1347566 1.3591491
Aglyptodactylus securifer 34.26081 40.7942148 0.1346237 1.5174793
Aglyptodactylus laticeps 34.23987 43.2735997 0.1335303 1.6098148
Aglyptodactylus madagascariensis 34.26118 41.0900700 0.1336204 1.5891644
Oreobates gemcare 27.18024 2.9400451 0.1326552 0.2002437
Oreobates granulosus 30.08670 5.8639713 0.1394010 0.3568929
Pristimantis pharangobates 26.77105 9.0765376 0.1370976 0.4712096
Dryophytes walkeri 36.25684 11.0801553 0.1290336 0.4251331
Dendropsophus molitor 35.94550 6.5445313 0.1114455 0.2843902
Paramesotriton labiatus 33.29464 13.7005921 0.1384989 0.4894372
Hyloxalus italoi 33.54766 15.1925930 0.1376286 0.6148015
Polypedates braueri 35.69335 4.4672186 0.1396728 0.1748780
Hynobius fucus 29.53878 16.7055366 0.1387388 0.6095587
Cynops orientalis 34.43684 5.4331496 0.1463195 0.1994169
Cophixalus australis 32.31767 19.6651206 0.1467242 0.7645302
Chalcorana labialis 32.96300 21.5367799 0.1317188 0.7552998
Kalophrynus limbooliati 32.94849 27.0779766 0.1411581 0.9369931
Pristimantis matidiktyo 33.79371 15.3999838 0.1477094 0.6131096
Pristimantis festae 30.38937 5.4975168 0.1405368 0.2732094
# Summary statistics
summary(species_ARR$slope)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.04859 0.13112 0.13464 0.13440 0.13813 0.21569
species_ARR %>%
    summarise(ARR = mean(slope), sd = sd(slope))
##         ARR          sd
## 1 0.1344049 0.008228308
# Figure
ggplot(species_ARR) + geom_density(aes(slope), fill = "#CE5B97", alpha = 1) + xlab("Acclimation Response Ratio (ARR)") +
    ylab("Number of species") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))

ggsave(file = "fig/Figure_S3.png", width = 20, height = 15, dpi = 500)

Identity of overheating species

# Return a list of species predicted to overheat
sp_overheating <- pop_sub_future4C %>%
    group_by(tip.label) %>%
    filter(overheating_risk > 0) %>%
    summarise(overheating_days = mean(overheating_days))

# Identify whether overheating species were studied previously

## Load training data used for the imputation
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")

# Filter to experimental data
training_data <- filter(training_data, imputed == "no")

# Identify if the overheating species were in the original dataset
sp_overheating <- sp_overheating %>%
    mutate(previously_studied = ifelse(tip.label %in% training_data$tip.label, "yes",
        "no"))

# Display data
kable(sp_overheating, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label overheating_days previously_studied
Adelphobates castaneoticus 1.331726 no
Adelphobates galactonotus 2.653211 no
Adelphobates quinquevittatus 2.487621 no
Adenomera andreae 1.476255 yes
Adenomera diptyx 1.589523 no
Adenomera hylaedactyla 1.813473 no
Allobates brunneus 1.479895 no
Allobates conspicuus 1.584121 yes
Allobates crombiei 1.346467 no
Allobates fuscellus 1.577168 no
Allobates gasconi 1.034722 no
Allobates marchesianus 1.446721 no
Allobates subfolionidificans 3.063564 no
Allobates trilineatus 2.576257 yes
Allophryne ruthveni 1.013036 no
Amazophrynella minuta 1.000702 no
Ambystoma mavortium 1.157669 yes
Ambystoma texanum 1.074166 no
Ameerega braccata 1.282663 no
Ameerega flavopicta 1.205529 no
Ameerega picta 1.711742 no
Amolops compotrix 1.375637 no
Amphiuma means 1.658379 no
Amphiuma pholeter 1.096859 no
Amphiuma tridactylum 1.237851 yes
Andrias davidianus 1.232301 no
Aneides aeneus 5.695831 yes
Aneides hardii 2.196203 no
Anomaloglossus degranvillei 1.022415 no
Ascaphus montanus 3.160715 no
Ascaphus truei 2.648305 yes
Atelopus spumarius 1.083059 yes
Austrochaperina adelphe 4.328498 no
Austrochaperina gracilipes 1.651183 no
Austrochaperina palmipes 1.832494 no
Barycholos pulcher 13.427604 no
Barycholos ternetzi 69.276214 no
Boana albopunctata 1.935578 yes
Boana boans 1.042691 yes
Boana curupi 1.013235 yes
Boana fasciata 1.302430 yes
Boana pulchella 1.426624 yes
Bolitoglossa alberchi 1.256514 no
Bolitoglossa altamazonica 4.623826 no
Bolitoglossa hartwegi 1.877880 no
Bolitoglossa mexicana 1.839333 no
Bolitoglossa occidentalis 1.460407 no
Bolitoglossa paraensis 1.324701 no
Bolitoglossa platydactyla 1.139128 no
Bolitoglossa rostrata 2.249686 no
Bolitoglossa rufescens 1.822126 no
Bolitoglossa veracrucis 1.401811 no
Bolitoglossa yucatana 4.900477 no
Bradytriton silus 1.991500 no
Bufo bufo 2.417129 yes
Bufotes boulengeri 2.098399 yes
Bufotes luristanicus 6.747333 no
Bufotes surdus 15.528455 no
Bufotes variabilis 5.008294 no
Ceratophrys cornuta 1.106527 no
Chiasmocleis albopunctata 1.633212 no
Cophixalus aenigma 17.599878 yes
Cophixalus concinnus 7.306129 yes
Cophixalus monticola 1.387947 yes
Craugastor augusti 2.285813 no
Craugastor loki 1.194720 yes
Craugastor palenque 1.163104 no
Craugastor tarahumaraensis 3.257659 no
Crinia bilingua 2.384508 no
Crinia deserticola 1.829380 no
Crinia pseudinsignifera 1.006397 no
Crinia remota 1.991712 no
Crossodactylus schmidti 2.786193 yes
Cryptobranchus alleganiensis 1.426452 yes
Cryptotriton alvarezdeltoroi 1.828001 no
Cyclorana vagitus 1.184105 no
Dendrobates leucomelas 1.477984 no
Dendrobates tinctorius 1.702112 no
Dendropsophus acreanus 1.635752 no
Dendropsophus melanargyreus 1.124785 no
Dendropsophus minutus 1.847820 yes
Dendropsophus nanus 1.659602 no
Dendropsophus rubicundulus 1.718883 no
Dendropsophus schubarti 1.014800 yes
Dendropsophus tritaeniatus 1.999748 no
Desmognathus abditus 1.017217 no
Desmognathus aeneus 7.418641 no
Desmognathus apalachicolae 2.536264 no
Desmognathus auriculatus 1.335424 no
Desmognathus brimleyorum 4.323020 yes
Desmognathus carolinensis 1.002789 yes
Desmognathus folkertsi 1.441581 no
Desmognathus fuscus 1.647850 yes
Desmognathus marmoratus 1.765940 no
Desmognathus monticola 3.692913 yes
Desmognathus ochrophaeus 1.344759 yes
Desmognathus ocoee 3.162387 yes
Desmognathus quadramaculatus 3.089325 yes
Desmognathus wrighti 1.694690 no
Dicamptodon aterrimus 6.337150 no
Dicamptodon tenebrosus 5.099773 yes
Discoglossus galganoi 1.149753 yes
Discoglossus pictus 3.839415 yes
Discoglossus scovazzi 3.556542 yes
Duttaphrynus stomaticus 1.118469 no
Elachistocleis ovalis 1.129576 no
Ensatina eschscholtzii 1.098729 yes
Euparkerella brasiliensis 7.380927 no
Euparkerella cochranae 7.560558 no
Eurycea cirrigera 1.362908 no
Eurycea guttolineata 1.233125 no
Eurycea longicauda 1.738471 yes
Eurycea lucifuga 1.761298 yes
Eurycea quadridigitata 1.035942 yes
Geobatrachus walkeri 6.353011 no
Gyrinophilus porphyriticus 4.533337 yes
Haddadus binotatus 1.581247 no
Hamptophryne boliviana 1.313814 yes
Heleioporus albopunctatus 1.017152 no
Heleioporus psammophilus 1.032387 no
Hemidactylium scutatum 1.492399 yes
Hemiphractus scutatus 1.354140 no
Hemisus guineensis 2.293496 no
Hemisus marmoratus 2.435910 no
Hildebrandtia ornata 2.447793 no
Holoaden bradei 13.608913 no
Holoaden luederwaldti 6.581455 no
Holoaden pholeter 10.740588 no
Hoplobatrachus occipitalis 1.062619 no
Hyalinobatrachium cappellei 1.508875 no
Hyalinobatrachium iaspidiense 1.323588 no
Hydrolaetare schmidti 1.326707 no
Hyla meridionalis 5.071485 yes
Hyla savignyi 5.363118 no
Hylarana erythraea 2.078765 yes
Hylarana tytleri 1.066961 no
Hyloxalus littoralis 1.556655 no
Hynobius amjiensis 12.695057 no
Hynobius guabangshanensis 2.663397 no
Hynobius yiwuensis 5.222396 no
Ischnocnema guentheri 1.076585 no
Ischnocnema juipoca 1.407624 no
Ischnocnema nasuta 1.394687 no
Ixalotriton parvus 1.427332 no
Kalophrynus interlineatus 1.032133 no
Kassina senegalensis 1.128485 no
Kurixalus baliogaster 1.032591 no
Leptodactylus bolivianus 2.038849 yes
Leptodactylus chaquensis 1.250766 no
Leptodactylus elenae 1.662158 no
Leptodactylus labyrinthicus 1.152348 no
Leptodactylus leptodactyloides 1.432079 yes
Leptodactylus mystaceus 1.828486 no
Leptodactylus syphax 1.381226 no
Leptopelis bufonides 1.393931 no
Leptopelis viridis 2.677689 no
Limnodynastes convexiusculus 2.243918 no
Limnodynastes depressus 4.051300 no
Limnodynastes dorsalis 1.000018 yes
Limnodynastes fletcheri 3.453354 yes
Limnodynastes lignarius 2.544430 no
Limnodynastes tasmaniensis 1.733422 yes
Lithobates catesbeianus 1.287967 yes
Lithobates clamitans 1.234238 yes
Lithobates palmipes 1.490301 yes
Lithobates palustris 10.138647 yes
Lithobates sylvaticus 1.927050 yes
Lithodytes lineatus 1.445530 yes
Litoria caerulea 1.428783 yes
Litoria coplandi 1.858656 no
Litoria dahlii 1.309442 no
Litoria inermis 2.026817 no
Litoria latopalmata 1.452543 no
Litoria meiriana 1.756409 no
Litoria microbelos 1.922523 no
Litoria nasuta 2.357258 yes
Litoria pallida 2.062274 no
Litoria personata 1.940655 no
Litoria rothii 1.598491 yes
Litoria splendida 1.330801 no
Litoria tornieri 2.220073 no
Litoria watjulumensis 1.725043 no
Liua shihi 2.199425 no
Lyciasalamandra antalyana 3.204503 no
Lyciasalamandra atifi 21.811932 no
Lyciasalamandra luschani 5.764057 no
Melanophryniscus klappenbachi 1.389241 no
Mixophyes balbus 1.707620 no
Mixophyes carbinensis 4.010866 no
Mixophyes coggeri 2.005359 no
Mixophyes fasciolatus 1.943606 yes
Mixophyes iteratus 1.770930 no
Mixophyes schevilli 4.517787 no
Neobatrachus albipes 1.445296 no
Neobatrachus aquilonius 5.145644 no
Neobatrachus fulvus 1.748348 no
Neobatrachus kunapalari 1.383805 no
Neobatrachus pelobatoides 1.928492 no
Neobatrachus pictus 2.309000 yes
Neobatrachus sudelli 2.178646 yes
Neobatrachus sutor 2.159647 no
Neobatrachus wilsmorei 1.606960 no
Neurergus crocatus 1.276431 no
Neurergus kaiseri 74.430061 no
Noblella lochites 2.548177 no
Noblella myrmecoides 63.385401 yes
Notaden bennettii 2.718532 no
Notaden melanoscaphus 3.095176 no
Notaden nichollsi 2.072915 no
Odontophrynus lavillai 1.307316 no
Odorrana absita 1.404542 no
Odorrana banaorum 2.613998 no
Odorrana bolavensis 2.895646 no
Odorrana chloronota 2.026089 no
Odorrana exiliversabilis 1.813434 no
Odorrana gigatympana 1.897480 no
Odorrana khalam 2.249571 no
Odorrana morafkai 2.448698 no
Odorrana schmackeri 1.646018 no
Odorrana tormota 1.567071 no
Oedipina elongata 2.420335 no
Oophaga pumilio 3.674345 yes
Oreobates crepitans 11.995133 no
Oreobates heterodactylus 16.802539 no
Oreobates quixensis 1.252196 yes
Pachyhynobius shangchengensis 13.101708 no
Paramesotriton chinensis 1.095738 yes
Pelodytes ibericus 2.684227 yes
Pelodytes punctatus 2.330505 yes
Pelophylax bedriagae 12.288878 no
Pelophylax ridibundus 9.515201 no
Pelophylax saharicus 4.251406 yes
Phaeognathus hubrichti 11.110938 no
Philautus abditus 1.633884 no
Phrynobatrachus francisci 1.169150 no
Phrynobatrachus latifrons 4.376321 no
Phrynobatrachus natalensis 2.287181 no
Phrynomantis microps 4.941136 no
Phyllomedusa vaillantii 1.000307 yes
Physalaemus albonotatus 1.027794 yes
Physalaemus biligonigerus 1.541520 no
Physalaemus centralis 1.746665 no
Physalaemus cuvieri 1.820027 yes
Phyzelaphryne miriamae 1.719845 no
Pipa pipa 1.867824 no
Platyplectrum spenceri 1.316863 no
Plethodon albagula 6.944689 no
Plethodon angusticlavius 11.715994 no
Plethodon caddoensis 3.460685 yes
Plethodon cylindraceus 1.912407 yes
Plethodon dorsalis 9.016353 yes
Plethodon electromorphus 1.082588 no
Plethodon fourchensis 11.698422 no
Plethodon glutinosus 3.228969 yes
Plethodon hoffmani 1.136886 no
Plethodon kentucki 1.183375 no
Plethodon kiamichi 12.561662 no
Plethodon kisatchie 7.558786 no
Plethodon meridianus 1.141825 no
Plethodon metcalfi 1.305740 no
Plethodon montanus 1.493882 yes
Plethodon ouachitae 6.951801 yes
Plethodon punctatus 1.282301 yes
Plethodon sequoyah 13.388303 no
Plethodon serratus 6.034191 yes
Plethodon ventralis 12.416570 no
Plethodon virginia 1.105922 yes
Plethodon websteri 6.498700 no
Plethodon wehrlei 1.064428 yes
Plethodon welleri 1.547475 no
Pleurodeles waltl 1.366367 yes
Polypedates maculatus 1.397946 no
Pristimantis aaptus 4.357656 no
Pristimantis altamazonicus 8.535277 no
Pristimantis aureolineatus 6.212337 no
Pristimantis carmelitae 1.264909 no
Pristimantis carvalhoi 21.190875 yes
Pristimantis chiastonotus 3.239237 no
Pristimantis conspicillatus 1.829450 yes
Pristimantis cristinae 1.744426 no
Pristimantis croceoinguinis 4.437011 no
Pristimantis cuentasi 2.322960 no
Pristimantis delicatus 1.674408 no
Pristimantis diadematus 5.393396 no
Pristimantis dundeei 13.568224 no
Pristimantis eurydactylus 10.678542 no
Pristimantis fasciatus 2.698440 no
Pristimantis fenestratus 4.413487 yes
Pristimantis gaigei 3.908528 no
Pristimantis gutturalis 3.318569 no
Pristimantis inguinalis 4.041425 no
Pristimantis insignitus 1.181215 no
Pristimantis kareliae 1.771033 no
Pristimantis lacrimosus 4.174917 no
Pristimantis lanthanites 4.365206 no
Pristimantis lythrodes 4.499982 no
Pristimantis malkini 4.262287 no
Pristimantis marmoratus 3.857256 no
Pristimantis martiae 9.464643 no
Pristimantis megalops 1.094705 no
Pristimantis ockendeni 59.045692 yes
Pristimantis orcus 5.389253 no
Pristimantis orphnolaimus 5.987749 no
Pristimantis paramerus 1.088396 no
Pristimantis pedimontanus 1.050806 no
Pristimantis penelopus 4.068818 no
Pristimantis peruvianus 9.001511 no
Pristimantis pharangobates 2.869022 yes
Pristimantis phoxocephalus 1.561697 yes
Pristimantis pseudoacuminatus 5.332077 no
Pristimantis rivasi 3.835742 no
Pristimantis ruthveni 1.099069 no
Pristimantis sanctaemartae 1.598943 no
Pristimantis skydmainos 7.622426 no
Pristimantis tayrona 1.466375 no
Pristimantis toftae 5.652714 yes
Pristimantis tubernasus 1.216822 no
Pristimantis turik 4.749128 no
Pristimantis variabilis 13.382752 no
Pristimantis ventrimarmoratus 6.109769 no
Pristimantis vertebralis 7.522321 yes
Pristimantis vilarsi 4.257651 no
Pristimantis yustizi 1.169627 no
Pristimantis zeuctotylus 2.995230 no
Pristimantis zimmermanae 2.919899 no
Pseudohynobius flavomaculatus 1.617805 no
Pseudopaludicola boliviana 1.271592 no
Pseudopaludicola mystacalis 1.217528 no
Pseudophryne guentheri 1.050981 no
Pseudotriton montanus 1.713707 yes
Pseudotriton ruber 3.131363 yes
Ptychadena bibroni 5.696183 no
Ptychadena mascareniensis 1.643866 no
Ptychadena nilotica 2.141543 no
Ptychadena oxyrhynchus 1.881074 no
Ptychadena pumilio 3.898629 no
Ptychadena schillukorum 5.333008 no
Ptychadena tellinii 4.480989 no
Ptychadena trinodis 6.073547 no
Pyxicephalus edulis 3.865562 no
Rana arvalis 1.012366 yes
Rana chensinensis 2.580704 yes
Rana dalmatina 1.771325 no
Rana dybowskii 5.002942 yes
Rana graeca 1.618548 no
Rana huanrensis 1.345701 no
Rana iberica 2.146867 yes
Rana italica 2.905115 no
Rana johnsi 1.786053 no
Rana macrocnemis 2.348911 no
Rana ornativentris 1.233939 no
Rana pseudodalmatina 3.671341 no
Rana tavasensis 3.501609 no
Rana zhenhaiensis 1.517115 no
Ranitomeya ventrimaculata 1.582316 no
Rhaebo guttatus 1.699722 no
Rhinella margaritifera 2.209977 yes
Rhyacotriton cascadae 3.833673 no
Rhyacotriton kezeri 3.826069 no
Rhyacotriton olympicus 1.375881 yes
Rhyacotriton variegatus 14.075879 yes
Salamandra infraimmaculata 6.586722 no
Salamandra salamandra 4.020116 yes
Scaphiopus holbrookii 2.854943 yes
Scaphiopus hurterii 1.737107 no
Spea bombifrons 1.286498 no
Spea multiplicata 1.895247 no
Strabomantis anomalus 2.429292 no
Strabomantis biporcatus 3.639925 no
Strabomantis bufoniformis 8.497761 no
Strabomantis sulcatus 28.347202 no
Teratohyla adenocheira 1.717075 no
Teratohyla midas 1.466248 no
Tomopterna cryptotis 3.987576 no
Triturus pygmaeus 1.080501 yes
Uperoleia arenicola 4.432716 no
Uperoleia aspera 3.039199 no
Uperoleia borealis 2.886874 no
Uperoleia inundata 2.853900 no
Uperoleia lithomoda 2.856264 no
Uperoleia micromeles 2.561785 no
Uperoleia mimula 1.185296 no
Uperoleia minima 1.363201 no
Uperoleia mjobergii 4.155718 no
Uperoleia orientalis 2.250057 no
Uperoleia rugosa 2.182497 yes
Uperoleia talpa 3.198082 no
Uperoleia trachyderma 2.756491 no
Xenopus laevis 1.000000 yes
Xenopus muelleri 1.472585 no
Xenopus tropicalis 4.952321 no
sp_overheating$previously_studied = as.factor(sp_overheating$previously_studied)

summary(sp_overheating)
##   tip.label         overheating_days previously_studied
##  Length:391         Min.   : 1.000   no :288           
##  Class :character   1st Qu.: 1.389   yes:103           
##  Mode  :character   Median : 1.927                     
##                     Mean   : 3.950                     
##                     3rd Qu.: 3.904                     
##                     Max.   :74.430
# 73.66% (288/391) of the species identified with a positive overheating risk
# were not assessed experimentally.

ggplot(sp_overheating, aes(x = previously_studied, y = log(overheating_days), col = previously_studied,
    fill = previously_studied)) + stat_halfeye(adjust = 1, justification = -0.5,
    .width = 0, point_colour = NA, alpha = 0.5, width = 0.5) + geom_jitter(width = 0.15,
    alpha = 0.85) + geom_boxplot(width = 0.4, outlier.color = NA, alpha = 0.9, color = "black",
    lwd = 1.15, notch = TRUE, fill = NA) + theme_classic() + ylab("Overheating days (log scale)") +
    xlab("Experimentally assessed in previous studies") + theme(axis.title.x = element_text(size = 20,
    vjust = -0.2), axis.title.y = element_text(size = 20, hjust = 0.5), axis.text.y = element_text(size = 15),
    axis.text.x = element_text(size = 15), panel.border = element_rect(fill = NA,
        size = 2))

Figure A1: Mean number of predicted overheating days in terrestrial conditions for species that were assessed experimentally previously (blue), or were fully imputed (pink).

Performance of the imputation

# Load data that was used for the imputation
data_for_imp <- readRDS("RData/General_data/pre_data_for_imputation.rds")

# Load datasets from the cross-validation
first_crossV <- readRDS(file = "Rdata/Imputation/results/1st_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "1")
second_crossV <- readRDS(file = "Rdata/Imputation/results/2nd_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "2")
third_crossV <- readRDS(file = "Rdata/Imputation/results/3rd_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "3")
fourth_crossV <- readRDS(file = "Rdata/Imputation/results/4th_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "4")
fifth_crossV <- readRDS(file = "Rdata/Imputation/results/5th_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "5")

all_imputed_dat <- bind_rows(first_crossV, second_crossV, third_crossV, fourth_crossV,
    fifth_crossV)

# Filter to data that was used for the cross-validation
imp_data <- all_imputed_dat[all_imputed_dat$dat_to_validate == "yes", ]
imp_data <- dplyr::filter(imp_data, is.na(tip.label) == FALSE)

# Add row number
row_n_imp <- data.frame(row_n = imp_data$row_n)

# Filter to original data
original_data <- data_for_imp[data_for_imp$row_n %in% row_n_imp$row_n, ]
original_data <- dplyr:::select(original_data, row_n, mean_UTL)

# Combine dataframes
data <- dplyr::left_join(original_data, imp_data, by = "row_n")
data <- rename(data, original_CTmax = mean_UTL.x, imputed_CTmax = filled_mean_UTL5)

# Remove observations that were cross-validated twice
duplicates <- data %>%
    group_by(row_n) %>%
    summarise(n = n()) %>%
    filter(n > 1)
duplicates <- duplicates$row_n

data <- data[!(data$row_n %in% duplicates & data$crossV == "5"), ]


data %>%
    summarise(mean = mean(original_CTmax), sd = sd(original_CTmax), n = n())
##       mean       sd   n
## 1 36.18638 2.669832 375
data %>%
    summarise(mean = mean(imputed_CTmax), sd = sd(imputed_CTmax), n = n())
##       mean       sd   n
## 1 35.93433 2.543695 375
ggplot(data) + geom_point(aes(x = acclimation_temp, y = original_CTmax), fill = "orange",
    col = "black", shape = 21, size = 4, alpha = 0.75) + geom_point(aes(x = acclimation_temp,
    y = imputed_CTmax), fill = "#2A788EFF", col = "black", shape = 21, size = 4,
    alpha = 0.75) + geom_smooth(aes(x = acclimation_temp, y = original_CTmax), col = "orange",
    fill = "orange", method = "lm", linewidth = 2) + geom_smooth(aes(x = acclimation_temp,
    y = imputed_CTmax), col = "#2A788EFF", fill = "#2A788EFF", method = "lm", linewidth = 2) +
    theme_classic() + xlab("Acclimation temperature") + ylab("CTmax") + theme(axis.title = element_text(size = 20))

Figure A2: Relationship between acclimation temperature and CTmax in the original (orange) and imputed (blue) cross-validated data.

Statistical analyses

Thermal safety margin

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_TSM.R and the resources used in pbs/Models/Running_models_TSM.pbs

Population-level patterns

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in TSM using generalized additive models. These models do not account for the phylogenetic relatedness between species, yet they are better at capturing non-linear patterns in TSM with latitude. While we could have fitted models with smooth terms using brms or stan, these models exceeded our computational capacities.

Run the models
# Function to run population-level TSM models in parallel
run_TSM_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(TSM ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$TSM_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        TSM = NA, TSM_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/summary_GAM_pop_lat_TSM_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/summary_MER_pop_lat_TSM_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/predictions_pop_lat_TSM_",
        habitat_scenario, ".rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 888487.8"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-9.2085 -0.6128 -0.2328  0.1271 24.8399 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.535  1.592  "                          
## [12] " genus         (Intercept)    7.623  2.761  "                          
## [13] " Xr            s(lat)      1070.894 32.725  "                          
## [14] " Residual                     8.463  2.909  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  13.1341     0.1375   95.53"                              
## [20] "Xs(lat)Fx1    -5.3406     0.4064  -13.14"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2878eaf8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.1341     0.1375   95.53   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.992  8.992 3593  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0236   "                                       
## [22] "lmer.REML = 8.8849e+05  Scale est. = 8.4635    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 920244.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "   Min     1Q Median     3Q    Max "                                   
##  [7] "-9.362 -0.612 -0.253  0.101 36.701 "                                   
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.445   1.564  "                          
## [12] " genus         (Intercept)   7.718   2.778  "                          
## [13] " Xr            s(lat)      866.391  29.435  "                          
## [14] " Residual                    8.185   2.861  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.5492     0.1383   90.74"                              
## [20] "Xs(lat)Fx1    -5.8871     0.4195  -14.03"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xd3a3d00>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.5492     0.1383   90.74   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3335  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.044   "                                       
## [22] "lmer.REML = 9.2024e+05  Scale est. = 8.1851    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 942290.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-10.5351  -0.6048  -0.2555   0.1243  24.3450 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.193   1.481  "                          
## [12] " genus         (Intercept)   7.323   2.706  "                          
## [13] " Xr            s(lat)      772.140  27.787  "                          
## [14] " Residual                    6.888   2.625  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  11.2144     0.1347   83.23"                              
## [20] "Xs(lat)Fx1    -7.5650     0.4102  -18.44"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xfd55718>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.2144     0.1347   83.23   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.989  8.989 3850  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.131   "                                       
## [22] "lmer.REML = 9.4229e+05  Scale est. = 6.8884    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 997734.8"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.5555  -0.5943  -0.2436   0.0649  27.6299 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.941  2.223  "                          
## [12] " genus         (Intercept)   11.247  3.354  "                          
## [13] " Xr            s(lat)      1552.192 39.398  "                          
## [14] " Residual                     9.776  3.127  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  15.6645     0.1690   92.66"                              
## [20] "Xs(lat)Fx1    -5.5015     0.4669  -11.78"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xdac67c8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   15.665      0.169   92.66   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3694  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.027   "                                        
## [22] "lmer.REML = 9.9773e+05  Scale est. = 9.776     n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1004856"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.4875  -0.5365  -0.1943   0.1022  29.4208 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.378  2.092  "                          
## [12] " genus         (Intercept)   10.381  3.222  "                          
## [13] " Xr            s(lat)      1714.903 41.411  "                          
## [14] " Residual                     8.695  2.949  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  14.7083     0.1623   90.61"                              
## [20] "Xs(lat)Fx1    -7.0912     0.4605  -15.40"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xfd4fc58>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  14.7083     0.1623   90.61   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4156  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0333   "                                       
## [22] "lmer.REML = 1.0049e+06  Scale est. = 8.6948    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 969628.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.5919  -0.4160  -0.0516   0.2807  29.0071 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.491  1.868  "                          
## [12] " genus         (Intercept)    8.144  2.854  "                          
## [13] " Xr            s(lat)      1764.336 42.004  "                          
## [14] " Residual                     8.341  2.888  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.9019     0.1442   89.45"                              
## [20] "Xs(lat)Fx1    -9.9258     0.4635  -21.42"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2879d310>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.9019     0.1442   89.45   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4134  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0884   "                                       
## [22] "lmer.REML = 9.6963e+05  Scale est. = 8.3408    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 228674.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-4.7098 -0.6323 -0.2156  0.1481 19.7636 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    2.104  1.450  "                         
## [12] " genus         (Intercept)    5.826  2.414  "                         
## [13] " Xr            s(lat)      3348.846 57.869  "                         
## [14] " Residual                     7.995  2.828  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  13.0576     0.2013  64.866"                             
## [20] "Xs(lat)Fx1     8.2292     0.8370   9.832"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x308f27e8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.0576     0.2013   64.87   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.981  8.981 1181  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.00786   "                                     
## [22] "lmer.REML = 2.2867e+05  Scale est. = 7.9952    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 230078.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-5.8711 -0.6573 -0.2430  0.1439 18.4365 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.969  1.403  "                         
## [12] " genus         (Intercept)    5.687  2.385  "                         
## [13] " Xr            s(lat)      3502.945 59.186  "                         
## [14] " Residual                     6.540  2.557  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  12.4496     0.1986   62.69"                             
## [20] "Xs(lat)Fx1     9.1879     0.8023   11.45"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x6273c480>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.4496     0.1986   62.69   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.983  8.983 1179  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0374   "                                      
## [22] "lmer.REML = 2.3008e+05  Scale est. = 6.5404    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_pop_lat_TSM_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 242333.5"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.3572 -0.6655 -0.2737  0.1364 17.2196 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.882  1.372  "                         
## [12] " genus         (Intercept)    5.392  2.322  "                         
## [13] " Xr            s(lat)      2880.198 53.667  "                         
## [14] " Residual                     5.618  2.370  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  11.2578     0.1946  57.844"                             
## [20] "Xs(lat)Fx1     7.1035     0.8119   8.749"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_pop_lat_TSM_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x3087b018>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.2578     0.1946   57.84   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.978  8.978 1002  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0877   "                                      
## [22] "lmer.REML = 2.4233e+05  Scale est. = 5.6184    n = 56210"
Visualize the results
# Find limits for colours of the plot
tsm_min <- min(min(pop_sub_current$TSM, na.rm = TRUE), min(pop_sub_future4C$TSM,
    na.rm = TRUE), min(pop_arb_current$TSM, na.rm = TRUE), min(pop_arb_future4C$TSM,
    na.rm = TRUE), min(pop_pond_current$TSM, na.rm = TRUE), min(pop_pond_future4C$TSM,
    na.rm = TRUE))

tsm_max <- max(max(pop_sub_current$TSM, na.rm = TRUE), max(pop_sub_future4C$TSM,
    na.rm = TRUE), max(pop_arb_current$TSM, na.rm = TRUE), max(pop_arb_future4C$TSM,
    na.rm = TRUE), max(pop_pond_current$TSM, na.rm = TRUE), max(pop_pond_future4C$TSM,
    na.rm = TRUE))
Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_future4C.rds")


pop_TSM_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = TSM),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = TSM), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_sub_current, aes(x = lat, y = TSM), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("TSM") + ylim(0, tsm_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_TSM_sub

Figure A3: Latitudinal variation in thermal safety margin for amphibians on terrestrial conditions. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015. Blue ribbons and points depict TSM in current microclimates. Orange ribbons and points depict TSM in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict TSM in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Pond or wetland
# Load model predictions
pred_pond_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_future4C.rds")


pop_TSM_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat, y = TSM),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = TSM), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_pond_current, aes(x = lat, y = TSM), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_pond_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("TSM") + ylim(0, tsm_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_TSM_pond

Figure A4: Latitudinal variation in thermal safety margin for amphibians in ponds or wetlands. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015. Blue ribbons and points depict TSM in current microclimates. Orange ribbons and points depict TSM in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict TSM in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_future4C.rds")


pop_TSM_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = TSM),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = TSM), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_arb_current, aes(x = lat, y = TSM), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Thermal safety margin") + ylim(0, tsm_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_TSM_arb

Figure A5: Latitudinal variation in thermal safety margin for amphibians in above-ground vegetation. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015. Blue ribbons and points depict TSM in current microclimates. Orange ribbons and points depict TSM in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict TSM in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

All habitats
all_habitats <- (pop_TSM_sub/pop_TSM_pond/pop_TSM_arb/plot_layout(ncol = 1))

all_habitats

Figure A6: Latitudinal variation in thermal safety margin for amphibians on terrestrial conditions (top panel), in water bodies (middle panel) or in above-ground vegetation (bottom panel). Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015. Blue ribbons and points depict TSM in current microclimates. Orange ribbons and points depict TSM in future climates with 2 degrees Celsius above preindustrial levels. Red ribbons and points depict TSM in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean thermal safety margin in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
# Run analyses with MCMCglmm to estimate mean TSM in each microhabitat and scenario

# Combine datasets
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

# Duplicate tip.label column values
all_data$species <- all_data$tip.label 

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

# Force the tree to be ultrametric
tree <- force.ultrametric(tree, method="extend") 

Ainv<-inverseA(tree)$Ainv

# Convert tibble to dataframe (needed for MCMCglmm)
all_data <- as.data.frame(all_data)

# Set prior
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(TSM ~ habitat_scenario - 1, # No intercept
                random = ~ species + tip.label + idh(TSM_se):units, # Genus, species, phylogenetic relatedness, and weights
                ginverse=list(tip.label = Ainv),
                singular.ok=TRUE,
                prior = prior,
                verbose=FALSE,
                data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/TSM/model_MCMCglmm_TSM.rds")
saveRDS(predictions, file = "RData/Models/TSM/predictions_MCMCglmm_TSM.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(TSM ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                       random = ~ species + tip.label + idh(TSM_se):units, 
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/TSM/model_MCMCglmm_TSM_contrast.rds")
Subset of overheating populations

Here, we only focus on the populations that are predicted to overheat.

# Reload dataset without pond data
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C")
)

# Filter to populations predicted to overheat
all_data$habitat_scenario <- as.character(all_data$habitat_scenario)
all_data$species <- all_data$tip.label
all_data <- filter(all_data, overheating_risk > 0)

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv

all_data <- as.data.frame(all_data)

# Run model
model_TSM <- MCMCglmm(TSM ~ habitat_scenario - 1, # No intercept
                      random = ~ species + tip.label + idh(TSM_se):units, # Species, phylogenetic relatedness, and weights
                      ginverse=list(tip.label = Ainv),
                      singular.ok=TRUE,
                      prior = prior,
                      verbose=FALSE,
                      nitt = 600000,
                      thin = 500,
                      burnin = 100000,
                      data = all_data) 

# Get predictions
predictions <- data.frame(emmeans(model_TSM, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_TSM, file = "RData/Models/TSM/model_MCMCglmm_TSM_overheating_pop.rds")
saveRDS(predictions, file = "RData/Models/TSM/predictions_MCMCglmm_TSM_overheating_pop.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_TSM <- readRDS("RData/Models/TSM/model_MCMCglmm_TSM.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5554355 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.295    1.171    1.408    673.1
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     11.96     10.9    12.94    508.6
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.828    1.821    1.834     1010
## 
##  Location effects: TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current      12.232    9.402   14.960     1000 <0.001
## habitat_scenarioarboreal_future2C     11.509    8.660   14.236     1000 <0.001
## habitat_scenarioarboreal_future4C     10.066    7.229   12.797     1000 <0.001
## habitat_scenariopond_current          13.600   10.708   16.275     1000 <0.001
## habitat_scenariopond_future2C         12.831    9.940   15.506     1000 <0.001
## habitat_scenariopond_future4C         11.683    8.796   14.361     1000 <0.001
## habitat_scenariosubstrate_current     11.694    8.856   14.428     1000 <0.001
## habitat_scenariosubstrate_future2C    10.915    8.025   13.594     1000 <0.001
## habitat_scenariosubstrate_future4C     9.411    6.530   12.090     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/TSM/predictions_MCMCglmm_TSM.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current  12.234546  9.402457  14.95957
## 2  arboreal_future2C  11.516657  8.660441  14.23555
## 3  arboreal_future4C  10.073365  7.228783  12.79706
## 4       pond_current  13.598003 10.708231  16.27547
## 5      pond_future2C  12.826568  9.939599  15.50559
## 6      pond_future4C  11.682330  8.795805  14.36130
## 7  substrate_current  11.693736  8.855884  14.42791
## 8 substrate_future2C  10.913539  8.025024  13.59418
## 9 substrate_future4C   9.408846  6.529886  12.08967
# Model diagnostics
plot(model_MCMC_TSM)

# Model summary (contrasts)
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/model_MCMCglmm_TSM_contrast.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5554457 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.298    1.181    1.401    656.2
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label        12    11.03    12.96    547.4
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.828    1.822    1.834     1041
## 
##  Location effects: TSM ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                         post.mean
## (Intercept)                                                            11.6552891
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.5382288
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.1847409
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.6279122
## relevel(habitat_scenario, ref = "substrate_current")pond_current        1.9054523
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.1363197
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      -0.0118602
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7801647
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.2837740
##                                                                          l-95% CI
## (Intercept)                                                             5.4040714
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.5164637
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.2048826
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.6464856
## relevel(habitat_scenario, ref = "substrate_current")pond_current        1.8918003
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.1249267
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      -0.0251820
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7942958
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.2970070
##                                                                          u-95% CI
## (Intercept)                                                            19.8011664
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.5625205
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.1623052
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.6099889
## relevel(habitat_scenario, ref = "substrate_current")pond_current        1.9173982
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.1496370
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      -0.0003685
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7679891
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.2720909
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1004.3
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    960.2
##                                                                         pMCMC
## (Intercept)                                                             0.004
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.062
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ** 
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      .  
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating populations
# Model summary
model_MCMC_TSM <- readRDS("RData/Models/TSM/model_MCMCglmm_TSM_overheating_pop.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: 15564.97 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species    0.2729   0.1348   0.4202     1000
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     2.957    2.071    3.875     1000
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units    0.1926   0.1732   0.2115     1000
## 
##  Location effects: TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       8.713    7.202   10.278     1000 <0.001
## habitat_scenarioarboreal_future2C      8.044    6.656    9.755     1000 <0.001
## habitat_scenarioarboreal_future4C      6.728    5.442    8.480     1000 <0.001
## habitat_scenariosubstrate_current      8.199    6.908    9.983     1000 <0.001
## habitat_scenariosubstrate_future2C     7.575    6.231    9.342     1000 <0.001
## habitat_scenariosubstrate_future4C     6.304    5.024    8.090     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/TSM/predictions_MCMCglmm_TSM_overheating_pop.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   8.679359  7.201852 10.277665
## 2  arboreal_future2C   8.004740  6.656127  9.754878
## 3  arboreal_future4C   6.693707  5.442138  8.480200
## 4  substrate_current   8.165787  6.907548  9.982687
## 5 substrate_future2C   7.538825  6.230643  9.342165
## 6 substrate_future4C   6.259877  5.024256  8.089966
# Model diagnostics
plot(model_MCMC_TSM)

Community-level patterns

Load the data

community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate community-level latitudinal patterns in TSM using generalized additive models.

Run the models
# Function to run community-level TSM models in parallel
run_community_TSM_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(community_TSM ~ s(lat, bs = "tp"), data = data, weights = 1/(data$community_TSM_se^2),
        REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        community_TSM = NA, community_TSM_se = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/summary_GAM_community_lat_TSM_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/summary_MER_community_lat_TSM_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/predictions_community_lat_TSM_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, pond_current = community_pond_current,
    pond_future2C = community_pond_future2C, pond_future4C = community_pond_future4C,
    substrate_current = community_sub_current, substrate_future2C = community_sub_future2C,
    substrate_future4C = community_sub_future4C)


# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 74037.5"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.9667 -0.3461 -0.0323  0.3129  7.1483 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 404.402  20.11   "        
## [12] " Residual          8.705   2.95   "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 14.71909    0.02466  596.99"  
## [18] "Xs(lat)Fx1   -5.46022    1.05401   -5.18"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.087"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x112356f8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 14.71909    0.02466     597   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.847  8.847 2883  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.636   "                                        
## [22] "lmer.REML =  74038  Scale est. = 8.7051    n = 14090"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 72259.9"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.3964 -0.3777 -0.0614  0.2801  7.3222 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 444.16   21.075  "        
## [12] " Residual         10.37    3.221  "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 13.98110    0.02281 612.934"  
## [18] "Xs(lat)Fx1   -6.42600    1.02557  -6.266"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.091"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x1165d778>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 13.98110    0.02281   612.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.873  8.873 3081  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.648   "                                        
## [22] "lmer.REML =  72260  Scale est. = 10.372    n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 71853.6"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.4042 -0.4791 -0.1198  0.2551  7.8523 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 530.63   23.036  "        
## [12] " Residual         13.96    3.737  "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept)   12.566      0.022 571.187"  
## [18] "Xs(lat)Fx1     -8.049      1.013  -7.943"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.088"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x12c47f98>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   12.566      0.022   571.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.898  8.898 3363  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.657   "                                        
## [22] "lmer.REML =  71854  Scale est. = 13.963    n = 14090"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 75984.6"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.6067 -0.3149  0.0316  0.4214  6.9417 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 636.38   25.227  "        
## [12] " Residual         14.42    3.798  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "              Estimate Std. Error t value" 
## [17] "X(Intercept)  16.53604    0.02354  702.50" 
## [18] "Xs(lat)Fx1   -12.30969    1.10367  -11.15" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.106"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x8f345b0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 16.53604    0.02354   702.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.867  8.867 2481  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.609   "                                        
## [22] "lmer.REML =  75985  Scale est. = 14.425    n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 75284.5"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.0086 -0.3795 -0.0355  0.3930  6.9066 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 630.74   25.114  "        
## [12] " Residual         16.18    4.023  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "              Estimate Std. Error t value" 
## [17] "X(Intercept)  15.93334    0.02389  666.81" 
## [18] "Xs(lat)Fx1   -13.09508    1.06732  -12.27" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.091"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0xf5ab250>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 15.93334    0.02389   666.8   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.869  8.869 2194  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.565   "                                        
## [22] "lmer.REML =  75284  Scale est. = 16.181    n = 14091"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 79000.3"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-4.3978 -0.4491 -0.1310  0.2826  8.3279 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 666.17   25.810  "        
## [12] " Residual         18.54    4.306  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "              Estimate Std. Error t value" 
## [17] "X(Intercept)  15.15554    0.03016  502.55" 
## [18] "Xs(lat)Fx1   -14.55793    1.06332  -13.69" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.057"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x1149e410>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 15.15554    0.03016   502.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.844  8.844 1334  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.408   "                                        
## [22] "lmer.REML =  79000  Scale est. = 18.544    n = 14091"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 29910.8"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-7.5152 -0.4005  0.0195  0.4843  8.4519 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 626.808  25.04   "        
## [12] " Residual          2.046   1.43   "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 13.67804    0.02506  545.91"  
## [18] "Xs(lat)Fx1   -7.71319    0.61792  -12.48"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.059"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0xba8e910>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 13.67804    0.02506   545.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.956  8.956 2132  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.742   "                                        
## [22] "lmer.REML =  29911  Scale est. = 2.0459    n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 29160"      
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.7428 -0.4130  0.0040  0.4709  8.6408 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 478.147  21.867  "        
## [12] " Residual          2.702   1.644  "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 12.89011    0.02331   552.9"  
## [18] "Xs(lat)Fx1   -6.91282    0.62269   -11.1"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.033"
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0xc380ab0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 12.89011    0.02331   552.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.944  8.944 1911  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.719   "                                        
## [22] "lmer.REML =  29160  Scale est. = 2.7016    n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/summary_MER_community_lat_TSM_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 29533.7"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.0023 -0.4621 -0.0077  0.4539  9.1474 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 348.083  18.657  "        
## [12] " Residual          4.961   2.227  "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 11.36631    0.02398 473.901"  
## [18] "Xs(lat)Fx1   -6.13991    0.69099  -8.886"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 0.000 "
# Generalized additive model
print(readRDS("RData/Models/TSM/summary_GAM_community_lat_TSM_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_TSM ~ s(lat, bs = \"tp\")"                           
##  [7] "<environment: 0x11e49ba8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 11.36631    0.02398   473.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.905  8.905 1456  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.661   "                                        
## [22] "lmer.REML =  29534  Scale est. = 4.9606    n = 6614"
Visualize the results

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_pond_current)


# Find limits for colours of the plot
tsm_min <- min(min(community_sub_current$community_TSM, na.rm = TRUE), min(community_sub_future4C$community_TSM,
    na.rm = TRUE), min(community_arb_current$community_TSM, na.rm = TRUE), min(community_arb_future4C$community_TSM,
    na.rm = TRUE), min(community_pond_current$community_TSM, na.rm = TRUE), min(community_pond_future4C$community_TSM,
    na.rm = TRUE))

tsm_max <- max(max(community_sub_current$community_TSM, na.rm = TRUE), max(community_sub_future4C$community_TSM,
    na.rm = TRUE), max(community_arb_current$community_TSM, na.rm = TRUE), max(community_arb_future4C$community_TSM,
    na.rm = TRUE), max(community_pond_current$community_TSM, na.rm = TRUE), max(community_pond_future4C$community_TSM,
    na.rm = TRUE))
Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_sub_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future4C.rds")

lat_sub_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = community_TSM),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_sub_future2C,
    aes(x = lat, y = community_TSM), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_sub_current, aes(x = lat, y = community_TSM), alpha = 0.85,
        col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("TSM") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future2C + map_sub_TSM_future4C +
    lat_sub_all + plot_layout(ncol = 4))

substrate_plot

Figure A7: Community-level patterns in thermal safety margin for amphibians on terrestrial conditions. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015 in each community (1-degree grid cell). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in TSM in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Pond or wetland
# Current
map_pond_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))



# Future +2C
map_pond_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_pond_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_pond_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_current.rds")
pred_community_pond_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future2C.rds")
pred_community_pond_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future4C.rds")

lat_pond_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_pond_future4C, aes(x = lat, y = community_TSM),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_pond_future2C,
    aes(x = lat, y = community_TSM), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_pond_current, aes(x = lat, y = community_TSM), alpha = 0.85,
        col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_pond_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("TSM") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

pond_plot <- (map_pond_TSM_current + map_pond_TSM_future2C + map_pond_TSM_future4C +
    lat_pond_all + plot_layout(ncol = 4))

pond_plot

Figure A8: Community-level patterns in thermal safety margin for amphibians in water bodies. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015 in each community (1-degree grid cell). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in TSM in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_arb_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(name = "TSM",
    option = "plasma", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "bottom",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future4C.rds")

lat_arb_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = community_TSM),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_arb_future2C,
    aes(x = lat, y = community_TSM), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_arb_current, aes(x = lat, y = community_TSM), alpha = 0.85,
        col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("TSM") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future2C + map_arb_TSM_future4C +
    lat_arb_all + plot_layout(ncol = 4))

arboreal_plot

Figure A9: Community-level patterns in thermal safety margin for amphibians in above-ground vegetation. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015 in each community (1-degree grid cell). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in TSM in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

All habitats
all_habitats <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

Figure A10: Community-level patterns in thermal safety margin for amphibians on terrestrial conditions (top row), in water bodies (middle row), or in above-ground vegetation (bottom row). Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature during the warmest quarters of 2006-2015 in each community (1-degree grid cell). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in TSM in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean thermal safety margin in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
all_community_data <- bind_rows(
  community_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  community_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  community_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  community_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  community_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  community_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  community_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  community_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  community_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

all_community_data <- as.data.frame(all_community_data)

prior_community  <- list(R = list(V = 1, nu = 0.002), 
                         G = list(G4 = list(V = 1, fix = 1)))

# Intercept-less model 
model_MCMC_community <- MCMCglmm(community_TSM ~ habitat_scenario - 1, # No intercept
                                 random = ~ idh(community_TSM_se):units, 
                                 singular.ok=TRUE,
                                 prior = prior_community,
                                 verbose=FALSE,
                                 data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC_community, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_community_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC_community, file = "RData/Models/TSM/model_MCMCglmm_community_TSM.rds")
saveRDS(predictions, file = "RData/Models/TSM/predictions_MCMCglmm_community_TSM.rds")


# Contrast 
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_MCMC_community_contrast <- MCMCglmm(community_TSM ~ relevel(habitat_scenario, ref = "substrate_current"), # Contrast
                                          random = ~ idh(community_TSM_se):units, 
                                          singular.ok=TRUE,
                                          prior = prior_community,
                                          verbose=FALSE,
                                          data = all_community_data)

saveRDS(model_MCMC_community_contrast, file = "RData/Models/TSM/model_MCMCglmm_community_TSM_contrast.rds")
Subset of overheating communities

Here, we only focus on the communities that are predicted to overheat.

# Reload dataset without pond data
all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Filter to overheating communities
all_community_data$habitat_scenario <- as.character(all_community_data$habitat_scenario)

all_community_data <- filter(all_community_data, n_species_overheating > 0)

# Run model
model_TSM_community <- MCMCglmm(community_TSM ~ habitat_scenario - 1, random = ~idh(community_TSM_se):units,
    singular.ok = TRUE, prior = prior_community, verbose = FALSE, nitt = 6e+05, thin = 500,
    burnin = 1e+05, data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_TSM_community, by = "habitat_scenario", specs = "habitat_scenario",
    data = all_community_data, type = "response"))

predictions <- predictions %>%
    rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_TSM_community, file = "RData/Models/TSM/model_MCMCglmm_community_TSM_overheating_communities.rds")
saveRDS(predictions, file = "RData/Models/TSM/predictions_MCMCglmm_community_TSM_overheating_communities.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_TSM <- readRDS("RData/Models/TSM/model_MCMCglmm_community_TSM.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 563561.6 
## 
##  G-structure:  ~idh(community_TSM_se):units
## 
##                        post.mean l-95% CI u-95% CI eff.samp
## community_TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     11.06    10.95    11.16     1000
## 
##  Location effects: community_TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       14.28    14.19    14.38   1093.8 <0.001
## habitat_scenarioarboreal_future2C      13.39    13.30    13.48   1101.5 <0.001
## habitat_scenarioarboreal_future4C      11.75    11.67    11.83   1000.0 <0.001
## habitat_scenariopond_current           17.41    17.35    17.47   1000.0 <0.001
## habitat_scenariopond_future2C          16.53    16.47    16.58   1000.0 <0.001
## habitat_scenariopond_future4C          15.29    15.23    15.35   1134.2 <0.001
## habitat_scenariosubstrate_current      15.28    15.21    15.33   1000.0 <0.001
## habitat_scenariosubstrate_future2C     14.33    14.28    14.40   1175.5 <0.001
## habitat_scenariosubstrate_future4C     12.60    12.54    12.66    794.2 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/TSM/predictions_MCMCglmm_community_TSM.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   14.27894  14.19096  14.38106
## 2  arboreal_future2C   13.39284  13.29830  13.47715
## 3  arboreal_future4C   11.74607  11.66519  11.83032
## 4       pond_current   17.40769  17.35164  17.47057
## 5      pond_future2C   16.52833  16.46825  16.58132
## 6      pond_future4C   15.28669  15.22536  15.34608
## 7  substrate_current   15.27923  15.20782  15.33023
## 8 substrate_future2C   14.32752  14.27874  14.39567
## 9 substrate_future4C   12.60216  12.54180  12.65637
# Model diagnostics
plot(model_MCMC_TSM)

# Model summary (contrasts)
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/model_MCMCglmm_community_TSM_contrast.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 563567.3 
## 
##  G-structure:  ~idh(community_TSM_se):units
## 
##                        post.mean l-95% CI u-95% CI eff.samp
## community_TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     11.06    10.96    11.17     1000
## 
##  Location effects: community_TSM ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                            15.276861
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.995725
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -1.886305
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -3.531581
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.131792
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.251745
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.008047
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.949783
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.676880
##                                                                         l-95% CI
## (Intercept)                                                            15.214197
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -1.100467
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -1.995412
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -3.638431
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.043326
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.164948
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      -0.075235
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -1.027735
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.760619
##                                                                         u-95% CI
## (Intercept)                                                            15.335050
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.869741
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -1.780184
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -3.423781
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.208417
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.333020
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.088532
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.867118
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.592223
##                                                                        eff.samp
## (Intercept)                                                                1000
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current       1105
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C      1030
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C      1000
## relevel(habitat_scenario, ref = "substrate_current")pond_current           1000
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C          1022
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C          1135
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C     1000
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C     1000
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.864
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating communities
# Model summary
model_MCMC_TSM <- readRDS("RData/Models/TSM/model_MCMCglmm_community_TSM_overheating_communities.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: 6116.34 
## 
##  G-structure:  ~idh(community_TSM_se):units
## 
##                        post.mean l-95% CI u-95% CI eff.samp
## community_TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units    0.3691   0.3282   0.4133     1000
## 
##  Location effects: community_TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current      10.805   10.468   11.144   1000.0 <0.001
## habitat_scenarioarboreal_future2C     10.248   10.042   10.461   1000.0 <0.001
## habitat_scenarioarboreal_future4C      9.021    8.904    9.136    976.8 <0.001
## habitat_scenariosubstrate_current     11.141   11.005   11.295   1000.0 <0.001
## habitat_scenariosubstrate_future2C    10.481   10.391   10.579   1000.0 <0.001
## habitat_scenariosubstrate_future4C     9.214    9.162    9.263   1000.0 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/TSM/predictions_MCMCglmm_community_TSM_overheating_communities.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current  10.808927 10.468021 11.143725
## 2  arboreal_future2C  10.252744 10.042049 10.460654
## 3  arboreal_future4C   9.021466  8.903870  9.135951
## 4  substrate_current  11.139340 11.004630 11.294944
## 5 substrate_future2C  10.479197 10.390957 10.579051
## 6 substrate_future4C   9.215602  9.161738  9.263436
# Model diagnostics
plot(model_MCMC_TSM)

CTmax

Here, we investigate the variation in CTmax across habitats and warming scenarios.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_CTmax.R and the resources used in pbs/Models/Running_models_CTmax.pbs

Population-level patterns

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in CTmax using generalized additive models. These models do not account for the phylogenetic relatedness between species, yet they are better at capturing non-linear patterns in CTmax with latitude. While we could have fitted models with smooth terms using brms or stan, these models exceeded our computational capacities.

Run the models
# Function to run population-level CTmax models in parallel
run_CTmax_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(CTmax ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$CTmax_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        CTmax = NA, CTmax_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$CTmax_pred <- pred$fit
    new_data$CTmax_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = CTmax_pred + 1.96 * CTmax_pred_se, lower = CTmax_pred -
        1.96 * CTmax_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/CTmax/summary_MER_pop_lat_CTmax_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/CTmax/predictions_pop_lat_CTmax_",
        habitat_scenario, ".rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_CTmax_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 189401.5"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.1177  -0.0838   0.2448   0.6008   8.6807 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3767  0.6138  "                          
## [12] " genus         (Intercept)  3.6665  1.9148  "                          
## [13] " Xr            s(lat)      28.5714  5.3452  "                          
## [14] " Residual                   0.2641  0.5140  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.86618    0.09075 406.253"                              
## [20] "Xs(lat)Fx1    0.68285    0.07371   9.264"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x26db6528>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.86618    0.09075   406.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.991  8.991 3009  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.122   "                                        
## [22] "lmer.REML = 1.894e+05  Scale est. = 0.26415   n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 197472"                                 
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-37.361  -0.057   0.257   0.598   8.772 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3667  0.6056  "                          
## [12] " genus         (Intercept)  3.6343  1.9064  "                          
## [13] " Xr            s(lat)      24.9774  4.9977  "                          
## [14] " Residual                   0.2269  0.4764  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.96300    0.09033  409.22"                              
## [20] "Xs(lat)Fx1    0.79546    0.07194   11.06"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xb98a360>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.96300    0.09033   409.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3089  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.136   "                                        
## [22] "lmer.REML = 1.9747e+05  Scale est. = 0.22695   n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 186049"                                 
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-29.3523  -0.0598   0.2385   0.5747   9.8201 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3530  0.5942  "                          
## [12] " genus         (Intercept)  3.6137  1.9010  "                          
## [13] " Xr            s(lat)      20.3852  4.5150  "                          
## [14] " Residual                   0.1614  0.4017  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.14027    0.09001  412.61"                              
## [20] "Xs(lat)Fx1    0.91267    0.06475   14.09"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xe3bce50>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.14027    0.09001   412.6   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3655  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.155   "                                        
## [22] "lmer.REML = 1.8605e+05  Scale est. = 0.16136   n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 237271.6"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.5487  -0.0716   0.2408   0.5933  11.4133 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3959  0.6292  "                          
## [12] " genus         (Intercept)  3.7194  1.9286  "                          
## [13] " Xr            s(lat)      36.4147  6.0345  "                          
## [14] " Residual                   0.2314  0.4811  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.97936    0.09119  405.54"                              
## [20] "Xs(lat)Fx1    0.83042    0.07311   11.36"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xc0e0c28>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.97936    0.09119   405.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3544  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.177   "                                        
## [22] "lmer.REML = 2.3727e+05  Scale est. = 0.23144   n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 243435.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-29.0257  -0.1074   0.1893   0.5349  12.0258 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3860  0.6213  "                          
## [12] " genus         (Intercept)  3.6997  1.9235  "                          
## [13] " Xr            s(lat)      40.2470  6.3440  "                          
## [14] " Residual                   0.2045  0.4522  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.12679    0.09092  408.36"                              
## [20] "Xs(lat)Fx1    1.07909    0.07196   14.99"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xe3b9240>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.12679    0.09092   408.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 4011  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.184   "                                        
## [22] "lmer.REML = 2.4344e+05  Scale est. = 0.20451   n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 207892.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.7588  -0.2820   0.0452   0.4111  12.1417 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3706  0.6088  "                          
## [12] " genus         (Intercept)  3.6967  1.9227  "                          
## [13] " Xr            s(lat)      41.5409  6.4452  "                          
## [14] " Residual                   0.1951  0.4417  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  37.3972     0.0908  411.84"                              
## [20] "Xs(lat)Fx1     1.5297     0.0726   21.07"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x26dc4170>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.3972     0.0908   411.8   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4020  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.147   "                                        
## [22] "lmer.REML = 2.0789e+05  Scale est. = 0.19511   n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 40976.5"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-18.3424  -0.0968   0.2464   0.5930   4.3570 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.3143  0.5606  "                         
## [12] " genus         (Intercept)  2.9902  1.7292  "                         
## [13] " Xr            s(lat)      81.5595  9.0310  "                         
## [14] " Residual                   0.2712  0.5207  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.4897     0.1346 278.508"                             
## [20] "Xs(lat)Fx1    -1.1780     0.1596  -7.382"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2ef16ec8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.4897     0.1346   278.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.972  8.972 949.9  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0571   "                                       
## [22] "lmer.REML =  40977  Scale est. = 0.27118   n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 39790.3"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-17.8778  -0.0851   0.2543   0.6113   5.3014 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.3072  0.5542  "                         
## [12] " genus         (Intercept)  2.9693  1.7232  "                         
## [13] " Xr            s(lat)      84.3615  9.1849  "                         
## [14] " Residual                   0.2114  0.4598  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.5942     0.1341 280.376"                             
## [20] "Xs(lat)Fx1    -1.3244     0.1493  -8.873"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x5a49c8d0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.5942     0.1341   280.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.976  8.976 1039  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0575   "                                       
## [22] "lmer.REML =  39790  Scale est. = 0.21138   n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_pop_lat_CTmax_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 41496.1"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-17.6454  -0.0669   0.2564   0.6181   7.3854 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.2998  0.5475  "                         
## [12] " genus         (Intercept)  2.9329  1.7126  "                         
## [13] " Xr            s(lat)      67.7798  8.2328  "                         
## [14] " Residual                   0.1498  0.3870  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.7647     0.1332 283.430"                             
## [20] "Xs(lat)Fx1    -0.9871     0.1373  -7.192"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_pop_lat_CTmax_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2ee9c380>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.7647     0.1332   283.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.974  8.974 1103  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0593   "                                       
## [22] "lmer.REML =  41496  Scale est. = 0.14977   n = 56210"
Visualize the results
# Find limits for colours of the plot
CTmax_min <- min(min(pop_sub_current$CTmax, na.rm = TRUE), min(pop_sub_future4C$CTmax,
    na.rm = TRUE), min(pop_arb_current$CTmax, na.rm = TRUE), min(pop_arb_future4C$CTmax,
    na.rm = TRUE), min(pop_pond_current$CTmax, na.rm = TRUE), min(pop_pond_future4C$CTmax,
    na.rm = TRUE))

CTmax_max <- max(max(pop_sub_current$CTmax, na.rm = TRUE), max(pop_sub_future4C$CTmax,
    na.rm = TRUE), max(pop_arb_current$CTmax, na.rm = TRUE), max(pop_arb_future4C$CTmax,
    na.rm = TRUE), max(pop_pond_current$CTmax, na.rm = TRUE), max(pop_pond_future4C$CTmax,
    na.rm = TRUE))
Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_future4C.rds")


pop_CTmax_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = CTmax),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = CTmax), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_sub_current, aes(x = lat, y = CTmax), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("CTmax") + ylim(CTmax_min, CTmax_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_CTmax_sub

Figure A11: Latitudinal variation in CTmax for amphibians on terrestrial conditions. CTmax is the mean predicted CTmax across the the warmest quarters of 2006-2015. Blue ribbons and points depict CTmax in current microclimates. Orange ribbons and points depict CTmax in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict CTmax in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Pond or wetland
# Load model predictions
pred_pond_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_future4C.rds")


pop_CTmax_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat, y = CTmax),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = CTmax), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_pond_current, aes(x = lat, y = CTmax), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_pond_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("CTmax") + ylim(CTmax_min, CTmax_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_CTmax_pond

Figure A12: Latitudinal variation in CTmax for amphibians in water bodies. CTmax is the mean predicted CTmax across the the warmest quarters of 2006-2015. Blue ribbons and points depict CTmax in current microclimates. Orange ribbons and points depict CTmax in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict CTmax in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_future4C.rds")


pop_CTmax_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = CTmax),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = CTmax), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_arb_current, aes(x = lat, y = CTmax), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("CTmax") + ylim(CTmax_min, CTmax_max) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_CTmax_arb

Figure A13: Latitudinal variation in CTmax for amphibians in above-ground vegetation. CTmax is the mean predicted CTmax across the the warmest quarters of 2006-2015. Blue ribbons and points depict CTmax in current microclimates. Orange ribbons and points depict CTmax in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict CTmax in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

All habitats
all_habitats <- (pop_CTmax_sub/pop_CTmax_pond/pop_CTmax_arb/plot_layout(ncol = 1))

all_habitats

Figure A14: Latitudinal variation in CTmax for amphibians on terrestrial conditions (top panel), in water bodies (middle panel) or in above-ground vegetation (bottom panel). CTmax is the mean predicted CTmax across the the warmest quarters of 2006-2015. Blue ribbons and points depict CTmax in current microclimates. Orange ribbons and points depict CTmax in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict CTmax in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean CTmax in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

all_data$species <- all_data$tip.label

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv

all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(CTmax ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(CTmax_se):units, # Species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/CTmax/model_MCMCglmm_CTmax.rds")
saveRDS(predictions, file = "RData/Models/CTmax/predictions_MCMCglmm_CTmax.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# The contrast model could not estimate the phylogenetic effect (likely because CTmax values are rather close).
# Therefore, only a the species-level random effect was kept

prior2  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, fix = 1)))

model_MCMC_contrast <- MCMCglmm(CTmax ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + idh(CTmax_se):units,
                                singular.ok=TRUE,
                                prior = prior2,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/CTmax/model_MCMCglmm_CTmax_contrast.rds")
Subset of overheating populations

Here, we only focus on the populations that are predicted to overheat.

# Reload dataset without pond data
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C")
)

# Filter to populations predicted to overheat
all_data$habitat_scenario <- as.character(all_data$habitat_scenario)
all_data$species <- all_data$tip.label
all_data <- filter(all_data, overheating_risk > 0)

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv

all_data <- as.data.frame(all_data)

# Run model
model_CTmax <- MCMCglmm(CTmax ~ habitat_scenario - 1, # No intercept
                        random = ~ species + tip.label + idh(CTmax_se):units, # Species, phylogenetic relatedness, and weights
                        ginverse=list(tip.label = Ainv),
                        singular.ok=TRUE,
                        prior = prior,
                        verbose=FALSE,
                        nitt = 600000,
                        thin = 500,
                        burnin = 100000,
                        data = all_data) 

# Get predictions
predictions <- data.frame(emmeans(model_CTmax, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_CTmax, file = "RData/Models/CTmax/model_MCMCglmm_CTmax_overheating_pop.rds")
saveRDS(predictions, file = "RData/Models/CTmax/predictions_MCMCglmm_CTmax_overheating_pop.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/model_MCMCglmm_CTmax.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: -1831730 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species   0.07132  0.05993  0.08373    365.2
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     2.958    2.517    3.676    878.2
## 
##                ~idh(CTmax_se):units
## 
##                post.mean l-95% CI u-95% CI eff.samp
## CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units  0.005869   0.0056 0.006203    10.81
## 
##  Location effects: CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp pMCMC  
## habitat_scenarioarboreal_current      35.215    6.944   59.413     1000 0.020 *
## habitat_scenarioarboreal_future2C     35.291    7.025   59.494     1000 0.020 *
## habitat_scenarioarboreal_future4C     35.414    7.152   59.620     1000 0.018 *
## habitat_scenariopond_current          35.366    7.101   59.568     1000 0.018 *
## habitat_scenariopond_future2C         35.456    7.189   59.658     1000 0.018 *
## habitat_scenariopond_future4C         35.587    7.319   59.789     1000 0.018 *
## habitat_scenariosubstrate_current     35.216    6.949   59.416     1000 0.020 *
## habitat_scenariosubstrate_future2C    35.297    7.030   59.494     1000 0.020 *
## habitat_scenariosubstrate_future4C    35.429    7.162   59.629     1000 0.018 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/CTmax/predictions_MCMCglmm_CTmax.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   35.55511  6.944097  59.41312
## 2  arboreal_future2C   35.63430  7.025288  59.49365
## 3  arboreal_future4C   35.75048  7.151952  59.62037
## 4       pond_current   35.70696  7.100851  59.56830
## 5      pond_future2C   35.79570  7.189272  59.65817
## 6      pond_future4C   35.92880  7.318508  59.78906
## 7  substrate_current   35.55639  6.948867  59.41632
## 8 substrate_future2C   35.63727  7.029510  59.49434
## 9 substrate_future4C   35.76828  7.161976  59.62927
# Model diagnostics
plot(model_MCMC_CTmax)

# Model summary (contrasts)
model_MCMC_CTmax_contrast <- readRDS("RData/Models/CTmax/model_MCMCglmm_CTmax_contrast.rds")
summary(model_MCMC_CTmax_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: -1825856 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     4.125    3.775    4.706     1000
## 
##                ~idh(CTmax_se):units
## 
##                post.mean l-95% CI u-95% CI eff.samp
## CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units  0.005893 0.005641 0.006153    13.78
## 
##  Location effects: CTmax ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                            37.067199
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.001108
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.075286
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.199362
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.150410
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.240008
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.371919
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.081434
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.212896
##                                                                         l-95% CI
## (Intercept)                                                            36.240948
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.013147
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.064217
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.190687
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.144416
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.234570
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.366573
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.076287
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.207861
##                                                                         u-95% CI
## (Intercept)                                                            38.037866
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.011606
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.084346
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.207925
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.154809
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.244828
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.377168
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.086811
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.218235
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     1319.3
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    668.1
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1000.0
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.856
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating populations
# Model summary
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/model_MCMCglmm_CTmax_overheating_pop.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: -30909.86 
## 
##  G-structure:  ~species
## 
##         post.mean  l-95% CI u-95% CI eff.samp
## species   0.06137 8.176e-08   0.1653    148.3
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     6.303    4.936    7.606    588.3
## 
##                ~idh(CTmax_se):units
## 
##                post.mean l-95% CI u-95% CI eff.samp
## CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean  l-95% CI  u-95% CI eff.samp
## units 0.0004679 0.0001382 0.0009026    340.1
## 
##  Location effects: CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       35.44    33.42    37.56     1000 <0.001
## habitat_scenarioarboreal_future2C      35.52    33.33    37.48     1000 <0.001
## habitat_scenarioarboreal_future4C      35.64    33.46    37.62     1000 <0.001
## habitat_scenariosubstrate_current      35.45    33.26    37.40     1000 <0.001
## habitat_scenariosubstrate_future2C     35.53    33.34    37.49     1000 <0.001
## habitat_scenariosubstrate_future4C     35.64    33.45    37.60     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/CTmax/predictions_MCMCglmm_CTmax_overheating_pop.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   35.47239  33.41860  37.56471
## 2  arboreal_future2C   35.55301  33.32855  37.47915
## 3  arboreal_future4C   35.66557  33.46189  37.61679
## 4  substrate_current   35.48424  33.25732  37.40287
## 5 substrate_future2C   35.55916  33.34403  37.48526
## 6 substrate_future4C   35.66107  33.45251  37.59708
# Model diagnostics
plot(model_MCMC_CTmax)

Community-level patterns

Load the data

community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate community-level latitudinal patterns in CTmax using generalized additive models.

Run the models
# Function to run community-level CTmax models in parallel
run_community_CTmax_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(community_CTmax ~ s(lat, bs = "tp"), data = data, weights = 1/(data$community_CTmax_se^2),
        REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        community_CTmax = NA, community_CTmax_se = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$CTmax_pred <- pred$fit
    new_data$CTmax_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = CTmax_pred + 1.96 * CTmax_pred_se, lower = CTmax_pred -
        1.96 * CTmax_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/CTmax/summary_GAM_community_lat_CTmax_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/CTmax/summary_MER_community_lat_CTmax_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/CTmax/predictions_community_lat_CTmax_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, pond_current = community_pond_current,
    pond_future2C = community_pond_future2C, pond_future4C = community_pond_future4C,
    substrate_current = community_sub_current, substrate_future2C = community_sub_future2C,
    substrate_future4C = community_sub_future4C)


# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_CTmax_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 53126.4"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-4.3022 -0.5251 -0.1584  0.2617  9.1728 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 163.060  12.769  "        
## [12] " Residual          1.972   1.404  "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 37.14118    0.01174 3162.56"  
## [18] "Xs(lat)Fx1   -3.64668    0.51145   -7.13"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.090"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0x13dab800>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.14118    0.01174    3163   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.912  8.912 5772  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.777   "                                        
## [22] "lmer.REML =  53126  Scale est. = 1.9724    n = 14090"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 51643.1"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-4.4722 -0.5490 -0.1577  0.2926  9.0591 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 170.2    13.045  "        
## [12] " Residual          2.4     1.549  "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 37.27164    0.01098 3395.674" 
## [18] "Xs(lat)Fx1   -3.41781    0.50058   -6.828" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.094"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0x10d6c308>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.27164    0.01098    3396   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.921  8.921 6020  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.783   "                                        
## [22] "lmer.REML =  51643  Scale est. = 2.3997    n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 50443"      
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.2013 -0.5499 -0.1451  0.3414  8.1019 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 171.321  13.089  "        
## [12] " Residual          3.054   1.748  "        
## [13] "Number of obs: 14090, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 37.49911    0.01029 3644.06"  
## [18] "Xs(lat)Fx1   -2.81333    0.47848   -5.88"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.089"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0xe89c468>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.49911    0.01029    3644   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.93   8.93 6292  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.789   "                                        
## [22] "lmer.REML =  50443  Scale est. = 3.054     n = 14090"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 52123.7"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-4.5524 -0.5793 -0.1873  0.2393  8.6135 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 177.303  13.316  "        
## [12] " Residual          2.651   1.628  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 37.38098    0.01009 3703.151" 
## [18] "Xs(lat)Fx1   -2.43644    0.47934   -5.083" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.108"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0x85be8a0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.38098    0.01009    3703   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.91   8.91 6479  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.802   "                                        
## [22] "lmer.REML =  52124  Scale est. = 2.6515    n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 51932.4"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-5.1306 -0.5639 -0.1658  0.3019  7.8297 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 189.502  13.766  "        
## [12] " Residual          3.084   1.756  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 37.53779    0.01043 3597.866" 
## [18] "Xs(lat)Fx1   -2.18132    0.47226   -4.619" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.093"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0xe4f4618>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.53779    0.01043    3598   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.915  8.915 6266  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =   0.79   "                                        
## [22] "lmer.REML =  51932  Scale est. = 3.0836    n = 14091"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 55466.5"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.6624 -0.5141 -0.0967  0.3408  9.0554 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 303.316  17.416  "        
## [12] " Residual          3.488   1.868  "        
## [13] "Number of obs: 14091, groups:  Xr, 8"      
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 37.70931    0.01308 2882.235" 
## [18] "Xs(lat)Fx1   -1.36614    0.47213   -2.894" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.059"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0x10a9fca0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.70931    0.01308    2882   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.933  8.933 4441  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.711   "                                        
## [22] "lmer.REML =  55467  Scale est. = 3.4879    n = 14091"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 27422.5"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-7.9526 -0.2275  0.0530  0.3765  5.2504 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 268.666  16.391  "        
## [12] " Residual          1.405   1.185  "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 38.72989    0.02076 1865.699" 
## [18] "Xs(lat)Fx1   -2.41397    0.50913   -4.741" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.059"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0xb11e548>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 38.72989    0.02076    1866   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.93   8.93 1166  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.608   "                                        
## [22] "lmer.REML =  27423  Scale est. = 1.405     n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 26813.5"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.8921 -0.2294  0.0713  0.4287  5.4185 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 283.184  16.828  "        
## [12] " Residual          1.895   1.377  "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error t value"  
## [17] "X(Intercept) 38.80794    0.01952 1987.74"  
## [18] "Xs(lat)Fx1   -3.04900    0.52029   -5.86"  
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 -0.033"
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0xba0a730>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 38.80794    0.01952    1988   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.934  8.934 1125  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.598   "                                        
## [22] "lmer.REML =  26813  Scale est. = 1.8949    n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/summary_MER_community_lat_CTmax_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"
##  [2] ""                                          
##  [3] "REML criterion at convergence: 25252.7"    
##  [4] ""                                          
##  [5] "Scaled residuals: "                        
##  [6] "    Min      1Q  Median      3Q     Max "  
##  [7] "-6.1126 -0.2827  0.1085  0.4439  6.6635 "  
##  [8] ""                                          
##  [9] "Random effects:"                           
## [10] " Groups   Name   Variance Std.Dev."        
## [11] " Xr       s(lat) 286.262  16.919  "        
## [12] " Residual          2.595   1.611  "        
## [13] "Number of obs: 6614, groups:  Xr, 8"       
## [14] ""                                          
## [15] "Fixed effects:"                            
## [16] "             Estimate Std. Error  t value" 
## [17] "X(Intercept) 38.98868    0.01735 2247.506" 
## [18] "Xs(lat)Fx1   -2.83927    0.50365   -5.637" 
## [19] ""                                          
## [20] "Correlation of Fixed Effects:"             
## [21] "           X(Int)"                         
## [22] "Xs(lat)Fx1 0.000 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/summary_GAM_community_lat_CTmax_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_CTmax ~ s(lat, bs = \"tp\")"                         
##  [7] "<environment: 0x116331b0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 38.98868    0.01735    2248   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.939  8.939 1147  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.602   "                                        
## [22] "lmer.REML =  25253  Scale est. = 2.5948    n = 6614"
Visualize the results

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_sub_current)


# Find limits for colours of the plot
CTmax_min <- min(min(community_sub_current$community_CTmax, na.rm = TRUE), min(community_sub_future4C$community_CTmax,
    na.rm = TRUE), min(community_arb_current$community_CTmax, na.rm = TRUE), min(community_arb_future4C$community_CTmax,
    na.rm = TRUE), min(community_pond_current$community_CTmax, na.rm = TRUE), min(community_pond_future4C$community_CTmax,
    na.rm = TRUE))

CTmax_max <- max(max(community_sub_current$community_CTmax, na.rm = TRUE), max(community_sub_future4C$community_CTmax,
    na.rm = TRUE), max(community_arb_current$community_CTmax, na.rm = TRUE), max(community_arb_future4C$community_CTmax,
    na.rm = TRUE), max(community_pond_current$community_CTmax, na.rm = TRUE), max(community_pond_future4C$community_CTmax,
    na.rm = TRUE))
Vegetated substrate
# Current
map_sub_CTmax_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = community_CTmax), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "inferno",
    name = "CTmax", na.value = "gray1", breaks = seq(25, 50, by = 5), limits = c(CTmax_min,
        CTmax_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_sub_CTmax_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_sub_future2C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", na.value = "gray1", breaks = seq(25,
    50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_CTmax_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_sub_future4C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", na.value = "gray1", breaks = seq(25,
    50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_future4C.rds")

lat_sub_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = community_CTmax),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_sub_future2C,
    aes(x = lat, y = community_CTmax), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_sub_current, aes(x = lat, y = community_CTmax), alpha = 0.85,
        col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(CTmax_min, CTmax_max) + xlab("") +
    ylab("CTmax") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_CTmax_current + map_sub_CTmax_future2C + map_sub_CTmax_future4C +
    lat_sub_all + plot_layout(ncol = 4))

substrate_plot

Figure A15: Community-level patterns in CTmax for amphibians on terrestrial conditions. CTmax estimates were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in CTmax in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Pond or wetland
# Current
map_pond_CTmax_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_current, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", name = "CTmax", na.value = "gray1",
    breaks = seq(25, 50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_pond_CTmax_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_future2C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", na.value = "gray1", breaks = seq(25,
    50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_pond_CTmax_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_future4C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", na.value = "gray1", breaks = seq(25,
    50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_pond_current <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_current.rds")
pred_community_pond_future2C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_future2C.rds")
pred_community_pond_future4C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_substrate_future4C.rds")

lat_pond_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_pond_future4C, aes(x = lat, y = community_CTmax),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_pond_future2C,
    aes(x = lat, y = community_CTmax), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_pond_current, aes(x = lat, y = community_CTmax),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_pond_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(CTmax_min, CTmax_max) + xlab("") +
    ylab("CTmax") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

pond_plot <- (map_pond_CTmax_current + map_pond_CTmax_future2C + map_pond_CTmax_future4C +
    lat_pond_all + plot_layout(ncol = 4))

pond_plot

Figure A16: Community-level patterns in CTmax for amphibians in water bodies. CTmax estimates were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in CTmax in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Above-ground vegetation
# Current
map_arb_CTmax_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = community_CTmax), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "inferno",
    name = "CTmax", na.value = "gray1", breaks = seq(25, 50, by = 5), limits = c(CTmax_min,
        CTmax_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_arb_CTmax_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_arb_future2C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "inferno", na.value = "gray1", breaks = seq(25,
    50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_CTmax_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_arb_future4C, aes(fill = community_CTmax), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(name = "CTmax", option = "inferno", na.value = "gray1",
    breaks = seq(25, 50, by = 5), limits = c(CTmax_min, CTmax_max), begin = 0, end = 1) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "bottom", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/CTmax/predictions_community_lat_CTmax_arboreal_future4C.rds")

lat_arb_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = community_CTmax),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_arb_future2C,
    aes(x = lat, y = community_CTmax), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_arb_current, aes(x = lat, y = community_CTmax), alpha = 0.85,
        col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(CTmax_min, CTmax_max) + xlab("") +
    ylab("CTmax") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_CTmax_current + map_arb_CTmax_future2C + map_arb_CTmax_future4C +
    lat_arb_all + plot_layout(ncol = 4))

arboreal_plot

Figure A17: Community-level patterns in CTmax for amphibians in above-ground vegetation. CTmax estimates were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in CTmax in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

All habitats
all_habitats <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

Figure A18: Community-level patterns in CTmax for amphibians on terrestrial conditions (top row), in water bodies (middle row), or in above-ground vegetation (bottom row). CTmax estimates were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in CTmax in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean thermal safety margin in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
all_community_data <- bind_rows(
  community_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  community_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  community_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  community_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  community_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  community_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  community_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  community_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  community_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

all_community_data <- as.data.frame(all_community_data)

prior_community  <- list(R = list(V = 1, nu = 0.002), 
                         G = list(G4 = list(V = 1, fix = 1)))

# Intercept-less model 
model_MCMC_community <- MCMCglmm(community_CTmax ~ habitat_scenario - 1, # No intercept
                                 random = ~ idh(community_CTmax_se):units, 
                                 singular.ok=TRUE,
                                 prior = prior_community,
                                 verbose=FALSE,
                                 data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC_community, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_community_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC_community, file = "RData/Models/CTmax/model_MCMCglmm_community_CTmax.rds")
saveRDS(predictions, file = "RData/Models/CTmax/predictions_MCMCglmm_community_CTmax.rds")


# Contrast 
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_MCMC_community_contrast <- MCMCglmm(community_CTmax ~ relevel(habitat_scenario, ref = "substrate_current"), # Contrast
                                          random = ~ idh(community_CTmax_se):units, 
                                          singular.ok=TRUE,
                                          prior = prior_community,
                                          verbose=FALSE,
                                          data = all_community_data)

saveRDS(model_MCMC_community_contrast, file = "RData/Models/CTmax/model_MCMCglmm_community_CTmax_contrast.rds")
Subset of overheating communities

Here, we only focus on the communities that are predicted to overheat.

# Reload dataset without pond data
all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Filter to overheating communities
all_community_data$habitat_scenario <- as.character(all_community_data$habitat_scenario)

all_community_data <- filter(all_community_data, n_species_overheating > 0)

# Run model
model_CTmax_community <- MCMCglmm(community_CTmax ~ habitat_scenario - 1, random = ~idh(community_TSM_se):units,
    singular.ok = TRUE, prior = prior_community, verbose = FALSE, nitt = 6e+05, thin = 500,
    burnin = 1e+05, data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_CTmax_community, by = "habitat_scenario",
    specs = "habitat_scenario", data = all_community_data, type = "response"))

predictions <- predictions %>%
    rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_CTmax_community, file = "RData/Models/CTmax/model_MCMCglmm_community_CTmax_overheating_communities.rds")
saveRDS(predictions, file = "RData/Models/CTmax/predictions_MCMCglmm_community_CTmax_overheating_communities.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/model_MCMCglmm_community_CTmax.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 471662.8 
## 
##  G-structure:  ~idh(community_CTmax_se):units
## 
##                          post.mean l-95% CI u-95% CI eff.samp
## community_CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     4.063    4.019    4.111     1000
## 
##  Location effects: community_CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       38.69    38.63    38.76   1000.0 <0.001
## habitat_scenarioarboreal_future2C      38.83    38.77    38.89   1000.0 <0.001
## habitat_scenarioarboreal_future4C      39.07    39.02    39.12   1000.0 <0.001
## habitat_scenariopond_current           36.79    36.75    36.83   1000.0 <0.001
## habitat_scenariopond_future2C          36.98    36.94    37.02   1000.0 <0.001
## habitat_scenariopond_future4C          37.13    37.09    37.16   1126.2 <0.001
## habitat_scenariosubstrate_current      36.46    36.42    36.50   1000.0 <0.001
## habitat_scenariosubstrate_future2C     36.69    36.66    36.73   1165.1 <0.001
## habitat_scenariosubstrate_future4C     37.01    36.98    37.05    815.5 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/CTmax/predictions_MCMCglmm_community_CTmax.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   38.68505  38.62606  38.75544
## 2  arboreal_future2C   38.83369  38.77413  38.89273
## 3  arboreal_future4C   39.06704  39.01503  39.12334
## 4       pond_current   36.79336  36.75493  36.83136
## 5      pond_future2C   36.98145  36.94458  37.01798
## 6      pond_future4C   37.12763  37.08659  37.16412
## 7  substrate_current   36.45701  36.41711  36.49806
## 8 substrate_future2C   36.68814  36.65584  36.73033
## 9 substrate_future4C   37.01236  36.97742  37.05025
# Model diagnostics
plot(model_MCMC_CTmax)

# Model summary (contrasts)
model_MCMC_CTmax_contrast <- readRDS("RData/Models/CTmax/model_MCMCglmm_community_CTmax_contrast.rds")

summary(model_MCMC_CTmax_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 471657.7 
## 
##  G-structure:  ~idh(community_CTmax_se):units
## 
##                          post.mean l-95% CI u-95% CI eff.samp
## community_CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     4.065     4.02    4.111     1000
## 
##  Location effects: community_CTmax ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              36.4561
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      2.2305
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     2.3764
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     2.6108
## relevel(habitat_scenario, ref = "substrate_current")pond_current          0.3375
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C         0.5251
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         0.6708
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.2316
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.5552
##                                                                        l-95% CI
## (Intercept)                                                             36.4109
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     2.1546
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    2.3041
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    2.5410
## relevel(habitat_scenario, ref = "substrate_current")pond_current         0.2816
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        0.4682
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        0.6200
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.1815
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   0.4987
##                                                                        u-95% CI
## (Intercept)                                                             36.4928
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     2.3101
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    2.4496
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    2.6825
## relevel(habitat_scenario, ref = "substrate_current")pond_current         0.3906
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        0.5795
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        0.7264
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.2869
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   0.6124
##                                                                        eff.samp
## (Intercept)                                                                1000
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current       1107
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C      1078
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C      1000
## relevel(habitat_scenario, ref = "substrate_current")pond_current           1000
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C          1018
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C          1132
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C     1000
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C     1000
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating communities
# Model summary
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/model_MCMCglmm_community_CTmax_overheating_communities.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: 11013.73 
## 
##  G-structure:  ~idh(community_TSM_se):units
## 
##                        post.mean l-95% CI u-95% CI eff.samp
## community_TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     4.174    3.881    4.456     1000
## 
##  Location effects: community_CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       39.26    38.69    39.77   1000.0 <0.001
## habitat_scenarioarboreal_future2C      39.43    39.03    39.88   1000.0 <0.001
## habitat_scenarioarboreal_future4C      39.76    39.51    40.01   1000.0 <0.001
## habitat_scenariosubstrate_current      38.68    38.37    38.95   1000.0 <0.001
## habitat_scenariosubstrate_future2C     38.74    38.52    38.96    912.4 <0.001
## habitat_scenariosubstrate_future4C     38.44    38.31    38.55    833.6 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/CTmax/predictions_MCMCglmm_community_CTmax_overheating_communities.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   39.25406  38.68626  39.77482
## 2  arboreal_future2C   39.43976  39.02742  39.88057
## 3  arboreal_future4C   39.74924  39.50627  40.00914
## 4  substrate_current   38.68098  38.36684  38.94522
## 5 substrate_future2C   38.73135  38.51668  38.95778
## 6 substrate_future4C   38.43767  38.31321  38.55352
# Model diagnostics
plot(model_MCMC_CTmax)

Maximum operative body temperature

Here, we investigate the variation in maximum operative body temperatures across habitats and warming scenarios.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_max_temp.R and the resources used in pbs/Models/Running_models_max_temp.pbs

Population-level patterns

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in maximum body temperature using generalized additive models. These models do not account for the phylogenetic relatedness between species, yet they are better at capturing non-linear patterns with latitude. While we could have fitted models with smooth terms using brms or stan, these models exceeded our computational capacities.

Run the models
# Function to run population-level max_temp models in parallel
run_max_temp_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(max_temp ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$max_temp_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        max_temp = NA, max_temp_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$max_temp_pred <- pred$fit
    new_data$max_temp_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = max_temp_pred + 1.96 * max_temp_pred_se,
        lower = max_temp_pred - 1.96 * max_temp_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/max_temp/summary_MER_pop_lat_max_temp_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/max_temp/predictions_pop_lat_max_temp_",
        habitat_scenario, ".rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_max_temp_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 970523.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-15.1972  -0.2173   0.1027   0.4365   5.1313 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.244   1.498  "                          
## [12] " genus         (Intercept)   3.243   1.801  "                          
## [13] " Xr            s(lat)      514.222  22.676  "                          
## [14] " Residual                    6.884   2.624  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 23.91799    0.09766 244.915"                              
## [20] "Xs(lat)Fx1    1.84149    0.35746   5.152"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x27cc69d8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 23.91799    0.09766   244.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.986  8.986 7027  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =   0.62   "                                        
## [22] "lmer.REML = 9.7052e+05  Scale est. = 6.8838    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1014454"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.3780  -0.1976   0.0962   0.3968   4.4059 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.376   1.542  "                          
## [12] " genus         (Intercept)   3.078   1.754  "                          
## [13] " Xr            s(lat)      499.461  22.349  "                          
## [14] " Residual                    8.259   2.874  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 24.74313    0.09687 255.439"                              
## [20] "Xs(lat)Fx1    1.36874    0.39258   3.487"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xc8dbd00>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 24.74313    0.09687   255.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.982  8.982 6463  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.575   "                                        
## [22] "lmer.REML = 1.0145e+06  Scale est. = 8.2586    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1041554"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.5708  -0.2237   0.0911   0.3813   4.2896 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.090   1.446  "                          
## [12] " genus         (Intercept)   2.963   1.721  "                          
## [13] " Xr            s(lat)      500.779  22.378  "                          
## [14] " Residual                    9.580   3.095  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 26.47169    0.09524  277.95"                              
## [20] "Xs(lat)Fx1    3.01508    0.41474    7.27"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf28d5e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 26.47169    0.09524     278   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.98   8.98 6215  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.529   "                                        
## [22] "lmer.REML = 1.0416e+06  Scale est. = 9.5802    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1021784"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-19.9213  -0.2537   0.0951   0.3906   7.7988 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.648   2.156  "                          
## [12] " genus         (Intercept)   7.104   2.665  "                          
## [13] " Xr            s(lat)      452.827  21.280  "                          
## [14] " Residual                    4.941   2.223  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  21.9278     0.1408 155.699"                              
## [20] "Xs(lat)Fx1     0.5651     0.3864   1.463"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xcffe7c8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  21.9278     0.1408   155.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.981  8.981 6281  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.513   "                                        
## [22] "lmer.REML = 1.0218e+06  Scale est. = 4.941     n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1022036"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-19.1205  -0.2647   0.0918   0.3875   7.5190 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.530   2.128  "                          
## [12] " genus         (Intercept)   6.744   2.597  "                          
## [13] " Xr            s(lat)      516.377  22.724  "                          
## [14] " Residual                    5.046   2.246  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  23.0311     0.1377  167.21"                              
## [20] "Xs(lat)Fx1     1.8997     0.3885    4.89"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf287b28>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  23.0311     0.1377   167.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.983  8.983 5598  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.519   "                                        
## [22] "lmer.REML = 1.022e+06  Scale est. = 5.0461    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1017630"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.8425  -0.2984   0.0858   0.3993   6.9493 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.404   2.099  "                          
## [12] " genus         (Intercept)   6.414   2.533  "                          
## [13] " Xr            s(lat)      536.559  23.164  "                          
## [14] " Residual                    5.180   2.276  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  24.8034     0.1348  184.01"                              
## [20] "Xs(lat)Fx1     2.8585     0.3900    7.33"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x27cd5068>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.8034     0.1348     184   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.984  8.984 4899  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.506   "                                        
## [22] "lmer.REML = 1.0176e+06  Scale est. = 5.1803    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 218385.4"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-27.0679  -0.3346   0.0899   0.5178   5.1108 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.489   1.578  "                         
## [12] " genus         (Intercept)   2.937   1.714  "                         
## [13] " Xr            s(lat)      398.989  19.975  "                         
## [14] " Residual                    2.041   1.429  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "              Estimate Std. Error t value"                            
## [19] "X(Intercept) 2.491e+01  1.566e-01 159.037"                            
## [20] "Xs(lat)Fx1   8.231e-04  3.644e-01   0.002"                            
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2b1843b0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.9051     0.1566     159   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.958  8.958 2177  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0809   "                                       
## [22] "lmer.REML = 2.1839e+05  Scale est. = 2.0412    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 218039.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-31.1293  -0.3508   0.0852   0.5182   5.5533 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.292   1.514  "                         
## [12] " genus         (Intercept)   2.641   1.625  "                         
## [13] " Xr            s(lat)      457.378  21.386  "                         
## [14] " Residual                    1.985   1.409  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  25.6767     0.1494 171.915"                             
## [20] "Xs(lat)Fx1    -0.4224     0.3601  -1.173"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x5ae08598>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  25.6767     0.1494   171.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.964  8.964 2299  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.025   "                                        
## [22] "lmer.REML = 2.1804e+05  Scale est. = 1.9852    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_pop_lat_max_temp_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 223065.6"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-30.6825  -0.4150   0.0965   0.5336   4.7667 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.208   1.486  "                         
## [12] " genus         (Intercept)   2.315   1.522  "                         
## [13] " Xr            s(lat)      482.097  21.957  "                         
## [14] " Residual                    2.227   1.492  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  27.1886     0.1424   190.9"                             
## [20] "Xs(lat)Fx1     1.8764     0.3753     5.0"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_pop_lat_max_temp_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x332bf3e0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  27.1886     0.1424   190.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.963  8.963 1855  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0331   "                                      
## [22] "lmer.REML = 2.2307e+05  Scale est. = 2.227     n = 56210"
Visualize the results
# Find limits for colours of the plot
max_temp_min <- min(min(pop_sub_current$max_temp, na.rm = TRUE), min(pop_sub_future4C$max_temp,
    na.rm = TRUE), min(pop_arb_current$max_temp, na.rm = TRUE), min(pop_arb_future4C$max_temp,
    na.rm = TRUE), min(pop_pond_current$max_temp, na.rm = TRUE), min(pop_pond_future4C$max_temp,
    na.rm = TRUE))

max_temp_max <- max(max(pop_sub_current$max_temp, na.rm = TRUE), max(pop_sub_future4C$max_temp,
    na.rm = TRUE), max(pop_arb_current$max_temp, na.rm = TRUE), max(pop_arb_future4C$max_temp,
    na.rm = TRUE), max(pop_pond_current$max_temp, na.rm = TRUE), max(pop_pond_future4C$max_temp,
    na.rm = TRUE))
Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_future4C.rds")


pop_max_temp_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = max_temp),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = max_temp), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_sub_current, aes(x = lat, y = max_temp), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Body temperature") + ylim(max_temp_min, max_temp_max) +
    scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) +
    theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_max_temp_sub

Figure A19: Latitudinal variation in maximum operative body temperatures for amphibians on terrestrial conditions. Body temperatures are averaged across the the warmest quarters of 2006-2015. Blue ribbons and points depict body temperatures in current microclimates. Orange ribbons and points depict body temperatures in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict body temperatures in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Pond or wetland
# Load model predictions
pred_pond_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_future4C.rds")


pop_max_temp_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat,
    y = max_temp), colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = max_temp), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_pond_current, aes(x = lat, y = max_temp), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_pond_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Body temperature") + ylim(max_temp_min, max_temp_max) +
    scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) +
    theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_max_temp_pond

Figure A20: Latitudinal variation in maximum operative body temperatures for amphibians in water bodies. Body temperatures are averaged across the the warmest quarters of 2006-2015. Blue ribbons and points depict body temperatures in current microclimates. Orange ribbons and points depict body temperatures in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict body temperatures in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_future4C.rds")


pop_max_temp_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = max_temp),
    colour = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = max_temp), colour = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_arb_current, aes(x = lat, y = max_temp), colour = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Body temperature") + ylim(max_temp_min, max_temp_max) +
    scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) +
    theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_max_temp_arb

Figure A21: Latitudinal variation in maximum operative body temperatures for amphibians in above-ground vegetation. Body temperatures are averaged across the the warmest quarters of 2006-2015. Blue ribbons and points depict body temperatures in current microclimates. Orange ribbons and points depict body temperatures in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict body temperatures in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

All habitats
all_habitats <- (pop_max_temp_sub/pop_max_temp_pond/pop_max_temp_arb/plot_layout(ncol = 1))

all_habitats

Figure A22: Latitudinal variation in maximum operative body temperatures for amphibians on terrestrial conditions (top panel), in water bodies (middle panel) or in above-ground vegetation (bottom panel). Body temperatures are averaged across the the warmest quarters of 2006-2015. Blue ribbons and points depict body temperatures in current microclimates. Orange ribbons and points depict body temperatures in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict body temperatures in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean body temperature in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

plan(sequential) 

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(max_temp ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(max_temp_se):units, # Species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/max_temp/model_MCMCglmm_max_temp.rds")
saveRDS(predictions, file = "RData/Models/max_temp/predictions_MCMCglmm_max_temp.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(max_temp ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(max_temp_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/max_temp/model_MCMCglmm_max_temp_contrast.rds")
Subset of overheating populations

Here, we only focus on the populations that are predicted to overheat.

# Reload dataset without pond data
all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C")
)

# Filter to populations predicted to overheat
all_data$habitat_scenario <- as.character(all_data$habitat_scenario)
all_data$species <- all_data$tip.label
all_data <- filter(all_data, overheating_risk > 0)

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv

all_data <- as.data.frame(all_data)

# Run model
model_max_temp <- MCMCglmm(max_temp ~ habitat_scenario - 1, # No intercept
                           random = ~ species + tip.label + idh(max_temp_se):units, # Species, phylogenetic relatedness, and weights
                           ginverse=list(tip.label = Ainv),
                           singular.ok=TRUE,
                           prior = prior,
                           verbose=FALSE,
                           nitt = 600000,
                           thin = 500,
                           burnin = 100000,
                           data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_max_temp, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_max_temp, file = "RData/Models/max_temp/model_MCMCglmm_max_temp_overheating_pop.rds")
saveRDS(predictions, file = "RData/Models/max_temp/predictions_MCMCglmm_max_temp_overheating_pop.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/model_MCMCglmm_max_temp.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5936794 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.075    1.907    2.252    708.4
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.81    18.22    21.26    636.8
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.343    3.334    3.353     1000
## 
##  Location effects: max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       22.72    19.16    26.29     1000 <0.001
## habitat_scenarioarboreal_future2C      23.51    19.95    27.07     1000 <0.001
## habitat_scenarioarboreal_future4C      25.16    21.61    28.72     1000 <0.001
## habitat_scenariopond_current           21.54    17.99    25.11     1000 <0.001
## habitat_scenariopond_future2C          22.67    19.11    26.24     1000 <0.001
## habitat_scenariopond_future4C          24.50    20.94    28.07     1000 <0.001
## habitat_scenariosubstrate_current      23.20    19.64    26.77     1000 <0.001
## habitat_scenariosubstrate_future2C     24.05    20.50    27.62     1000 <0.001
## habitat_scenariosubstrate_future4C     25.83    22.27    29.40     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/max_temp/predictions_MCMCglmm_max_temp.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   22.72440  19.15780  26.28905
## 2  arboreal_future2C   23.52482  19.94505  27.07403
## 3  arboreal_future4C   25.16713  21.61498  28.72044
## 4       pond_current   21.55094  17.98937  25.11084
## 5      pond_future2C   22.67944  19.11084  26.24442
## 6      pond_future4C   24.50709  20.93759  28.07058
## 7  substrate_current   23.20207  19.64125  26.76607
## 8 substrate_future2C   24.06400  20.50457  27.62195
## 9 substrate_future4C   25.83500  22.27295  29.40320
# Model diagnostics
plot(model_MCMC_max_temp)

# Model summary (contrasts)
model_MCMC_max_temp_contrast <- readRDS("RData/Models/max_temp/model_MCMCglmm_max_temp_contrast.rds")

summary(model_MCMC_max_temp_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5936783 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.072    1.905    2.252    677.7
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.91    18.41    21.64    566.9
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.343    3.334    3.353     1000
## 
##  Location effects: max_temp ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              23.1623
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     -0.4780
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.3133
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     1.9616
## relevel(habitat_scenario, ref = "substrate_current")pond_current         -1.6561
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        -0.5244
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         1.3018
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.8587
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    2.6309
##                                                                        l-95% CI
## (Intercept)                                                             15.3956
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4981
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.2943
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.9414
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6681
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.5358
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.2880
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8464
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6184
##                                                                        u-95% CI
## (Intercept)                                                             29.2021
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4606
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.3322
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.9800
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6421
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.5104
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.3136
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8713
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6444
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      880.5
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     898.7
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         833.3
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    916.9
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating populations
# Model summary
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/model_MCMCglmm_max_temp_overheating_pop.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: -28244.81 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     0.366      0.2   0.5227     1000
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     3.476     2.49    4.461     1000
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units 0.0007174 0.000166 0.001472    232.4
## 
##  Location effects: max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       26.74    25.16    28.40     1000 <0.001
## habitat_scenarioarboreal_future2C      27.49    25.98    29.16     1000 <0.001
## habitat_scenarioarboreal_future4C      29.12    27.63    30.84     1000 <0.001
## habitat_scenariosubstrate_current      27.17    25.55    28.74     1000 <0.001
## habitat_scenariosubstrate_future2C     27.88    26.36    29.57     1000 <0.001
## habitat_scenariosubstrate_future4C     29.61    27.89    31.11     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/max_temp/predictions_MCMCglmm_max_temp_overheating_pop.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   26.75141  25.15519  28.40130
## 2  arboreal_future2C   27.50296  25.98381  29.16038
## 3  arboreal_future4C   29.14249  27.63151  30.84459
## 4  substrate_current   27.18328  25.54506  28.73786
## 5 substrate_future2C   27.90692  26.35833  29.56681
## 6 substrate_future4C   29.63061  27.89394  31.10604
# Model diagnostics
plot(model_MCMC_max_temp)

Community-level patterns

Load the data

community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate community-level latitudinal patterns in max_temp using generalized additive models.

Run the models
# Function to run community-level max_temp models in parallel
run_community_max_temp_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(community_max_temp ~ s(lat, bs = "tp"), data = data, weights = 1/(data$community_max_temp_se^2),
        REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        community_max_temp = NA, community_max_temp_se = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$max_temp_pred <- pred$fit
    new_data$max_temp_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = max_temp_pred + 1.96 * max_temp_pred_se,
        lower = max_temp_pred - 1.96 * max_temp_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/max_temp/summary_GAM_community_lat_max_temp_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/max_temp/summary_MER_community_lat_max_temp_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/max_temp/predictions_community_lat_max_temp_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, pond_current = community_pond_current,
    pond_future2C = community_pond_future2C, pond_future4C = community_pond_future4C,
    substrate_current = community_sub_current, substrate_future2C = community_sub_future2C,
    substrate_future4C = community_sub_future4C)

plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_max_temp_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_substrate_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 76280.3"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-18.9559  -0.2432   0.2540   0.5634   2.4507 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 779.440  27.918  "           
## [12] " Residual          5.514   2.348  "           
## [13] "Number of obs: 14090, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 20.45121    0.03441 594.308"     
## [18] "Xs(lat)Fx1   -0.49862    1.04246  -0.478"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.025 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0xaa0a8c8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 20.45121    0.03441   594.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.933  8.933 3372  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.651   "                                        
## [22] "lmer.REML =  76280  Scale est. = 5.5136    n = 14090"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_substrate_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 79187.2"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-16.9858  -0.0940   0.3436   0.6276   2.0129 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 455.891  21.35   "           
## [12] " Residual          7.234   2.69   "           
## [13] "Number of obs: 14090, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 20.95077    0.03746 559.285"     
## [18] "Xs(lat)Fx1    2.81709    1.15096   2.448"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.041 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0x128dc918>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 20.95077    0.03746   559.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.862  8.862 3085  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.646   "                                        
## [22] "lmer.REML =  79187  Scale est. = 7.2341    n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_substrate_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 80365.2"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-12.9765  -0.0487   0.3682   0.6497   2.3408 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 498.28   22.322  "           
## [12] " Residual          7.77    2.787  "           
## [13] "Number of obs: 14090, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 22.91772    0.03907 586.550"     
## [18] "Xs(lat)Fx1    0.24259    1.17353   0.207"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0x9c0e8d8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 22.91772    0.03907   586.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.866  8.866 2710  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.626   "                                        
## [22] "lmer.REML =  80365  Scale est. = 7.7697    n = 14090"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_pond_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 83552.3"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-16.7537  -0.3939   0.0719   0.3921   3.6539 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 1331.12  36.485  "           
## [12] " Residual          17.99   4.241  "           
## [13] "Number of obs: 14091, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 19.21680    0.04883 393.522"     
## [18] "Xs(lat)Fx1    8.03832    1.28371   6.262"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.118 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_pond_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0xacce950>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 19.21680    0.04883   393.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.921  8.921 1986  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.467   "                                        
## [22] "lmer.REML =  83552  Scale est. = 17.989    n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_pond_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 82957.3"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-17.0858  -0.3930   0.0936   0.4205   3.4156 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 1166.37  34.152  "           
## [12] " Residual          16.76   4.094  "           
## [13] "Number of obs: 14091, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 20.49940    0.04705 435.692"     
## [18] "Xs(lat)Fx1    9.00629    1.22893   7.329"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.120 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_pond_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0x128da9f8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 20.49940    0.04705   435.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.915  8.915 1987  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.473   "                                        
## [22] "lmer.REML =  82957  Scale est. = 16.761    n = 14091"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_pond_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 82570.9"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-18.9800  -0.3712   0.1147   0.4776   3.2787 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 1113.54  33.370  "           
## [12] " Residual          15.65   3.956  "           
## [13] "Number of obs: 14091, groups:  Xr, 8"         
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 22.45544    0.04515 497.343"     
## [18] "Xs(lat)Fx1   10.29001    1.17366   8.767"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.111 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_pond_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0xa4757a8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 22.45544    0.04515   497.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.916  8.916 1954  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.482   "                                        
## [22] "lmer.REML =  82571  Scale est. = 15.649    n = 14091"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_arboreal_current.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 31283.5"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-15.6594  -0.2968   0.2176   0.5870   2.0863 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 394.100  19.852  "           
## [12] " Residual          7.072   2.659  "           
## [13] "Number of obs: 6614, groups:  Xr, 8"          
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 24.08189    0.03506 686.861"     
## [18] "Xs(lat)Fx1   -0.63100    1.60740  -0.393"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.064 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0xaf49828>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 24.08189    0.03506   686.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.692  8.692 630.6  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.428   "                                        
## [22] "lmer.REML =  31283  Scale est. = 7.0717    n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_arboreal_future2C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 31158.6"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-14.2020  -0.2453   0.2434   0.6171   2.6053 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 1218.765 34.911  "           
## [12] " Residual           7.505  2.739  "           
## [13] "Number of obs: 6614, groups:  Xr, 8"          
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "              Estimate Std. Error t value"    
## [17] "X(Intercept)  24.86782    0.03491 712.302"    
## [18] "Xs(lat)Fx1   -11.36821    1.57286  -7.228"    
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 -0.005"
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0x848f210>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 24.86782    0.03491   712.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.901  8.901 682.5  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.469   "                                        
## [22] "lmer.REML =  31159  Scale est. = 7.5048    n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/summary_MER_community_lat_max_temp_arboreal_future4C.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"   
##  [2] ""                                             
##  [3] "REML criterion at convergence: 32909.5"       
##  [4] ""                                             
##  [5] "Scaled residuals: "                           
##  [6] "     Min       1Q   Median       3Q      Max "
##  [7] "-22.7369  -0.1295   0.3087   0.6779   1.7389 "
##  [8] ""                                             
##  [9] "Random effects:"                              
## [10] " Groups   Name   Variance Std.Dev."           
## [11] " Xr       s(lat) 559.572  23.655  "           
## [12] " Residual          9.614   3.101  "           
## [13] "Number of obs: 6614, groups:  Xr, 8"          
## [14] ""                                             
## [15] "Fixed effects:"                               
## [16] "             Estimate Std. Error t value"     
## [17] "X(Intercept) 26.36339    0.04024  655.11"     
## [18] "Xs(lat)Fx1    7.97956    1.88186    4.24"     
## [19] ""                                             
## [20] "Correlation of Fixed Effects:"                
## [21] "           X(Int)"                            
## [22] "Xs(lat)Fx1 0.100 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/summary_GAM_community_lat_max_temp_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "community_max_temp ~ s(lat, bs = \"tp\")"                      
##  [7] "<environment: 0x1216ade8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 26.36339    0.04024   655.1   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.712  8.712 404.2  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.355   "                                        
## [22] "lmer.REML =  32910  Scale est. = 9.6136    n = 6614"
Visualize the results

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_sub_current)


# Find limits for colours of the plot
max_temp_min <- min(min(community_sub_current$community_max_temp, na.rm = TRUE),
    min(community_sub_future4C$community_max_temp, na.rm = TRUE), min(community_arb_current$community_max_temp,
        na.rm = TRUE), min(community_arb_future4C$community_max_temp, na.rm = TRUE),
    min(community_pond_current$community_max_temp, na.rm = TRUE), min(community_pond_future4C$community_max_temp,
        na.rm = TRUE))

max_temp_max <- max(max(community_sub_current$community_max_temp, na.rm = TRUE),
    max(community_sub_future4C$community_max_temp, na.rm = TRUE), max(community_arb_current$community_max_temp,
        na.rm = TRUE), max(community_arb_future4C$community_max_temp, na.rm = TRUE),
    max(community_pond_current$community_max_temp, na.rm = TRUE), max(community_pond_future4C$community_max_temp,
        na.rm = TRUE))
Vegetated substrate
# Current
map_sub_max_temp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_sub_current, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", name = "Body temperature",
    na.value = "gray1", breaks = seq(-5, 35, by = 10), limits = c(max_temp_min, max_temp_max),
    begin = 0, end = 1) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))

# Future +2C
map_sub_max_temp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_sub_future2C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_max_temp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_sub_future4C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_future4C.rds")

lat_sub_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = community_max_temp),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_sub_future2C,
    aes(x = lat, y = community_max_temp), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_sub_current, aes(x = lat, y = community_max_temp),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, max_temp_max) + xlab("") +
    ylab("Body temperature") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_max_temp_current + map_sub_max_temp_future2C + map_sub_max_temp_future4C +
    lat_sub_all + plot_layout(ncol = 4))

substrate_plot

Figure A23: Community-level patterns in maximum operative body temperatures for amphibians on terrestrial conditions. Body temperatures were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in max_temp in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Pond or wetland
# Current
map_pond_max_temp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_current, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", name = "Body temperature",
    na.value = "gray1", breaks = seq(-5, 35, by = 10), limits = c(max_temp_min, max_temp_max),
    begin = 0, end = 1) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_pond_max_temp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_future2C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_pond_max_temp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_pond_future4C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_pond_current <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_current.rds")
pred_community_pond_future2C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_future2C.rds")
pred_community_pond_future4C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_substrate_future4C.rds")

lat_pond_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_pond_future4C, aes(x = lat, y = community_max_temp),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_pond_future2C,
    aes(x = lat, y = community_max_temp), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_pond_current, aes(x = lat, y = community_max_temp),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_pond_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, max_temp_max) + xlab("") +
    ylab("Body temperature") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

pond_plot <- (map_pond_max_temp_current + map_pond_max_temp_future2C + map_pond_max_temp_future4C +
    lat_pond_all + plot_layout(ncol = 4))

pond_plot

Figure A24: Community-level patterns in maximum operative body temperatures for amphibians in water bodies. Body temperatures were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in max_temp in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Above-ground vegetation
# Current
map_arb_max_temp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_arb_current, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", name = "Body temperature",
    na.value = "gray1", breaks = seq(-5, 35, by = 10), limits = c(max_temp_min, max_temp_max),
    begin = 0, end = 1) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))

# Future +2C
map_arb_max_temp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_arb_future2C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_max_temp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray",
    linetype = "dashed", size = 0.5) + geom_sf(data = world, fill = "black", col = "black") +
    geom_sf(data = community_arb_future4C, aes(fill = community_max_temp), color = NA,
        alpha = 1) + coord_sf(ylim = c(-55.00099, 72.00064), xlim = c(-166.82905,
    178.56617)) + scale_fill_viridis(option = "rocket", na.value = "gray1", breaks = seq(-5,
    35, by = 10), limits = c(max_temp_min, max_temp_max), begin = 0, end = 1) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "bottom", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/max_temp/predictions_community_lat_max_temp_arboreal_future4C.rds")

lat_arb_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = community_max_temp),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_arb_future2C,
    aes(x = lat, y = community_max_temp), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_arb_current, aes(x = lat, y = community_max_temp),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + xlim(-55.00099, 72.00064) + ylim(0, max_temp_max) + xlab("") +
    ylab("max_temp") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 12), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_max_temp_current + map_arb_max_temp_future2C + map_arb_max_temp_future4C +
    lat_arb_all + plot_layout(ncol = 4))

arboreal_plot

Figure A25: Community-level patterns in maximum operative body temperatures for amphibians in above-ground vegetation. Body temperatures were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in max_temp in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

All habitats
all_habitats <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

Figure A26: Community-level patterns in maximum operative body temperatures for amphibians on terrestrial conditions (top row), in water bodies (middle row), or in above-ground vegetation (bottom row). Body temperatures were averaged within communities (1-degree grid cells). The first column refer to current climates (blue), the middle column assume +2C of warming above pre-industrial levels (orange), and the right column assume +4C of warming above pre-industrial levels (pink). The right panel depicts latitudinal patterns in max_temp in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (pink). Black colour depicts areas with no data.

Bayesian linear mixed models

Here, we used Bayesian linear mixed models to estimate the mean thermal safety margin in each microhabitat and climatic scenario. These models account for the different degrees of phylogenetic relatedness and decompose sources of variation among species.

Run the models
Full dataset
all_community_data <- bind_rows(
  community_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  community_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  community_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  community_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  community_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  community_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  community_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  community_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  community_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

all_community_data <- as.data.frame(all_community_data)

prior_community  <- list(R = list(V = 1, nu = 0.002), 
                         G = list(G4 = list(V = 1, fix = 1)))

# Intercept-less model 
model_MCMC_community <- MCMCglmm(community_max_temp ~ habitat_scenario - 1, # No intercept
                                 random = ~ idh(community_max_temp_se):units, 
                                 singular.ok=TRUE,
                                 prior = prior_community,
                                 verbose=FALSE,
                                 data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC_community, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_community_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC_community, file = "RData/Models/max_temp/model_MCMCglmm_community_max_temp.rds")
saveRDS(predictions, file = "RData/Models/max_temp/predictions_MCMCglmm_community_max_temp.rds")


# Contrast 
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_MCMC_community_contrast <- MCMCglmm(community_max_temp ~ relevel(habitat_scenario, ref = "substrate_current"), # Contrast
                                          random = ~ idh(community_max_temp_se):units, 
                                          singular.ok=TRUE,
                                          prior = prior_community,
                                          verbose=FALSE,
                                          data = all_community_data)

saveRDS(model_MCMC_community_contrast, file = "RData/Models/max_temp/model_MCMCglmm_community_max_temp_contrast.rds")
Subset of overheating communities

Here, we only focus on the communities that are predicted to overheat.

# Reload dataset without pond data
all_community_data <- bind_rows(
  community_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  community_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  community_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  community_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  community_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  community_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C")
)

# Filter to overheating communities 
all_community_data$habitat_scenario <- as.character(all_community_data$habitat_scenario)

all_community_data <- filter(all_community_data, n_species_overheating > 0)

model_max_temp_community <- MCMCglmm(community_max_temp ~ habitat_scenario - 1, # No intercept
                                     random = ~ idh(community_max_temp_se):units, 
                                     singular.ok=TRUE,
                                     prior = prior_community,
                                     verbose=FALSE,
                                     nitt = 600000,
                                     thin = 500,
                                     burnin = 100000,
                                     data = all_community_data)

# Get predictions
predictions <- data.frame(emmeans(model_max_temp_community, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_community_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_max_temp_community, file = "RData/Models/max_temp/model_MCMCglmm_community_max_temp_overheating_communities.rds")
saveRDS(predictions, file = "RData/Models/max_temp/predictions_MCMCglmm_community_max_temp_overheating_communities.rds")
Model summaries
Full dataset
# Model summary
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/model_MCMCglmm_community_max_temp.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 653132.7 
## 
##  G-structure:  ~idh(community_max_temp_se):units
## 
##                             post.mean l-95% CI u-95% CI eff.samp
## community_max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     27.91    27.63    28.17     1000
## 
##  Location effects: community_max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       24.37    24.23    24.49   1000.0 <0.001
## habitat_scenarioarboreal_future2C      25.33    25.20    25.47   1000.0 <0.001
## habitat_scenarioarboreal_future4C      27.23    27.11    27.37   1000.0 <0.001
## habitat_scenariopond_current           19.16    19.08    19.26    781.2 <0.001
## habitat_scenariopond_future2C          20.47    20.37    20.55   1000.0 <0.001
## habitat_scenariopond_future4C          22.55    22.46    22.63   1000.0 <0.001
## habitat_scenariosubstrate_current      21.43    21.34    21.52   1000.0 <0.001
## habitat_scenariosubstrate_future2C     22.57    22.46    22.65   1000.0 <0.001
## habitat_scenariosubstrate_future4C     24.75    24.65    24.84   1000.0 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/max_temp/predictions_MCMCglmm_community_max_temp.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   24.36436  24.23064  24.48986
## 2  arboreal_future2C   25.33354  25.19825  25.46742
## 3  arboreal_future4C   27.23478  27.11246  27.36713
## 4       pond_current   19.16425  19.07934  19.25729
## 5      pond_future2C   20.46822  20.37069  20.55438
## 6      pond_future4C   22.55194  22.45972  22.63010
## 7  substrate_current   21.43123  21.33784  21.51840
## 8 substrate_future2C   22.56827  22.46491  22.65494
## 9 substrate_future4C   24.74836  24.65465  24.83646
# Model diagnostics
plot(model_MCMC_max_temp)

# Model summary (contrasts)
model_MCMC_max_temp_contrast <- readRDS("RData/Models/max_temp/model_MCMCglmm_community_max_temp_contrast.rds")

summary(model_MCMC_max_temp_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 653133 
## 
##  G-structure:  ~idh(community_max_temp_se):units
## 
##                             post.mean l-95% CI u-95% CI eff.samp
## community_max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units      27.9    27.64    28.16    909.5
## 
##  Location effects: community_max_temp ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              21.4305
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      2.9358
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     3.8997
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     5.7983
## relevel(habitat_scenario, ref = "substrate_current")pond_current         -2.2688
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        -0.9656
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         1.1181
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    1.1356
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    3.3191
##                                                                        l-95% CI
## (Intercept)                                                             21.3395
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     2.7735
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    3.7410
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    5.6434
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -2.3894
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -1.0894
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.0028
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.9810
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   3.1890
##                                                                        u-95% CI
## (Intercept)                                                             21.5232
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     3.1053
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    4.0612
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    5.9529
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -2.1302
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.8262
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.2656
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1.2548
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   3.4538
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      888.9
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1158.1
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1000.0
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Subset of overheating communities
# Model summary
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/model_MCMCglmm_community_max_temp_overheating_communities.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 100001:599501
##  Thinning interval  = 500
##  Sample size  = 1000 
## 
##  DIC: 6086.701 
## 
##  G-structure:  ~idh(community_max_temp_se):units
## 
##                             post.mean l-95% CI u-95% CI eff.samp
## community_max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     0.324   0.2284   0.4276     1000
## 
##  Location effects: community_max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       28.35    28.14    28.60     1072 <0.001
## habitat_scenarioarboreal_future2C      29.07    28.90    29.27     1113 <0.001
## habitat_scenarioarboreal_future4C      30.67    30.55    30.78     1096 <0.001
## habitat_scenariosubstrate_current      28.15    28.01    28.30     1000 <0.001
## habitat_scenariosubstrate_future2C     28.82    28.71    28.94     1000 <0.001
## habitat_scenariosubstrate_future4C     30.43    30.35    30.50     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model prediction
print(readRDS("RData/Models/max_temp/predictions_MCMCglmm_community_max_temp_overheating_communities.rds"))
##     habitat_scenario prediction lower.HPD upper.HPD
## 1   arboreal_current   28.35683  28.13941  28.59862
## 2  arboreal_future2C   29.07454  28.89560  29.27142
## 3  arboreal_future4C   30.66472  30.54688  30.77873
## 4  substrate_current   28.14615  28.00520  28.30060
## 5 substrate_future2C   28.82329  28.70738  28.94337
## 6 substrate_future4C   30.43003  30.35355  30.50219
# Model diagnostics
plot(model_MCMC_max_temp)

Overheating risk

Here, we investigate the variation in overheating risk across microhabitats and climatic scenarios. Note that none of the populations were predicted to overheat in water bodies.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_overheating_risk.R and the resources used in pbs/Models/Running_models_overheating_risk.pbs

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in overheating risk using generalized additive models. These models do not account for the phylogenetic relatedness between species, yet they are better at capturing non-linear patterns with latitude. While we could have fitted models with smooth terms using brms or stan, these models exceeded our computational capacities.

Run the models

run_overheating_risk_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(overheating_risk ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        overheating_risk = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_overheating_risk_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  5371.4   5422.6  -2680.7   5361.4   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-1.861 -0.001 -0.001  0.000 50.589 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   98.004  9.900  "                          
## [15] " genus         (Intercept)    2.151  1.467  "                          
## [16] " Xr            s(lat)      2103.476 45.864  "                          
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -15.0293     0.5022  -29.93   <2e-16 ***"                 
## [22] "Xs(lat)Fx1     0.6194     4.4149    0.14    0.888    "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.050 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xf814e80>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -15.0293     0.9464  -15.88   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq p-value    "                         
## [17] "s(lat) 7.51   7.51  178.4  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.7e-05   "                                     
## [22] "glmer.ML = 4564.6  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  8751.3   8802.4  -4370.7   8741.3   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-2.7836 -0.0024 -0.0016 -0.0010 28.4365 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)  84.243   9.178  "                          
## [15] " genus         (Intercept)   1.012   1.006  "                          
## [16] " Xr            s(lat)      788.750  28.085  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -13.6662     0.3834 -35.643   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    -0.9500     3.9997  -0.238    0.812    "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.001"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x10768188>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -13.6662     0.6669  -20.49   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.601  7.601  284.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.65e-05   "                                    
## [22] "glmer.ML = 7511.9  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 21242.5  21293.7 -10616.3  21232.5   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-5.854 -0.044 -0.015 -0.005 37.848 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   9.487   3.080  "                          
## [15] " genus         (Intercept)  13.454   3.668  "                          
## [16] " Xr            s(lat)      639.606  25.290  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -10.0280     0.3434 -29.198  < 2e-16 ***"                 
## [22] "Xs(lat)Fx1     7.2689     2.1529   3.376 0.000735 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.002"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x11352b88>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -10.0280     0.3323  -30.18   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.296  8.296  992.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -1.06e-05   "                                    
## [22] "glmer.ML =  18587  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1008.9   1053.6   -499.5    998.9    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-0.8527 -0.0007 -0.0004  0.0000 16.3198 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept) 132.617  11.516  "                         
## [15] " genus         (Intercept)   4.825   2.197  "                         
## [16] " Xr            s(lat)      922.481  30.372  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -19.328      1.591 -12.151   <2e-16 ***"                
## [22] "Xs(lat)Fx1     -2.701      5.480  -0.493    0.622    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.392 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xe2ce220>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -19.328      3.608  -5.357 8.44e-08 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq  p-value    "                       
## [17] "s(lat) 2.787  2.787  28.39 2.52e-06 ***"                       
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.91e-05   "                                    
## [22] "glmer.ML = 879.61  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1487.3   1532.0   -738.6   1477.3    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.1712 -0.0003 -0.0001  0.0000 18.5221 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept)    459.02  21.425 "                        
## [15] " genus         (Intercept)     14.24   3.773 "                        
## [16] " Xr            s(lat)      237193.94 487.026 "                        
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -41.771      1.269  -32.91   <2e-16 ***"                
## [22] "Xs(lat)Fx1    -38.106      2.151  -17.72   <2e-16 ***"                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.257 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xeae4fe8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -41.771      8.981  -4.651  3.3e-06 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.447  5.447  97.76  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -9.68e-05   "                                    
## [22] "glmer.ML = 1288.9  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/summary_MER_pop_lat_overheating_risk_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  3416.6   3461.3  -1703.3   3406.6    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.4706 -0.0023 -0.0016 -0.0004 29.6878 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)   98.495  9.924  "                         
## [15] " genus         (Intercept)    1.293  1.137  "                         
## [16] " Xr            s(lat)      5935.534 77.042  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -14.4999     0.7147 -20.289   <2e-16 ***"                
## [22] "Xs(lat)Fx1    -4.1582     5.5009  -0.756     0.45    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.042 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/summary_GAM_pop_lat_overheating_risk_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xf997158>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -14.50       1.31  -11.07   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 6.415  6.415  137.9  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.00011   "                                     
## [22] "glmer.ML = 2969.3  Scale est. = 1         n = 56210"

Visualize the results

Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_substrate_future4C.rds")


pop_overheating_risk_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat,
    y = overheating_risk), colour = "#EF4187", shape = 20, alpha = 0.85, size = 2,
    position = position_jitter(width = 0.25, height = 0.025)) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = overheating_risk), colour = "#FAA43A", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.025)) + geom_point(data = pop_sub_current,
    aes(x = lat, y = overheating_risk), colour = "#5DC8D9", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.025)) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Overheating risk") + ylim(0, 1) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_overheating_risk_sub

Figure A27: Latitudinal variation in overheating risk for amphibians on terrestrial conditions. Overheating risk represents the probability (0-1) that a population exceeds its physiological limits at least once in the 910 days investigated. Blue ribbons and points depict overheating_risk in current microclimates. Orange ribbons and points depict overheating_risk in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_risk in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/overheating_risk/predictions_pop_lat_overheating_risk_arboreal_future4C.rds")


pop_overheating_risk_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat,
    y = overheating_risk), colour = "#EF4187", shape = 20, alpha = 0.85, size = 2,
    position = position_jitter(width = 0.25, height = 0.025)) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = overheating_risk), colour = "#FAA43A", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.025)) + geom_point(data = pop_arb_current,
    aes(x = lat, y = overheating_risk), colour = "#5DC8D9", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.025)) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Overheating risk") + ylim(0, 1) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_overheating_risk_arb

Figure A28: Latitudinal variation in overheating risk for amphibians in above ground vegetation. Overheating risk represents the probability (0-1) that a population exceeds its physiological limits at least once in the 910 days investigated. Blue ribbons and points depict overheating_risk in current microclimates. Orange ribbons and points depict overheating_risk in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_risk in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

All habitats
all_habitats <- (pop_overheating_risk_sub/pop_overheating_risk_arb/plot_layout(ncol = 1))

all_habitats

Figure A29: Latitudinal variation in overheating risk for amphibians on terrestrial conditions (top row) or in above ground vegetation (bottom row). Overheating risk represents the probability (0-1) that a population exceeds its physiological limits at least once in the 910 days investigated. Blue ribbons and points depict overheating_risk in current microclimates. Orange ribbons and points depict overheating_risk in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_risk in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Linear mixed models

Here, we used linear mixed models to estimate the mean overheating risk in each microhabitat and climatic scenario. Note that we could not use bayesian linear mixed models because the models failed to mix, even after hundreds of thousands of iterations. These models therefore do not account for variation due to phylogeny, and confidence intervals are likely to be wider than predicted.

Run the models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model
model_risk <- glmer(overheating_risk ~ habitat_scenario - 1 + (1 | genus/species),
    family = "binomial", control = glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb")),
    data = all_data)

# Get predictions
predictions <- as.data.frame(ggpredict(model_risk, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model and predictions
saveRDS(model_risk, file = "RData/Models/overheating_risk/model_lme4_overheating_risk.rds")
saveRDS(predictions, file = "RData/Models/overheating_risk/predictions_lme4_overheating_risk.rds")

#### Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# Run model
model_risk_contrast <- glmer(overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "binomial", control = glmerControl(optimizer = "optimx",
    optCtrl = list(method = "nlminb")), data = all_data)

# Save model
saveRDS(model_risk_contrast, file = "RData/Models/overheating_risk/model_lme4_overheating_risk_contrast.rds")

Model summaries

# Model summary
model_overheating_risk <- readRDS("RData/Models/overheating_risk/model_lme4_overheating_risk.rds")
summary(model_overheating_risk)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: overheating_risk ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  42530.0  42622.5 -21257.0  42514.0   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -2.622 -0.014 -0.002 -0.001 48.777 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 69.6532  8.3458  
##  genus         (Intercept)  0.3059  0.5531  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -14.5562     0.3125  -46.58   <2e-16 ***
## habitat_scenarioarboreal_future2C  -13.8376     0.2981  -46.42   <2e-16 ***
## habitat_scenarioarboreal_future4C  -12.5010     0.2976  -42.01   <2e-16 ***
## habitat_scenariosubstrate_current  -13.8170     0.2953  -46.79   <2e-16 ***
## habitat_scenariosubstrate_future2C -13.1571     0.2937  -44.80   <2e-16 ***
## habitat_scenariosubstrate_future4C -11.6082     0.2922  -39.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.938                                                            
## hbtt_scnrr_4C 0.949       0.963                                                
## hbtt_scnrs_   0.950       0.964         0.977                                  
## hbtt_scnrs_2C 0.952       0.967         0.980         0.986                    
## hbtt_scnrs_4C 0.954       0.969         0.982         0.989       0.992
# Model predictions
print(readRDS("RData/Models/overheating_risk/predictions_lme4_overheating_risk.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 4.767802e-07 0.3124954 2.584174e-07 8.796596e-07
## 2  arboreal_future2C 9.781078e-07 0.2980960 5.453146e-07 1.754390e-06
## 3  arboreal_future4C 3.722807e-06 0.2975650 2.077703e-06 6.670478e-06
## 4  substrate_current 9.985227e-07 0.2953044 5.597507e-07 1.781235e-06
## 5 substrate_future2C 1.931620e-06 0.2936826 1.086273e-06 3.434820e-06
## 6 substrate_future4C 9.090918e-06 0.2921752 5.127545e-06 1.611776e-05
# Model summary (contrasts)
model_overheating_risk_contrast <- readRDS("RData/Models/overheating_risk/model_lme4_overheating_risk_contrast.rds")

summary(model_overheating_risk_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  42530.0  42622.5 -21257.0  42514.0   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -2.622 -0.014 -0.002 -0.001 48.777 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 69.6531  8.3458  
##  genus         (Intercept)  0.3059  0.5531  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -13.81696
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.73922
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.02065
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.31597
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.65985
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.20877
##                                                                        Std. Error
## (Intercept)                                                               0.27087
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.09717
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.07987
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.06421
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.04859
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.04395
##                                                                        z value
## (Intercept)                                                            -51.010
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -7.608
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.259
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   20.493
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  13.579
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  50.254
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   2.79e-14
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.796
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.065             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.077  0.263      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.088  0.315      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.102  0.303      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.131  0.319      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.384                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.371                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.392                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.461                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.500                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.690

Overheating days

Here, we investigate the variation in overheating days across microhabitats and climatic scenarios. Note that none of the populations were predicted to overheat in water bodies (except 11 species in high warming projections).

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_overheating_days.R and the resources used in pbs/Models/Running_models_overheating_days.pbs

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in overheating days using generalized additive models. These models do not account for the phylogenetic relatedness between species, yet they are better at capturing non-linear patterns with latitude. While we could have fitted models with smooth terms using brms or stan, these models exceeded our computational capacities.

Run the models

run_overheating_days_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)
    dataset$overheating_days <- round(dataset$overheating_days)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(dataset$lat), max(dataset$lat), length = 1000),
        overheating_days = NA, genus = NA, species = NA)

    # Apply filter for arboreal_future4C scenario
    if (habitat_scenario == "arboreal_future4C") {
        dataset <- dataset %>%
            filter(lat >= -45 & lat <= 45)  # Model does not run with full range of latitudes for this dataset
    }

    data <- dataset

    # Run model
    model <- gamm4::gamm4(overheating_days ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, family = binomial(), REML = TRUE)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_days_pred <- pred$fit
    new_data$overheating_days_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_days_pred + 1.96 * overheating_days_pred_se,
        lower = overheating_days_pred - 1.96 * overheating_days_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_days/predictions_pop_lat_overheating_days_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_overheating_days_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 14861.5  14912.6  -7425.7  14851.5   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-1.712 -0.005 -0.002 -0.001 39.337 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance  Std.Dev."                         
## [14] " species:genus (Intercept)   66.1243  8.1317 "                         
## [15] " genus         (Intercept)    0.7806  0.8835 "                         
## [16] " Xr            s(lat)      3721.0636 61.0005 "                         
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -12.7836     0.3358  -38.06   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    24.8491     1.8158   13.69   <2e-16 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.040"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xc69c930>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -12.7836     0.5044  -25.34   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.527  8.527  541.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.17e-05   "                                    
## [22] "glmer.ML =   9195  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 23947.5  23998.7 -11968.8  23937.5   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-2.2693 -0.0451 -0.0039 -0.0021 23.7539 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance  Std.Dev."                         
## [14] " species:genus (Intercept)   56.3964  7.5098 "                         
## [15] " genus         (Intercept)    0.4728  0.6876 "                         
## [16] " Xr            s(lat)      9607.2612 98.0166 "                         
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -11.9316     0.2916  -40.91   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    45.4426     2.6288   17.29   <2e-16 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.133 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xff68180>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -11.9316     0.3827  -31.18   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.824  8.824   1130  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.36e-05   "                                    
## [22] "glmer.ML =  15227  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 86407.6  86458.8 -43198.8  86397.6   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-7.613 -0.105 -0.041 -0.014 43.656 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)    7.535  2.745  "                          
## [15] " genus         (Intercept)   11.626  3.410  "                          
## [16] " Xr            s(lat)      4095.733 63.998  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "               Estimate Std. Error z value Pr(>|z|)    "               
## [21] "X(Intercept) -8.4341302  0.0001158  -72840   <2e-16 ***"               
## [22] "Xs(lat)Fx1   30.4489755  0.0001176  258838   <2e-16 ***"               
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.000 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x20644f30>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -8.4341     0.2629  -32.08   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.951  8.951   6624  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.18e-05   "                                    
## [22] "glmer.ML =  63919  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  2505.7   2550.4  -1247.8   2495.7    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.1219 -0.0011 -0.0008 -0.0001 17.6245 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)  128.98  11.357  "                         
## [15] " genus         (Intercept)    3.14   1.772  "                         
## [16] " Xr            s(lat)      4887.67  69.912  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -17.0116     0.9006 -18.889   <2e-16 ***"                
## [22] "Xs(lat)Fx1     4.2675     3.0198   1.413    0.158    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.018 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xcf9dff8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -17.012      2.515  -6.764 1.35e-11 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.701  4.701  110.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -8.3e-05   "                                     
## [22] "glmer.ML = 1453.9  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  4007.2   4051.9  -1998.6   3997.2    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "   Min     1Q Median     3Q    Max "                                  
## [10] "-1.313 -0.014 -0.004 -0.001 97.169 "                                  
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)   13.01   3.607  "                         
## [15] " genus         (Intercept)   18.70   4.325  "                         
## [16] " Xr            s(lat)      6971.56  83.496  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "               Estimate Std. Error z value Pr(>|z|)    "              
## [21] "X(Intercept) -14.981012   0.000356  -42081   <2e-16 ***"              
## [22] "Xs(lat)Fx1    -0.766909   0.000356   -2154   <2e-16 ***"              
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.000 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xff07dd8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -14.981      1.788   -8.38   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.974  4.974  159.8  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -6.96e-05   "                                    
## [22] "glmer.ML = 2359.4  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/summary_MER_pop_lat_overheating_days_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] " 13732.7  13777.3  -6861.4  13722.7    55424 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "   Min     1Q Median     3Q    Max "                                  
## [10] "-4.278 -0.069 -0.007 -0.002 74.160 "                                  
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept)   47.8929  6.9205 "                        
## [15] " genus         (Intercept)    0.3517  0.5931 "                        
## [16] " Xr            s(lat)      3847.9852 62.0321 "                        
## [17] "Number of obs: 55429, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -11.4556     0.5059  -22.64   <2e-16 ***"                
## [22] "Xs(lat)Fx1   -16.1371     1.2972  -12.44   <2e-16 ***"                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.044 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/summary_GAM_pop_lat_overheating_days_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x14e78d50>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -11.4556     0.6105  -18.76   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.062  8.062  676.9  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.000143   "                                    
## [22] "glmer.ML = 9759.9  Scale est. = 1         n = 55429"

Visualize the results

Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_substrate_future4C.rds")


pop_overheating_days_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat,
    y = overheating_days), colour = "#EF4187", shape = 20, alpha = 0.85, size = 2,
    position = position_jitter(width = 0.25, height = 0.25)) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = overheating_days), colour = "#FAA43A", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.25)) + geom_point(data = pop_sub_current,
    aes(x = lat, y = overheating_days), colour = "#5DC8D9", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.25)) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Overheating days") + ylim(0, 131) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_overheating_days_sub

Figure A30: Latitudinal variation in overheating days for amphibians on terrestrial conditions. Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/overheating_days/predictions_pop_lat_overheating_days_arboreal_future4C.rds")


pop_overheating_days_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat,
    y = overheating_days), colour = "#EF4187", shape = 20, alpha = 0.85, size = 2,
    position = position_jitter(width = 0.25, height = 0.25)) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = overheating_days), colour = "#FAA43A", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.25)) + geom_point(data = pop_arb_current,
    aes(x = lat, y = overheating_days), colour = "#5DC8D9", shape = 20, alpha = 0.85,
    size = 2, position = position_jitter(width = 0.25, height = 0.25)) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("Overheating days") + ylim(0, 131) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

pop_overheating_days_arb

Figure A31: Latitudinal variation in overheating days for amphibians in above ground vegetation. Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

All habitats
all_habitats <- (pop_overheating_days_sub/pop_overheating_days_arb/plot_layout(ncol = 1))

all_habitats

Figure A32: Latitudinal variation in overheating days for amphibians on terrestrial conditions (top row) or in above ground vegetation (bottom row). Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from generalised additive mixed models.

Linear mixed models

Here, we used linear mixed models to estimate the mean number of overheating days in each microhabitat and climatic scenario. Note that we could not use bayesian linear mixed models because the models failed to mix, even after hundreds of thousands of iterations. These models therefore do not account for variation due to phylogeny, and confidence intervals are likely to be wider than predicted.

Run the models

Full dataset
all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)
all_data$overheating_days <- round(all_data$overheating_days)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model Note that this model fails if we add an observation-level random
# effect
model_days <- glmer(overheating_days ~ habitat_scenario - 1 + (1 | genus/species),
    family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05)),
    data = all_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_days, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)


# Save model and predictions
saveRDS(model_days, file = "RData/Models/overheating_days/model_lme4_overheating_days.rds")
saveRDS(predictions, file = "RData/Models/overheating_days/predictions_lme4_overheating_days.rds")

#### Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_days_contrast <- glmer(overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 2e+05)), data = all_data)

# Save model
saveRDS(model_days_contrast, file = "RData/Models/overheating_days/model_lme4_overheating_days_contrast.rds")
Subset of overheating populations
# Filter to populations predicted to overheat
all_data <- filter(all_data, overheating_risk > 0)

model_days_overheating_pop <- glmer(overheating_days ~ habitat_scenario - 1 + (1 |
    genus/species/obs), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 2e+05)), data = all_data)


# Get predictions
predictions_overheating_pop <- as.data.frame(ggpredict(model_days_overheating_pop,
    terms = "habitat_scenario", type = "simulate", interval = "confidence", nsim = 1000))

predictions_overheating_pop <- predictions_overheating_pop %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model and predictions
saveRDS(model_days_overheating_pop, file = "RData/Models/overheating_days/model_lme4_overheating_days_overheating_pop.rds")
saveRDS(predictions_overheating_pop, file = "RData/Models/overheating_days/predictions_lme4_overheating_days_overheating_pop.rds")

Model summaries

Full dataset
# Model summary
model_overheating_days <- readRDS("RData/Models/overheating_days/model_lme4_overheating_days.rds")

summary(model_overheating_days)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
## 155884.5 155977.0 -77934.3 155868.5   780182 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
##  -6.836  -0.057  -0.006  -0.002 116.897 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 52.50    7.2459  
##  genus         (Intercept)  0.11    0.3317  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -13.1015     0.1172 -111.82   <2e-16 ***
## habitat_scenarioarboreal_future2C  -12.5355     0.1139 -110.08   <2e-16 ***
## habitat_scenarioarboreal_future4C  -10.8965     0.1115  -97.75   <2e-16 ***
## habitat_scenariosubstrate_current  -12.4883     0.1111 -112.36   <2e-16 ***
## habitat_scenariosubstrate_future2C -11.8894     0.1110 -107.12   <2e-16 ***
## habitat_scenariosubstrate_future4C -10.0632     0.1104  -91.11   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.876                                                            
## hbtt_scnrr_4C 0.911       0.944                                                
## hbtt_scnrs_   0.904       0.937         0.974                                  
## hbtt_scnrs_2C 0.910       0.943         0.980         0.977                    
## hbtt_scnrs_4C 0.916       0.949         0.987         0.984       0.991
# Model predictions
print(readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days.rds"))
##     habitat_scenario  prediction         se     lower_CI   upper_CI
## 1   arboreal_current 0.008328287 0.02559816 0.0000000000 0.04267746
## 2  arboreal_future2C 0.014655631 0.03517287 0.0000000000 0.08279710
## 3  arboreal_future4C 0.075557250 0.08505270 0.0115388721 0.22957170
## 4  substrate_current 0.013504832 0.03957663 0.0004806136 0.07981448
## 5 substrate_future2C 0.024578353 0.05475054 0.0019021059 0.12697458
## 6 substrate_future4C 0.152603656 0.14084296 0.0459192408 0.45990199
# Model summary (contrasts)
model_overheating_days_contrast <- readRDS("RData/Models/overheating_days/model_lme4_overheating_days_contrast.rds")

summary(model_overheating_days_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
## 155884.5 155977.0 -77934.3 155868.5   780182 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
##  -6.836  -0.057  -0.006  -0.002 116.897 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 52.52    7.2470  
##  genus         (Intercept)  0.11    0.3317  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -12.48936
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.61321
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.04722
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.59182
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.59891
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.42503
##                                                                        Std. Error
## (Intercept)                                                               0.16736
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.05006
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.04026
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.02548
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.02362
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.01977
##                                                                        z value
## (Intercept)                                                            -74.628
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -12.248
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -1.173
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   62.484
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  25.357
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C 122.637
##                                                                        Pr(>|z|)
## (Intercept)                                                              <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.241
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   <2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.026             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.043  0.204      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.073  0.322      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.074  0.300      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.082  0.359      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.403                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.377                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.451                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.595                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.712                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.768                              
## optimizer (bobyqa) convergence code: 0 (OK)
## Model failed to converge with max|grad| = 0.00248256 (tol = 0.002, component 1)
Subset of overheating populations
# Model summary
model_overheating_days_overheating_pop <- readRDS("RData/Models/overheating_days/model_lme4_overheating_days_overheating_pop.rds")
summary(model_overheating_days_overheating_pop)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ habitat_scenario - 1 + (1 | genus/species/obs)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##  34008.1  34070.7 -16995.1  33990.1     7682 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.9902 -0.4092 -0.0719  0.2867  1.8958 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.3096   0.5564  
##  species:genus       (Intercept) 0.1873   0.4328  
##  genus               (Intercept) 0.2534   0.5033  
## Number of obs: 7691, groups:  
## obs:(species:genus), 7691; species:genus, 391; genus, 118
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -0.90187    0.10344  -8.719  < 2e-16 ***
## habitat_scenarioarboreal_future2C  -0.57655    0.08619  -6.689 2.24e-11 ***
## habitat_scenarioarboreal_future4C   0.38794    0.07181   5.402 6.58e-08 ***
## habitat_scenariosubstrate_current  -0.43971    0.07215  -6.095 1.10e-09 ***
## habitat_scenariosubstrate_future2C -0.12056    0.06838  -1.763   0.0779 .  
## habitat_scenariosubstrate_future4C  0.83364    0.06385  13.055  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.504                                                            
## hbtt_scnrr_4C 0.591       0.708                                                
## hbtt_scnrs_   0.569       0.681         0.806                                  
## hbtt_scnrs_2C 0.593       0.711         0.845         0.845                    
## hbtt_scnrs_4C 0.611       0.733         0.876         0.873       0.916
# Model prediction
print(readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_overheating_pop.rds"))
##     habitat_scenario prediction       se   lower_CI  upper_CI
## 1   arboreal_current   1.621303 1.235769 0.02631579  4.429112
## 2  arboreal_future2C   1.955541 1.355557 0.11289753  4.973498
## 3  arboreal_future4C   5.083953 2.005968 1.80564840  9.387467
## 4  substrate_current   2.154849 1.393408 0.23914474  5.264264
## 5 substrate_future2C   2.576727 1.495037 0.40998947  5.856829
## 6 substrate_future4C   6.747021 2.171997 3.13584040 11.384964

Relationship between TSM and overheating events

Here, we investigate the association between thermal safety margins and the predicted number of overheating events across microhabitats and climatic scenarios.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_overheating_days_by_TSM.R and the resources used in pbs/Models/Running_models_overheating_days_by_TSM.pbs

Load the data

# Load population-level data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

Linear mixed models

Note that we could not use bayesian linear mixed models because the models failed to mix, even after hundreds of thousands of iterations. Therefore, these predictions do not account for variation due to phylogenetic relatedness and confidence intervals are likely wider than those predicted.

Run the models

# Function to run the MCMCglmm for each habitat scenario
run_model <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)
    dataset$overheating_days <- round(dataset$overheating_days)

    dataset <- dataset %>%
        mutate(obs = as.character(row_number()))

    data <- dataset

    # Set the seed for reproducibility
    set.seed(123)

    # Fit the model
    model <- glmer(overheating_days ~ TSM + (1 | genus/species/obs), family = "poisson",
        control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05)),
        data = data)

    # Get predictions
    predictions <- data.frame(emmeans(model, specs = "TSM", data = data, at = list(TSM = seq(min(data$TSM),
        max(data$TSM), length = 100)), type = "response"))

    predictions <- predictions %>%
        rename(prediction = rate)

    saveRDS(model, file = paste0("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_",
        habitat_scenario, ".rds"))
    saveRDS(predictions, file = paste0("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_",
        habitat_scenario, ".rds"))
}

dataset_list <- list(substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

plan(multicore(workers = 2))

results <- future_lapply(names(dataset_list), function(x) {
    run_model(dataset_list[[x]], x)
}, future.packages = c("lme4", "emmeans", "ggeffects", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_substrate_current.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##  12447.0  12498.1  -6218.5  12437.0   203849 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.745 -0.023 -0.006 -0.002 98.398 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.116    0.3406  
##  species:genus       (Intercept) 3.346    1.8292  
##  genus               (Intercept) 5.850    2.4186  
## Number of obs: 203854, groups:  
## obs:(species:genus), 203854; species:genus, 5177; genus, 464
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  3.72283    0.38956   9.556   <2e-16 ***
## TSM         -1.20082    0.03084 -38.941   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.644

Future climate (+2C)

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_substrate_future2C.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##  18646.6  18697.8  -9318.3  18636.6   203848 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -2.203 -0.041 -0.011 -0.002 81.336 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.0779   0.2791  
##  species:genus       (Intercept) 2.3801   1.5427  
##  genus               (Intercept) 5.2724   2.2962  
## Number of obs: 203853, groups:  
## obs:(species:genus), 203853; species:genus, 5177; genus, 464
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  6.31747    0.31011   20.37   <2e-16 ***
## TSM         -1.45241    0.02707  -53.66   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.647

Future climate (+4C)

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_substrate_future4C.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##  43718.4  43769.5 -21854.2  43708.4   203848 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
##  -2.122  -0.074  -0.021  -0.005 133.660 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.2483   0.4983  
##  species:genus       (Intercept) 1.0245   1.0122  
##  genus               (Intercept) 2.9542   1.7188  
## Number of obs: 203853, groups:  
## obs:(species:genus), 203853; species:genus, 5177; genus, 464
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  7.61095    0.17145   44.39   <2e-16 ***
## TSM         -1.61621    0.01476 -109.49   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.565
Above-ground vegetation

Current climate

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_arboreal_current.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##   1999.1   2043.8   -994.5   1989.1    56205 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.4107 -0.0022 -0.0008 -0.0003 14.4385 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept)  0.00    0.000   
##  species:genus       (Intercept) 15.19    3.897   
##  genus               (Intercept)  0.00    0.000   
## Number of obs: 56210, groups:  
## obs:(species:genus), 56210; species:genus, 1771; genus, 174
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.92912    1.09109   4.518 6.25e-06 ***
## TSM         -1.51134    0.09357 -16.152  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.645
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')

Future climate (+2C)

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_arboreal_future2C.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##   2988.7   3033.4  -1489.3   2978.7    56205 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.552 -0.013 -0.003 -0.001 36.350 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.000    0.000   
##  species:genus       (Intercept) 2.358    1.536   
##  genus               (Intercept) 4.359    2.088   
## Number of obs: 56210, groups:  
## obs:(species:genus), 56210; species:genus, 1771; genus, 174
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  7.83607    0.83558   9.378   <2e-16 ***
## TSM         -1.73915    0.07952 -21.872   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.670
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')

Future climate (+4C)

# Model summary
print(summary(readRDS("RData/Models/overheating_days/model_lme4_overheating_days_by_TSM_arboreal_future4C.rds")))
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ TSM + (1 | genus/species/obs)
##    Data: data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##      AIC      BIC   logLik deviance df.resid 
##   6820.7   6865.4  -3405.3   6810.7    56205 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.7715 -0.0428 -0.0104 -0.0022 21.1830 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  obs:(species:genus) (Intercept) 0.0000   0.0000  
##  species:genus       (Intercept) 0.9173   0.9577  
##  genus               (Intercept) 8.7890   2.9646  
## Number of obs: 56210, groups:  
## obs:(species:genus), 56210; species:genus, 1771; genus, 174
## 
## Fixed effects:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) 10.08279    0.58740   17.16   <2e-16 ***
## TSM         -2.08512    0.03893  -53.57   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## TSM -0.403
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')

Visualize the results

Vegetated substrate
# Load model predictions
pred_sub_current <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_substrate_future4C.rds")

pop_days_TSM_sub <- ggplot() + geom_ribbon(data = pred_sub_future4C, aes(x = TSM,
    ymin = asymp.LCL, ymax = asymp.UCL), fill = "#EF4187", colour = "black", linewidth = 0.5,
    alpha = 0.75) + geom_ribbon(data = pred_sub_future2C, aes(x = TSM, ymin = asymp.LCL,
    ymax = asymp.UCL), fill = "#FAA43A", colour = "black", linewidth = 0.5, alpha = 0.75) +
    geom_ribbon(data = pred_sub_current, aes(x = TSM, ymin = asymp.LCL, ymax = asymp.UCL),
        fill = "#5DC8D9", colour = "black", linewidth = 0.5, alpha = 0.75) + xlab("TSM") +
    ylab("Overheating days") + xlim(0, 20) + ylim(-0.25, 210) + theme_classic() +
    theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
        colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
        text = element_text(color = "black"), axis.title.x = element_text(size = 30),
        axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
            size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
            size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
            size = 3))

pop_days_TSM_sub

Figure A34: Relationship between the number of overheating days and TSM in terrestrial conditions. Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from the models.

Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/overheating_days/predictions_lme4_overheating_days_by_TSM_arboreal_future4C.rds")

pop_days_TSM_arb <- ggplot() + geom_ribbon(data = pred_arb_future4C, aes(x = TSM,
    ymin = asymp.LCL, ymax = asymp.UCL), fill = "#EF4187", colour = "black", linewidth = 0.5,
    alpha = 0.75) + geom_ribbon(data = pred_arb_future2C, aes(x = TSM, ymin = asymp.LCL,
    ymax = asymp.UCL), fill = "#FAA43A", colour = "black", linewidth = 0.5, alpha = 0.75) +
    geom_ribbon(data = pred_arb_current, aes(x = TSM, ymin = asymp.LCL, ymax = asymp.UCL),
        fill = "#5DC8D9", colour = "black", linewidth = 0.5, alpha = 0.75) + xlab("TSM") +
    ylab("Overheating days") + xlim(0, 20) + ylim(-0.25, 210) + theme_classic() +
    theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
        colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
        text = element_text(color = "black"), axis.title.x = element_text(size = 30),
        axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
            size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
            size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
            size = 3))

pop_days_TSM_arb

Figure A35: Relationship between the number of overheating days and TSM in above-ground vegetation. Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from the models.

All habitats
all_habitats <- (pop_days_TSM_sub/pop_days_TSM_arb/plot_layout(ncol = 1))

all_habitats

Figure A36: Relationship between the number of overheating days and TSM in terrestrial (top row) or arboreal conditions (bottom row). Overheating days represents the number of days that a population exceeds its physiological limits across the 910 days investigated. Blue ribbons and points depict overheating_days in current microclimates. Orange ribbons and points depict overheating_days in future climates with 2 degrees Celsius above preindustrial levels. Pink ribbons and points depict overheating_days in future climates with 4 degrees Celsius above preindustrial levels. Ribbons delimit the lower and upper 95% confidence intervals predicted from the models.

Number of species overheating

Here, we investigate the variation in the number of species predicted to overheating in each community. Note that none of the populations were predicted to overheat in water bodies.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_n_species_overheating.R and the resources used in pbs/Models/Running_models_n_species_overheating.pbs

Load the data

# Load population-level data

# Substrate
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

# Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in the number of species overheating in each community using generalized additive models.

Run the models

run_community_n_species_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(n_species_overheating ~ s(lat, bs = "tp"), data = data,
        family = poisson(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        n_species_overheating = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$n_species_overheating_pred <- pred$fit
    new_data$n_species_overheating_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = n_species_overheating_pred + 1.96 * n_species_overheating_pred_se,
        lower = n_species_overheating_pred - 1.96 * n_species_overheating_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_",
        habitat_scenario, ".rds"))
}

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_n_species_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  6218.2   6240.9  -3106.1   6212.2    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.685 -0.216 -0.085 -0.056 97.337 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1122     33.49   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -4.6216     0.1598 -28.927   <2e-16 ***"            
## [20] "Xs(lat)Fx1     2.8854     4.2856   0.673    0.501    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.171"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xb3ee2e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -4.6216     0.1682  -27.48   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.567  7.567   1027  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0325   "                                       
## [22] "glmer.ML = 5478.3  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  9756.6   9779.3  -4875.3   9750.6    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.847 -0.298 -0.164 -0.061 65.015 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 290.8    17.05   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -3.69613    0.09869 -37.453   <2e-16 ***"            
## [20] "Xs(lat)Fx1    2.03001    2.63061   0.772     0.44    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.032"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xebca1e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -3.69613    0.09985  -37.02   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.949  7.949   1705  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0394   "                                       
## [22] "glmer.ML = 8566.6  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 22586.5  22609.1 -11290.2  22580.5    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.192 -0.610 -0.394 -0.072 37.240 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1147     33.86   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -2.45566    0.05986 -41.025  < 2e-16 ***"            
## [20] "Xs(lat)Fx1   21.87656    3.07342   7.118  1.1e-12 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.342"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x101eb1e0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -2.45566    0.05984  -41.03   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.844  8.844   2688  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0576   "                                       
## [22] "glmer.ML =  18997  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1197.1   1217.5   -595.6   1191.1     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.405 -0.110 -0.015 -0.001 34.123 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1240     35.21   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept)  -9.7538     3.7057  -2.632  0.00849 **"             
## [20] "Xs(lat)Fx1     0.8302    11.5350   0.072  0.94263   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.540 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xe872288>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -9.754      4.641  -2.102   0.0356 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 3.561  3.561  111.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0373   "                                       
## [22] "glmer.ML = 981.31  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1911.2   1931.6   -952.6   1905.2     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.609 -0.099 -0.044  0.000 33.534 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 31301    176.9   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -26.979      2.715  -9.938   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -24.726      1.757 -14.070   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.179"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xb3d7e18>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -26.98      12.83  -2.103   0.0355 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.455  5.455  248.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0594   "                                       
## [22] "glmer.ML = 1564.4  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/summary_MER_community_lat_number_sp_overheating_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  4192.9   4213.3  -2093.4   4186.9     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.879  -0.231  -0.115  -0.009 184.676 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 14734    121.4   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -5.9651     0.5824  -10.24   <2e-16 ***"            
## [20] "Xs(lat)Fx1   -18.8659     1.5317  -12.32   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.023"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/summary_GAM_community_lat_number_sp_overheating_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xeac27d8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.9651     0.7136   -8.36   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.253  7.253  706.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0825   "                                       
## [22] "glmer.ML = 3393.1  Scale est. = 1         n = 6614"

Visualize the results

# Set colours
magma_subset <- viridis::magma(100)[40:100]
color_func <- colorRampPalette(c("gray95", magma_subset))
colors_magma <- color_func(100)

community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")

sp_min <- min(min(community_sub_current$n_species_overheating, na.rm = TRUE), min(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), min(community_pond_current$n_species_overheating, na.rm = TRUE),
    min(community_pond_future4C$n_species_overheating, na.rm = TRUE), min(community_arb_current$n_species_overheating,
        na.rm = TRUE), min(community_arb_future4C$n_species_overheating, na.rm = TRUE))

sp_max <- max(max(community_sub_current$n_species_overheating, na.rm = TRUE), max(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), max(community_pond_current$n_species_overheating, na.rm = TRUE),
    max(community_pond_future4C$n_species_overheating, na.rm = TRUE), max(community_arb_current$n_species_overheating,
        na.rm = TRUE), max(community_arb_future4C$n_species_overheating, na.rm = TRUE))
Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0.1, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_sub_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future2C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_substrate_future4C.rds")

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = n_species_overheating),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_sub_future2C,
    aes(x = lat, y = n_species_overheating), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_sub_current, aes(x = lat, y = n_species_overheating),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlim(-55.00099, 72.00064) + ylim(0, 85) + xlab("Latitude") + ylab("Number of species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future2C + map_sub_TSM_future4C +
    lat_all + plot_layout(ncol = 4))

substrate_plot

Figure A37: Number of species predicted to overheat in each community for amphibians on terrestrial conditions. The number of species overheating as assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015). The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0.1, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_arb_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future2C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/n_species_overheating/predictions_community_lat_number_sp_overheating_arboreal_future4C.rds")

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = n_species_overheating),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_arb_future2C,
    aes(x = lat, y = n_species_overheating), alpha = 0.85, col = "#FAA43A", shape = ".") +
    geom_point(data = community_arb_current, aes(x = lat, y = n_species_overheating),
        alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlim(-55.00099, 72.00064) + ylim(0, 85) + xlab("Latitude") + ylab("Number of species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future2C + map_arb_TSM_future4C +
    lat_all + plot_layout(ncol = 4))

arboreal_plot

Figure A38: Number of species predicted to overheat in each community for amphibians in above-ground vegetation. The number of species overheating as assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015). The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

All habitats
all_habitats <- (substrate_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

Figure A39: Number of species predicted to overheat in each community for amphibians on terrestrial conditions (top panel) or in above-ground vegetation (bottom panel). The number of species overheating as assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015). The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

Linear mixed models

Here, we used linear mixed models to estimate the mean number of species predicted to overheat in each microhabitat and climatic scenario. Note that we could not use bayesian linear mixed models because the models failed to mix, even after hundreds of thousands of iterations.

Run the models

Full dataset
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")


all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_n_sp <- glmer(n_species_overheating ~ habitat_scenario - 1 + (1 | obs), family = "poisson",
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_n_sp, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_n_sp, file = "RData/Models/n_species_overheating/model_lme4_number_sp_overheating.rds")
saveRDS(predictions, file = "RData/Models/n_species_overheating/predictions_lme4_number_sp_overheating.rds")


# Contrast
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_n_sp_contrast <- glmer(n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | obs), family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)

saveRDS(model_n_sp_contrast, file = "RData/Models/n_species_overheating/model_lme4_number_sp_overheating_contrast.rds")
Subset of overheating communities
# Filter to overheating communities
all_community_data <- filter(all_community_data, n_species_overheating > 0)

# Run model
model_n_sp_overheating_communities <- glmer(n_species_overheating ~ habitat_scenario -
    1 + (1 | obs), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)


# Get predictions
predictions_overheating_communities <- as.data.frame(ggpredict(model_n_sp_overheating_communities,
    terms = "habitat_scenario", type = "simulate", interval = "confidence", nsim = 1000))

predictions_overheating_communities <- predictions_overheating_communities %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_n_sp_overheating_communities, file = "RData/Models/n_species_overheating/model_lme4_number_sp_overheating_overheating_communities.rds")
saveRDS(predictions_overheating_communities, file = "RData/Models/n_species_overheating/predictions_lme4_number_sp_overheating_overheating_communities.rds")

Model summaries

Full dataset
# Model summary
model_n_species_overheating <- readRDS("RData/Models/n_species_overheating/model_lme4_number_sp_overheating.rds")
summary(model_n_species_overheating)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: n_species_overheating ~ habitat_scenario - 1 + (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  22227.8  22291.0 -11106.9  22213.8    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.02314 -0.01565 -0.01330 -0.01045  0.18585 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 55.47    7.447   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -9.58041    0.27184  -35.24   <2e-16 ***
## habitat_scenarioarboreal_future2C  -9.18387    0.22894  -40.11   <2e-16 ***
## habitat_scenarioarboreal_future4C  -8.30145    0.15935  -52.10   <2e-16 ***
## habitat_scenariosubstrate_current  -9.11648    0.16106  -56.60   <2e-16 ***
## habitat_scenariosubstrate_future2C -8.63049    0.13501  -63.92   <2e-16 ***
## habitat_scenariosubstrate_future4C -7.50281    0.09945  -75.44   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.072                                                            
## hbtt_scnrr_4C 0.103       0.124                                                
## hbtt_scnrs_   0.104       0.125         0.178                                  
## hbtt_scnrs_2C 0.124       0.149         0.213         0.215                    
## hbtt_scnrs_4C 0.170       0.204         0.290         0.294       0.351
# Model prediction
print(readRDS("RData/Models/n_species_overheating/predictions_lme4_number_sp_overheating.rds"))
##     habitat_scenario prediction         se    lower_CI   upper_CI
## 1   arboreal_current 0.02088781 0.01660796 0.001511944 0.05398019
## 2  arboreal_future2C 0.03995615 0.02701276 0.005745389 0.09375189
## 3  arboreal_future4C 0.10655050 0.06838450 0.021314636 0.24254233
## 4  substrate_current 0.05635604 0.03117476 0.016035058 0.11809666
## 5 substrate_future2C 0.09628857 0.05181968 0.029086231 0.19937544
## 6 substrate_future4C 0.28801057 0.15671888 0.083158268 0.60375089
# Model summary (contrasts)
model_n_species_overheating_contrast <- readRDS("RData/Models/n_species_overheating/model_lme4_number_sp_overheating_contrast.rds")
summary(model_n_species_overheating_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  22227.8  22291.0 -11106.9  22213.8    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.02314 -0.01565 -0.01330 -0.01045  0.18585 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 55.46    7.447   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                             -9.1163
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4640
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.0677
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    0.8149
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.4859
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.6135
##                                                                        Std. Error
## (Intercept)                                                                0.1566
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current       0.3006
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C      0.2563
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C      0.2024
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C     0.1830
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C     0.1586
##                                                                        z value
## (Intercept)                                                            -58.229
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -1.544
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.264
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    4.026
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   2.655
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  10.176
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.12266
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.79168
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  5.67e-05
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.00793
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ** 
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.415             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.482  0.248      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.623  0.322      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.692  0.358      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.798  0.413      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.372                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.413                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.477                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.536                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.619                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.688
Subset of overheating communities
# Model summary
model_n_species_overheating <- readRDS("RData/Models/n_species_overheating/model_lme4_number_sp_overheating_overheating_communities.rds")
summary(model_n_species_overheating)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: n_species_overheating ~ habitat_scenario - 1 + (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  10812.3  10853.0  -5399.1  10798.3     2470 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -0.5014 -0.4646 -0.3080  0.3303  0.8234 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 0.6008   0.7751  
## Number of obs: 2477, groups:  obs, 2477
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current    0.52261    0.12507   4.179 2.93e-05 ***
## habitat_scenarioarboreal_future2C   0.72284    0.09809   7.369 1.72e-13 ***
## habitat_scenarioarboreal_future4C   0.70050    0.06188  11.320  < 2e-16 ***
## habitat_scenariosubstrate_current   0.88243    0.06364  13.867  < 2e-16 ***
## habitat_scenariosubstrate_future2C  0.85588    0.04970  17.221  < 2e-16 ***
## habitat_scenariosubstrate_future4C  0.81189    0.02907  27.932  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.002                                                            
## hbtt_scnrr_4C 0.005       0.006                                                
## hbtt_scnrs_   0.005       0.007         0.013                                  
## hbtt_scnrs_2C 0.007       0.009         0.018         0.019                    
## hbtt_scnrs_4C 0.011       0.015         0.030         0.032       0.045
# Model prediction
print(readRDS("RData/Models/n_species_overheating/predictions_lme4_number_sp_overheating_overheating_communities.rds"))
##     habitat_scenario prediction       se   lower_CI upper_CI
## 1   arboreal_current   1.929784 1.366272 0.05371622 5.054054
## 2  arboreal_future2C   2.444730 1.528755 0.18896396 5.649099
## 3  arboreal_future4C   2.509284 1.520796 0.31228070 5.691842
## 4  substrate_current   3.185217 1.687332 0.60059289 6.882609
## 5 substrate_future2C   3.227951 1.675308 0.67840376 6.809742
## 6 substrate_future4C   3.084207 1.636719 0.61654744 6.557210

Proportion of species overheating

Here, we investigate the variation in the proportion of species predicted to overheat in each community. Note that none of the populations were predicted to overheat in water bodies.

This code ran on an HPC environment, where the original code can be found in R/Models/Running_models_prop_species_overheating.R and the resources used in pbs/Models/Running_models_prop_species_overheating.pbs

Load the data

# Load population-level data

# Substrate
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

# Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

Generalized additive mixed models

Here, we investigate latitudinal patterns in the number of species overheating in each community using generalized additive models.

Run the models

run_community_proportion_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(proportion_species_overheating ~ s(lat, bs = "tp"), data = data,
        weights = data$n_species, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        proportion_species_overheating = NA, n_species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_",
        habitat_scenario, ".rds"))
}


# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_proportion_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  5492.8   5515.4  -2743.4   5486.8    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -1.180  -0.171  -0.078  -0.040 108.961 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1139     33.76   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -6.8803     0.1689 -40.738   <2e-16 ***"            
## [20] "Xs(lat)Fx1     3.3539     6.2435   0.537    0.591    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.249"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xb965338>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -6.880      0.168  -40.96   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.576  7.576  417.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0197   "                                       
## [22] "glmer.ML = 4789.7  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  8573.1   8595.8  -4283.5   8567.1    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.461 -0.253 -0.119 -0.056 69.925 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 261.7    16.18   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -5.94578    0.09981 -59.568   <2e-16 ***"            
## [20] "Xs(lat)Fx1    2.37820    3.06803   0.775    0.438    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.047"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xe8a06f8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.9458     0.1009  -58.91   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.802  7.802  623.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0217   "                                       
## [22] "glmer.ML =   7454  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 20152.3  20174.9 -10073.1  20146.3    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-2.073 -0.531 -0.226 -0.074 39.252 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1205     34.71   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -4.69352    0.05982 -78.457  < 2e-16 ***"            
## [20] "Xs(lat)Fx1   23.64469    2.97760   7.941 2.01e-15 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.334"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0x13f60e20>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -4.69352    0.06073  -77.29   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.823  8.823   1159  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0383   "                                       
## [22] "glmer.ML =  16918  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   918.6    939.0   -456.3    912.6     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.7469 -0.0865 -0.0102 -0.0007 27.2347 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1126     33.55   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept) -11.3026     3.5404  -3.192  0.00141 **"             
## [20] "Xs(lat)Fx1     0.3667    10.5142   0.035  0.97218   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.500 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xe5284f0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -11.303      4.591  -2.462   0.0138 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 3.466  3.466  88.33  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0682   "                                       
## [22] "glmer.ML = 707.55  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1426.6   1447.0   -710.3   1420.6     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.1381 -0.0961 -0.0256  0.0000 24.1444 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 80138    283.1   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -44.319      1.959  -22.63   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -42.661      2.198  -19.41   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.094"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xb024d68>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -44.32      19.92  -2.224   0.0261 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.592  5.592  197.7  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.116   "                                        
## [22] "glmer.ML = 1084.1  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/summary_MER_community_lat_proportion_sp_overheating_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  3004.8   3025.2  -1499.4   2998.8     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -1.629  -0.216  -0.077  -0.007 147.828 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 44397    210.7   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)   -9.255      1.147  -8.065 7.31e-16 ***"            
## [20] "Xs(lat)Fx1    -66.351     55.969  -1.185    0.236    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.282 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/summary_GAM_community_lat_proportion_sp_overheating_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xe77fd20>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -9.255      1.148  -8.065 7.33e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq p-value    "                         
## [17] "s(lat) 7.59   7.59  475.5  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.132   "                                        
## [22] "glmer.ML = 2226.1  Scale est. = 1         n = 6614"

Visualize the results

# Set colours
magma_subset <- viridis::magma(100)[40:100]
color_func <- colorRampPalette(c("gray95", magma_subset))
colors_magma <- color_func(100)

community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")
Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0.1, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_sub_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future2C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_substrate_future4C.rds")

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_sub_future2C,
    aes(x = lat, y = proportion_species_overheating), alpha = 0.85, col = "#FAA43A",
    shape = ".") + geom_point(data = community_sub_current, aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlim(-55.00099, 72.00064) + ylim(0, 1) + xlab("Latitude") + ylab("Proportion of species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future2C + map_sub_TSM_future4C +
    lat_all + plot_layout(ncol = 4))

substrate_plot

Figure A40: Proportion of species predicted to overheat in each community for amphibians on terrestrial conditions. The proportion of species overheating was assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015) divided by the total number of species in a given community. The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0.1, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))



# Future +2C
map_arb_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future2C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = colors_magma,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/prop_species_overheating/predictions_community_lat_proportion_sp_overheating_arboreal_future4C.rds")

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, col = "#EF4187", shape = ".") + geom_point(data = community_arb_future2C,
    aes(x = lat, y = proportion_species_overheating), alpha = 0.85, col = "#FAA43A",
    shape = ".") + geom_point(data = community_arb_current, aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, col = "#5DC8D9", shape = ".") + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlim(-55.00099, 72.00064) + ylim(0, 1) + xlab("Latitude") + ylab("Proportion of species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future2C + map_arb_TSM_future4C +
    lat_all + plot_layout(ncol = 4))

arboreal_plot

Figure A41: Proportion of species predicted to overheat in each community for amphibians in above-ground vegetation. The proportion of species overheating was assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015) divided by the total number of species in a given community. The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

All habitats
all_habitats <- (substrate_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

Figure A42: Proportion of species predicted to overheat in each community for amphibians on terrestrial conditions (top panel) or in above-ground vegetation (bottom panel). TThe proportion of species overheating was assessed as the sum of species overheating at least once in the period surveyed (910 days between 2006 and 2015) divided by the total number of species in a given community. The right panel depicts latitudinal patterns in the number of species overheating in current climates (blue), or assuming +2C (orange) or +4C above pre-industrial levels (red). Gray colour depicts species areas where none of the species overheat. Black colour depicts areas with no data.

Linear mixed models

Here, we used linear mixed models to estimate the mean proportion of species predicted to overheat in each microhabitat and climatic scenario. Note that we could not use bayesian linear mixed models because the models failed to mix, even after hundreds of thousands of iterations.

Run the models

Full dataset
# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")


all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_prop <- glmer(proportion_species_overheating ~ habitat_scenario - 1 + (1 |
    obs), family = "binomial", weights = n_species, control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)



# Get predictions
predictions <- as.data.frame(ggpredict(model_prop, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_prop, file = "RData/Models/prop_species_overheating/model_lme4_prop_species_overheating.rds")
saveRDS(predictions, file = "RData/Models/prop_species_overheating/predictions_lme4_prop_species_overheating.rds")


###### Contrasts
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

# Run model
model_prop_contrast <- glmer(proportion_species_overheating ~ relevel(habitat_scenario,
    ref = "substrate_current") + (1 | obs), family = "binomial", weights = n_species,
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)
# Save model
saveRDS(model_prop_contrast, file = "RData/Models/prop_species_overheating/model_lme4_prop_species_overheating_contrast.rds")
Subset of overheating communities
# Filter to overheating communities
all_community_data <- filter(all_community_data, n_species_overheating > 0)

# Run model Intercept-less model
model_prop_overheating_communities <- glmer(proportion_species_overheating ~ habitat_scenario -
    1 + (1 | obs), family = "binomial", weights = n_species, control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)



# Get predictions
predictions_overheating_communities <- as.data.frame(ggpredict(model_prop_overheating_communities,
    terms = "habitat_scenario", type = "random", interval = "confidence", nsim = 1000))

predictions_overheating_communities <- predictions_overheating_communities %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)


# Save model summaries and predictions
saveRDS(model_prop_overheating_communities, file = "RData/Models/prop_species_overheating/model_lme4_prop_species_overheating_overheating_communities.rds")
saveRDS(predictions_overheating_communities, file = "RData/Models/prop_species_overheating/predictions_lme4_prop_species_overheating_overheating_communities.rds")

Model summaries

Full dataset
# Model summary
model_prop_sp_overheating <- readRDS("RData/Models/prop_species_overheating/model_lme4_prop_species_overheating.rds")

summary(model_prop_sp_overheating)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: proportion_species_overheating ~ habitat_scenario - 1 + (1 |      obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  20831.7  20895.0 -10408.9  20817.7    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.09403 -0.01869 -0.01102 -0.00645  0.63760 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 42.26    6.5     
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -11.3359     0.2673  -42.41   <2e-16 ***
## habitat_scenarioarboreal_future2C  -10.8943     0.2263  -48.14   <2e-16 ***
## habitat_scenarioarboreal_future4C   -9.9057     0.1634  -60.61   <2e-16 ***
## habitat_scenariosubstrate_current  -11.3134     0.1581  -71.56   <2e-16 ***
## habitat_scenariosubstrate_future2C -10.7777     0.1350  -79.84   <2e-16 ***
## habitat_scenariosubstrate_future4C  -9.4174     0.1061  -88.79   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.093                                                            
## hbtt_scnrr_4C 0.129       0.156                                                
## hbtt_scnrs_   0.134       0.161         0.225                                  
## hbtt_scnrs_2C 0.157       0.190         0.266         0.275                    
## hbtt_scnrs_4C 0.208       0.252         0.351         0.363       0.428
# Model predictions
print(readRDS("RData/Models/prop_species_overheating/predictions_lme4_prop_species_overheating.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 1.193596e-05 0.2672754 7.068936e-06 2.015389e-05
## 2  arboreal_future2C 1.856423e-05 0.2263155 1.191351e-05 2.892761e-05
## 3  arboreal_future4C 4.988644e-05 0.1634379 3.621344e-05 6.872155e-05
## 4  substrate_current 1.220847e-05 0.1580970 8.955507e-06 1.664300e-05
## 5 substrate_future2C 2.085912e-05 0.1349987 1.600984e-05 2.717718e-05
## 6 substrate_future4C 8.129452e-05 0.1060685 6.603622e-05 1.000780e-04
# Model summary (contrasts)
model_prop_sp_overheating_contrast <- readRDS("RData/Models/prop_species_overheating/model_lme4_prop_species_overheating_contrast.rds")
summary(model_prop_sp_overheating_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## proportion_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  20831.7  20895.0 -10408.9  20817.7    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.09403 -0.01869 -0.01102 -0.00645  0.63761 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 42.25    6.5     
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -11.31335
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.02249
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.41915
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.40769
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.53569
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.89604
##                                                                        Std. Error
## (Intercept)                                                               0.15758
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.29126
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.25333
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.20018
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.17698
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.15448
##                                                                        z value
## (Intercept)                                                            -71.796
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.077
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1.655
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    7.032
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   3.027
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  12.274
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.93845
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.09802
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  2.04e-12
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.00247
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  .  
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ** 
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.409             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.473  0.252      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.602  0.322      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.679  0.363      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.768  0.416      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.373                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.421                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.482                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.537                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.615                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.694
Subset of overheating populations
# Model summary
model_prop_sp_overheating <- readRDS("RData/Models/prop_species_overheating/model_lme4_prop_species_overheating_overheating_communities.rds")
summary(model_prop_sp_overheating)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: proportion_species_overheating ~ habitat_scenario - 1 + (1 |      obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  11261.2  11301.9  -5623.6  11247.2     2470 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.99826 -0.37135  0.03171  0.42087  2.70620 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 1.019    1.009   
## Number of obs: 2477, groups:  obs, 2477
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -3.23209    0.15053  -21.47   <2e-16 ***
## habitat_scenarioarboreal_future2C  -2.87037    0.12065  -23.79   <2e-16 ***
## habitat_scenarioarboreal_future4C  -2.73669    0.07612  -35.95   <2e-16 ***
## habitat_scenariosubstrate_current  -2.88750    0.07955  -36.30   <2e-16 ***
## habitat_scenariosubstrate_future2C -2.78072    0.06181  -44.99   <2e-16 ***
## habitat_scenariosubstrate_future4C -2.26730    0.03574  -63.44   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.001                                                            
## hbtt_scnrr_4C 0.002       0.002                                                
## hbtt_scnrs_   0.001       0.001         0.002                                  
## hbtt_scnrs_2C 0.001       0.001         0.003         0.002                    
## hbtt_scnrs_4C 0.000       0.000         0.001         0.001       0.001
# Model prediction
print(readRDS("RData/Models/prop_species_overheating/predictions_lme4_prop_species_overheating_overheating_communities.rds"))
##     habitat_scenario prediction         se   lower_CI   upper_CI
## 1   arboreal_current 0.03797581 0.15052796 0.02855036 0.05035162
## 2  arboreal_future2C 0.05363798 0.12064505 0.04282650 0.06698780
## 3  arboreal_future4C 0.06084280 0.07611802 0.05285610 0.06994720
## 4  substrate_current 0.05277503 0.07954997 0.04550268 0.06113521
## 5 substrate_future2C 0.05837474 0.06181235 0.05206100 0.06540136
## 6 substrate_future4C 0.09386742 0.03573994 0.08807642 0.09999741

Phylogenetic signal in CTmax

# Load the experimental data
training_data <- readRDS(file="RData/General_data/pre_data_for_imputation.rds")
training_data <- filter(training_data, imputed == "no")
tree <- readRDS(file="RData/General_data/tree_for_imputation.rds")

# Reorganise levels of some variables
training_data <- training_data %>% 
  mutate(species = tip.label,
         acclimated,
         life_stage_tested = factor(life_stage_tested),
         life_stage_tested=factor(life_stage_tested,
                              levels=c("adult", "adults", "larvae"),
                              labels=c("adults", "adults", "larvae")),
         endpoint2 = factor(endpoint, 
                        levels=c("LRR", "OS", "LOE", "prodding", "other", "death"),
                        labels=c("LRR", "OS", "LRR", "other", "other", "other")),
         ecotype = factor(ecotype)) 

# Remove the family column to run MCMCglmm
training_data <- dplyr::select(training_data, -family) 

# Match data to phylogenetic tree
matchpos <- match(training_data$tip.label, tree$tip.label)
training_data$matchpos <- matchpos
training_data <- training_data %>% filter(is.na(matchpos) == F) 

tree <- drop.tip(tree, tree$tip.label[-match(training_data$tip.label, tree$tip.label)]) 

# Force the tree to be ultrametric
tree<-force.ultrametric(tree, method="extend") 
## ***************************************************************
## *                          Note:                              *
## *    force.ultrametric does not include a formal method to    *
## *    ultrametricize a tree & should only be used to coerce    *
## *   a phylogeny that fails is.ultramtric due to rounding --   *
## *    not as a substitute for formal rate-smoothing methods.   *
## ***************************************************************
# Phylogenetic co-variance matrix
Ainv<-inverseA(tree)$Ainv

# Set paramaeter expanded prior
 prior<-  list(R = list(V=1, nu=0.001), 
               G = list(G1=list(V = 1, nu = 0.002, alpha.mu = 0, alpha.V = 1e4), 
                        G2=list(V = 1, nu = 0.002, alpha.mu = 0, alpha.V = 1e4)))

# Fit model with all complete case predictors
model <- MCMCglmm(mean_UTL ~ acclimation_temp + 
                             endpoint2 + 
                             acclimated + 
                             life_stage_tested + 
                             ecotype, 
                  random = ~ tip.label + # Phylogeny + species random effects
                             species,
                  ginverse = list(tip.label = Ainv),
                  pl = TRUE, 
                  pr = TRUE, 
                  nitt = 130000, 
                  thin = 100, 
                  burnin = 30000, 
                  singular.ok = TRUE, 
                  prior = prior, 
                  verbose = FALSE, 
                  data = training_data)
summary(model)
## 
##  Iterations = 30001:129901
##  Thinning interval  = 100
##  Sample size  = 1000 
## 
##  DIC: 9724.977 
## 
##  G-structure:  ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     14.27    10.53    18.06    877.7
## 
##                ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species    0.7721   0.3087    1.242     1000
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.952    1.835    2.068     1000
## 
##  Location effects: mean_UTL ~ acclimation_temp + endpoint2 + acclimated + life_stage_tested + ecotype 
## 
##                         post.mean l-95% CI u-95% CI eff.samp  pMCMC    
## (Intercept)              31.47595 28.62384 35.11641   1000.0 <0.001 ***
## acclimation_temp          0.13329  0.12519  0.14182    914.8 <0.001 ***
## endpoint2OS               1.41665  1.22123  1.61176   1122.3 <0.001 ***
## endpoint2other            1.51790  1.30346  1.71090   1000.0 <0.001 ***
## acclimatedfield-fresh    -0.81361 -1.38868 -0.21294    906.8  0.008 ** 
## life_stage_testedlarvae   1.35208  1.13264  1.59810   1000.0 <0.001 ***
## ecotypeArboreal          -0.26937 -1.50087  1.08295   1000.0  0.692    
## ecotypeFossorial          0.90306 -0.50444  2.37255    940.7  0.238    
## ecotypeGround-dwelling   -0.04639 -1.23625  1.05909   1101.6  0.934    
## ecotypeSemi-aquatic       0.04990 -1.12342  1.15478   1000.0  0.948    
## ecotypeStream-dwelling   -0.72224 -1.92064  0.68292   1000.0  0.282    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Calculate proportion of non-residual variance explained by phylogeny
lambda <- model$VCV[,"tip.label"]/(model$VCV[,"tip.label"] + model$VCV[,"species"]) 
posterior.mode(lambda) # Lambda
##      var1 
## 0.9465116
HPDinterval(lambda) # Highest posterior density
##         lower     upper
## var1 0.904953 0.9840589
## attr(,"Probability")
## [1] 0.95

Sensitivity analyses

Changing biophysical model parameters

Here, we compared predictions of overheating risk for a high-risk species in a given location assuming different biophsyical parameters.

This code can be run locally, but note that the ectotherm model simulating pond parameters takes time to run (~30 min).

Terrestrial conditions

Standard parameters

Find the location and body mass of the species at highest risk
# Identify the location and species on which to do the sensitivity analysis
# (species most vulnerable warming)
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")

pop_sub_current <- filter(pop_sub_current, tip.label == "Noblella myrmecoides")  # Most high-risk species in terrestrial conditions
high_risk <- pop_sub_current %>%
    slice_max(order_by = overheating_days, n = 1)
high_risk  # The location -69.5, -9.5 is at highest risk for this species
## # A tibble: 1 × 18
##   tip.label     lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se   TSM TSM_se
##   <chr>           <dbl>   <dbl> <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>
## 1 Noblella myr…   -69.5    -9.5  32.9    0.605     29.4        1.01  3.38  0.605
## # ℹ 9 more variables: overheating_probability <dbl>,
## #   overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>,
## #   overheating_risk_strict <dbl>, consecutive_overheating_days <dbl>,
## #   lon <dbl>, lat <dbl>
# Find body mass of this assemblage
presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")
data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label, body_mass),
    by = "tip.label")
median_body_mass <- presence_body_mass %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
    dplyr::ungroup()

median_body_mass[median_body_mass$lon == -69.5 & median_body_mass$lat == -9.5, ]  # 4.28 g
## # A tibble: 1 × 3
##     lon   lat median_mass
##   <dbl> <dbl>       <dbl>
## 1 -69.5  -9.5        4.28
Run the biophysical model
# Run the biophysical models using the parameters used in the paper

# Set parameters
dstart <- "01/01/2005"
dfinish <- "31/12/2015"
coords <- c(-69.5, -9.5)

# Run the microclimate model
micro_default <- NicheMapR::micro_ncep(loc = coords, dstart = dstart, dfinish = dfinish,
    scenario = 4, minshade = 85, maxshade = 90, Usrhyt = 0.01, cap = 1, ERR = 1.5,
    spatial = "E:/p_pottier/Climatic_data/data/NCEP_time", terra_source = "E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data")
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -69.5 lat -9.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  133.26    2.46  359.25
# Run the ectotherm model
micro <- micro_default
ecto <- NicheMapR::ectotherm(live = 0, Ww_g = 4.28, shape = 4, pct_wet = 80)
environ <- as.data.frame(ecto$environ)

# Calculate daily temperature
daily_temp <- environ %>%
    dplyr::mutate(YEAR = YEAR + 2004) %>%
    dplyr::group_by(YEAR, DOY) %>%
    dplyr::summarize(max_temp = max(TC), mean_temp = mean(TC), .groups = "drop")

# Create a function to calculate the rolling weekly temperature
calc_yearly_rolling_mean <- function(data) {
    data$mean_weekly_temp <- zoo::rollapply(data$mean_temp, width = 7, FUN = mean,
        align = "right", partial = TRUE, fill = NA)
    data$max_weekly_temp <- zoo::rollapply(data$max_temp, width = 7, FUN = mean,
        align = "right", partial = TRUE, fill = NA)
    return(data)
}


# Calculate mean weekly temperature
daily_temp <- daily_temp %>%
    dplyr::group_by(YEAR) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days <- daily_temp %>%
    dplyr::group_by(YEAR) %>%
    dplyr::top_n(91, max_temp) %>%
    dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Load imputed data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
                            upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
  mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
  group_by(tip.label)

# Filter to the species of interest 
species_data_n_myrc <- species_data %>% 
  dplyr::filter(tip.label=="Noblella myrmecoides")

# Run meta-analytic model
fit <- metafor::rma(yi = CTmax, 
                    sei = se, 
                    mod = ~acclimation_temp, 
                    data = species_data_n_myrc)

prediction <- predict(fit, newmods = daily_temp_warmest_days$mean_weekly_temp)
daily_CTmax <- dplyr::select((cbind(daily_temp_warmest_days, 
                                    cbind(predicted_CTmax = prediction$pred,
                                          predicted_CTmax_se = prediction$se))),
                             - max_weekly_temp)

# Calculate climate vulnerability metrics
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability<- daily_CTmax %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Save file
saveRDS(daily_vulnerability, file = "RData/Climate_vulnerability/Substrate/future4C/daily_vulnerability_sensitivity_analysis.rds")

# Set number of days
n_days <- 910

pop_vulnerability <- daily_vulnerability %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability <- pop_vulnerability %>% rename(max_temp = mean_max_temp)

pop_vulnerability  
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.1    0.952     32.3       0.910 0.987  0.952                   0.219
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Smaller body size

Run the biophysical model
micro <- micro_default # Same microclimate model as above

# Run the ectotherm model
ecto_small <- NicheMapR::ectotherm(live= 0, 
                                   Ww_g = 0.5, # Small body mass
                                   shape = 4, 
                                   pct_wet = 80)
environ_small <- as.data.frame(ecto_small$environ)

# Calculate daily temperature
daily_temp_small <- environ_small %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_small <- daily_temp_small %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_small_warmest_days <- daily_temp_small %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_small <- predict(fit, newmods = daily_temp_small_warmest_days$mean_weekly_temp)
daily_CTmax_small <- dplyr::select((cbind(daily_temp_small_warmest_days, 
                                          cbind(predicted_CTmax = prediction_small$pred,
                                                predicted_CTmax_se = prediction_small$se))),
                                   - max_weekly_temp)


###### Daily TSM and overheating risk ##########
daily_vulnerability_small <- daily_CTmax_small %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


saveRDS(daily_vulnerability_small, file = "RData/Climate_vulnerability/Substrate/future4C/daily_vulnerability_small_body_size_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_small <- daily_vulnerability_small %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_small <- pop_vulnerability_small %>% rename(max_temp = mean_max_temp)

pop_vulnerability_small 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.1    0.935     32.0       0.903  1.27  0.935                   0.163
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Larger body size

Run the biophysical model
micro <- micro_default # Same microclimate model as above

# Run the ectotherm model
ecto_large <- NicheMapR::ectotherm(live= 0, 
                                   Ww_g = 50,  # Large body mass
                                   shape = 4, 
                                   pct_wet = 80)
environ_large <- as.data.frame(ecto_large$environ)

# Calculate daily temperature
daily_temp_large <- environ_large %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_large <- daily_temp_large %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_large_warmest_days <- daily_temp_large %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_large <- predict(fit, newmods = daily_temp_large_warmest_days$mean_weekly_temp)
daily_CTmax_large <- dplyr::select((cbind(daily_temp_large_warmest_days, 
                                          cbind(predicted_CTmax = prediction_large$pred,
                                                predicted_CTmax_se = prediction_large$se))), -max_weekly_temp)

###### Daily TSM and overheating risk ##########
daily_vulnerability_large <- daily_CTmax_large %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_large, file = "RData/Climate_vulnerability/Substrate/future4C/daily_vulnerability_large_body_size_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_large <- daily_vulnerability_large %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_large <- pop_vulnerability_large %>% rename(max_temp = mean_max_temp)

pop_vulnerability_large 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.1    0.985     32.8       0.923 0.579  0.985                   0.320
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Underground conditions

Run the biophysical model
micro <- micro_default  # Same microclimate model as above
ecto <- NicheMapR::ectotherm(live = 0, Ww_g = 4.28, shape = 4, pct_wet = 80)  # Same ectotherm model as previously
environ <- as.data.frame(ecto$environ)

dummy_burrow <- dplyr::select(environ, DOY, YEAR)  # Create dummy variable to store results at different depths
soil_temp <- as.data.frame(micro$soil)  # Extract soil temperatures at different depths
environ_burrow <- cbind(dummy_burrow, dplyr::select(soil_temp, D2.5cm, D5cm, D10cm,
    D15cm, D20cm))  # Get soil depths up to 20 cm
environ_burrow <- pivot_longer(environ_burrow, cols = D2.5cm:D20cm, names_to = "DEPTH",
    names_prefix = "D", values_to = "TC")  # Pivot longer

# Calculate daily temperature
daily_temp_burrow <- environ_burrow %>%
    dplyr::mutate(YEAR = YEAR + 2004) %>%
    dplyr::group_by(YEAR, DOY, DEPTH) %>%
    dplyr::summarize(max_temp = max(TC), mean_temp = mean(TC), .groups = "drop")

# Calculate mean weekly temperature
daily_temp_burrow <- daily_temp_burrow %>%
    dplyr::group_by(YEAR, DEPTH) %>%
    dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_burrow_warmest_days <- daily_temp_burrow %>%
    dplyr::group_by(YEAR, DEPTH) %>%
    dplyr::top_n(91, max_temp) %>%
    dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_burrow <- predict(fit, newmods = daily_temp_burrow_warmest_days$mean_weekly_temp)
daily_CTmax_burrow <- dplyr::select((cbind(daily_temp_burrow_warmest_days, 
                                           cbind(predicted_CTmax = prediction_burrow$pred,
                                                 predicted_CTmax_se = prediction_burrow$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_burrow <- daily_CTmax_burrow %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_burrow, file = "RData/Climate_vulnerability/Substrate/future4C/daily_vulnerability_burrow_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_burrow <- daily_vulnerability_burrow %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(DEPTH) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_burrow <- pop_vulnerability_burrow %>% rename(max_temp = mean_max_temp)

pop_vulnerability_burrow 
## # A tibble: 5 × 12
##   DEPTH CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <chr> <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1 10cm   33.5     2.11     31.5       0.575 2.11    2.11                 0.0378 
## 2 15cm   33.5     2.18     31.1       0.520 2.57    2.18                 0.0130 
## 3 2.5cm  33.4     1.96     32.6       0.782 0.938   1.96                 0.228  
## 4 20cm   33.5     2.23     30.8       0.479 2.86    2.23                 0.00547
## 5 5cm    33.5     2.02     32.1       0.683 1.47    2.02                 0.118  
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Open habitats

Run the biophysical model
# Run the microclimate model with reduced shade
micro_open <-  NicheMapR::micro_ncep(loc = coords, 
                                dstart = dstart, 
                                dfinish = dfinish, 
                                scenario=4,
                                minshade=50, # Reduced shade (50%)
                                maxshade=90,
                                Usrhyt = 0.01,
                                cap = 1,
                                ERR = 1.5, 
                                spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -69.5 lat -9.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  124.30    1.80  307.69
# Run the ectotherm model
micro <- micro_open
ecto_open <- NicheMapR::ectotherm(live= 0, 
                                  Ww_g = 4.28, 
                                  shape = 4, 
                                  pct_wet = 80)
environ_open <- as.data.frame(ecto_open$environ)

# Calculate daily temperature
daily_temp_open<- environ_open %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_open <- daily_temp_open %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_open_warmest_days <- daily_temp_open %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_open <- predict(fit, newmods = daily_temp_open_warmest_days$mean_weekly_temp)
daily_CTmax_open <- dplyr::select((cbind(daily_temp_open_warmest_days, 
                                         cbind(predicted_CTmax = prediction_open$pred,
                                               predicted_CTmax_se = prediction_open$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_open <- daily_CTmax_open %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_open, file = "RData/Climate_vulnerability/Substrate/future4C/daily_vulnerability_open_habitat_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_open <- daily_vulnerability_open %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_open <- pop_vulnerability_open %>% rename(max_temp = mean_max_temp)

pop_vulnerability_open 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.2     1.15     35.2        1.06 -1.76   1.15                   0.919
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Compare the results

# Open habitats and burrows
habitat_selection <- ggplot() + geom_density(data = daily_vulnerability_open, aes(x = daily_TSM),
    alpha = 0.6, fill = "red") + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "2.5cm"), aes(x = daily_TSM), fill = "gold", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "5cm"), aes(x = daily_TSM), fill = "#BA9E49", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "10cm"), aes(x = daily_TSM), fill = "darkorange", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "15cm"), aes(x = daily_TSM), fill = "#F1AF79", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "20cm"), aes(x = daily_TSM), fill = "#995C51", alpha = 0.7) + geom_density(data = daily_vulnerability,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-6.5, 5) + ylim(0, 1.1) + xlab("Daily TSM") +
    ylab("Density") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))


# Body size

body_size <- ggplot() + geom_density(data = daily_vulnerability_small, aes(x = daily_TSM),
    alpha = 0.5, fill = "#49BAAE") + geom_density(data = daily_vulnerability_large,
    aes(x = daily_TSM), alpha = 0.5, fill = "#BA4989") + geom_density(data = daily_vulnerability,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("Density") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))


terrestrial_parameters <- body_size/habitat_selection

terrestrial_parameters

ggsave(terrestrial_parameters, file = "fig/Figure_S9.png", height = 20, width = 16,
    dpi = 500)

Aquatic conditions

Standard parameters

Run the biophysical model
micro <- micro_default # Same microclimate model as before
micro$metout[, 13] <- 0 # Make sure the pond stays in the shade

ecto_pond <- ectotherm(container=1, # container model
                       conth=1500, # shallow pond of 1.5m depth
                       contw=12000,# pond of 12m width
                       contype=1, # container sunk into the ground like a pond
                       rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
                       continit = 1500, # Initial container water level (1.5m)
                       conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
                       contwet=100, # 100% of container surface area acting as free water exchanger
                       contonly=1)

environ_pond <- as.data.frame(ecto_pond$environ)

# Calculate daily temperature
daily_temp_pond <- environ_pond %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_pond <- daily_temp_pond %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_pond <- daily_temp_pond %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_pond <- predict(fit, newmods = daily_temp_warmest_days_pond$mean_weekly_temp)
daily_CTmax_pond <- dplyr::select((cbind(daily_temp_warmest_days_pond, 
                                   cbind(predicted_CTmax = prediction_pond$pred,
                                         predicted_CTmax_se = prediction_pond$se))),
                                  - max_weekly_temp)

# Calculate climate vulnerability metrics
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_pond <- daily_CTmax_pond %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_pond, file = "RData/Climate_vulnerability/Pond/future4C/daily_vulnerability_pond_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_pond <- daily_vulnerability_pond %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_pond <- pop_vulnerability_pond %>% rename(max_temp = mean_max_temp)

pop_vulnerability_pond 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.3     1.49     29.4       0.577  4.11   1.49                0.000287
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Shallower pond

Run the biophysical model
micro <- micro_default # Same microclimate model as before
micro$metout[, 13] <- 0 # Make sure the pond stays in the shade

ecto_pond_shallow <- ectotherm(container=1, # container model
                               conth=50, # shallow pond of 50 cm depth
                               contw=12000,# pond of 12m width
                               contype=1, # container sunk into the ground like a pond
                               rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
                               continit = 1500, # Initial container water level (1.5m)
                               conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
                               contwet=100, # 100% of container surface area acting as free water exchanger
                               contonly=1)

environ_pond_shallow <- as.data.frame(ecto_pond_shallow$environ)

# Calculate daily temperature
daily_temp_pond_shallow <- environ_pond_shallow %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_pond_shallow <- daily_temp_pond_shallow %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_pond_shallow <- daily_temp_pond_shallow %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_pond_shallow <- predict(fit, newmods = daily_temp_warmest_days_pond_shallow$mean_weekly_temp)
daily_CTmax_pond_shallow <- dplyr::select((cbind(daily_temp_warmest_days_pond_shallow, cbind(predicted_CTmax = prediction_pond_shallow$pred,
                                               predicted_CTmax_se = prediction_pond_shallow$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_pond_shallow <- daily_CTmax_pond_shallow %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_pond_shallow, file = "RData/Climate_vulnerability/Pond/future4C/daily_vulnerability_shallow_pond_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_pond_shallow <- daily_vulnerability_pond_shallow %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_pond_shallow <- pop_vulnerability_pond_shallow %>% rename(max_temp = mean_max_temp)

pop_vulnerability_pond_shallow 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.1    0.887     31.5       0.960  1.83  0.887                  0.0932
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Deeper pond

Run the biophysical model
micro <- micro_default # Same microclimate model as before
micro$metout[, 13] <- 0 # Make sure the pond stays in the shade

ecto_pond_deep <- ectotherm(container=1, # container model
                            conth=3000, # deep pond of 3 meters depth
                            contw=12000,# pond of 12m width
                            contype=1, # container sunk into the ground like a pond
                            rainmult = 1000000000, # rainfall multiplier, to keep the pond wet
                            continit = 1500, # Initial container water level (1.5m)
                            conthole = 0, # Daily loss of height (mm) due to hole in container (e.g. infiltration)
                            contwet=100, # 100% of container surface area acting as free water exchanger
                            contonly=1)

environ_pond_deep <- as.data.frame(ecto_pond_deep$environ)

# Calculate daily temperature
daily_temp_pond_deep <- environ_pond_deep %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_pond_deep <- daily_temp_pond_deep %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_pond_deep <- daily_temp_pond_deep %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_pond_deep <- predict(fit, newmods = daily_temp_warmest_days_pond_deep$mean_weekly_temp)
daily_CTmax_pond_deep <- dplyr::select((cbind(daily_temp_warmest_days_pond_deep, 
                                                 cbind(predicted_CTmax = prediction_pond_deep$pred,
                                                       predicted_CTmax_se = prediction_pond_deep$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_pond_deep <- daily_CTmax_pond_deep %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_pond_deep, file = "RData/Climate_vulnerability/Pond/future4C/daily_vulnerability_deep_pond_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_pond_deep <- daily_vulnerability_pond_deep %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_pond_deep <- pop_vulnerability_pond_deep %>% rename(max_temp = mean_max_temp)

pop_vulnerability_pond_deep 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  33.4     1.58     29.3       0.551  4.27   1.58                0.000109
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Compare the results

# Pond depth

aquatic_parameters <- ggplot() + geom_density(data = daily_vulnerability_pond_shallow,
    aes(x = daily_TSM), alpha = 0.5, fill = "lightblue") + geom_density(data = daily_vulnerability_pond_deep,
    aes(x = daily_TSM), alpha = 0.5, fill = "darkblue") + geom_density(data = daily_vulnerability_pond,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 6) + xlab("Daily TSM") +
    ylab("Density") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))

aquatic_parameters

ggsave(aquatic_parameters, file = "fig/Figure_S10.png", height = 10, width = 12,
    dpi = 500)

Arboreal conditions

Standard conditions

Find the location and body mass of the species at highest risk
# Identify the location and species on which to do the sensitivity analysis
# (species most vulnerable warming)
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")

pop_arb_current <- filter(pop_arb_current, tip.label == "Pristimantis ockendeni")  # Most high-risk species in arboreal conditions
high_risk_arb <- pop_arb_current %>%
    slice_max(order_by = overheating_days, n = 1)
high_risk_arb  # The location -71.5, -4.5 is at highest risk for this species
## # A tibble: 1 × 18
##   tip.label     lon_adj lat_adj CTmax CTmax_se max_temp max_temp_se   TSM TSM_se
##   <chr>           <dbl>   <dbl> <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>
## 1 Pristimantis…   -71.5    -4.5  32.5    0.597     28.7       0.778  3.70  0.597
## # ℹ 9 more variables: overheating_probability <dbl>,
## #   overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>,
## #   overheating_risk_strict <dbl>, consecutive_overheating_days <dbl>,
## #   lon <dbl>, lat <dbl>
# Find body mass of this assemblage
presence_arb <- readRDS(file = "RData/General_data/species_coordinates_adjusted_arboreal.rds")

presence_body_mass_arb <- merge(presence_arb, dplyr::select(data_for_imp, tip.label,
    body_mass), by = "tip.label")
median_body_mass_arb <- presence_body_mass_arb %>%
    dplyr::group_by(lon, lat) %>%
    dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
    dplyr::ungroup()

median_body_mass_arb[median_body_mass_arb$lon == -71.5 & median_body_mass_arb$lat ==
    -4.5, ]  # 2.85 g
## # A tibble: 1 × 3
##     lon   lat median_mass
##   <dbl> <dbl>       <dbl>
## 1 -71.5  -4.5        2.85
Run the biophysical model
# Set coordinates
coords_arb <- c(-71.5, -4.5)

# Run the microclimate model
micro_arb <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                    dstart = dstart, 
                                    dfinish = dfinish, 
                                    scenario=4, # 4C of warming
                                    minshade=85,
                                    maxshade=90,
                                    Usrhyt = 2, # 2 meters above ground
                                    windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                                    microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                                    ERR = 1.5,
                                    spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                    terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  167.91    1.03  272.58
# Run the ectotherm model
micro <- micro_arb
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2m)

ecto_arb <- NicheMapR::ectotherm(live= 0, 
                                 Ww_g = 2.85, 
                                 shape = 4, 
                                 pct_wet = 80)

environ_arb <- as.data.frame(ecto_arb$environ)

# Calculate daily temperature
daily_temp_arb <- environ_arb %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb <- daily_temp_arb %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb <- daily_temp_arb %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Load imputed data
results_imputation <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

CTmax_data <- dplyr::select(results_imputation, CTmax = filled_mean_UTL5, lowerCI = lower_mean_UTL,
                            upperCI = upper_mean_UTL, acclimation_temp, tip.label, imputed)  # Select relevant columns

original_data <- dplyr::filter(CTmax_data, imputed == "no")  # Original experimental data
imputed_data <- dplyr::filter(CTmax_data, imputed == "yes")  # Imputed data

# Calculate standard error of each observation
imputed_data <- imputed_data %>%
  mutate(se = (upperCI - CTmax)/1.96)

# Group data by species
species_data <- imputed_data %>%
  group_by(tip.label)

# Filter to the species of interest 
species_data_p_ock <- species_data %>% 
  dplyr::filter(tip.label=="Pristimantis ockendeni")

# Generate predictions
fit_p_ock <- metafor::rma(yi = CTmax, sei = se, mod = ~acclimation_temp, data = species_data_p_ock)
prediction_arb <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb$mean_weekly_temp)
daily_CTmax_arb <- dplyr::select((cbind(daily_temp_warmest_days_arb, 
                                              cbind(predicted_CTmax = prediction_arb$pred,
                                                    predicted_CTmax_se = prediction_arb$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_arb <- daily_CTmax_arb %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_arb, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb <- daily_vulnerability_arb %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_arb <- pop_vulnerability_arb %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.957     31.1       0.784  1.75  0.957                  0.0835
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Lower plant height

Run the biophysical model
# Run the microclimate model
micro_arb_short <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                          dstart = dstart, 
                                          dfinish = dfinish, 
                                          scenario=4,
                                          minshade=85,
                                          maxshade=90,
                                          Usrhyt = 0.5, # 0.5 m above ground
                                          windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                                          microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                                          ERR = 1.5,
                                          spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                          terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  176.81    0.98  266.46
# Run the ectotherm model
micro <- micro_arb_short
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (50 cm)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (50 cm)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (50 cm)

ecto_arb_short <- NicheMapR::ectotherm(live= 0, 
                                       Ww_g = 2.85, 
                                       shape = 4, 
                                       pct_wet = 80)

environ_arb_short <- as.data.frame(ecto_arb_short$environ)

# Calculate daily temperature
daily_temp_arb_short <- environ_arb_short %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_short <- daily_temp_arb_short %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_short <- daily_temp_arb_short %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_short <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_short$mean_weekly_temp)
daily_CTmax_arb_short <- dplyr::select((cbind(daily_temp_warmest_days_arb_short, 
                                                 cbind(predicted_CTmax = prediction_arb_short$pred,
                                                       predicted_CTmax_se = prediction_arb_short$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_short <- daily_CTmax_arb_short %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_arb_short, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_short_height_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_short <- daily_vulnerability_arb_short %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_arb_short <- pop_vulnerability_arb_short %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb_short 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.959     31.1       0.784  1.75  0.959                  0.0835
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Higher plant height

Run the biophysical model
# Run the microclimate model
micro_arb_tall <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                         dstart = dstart, 
                                         dfinish = dfinish, 
                                         scenario=4,
                                         minshade=85,
                                         maxshade=90,
                                         Usrhyt = 5, # 5 meters above ground
                                         Refhyt = 5,
                                         windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                                         microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                                         ERR = 1.5,
                                         spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                         terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  188.60    0.71  255.96
# Run the ectotherm model
micro <- micro_arb_tall
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (5 m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (5 m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (5 m)

ecto_arb_tall <- NicheMapR::ectotherm(live= 0, 
                                      Ww_g = 2.85, 
                                      shape = 4, 
                                      pct_wet = 80)

environ_arb_tall <- as.data.frame(ecto_arb_tall$environ)

# Calculate daily temperature
daily_temp_arb_tall <- environ_arb_tall %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_tall <- daily_temp_arb_tall %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_tall <- daily_temp_arb_tall %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_tall <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_tall$mean_weekly_temp)
daily_CTmax_arb_tall <- dplyr::select((cbind(daily_temp_warmest_days_arb_tall, 
                                              cbind(predicted_CTmax = prediction_arb_tall$pred,
                                                    predicted_CTmax_se = prediction_arb_tall$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_tall <- daily_CTmax_arb_tall %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_arb_tall, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_tall_height_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_tall <- daily_vulnerability_arb_tall %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_arb_tall <- pop_vulnerability_arb_tall %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb_tall 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.969     31.1       0.784  1.73  0.969                  0.0859
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

75% radiation diffused

Run the biophysical model
# Run the microclimate model
micro_arb_mid_diff <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                             dstart = dstart, 
                                             dfinish = dfinish, 
                                             scenario=4,
                                             minshade=85,
                                             maxshade=90,
                                             Usrhyt = 2,
                                             windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                                             microclima.LAI = 0.75, # 75% of the radiation is diffused because of vegetation
                                             ERR = 1.5,
                                             spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                             terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  187.44    0.64  252.30
# Run the ectotherm model
micro <- micro_arb_mid_diff
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2 m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2 m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2 m)

ecto_arb_mid_diff <- NicheMapR::ectotherm(live= 0, 
                                          Ww_g = 2.85, 
                                          shape = 4, 
                                          pct_wet = 80)

environ_arb_mid_diff <- as.data.frame(ecto_arb_mid_diff$environ)

# Calculate daily temperature
daily_temp_arb_mid_diff <- environ_arb_mid_diff %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_mid_diff <- daily_temp_arb_mid_diff %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_mid_diff <- daily_temp_arb_mid_diff %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_mid_diff <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_mid_diff$mean_weekly_temp)
daily_CTmax_arb_mid_diff <- dplyr::select((cbind(daily_temp_warmest_days_arb_mid_diff, 
                                              cbind(predicted_CTmax = prediction_arb_mid_diff$pred,
                                                    predicted_CTmax_se = prediction_arb_mid_diff$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_mid_diff <- daily_CTmax_arb_mid_diff %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_arb_mid_diff, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_med_solar_diff_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_mid_diff <- daily_vulnerability_arb_mid_diff %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_arb_mid_diff <- pop_vulnerability_arb_mid_diff %>% rename(max_temp = mean_max_temp) 

pop_vulnerability_arb_mid_diff 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.969     31.2       0.787  1.68  0.969                  0.0918
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

50% radiation diffused

Run the biophysical model
# Run the microclimate model
micro_arb_low_diff <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                             dstart = dstart, 
                                             dfinish = dfinish, 
                                             scenario=4,
                                             minshade=85,
                                             maxshade=90,
                                             Usrhyt = 2,
                                             windfac = 0.2, # Reduce wind speed by 80% in dense vegetation
                                             microclima.LAI = 0.5, # 50% of the radiation is diffused because of vegetation
                                             ERR = 1.5,
                                             spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                             terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  218.52    1.26  309.68
# Run the ectotherm model
micro <- micro_arb_low_diff
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2 m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2 m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2 m)

ecto_arb_low_diff <- NicheMapR::ectotherm(live= 0, 
                                          Ww_g = 2.85, 
                                          shape = 4, 
                                          pct_wet = 80)

environ_arb_low_diff <- as.data.frame(ecto_arb_low_diff$environ)

# Calculate daily temperature
daily_temp_arb_low_diff <- environ_arb_low_diff %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_low_diff <- daily_temp_arb_low_diff %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_low_diff <- daily_temp_arb_low_diff %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_low_diff <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_low_diff$mean_weekly_temp)
daily_CTmax_arb_low_diff <- dplyr::select((cbind(daily_temp_warmest_days_arb_low_diff, 
                                             cbind(predicted_CTmax = prediction_arb_low_diff$pred,
                                                   predicted_CTmax_se = prediction_arb_low_diff$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_low_diff <- daily_CTmax_arb_low_diff %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


saveRDS(daily_vulnerability_arb_low_diff, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_low_solar_diff_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_low_diff <- daily_vulnerability_arb_low_diff %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_arb_low_diff <- pop_vulnerability_arb_low_diff %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb_low_diff 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.991     31.3       0.793  1.55  0.991                   0.110
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

100% wind reduction

Run the biophysical model
# Run the microclimate model
micro_arb_no_wind <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                            dstart = dstart, 
                                            dfinish = dfinish, 
                                            scenario=4,
                                            minshade=85,
                                            maxshade=90,
                                            Usrhyt = 2,
                                            windfac = 0, # Reduce wind speed by 100% in vegetation
                                            microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                                            ERR = 1.5,
                                            spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                            terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  190.46    0.58  264.68
# Run the ectotherm model
micro <- micro_arb_no_wind
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2 m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2 m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2 m)

ecto_arb_no_wind <- NicheMapR::ectotherm(live= 0, 
                                         Ww_g = 2.85, 
                                         shape = 4, 
                                         pct_wet = 80)

environ_arb_no_wind <- as.data.frame(ecto_arb_no_wind$environ)

# Calculate daily temperature
daily_temp_arb_no_wind <- environ_arb_no_wind %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_no_wind <- daily_temp_arb_no_wind %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_no_wind <- daily_temp_arb_no_wind %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_no_wind <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_no_wind$mean_weekly_temp)
daily_CTmax_arb_no_wind <- dplyr::select((cbind(daily_temp_warmest_days_arb_no_wind, 
                                                 cbind(predicted_CTmax = prediction_arb_no_wind$pred,
                                                       predicted_CTmax_se = prediction_arb_no_wind$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_no_wind<- daily_CTmax_arb_no_wind %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


saveRDS(daily_vulnerability_arb_no_wind, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_no_wind_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_no_wind <- daily_vulnerability_arb_no_wind %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_arb_no_wind <- pop_vulnerability_arb_no_wind %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb_no_wind 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.982     31.2       0.776  1.69  0.982                  0.0901
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

50% wind reduction

Run the biophysical model
# Run the microclimate model
micro_arb_high_wind <-  NicheMapR::micro_ncep(loc = coords_arb, 
                                              dstart = dstart, 
                                              dfinish = dfinish, 
                                              scenario=4,
                                              minshade=85,
                                              maxshade=90,
                                              Usrhyt = 2,
                                              windfac = 0.5, # Reduce wind speed by 50% in vegetation
                                              microclima.LAI = 0.9, # 90% of the radiation is diffused because of vegetation
                                              ERR = 1.5,
                                              spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time',
                                              terra_source = 'E:/p_pottier/Climatic_data/data/climatic_data_TerraClimate/data')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2004 (need a bit of the previous year) 
## reading weather input for 2005 
## reading weather input for 2006 
## reading weather input for 2007 
## reading weather input for 2008 
## reading weather input for 2009 
## reading weather input for 2010 
## reading weather input for 2011 
## reading weather input for 2012 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  4017  days from  2005-01-01  to  2015-12-31 23:00:00  at site  long -71.5 lat -4.5 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  185.41    0.80  250.52
# Run the ectotherm model
micro <- micro_arb_high_wind
micro$metout[, 3] <- micro$metout[, 4] # Make the local height equal to reference height (2 m)
micro$metout[, 5] <- micro$metout[, 6] # Make the local height equal to reference height (2 m)
micro$metout[, 7] <- micro$metout[, 8] # Make the local height equal to reference height (2 m)

ecto_arb_high_wind <- NicheMapR::ectotherm(live= 0, 
                                           Ww_g = 2.85, 
                                           shape = 4, 
                                           pct_wet = 80)

environ_arb_high_wind <- as.data.frame(ecto_arb_high_wind$environ)

# Calculate daily temperature
daily_temp_arb_high_wind <- environ_arb_high_wind %>%
  dplyr::mutate(YEAR = YEAR + 2004) %>%
  dplyr::group_by(YEAR, DOY) %>%
  dplyr::summarize(max_temp = max(TC), 
                   mean_temp = mean(TC), .groups = "drop") 

# Calculate mean weekly temperature
daily_temp_arb_high_wind <- daily_temp_arb_high_wind %>%
  dplyr::group_by(YEAR) %>%
  dplyr::group_modify(~calc_yearly_rolling_mean(.))

# Identify the warmest 91 days (3 months) of each year
daily_temp_warmest_days_arb_high_wind <- daily_temp_arb_high_wind %>%
  dplyr::group_by(YEAR) %>%
  dplyr::top_n(91, max_temp) %>% 
  dplyr::filter(YEAR > 2005)
Calculate climate vulnerability
# Generate predictions
prediction_arb_high_wind <- predict(fit_p_ock, newmods = daily_temp_warmest_days_arb_high_wind$mean_weekly_temp)
daily_CTmax_arb_high_wind <- dplyr::select((cbind(daily_temp_warmest_days_arb_high_wind, 
                                                 cbind(predicted_CTmax = prediction_arb_high_wind$pred,
                                                       predicted_CTmax_se = prediction_arb_high_wind$se))), -max_weekly_temp)

# Calculate climate vulnerability metrics
daily_vulnerability_arb_high_wind <- daily_CTmax_arb_high_wind %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

saveRDS(daily_vulnerability_arb_high_wind, file = "RData/Climate_vulnerability/Arboreal/future4C/daily_vulnerability_arboreal_high_wind_sensitivity_analysis.rds")

# Aggregate to local species occurrences
pop_vulnerability_arb_high_wind <- daily_vulnerability_arb_high_wind %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_arb_high_wind <- pop_vulnerability_arb_high_wind %>% rename(max_temp = mean_max_temp)

pop_vulnerability_arb_high_wind 
## # A tibble: 1 × 11
##   CTmax CTmax_se max_temp max_temp_se   TSM TSM_se overheating_probability
##   <dbl>    <dbl>    <dbl>       <dbl> <dbl>  <dbl>                   <dbl>
## 1  32.7    0.922     31.0       0.788  1.87  0.922                  0.0706
## # ℹ 4 more variables: overheating_probability_se <dbl>, overheating_days <dbl>,
## #   overheating_days_se <dbl>, overheating_risk <dbl>

Compare the results

# Plant height
plant_height <- ggplot() + geom_density(data = daily_vulnerability_arb_tall, aes(x = daily_TSM),
    alpha = 0.5, fill = "darkgreen") + geom_density(data = daily_vulnerability_arb_short,
    aes(x = daily_TSM), alpha = 0.5, fill = "lightgreen") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("Density") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

# Diffusion of solar radiation
plant_solar_rad <- ggplot() + geom_density(data = daily_vulnerability_arb_low_diff,
    aes(x = daily_TSM), alpha = 0.5, fill = "#cc4778") + geom_density(data = daily_vulnerability_arb_mid_diff,
    aes(x = daily_TSM), alpha = 0.5, fill = "#7e03a8") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("Density") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

# Wind reduction
plant_wind_reduc <- ggplot() + geom_density(data = daily_vulnerability_arb_no_wind,
    aes(x = daily_TSM), alpha = 0.5, fill = "#BA4953") + geom_density(data = daily_vulnerability_arb_high_wind,
    aes(x = daily_TSM), alpha = 0.5, fill = "#49BAAE") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("Daily TSM") +
    ylab("Density") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))

arboreal_parameters <- plant_height/plant_solar_rad/plant_wind_reduc

arboreal_parameters

ggsave(arboreal_parameters, file = "fig/Figure_S11.png", height = 30, width = 18,
    dpi = 500)

Validation of operative body temperature estimates

Here, we provide a brief validation of operative body temperatures predicted from our models. As a case in point, we compare our estimates to field body temperatures of 11 species of frogs in Mexico (taken from Lara-Resendiz & Luja, 2018, Revista Mexicana de Biodiversidad)

Prepare data

# Get Tb measurements from the study (Table 1)
data <- data.frame(Species = c("Agalychnis dacnicolor", "Craugastor occidentalis",
    "Hyla eximia", "Incilius mazatlanensis", "Leptodactylus melanonotus", "Lithobates catesbeianus",
    "Lithobates forreri", "Plectrohyla bistincta", "Smilisca baudinii", "Smilisca fodiens",
    "Tlalocohyla smithii"), Tb = c("21.7±1.97 (17.2-29.8)", "20.5±2.29 (18.2-25.8)",
    "22.8±1.12 (20.4-24)", "24.4±1.48 (22.5-26.6)", "24.6±3.36 (21.5-33.3)", "24.8±0.88 (23.4-25.8)",
    "23.9±1.84 (20.9-27.7)", "22.5±3.09 (15.1-29.9)", "23.4±2.29 (20.8-29)", "22.7±1.07 (21.4-24)",
    "21.3±2.03 (14.5-25.7)"))

# Extract the mean and range of body temperatures
data$Tb_mean <- as.numeric(sub("\\±.*", "", data$Tb))
data$Tb_range <- gsub(".*\\((.*)\\).*", "\\1", data$Tb)
range_split <- strsplit(as.character(data$Tb_range), "-")
data$Min <- sapply(range_split, function(x) as.numeric(x[1]))
data$Max <- sapply(range_split, function(x) as.numeric(x[2]))


data <- data %>%
    dplyr::select(Species, Mean = Tb_mean, Min, Max)

# Species at the first site
data_Tepic <- filter(data, Species == "Agalychnis dacnicolor" | Species == "Hyla eximia" |
    Species == "Incilius mazatlanensis" | Species == "Leptodactylus melanonotus" |
    Species == "Lithobates catesbeianus" | Species == "Lithobates forreri" | Species ==
    "Smilisca baudinii" | Species == "Smilisca fodiens" | Species == "Tlalocohyla smithii")

# Species at the second site
data_CD <- filter(data, Species == "Craugastor occidentalis" | Species == "Lithobates forreri" |
    Species == "Plectrohyla bistincta" | Species == "Smilisca baudinii" | Species ==
    "Tlalocohyla smithii")

*** Compare body temperatures at the first site

# Set parameters
dstart <- "01/01/2013"
dfinish <- "31/12/2015" # Wide range of dates, but will only select June to October 2013/2015
coords<- c(-104.85, 21.48) # Tepic, most sampled site

# Run the microclimate model
micro_valid <-  NicheMapR::micro_ncep(loc = coords, 
                                      dstart = dstart, 
                                      dfinish = dfinish, 
                                      scenario=0,
                                      minshade=85,
                                      maxshade=90,
                                      Usrhyt = 0.01,
                                      cap = 1,
                                      ERR = 1.5, 
                                      spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2012 (need a bit of the previous year) 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  1095  days from  2013-01-01  to  2015-12-31 23:00:00  at site  long -104.85 lat 21.48 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##   59.27    0.48  114.59
micro <- micro_valid

# Find body mass of the closest location
presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")
data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
                                                    body_mass), by = "tip.label")
median_body_mass <- presence_body_mass %>%
  dplyr::group_by(lon, lat) %>%
  dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
  dplyr::ungroup()

median_body_mass[median_body_mass$lon == -104.5 & median_body_mass$lat == 21.5,] # 24.9 g
## # A tibble: 1 × 3
##     lon   lat median_mass
##   <dbl> <dbl>       <dbl>
## 1 -104.  21.5        24.9
# Run the ectotherm model
ecto <- NicheMapR::ectotherm(live= 0, 
                             Ww_g = 24.9,  
                             shape = 4, 
                             pct_wet = 80)
environ <- as.data.frame(ecto$environ)

environ_2013 <- filter(environ, 
                      YEAR == "1" & 
                      DAY > 152 & DAY < 304 & 
                      (TIME < 2 | TIME > 17)) # June to October 2013; between 18h and 0:30h
environ_2015 <- filter(environ, 
                       YEAR == "3" & 
                         DAY > 882 & DAY < 1034 & 
                         (TIME < 2 | TIME > 17)) # June to October 2015; between 18h and 0:30h

stats_2013 <- environ_2013 %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2015 <- environ_2015 %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2013
##        Min      Max    Mean       sd
## 1 17.95255 27.69047 23.1765 1.636191
stats_2015 # Virtually the same
##        Min      Max     Mean       sd
## 1 17.85327 27.89148 23.78714 1.701461
x_limits <- c(0.99, 1.01) # Define plot margins

# Space out species equally
num_points <- nrow(data_Tepic)
x_values <- seq(from = 0.991, to = 1.009, length.out = num_points)

Tb_jittered <- data_Tepic %>%
  mutate(x_jitter = x_values)

first_site <- 
ggplot() +
  geom_rect(data = stats_2013,   # Add a "ribbon" to represent the range 
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Min, ymax = Max),
            fill = "grey80", alpha = 0.5) +
    geom_segment(data = stats_2013,   # Add a line for the Mean
                 aes(x = x_limits[1], xend = x_limits[2], 
                     y = Mean, yend = Mean), 
                 color = "black", size = 1.5)  +
    geom_rect(data = stats_2013,    # Add SD for the Mean
              aes(xmin = x_limits[1], xmax = x_limits[2], 
                  ymin = Mean - sd, ymax = Mean + sd),
               fill = "grey60", alpha = 0.5) +
    geom_pointrange(data = Tb_jittered,   # Add body temperature data
                    aes(x = x_jitter, y = Mean, 
                        ymin = Min, ymax = Max, col = Species),
                    size = 1.5, linewidth = 1.3) + 
  scale_x_continuous(name = "", labels = NULL, breaks = NULL) +
  theme_classic() + 
  xlab("") + 
  ylab("Temperature (°C)") + 
  theme_classic() + 
  theme(text = element_text(color = "black"),
        axis.title.y = element_text(size = 40, margin = margin(t = 0, r = 30, b = 0, l = 0)), 
        axis.text.y = element_text(size = 30, margin = margin(t = 0, r = 20, b = 0, l = 0)), 
        legend.text = element_text(size = 15, face = "italic"),
        legend.title = element_text(size = 18),
        panel.border = element_rect(fill = NA, size = 2))


first_site

*** Compare body temperatures at the second site

coords <- c(-105.03, 21.45) # El  Cuarenteño

# Run the microclimate model
micro_valid_CD <-  NicheMapR::micro_ncep(loc = coords, 
                                      dstart = dstart, 
                                      dfinish = dfinish, 
                                      scenario=0,
                                      minshade=85,
                                      maxshade=90,
                                      Usrhyt = 0.01,
                                      cap = 1,
                                      ERR = 1.5, 
                                      spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2012 (need a bit of the previous year) 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  1095  days from  2013-01-01  to  2015-12-31 23:00:00  at site  long -105.03 lat 21.45 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##   39.52    0.45   91.06
micro <- micro_valid_CD

# Run the ectotherm model
ecto_CD <- NicheMapR::ectotherm(live= 0, 
                             Ww_g = 24.9,  
                             shape = 4, 
                             pct_wet = 80)
environ_CD <- as.data.frame(ecto$environ)

environ_2013_CD <- filter(environ_CD, 
                       YEAR == "1" & 
                         DAY > 152 & DAY < 304 & 
                      (TIME < 2 | TIME > 17)) # June to October 2013
environ_2015_CD <- filter(environ, 
                       YEAR == "3" & 
                         DAY > 882 & DAY < 1034 & 
                      (TIME < 2 | TIME > 17)) # June to October 2015

stats_2013_CD <- environ_2013_CD %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2015_CD <- environ_2015_CD %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2013_CD
##        Min      Max    Mean       sd
## 1 17.95255 27.69047 23.1765 1.636191
stats_2015_CD # Virtually the same
##        Min      Max     Mean       sd
## 1 17.85327 27.89148 23.78714 1.701461
# Space out species equally
num_points <- nrow(data_CD)
x_values <- seq(from = 0.991, to = 1.009, length.out = num_points)

Tb_jittered_CD <- data_CD %>%
  mutate(x_jitter = x_values)

second_site <- 
ggplot() +
   
  geom_rect(data = stats_2013_CD, # Add a "ribbon" to represent the range
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Min, ymax = Max),
            fill = "grey80", alpha = 0.5) +
  geom_segment(data = stats_2013_CD, # Add a line for the Mean
               aes(x = x_limits[1], xend = x_limits[2], 
                   y = Mean, yend = Mean), color = "black", size = 1.5) +
  geom_rect(data = stats_2013_CD, # Add SD for the Mean
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Mean - sd, ymax = Mean + sd),
            fill = "grey60", alpha = 0.5) +
  geom_pointrange(data = Tb_jittered_CD, # Add body temperature
                  aes(x = x_jitter, y = Mean, 
                      ymin = Min, ymax = Max, 
                      col = Species),
                  size = 1.5, linewidth = 1.3) + 
  scale_x_continuous(name = "", labels = NULL, breaks = NULL) + 
  theme_classic() + 
  xlab("") + 
  ylab("Temperature (°C)") + 
  theme_classic() + 
  theme(text = element_text(color = "black"),
        axis.title.y = element_text(size = 40, margin = margin(t = 0, r = 30, b = 0, l = 0)), 
        axis.text.y = element_text(size = 30, margin = margin(t = 0, r = 20, b = 0, l = 0)), 
        legend.text = element_text(size = 15, face = "italic"),
        legend.title = element_text(size = 18),
        panel.border = element_rect(fill = NA, size = 2))

second_site

Final plot

validation_OBT <- first_site/second_site

validation_OBT

ggsave(validation_OBT, file = "fig/Figure_S12.png", height = 15, width = 11, dpi = 500)

Alternative climate vulnerability metrics

Acclimation to the maximum weekly temperature

Vegetated substrate

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate.R and the resources used in pbs/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate.pbs

Current climate
daily_CTmax_max_current <- readRDS(file="RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_max_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_current <- daily_CTmax_max_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_current <- daily_vulnerability_max_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_current <- daily_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_max_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_current)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_max_current  <- pop_vulnerability_max_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_current <- left_join(pop_vulnerability_max_current, distinct_coord, by="lon_lat")
pop_vulnerability_max_current <- pop_vulnerability_max_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_current, file="RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_max_current <- pop_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_current)

saveRDS(community_vulnerability_max_current, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_max_acc_current.rds")
Future climate (+2C)
daily_CTmax_max_2C <- readRDS(file="RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_max_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_2C <- daily_CTmax_max_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_2C <- daily_vulnerability_max_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_2C <- daily_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_max_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_2C)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_max_2C  <- pop_vulnerability_max_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_2C <- left_join(pop_vulnerability_max_2C, distinct_coord, by="lon_lat")
pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_2C, file="RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_2C)

saveRDS(community_vulnerability_max_2C, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_max_acc_future2C.rds")
Future climate (+4C)
daily_CTmax_max_4C <- readRDS(file="RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_max_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_4C <- daily_CTmax_max_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_4C <- daily_vulnerability_max_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_4C <- daily_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_max_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_4C)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_max_4C  <- pop_vulnerability_max_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_4C <- left_join(pop_vulnerability_max_4C, distinct_coord, by="lon_lat")
pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_4C, file="RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_4C)

saveRDS(community_vulnerability_max_4C, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_max_acc_future4C.rds")
Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate.R and the resources used in pbs/Climate_vulnerability/Substrate/Clipping_grid_cells_substrate.pbs

community_df_max_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_max_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_current), function(i) {
    row <- community_df_max_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_max_acc_current_clipped_cells.rds")



################################# Do the same for the future climate
################################# #########################

community_df_max_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_max_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future2C), function(i) {
    row <- community_df_max_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_max_acc_future2C_clipped_cells.rds")

################

community_df_max_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_max_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future4C), function(i) {
    row <- community_df_max_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_max_acc_future4C_clipped_cells.rds")

Pond or wetland

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond.R and the resources used in pbs/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond.pbs

Current climate
daily_CTmax_max_current <- readRDS(file="RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_max_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_current <- daily_CTmax_max_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_current <- daily_vulnerability_max_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_current <- daily_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_max_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_current)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_max_current  <- pop_vulnerability_max_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_current <- left_join(pop_vulnerability_max_current, distinct_coord, by="lon_lat")
pop_vulnerability_max_current <- pop_vulnerability_max_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_current, file="RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_max_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_max_current <- pop_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_current)

saveRDS(community_vulnerability_max_current, file="RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_max_acc_current.rds")
Future climate (+2C)
daily_CTmax_max_2C <- readRDS(file="RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_max_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_2C <- daily_CTmax_max_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_2C <- daily_vulnerability_max_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_2C <- daily_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_max_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_2C)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_max_2C  <- pop_vulnerability_max_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_2C <- left_join(pop_vulnerability_max_2C, distinct_coord, by="lon_lat")
pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_2C, file="RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_max_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_2C)

saveRDS(community_vulnerability_max_2C, file="RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_max_acc_future2C.rds")
Future climate (+4C)
daily_CTmax_max_4C <- readRDS(file="RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_max_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_4C <- daily_CTmax_max_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_4C <- daily_vulnerability_max_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_4C <- daily_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_max_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_4C)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_max_4C  <- pop_vulnerability_max_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_4C <- left_join(pop_vulnerability_max_4C, distinct_coord, by="lon_lat")
pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_4C, file="RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_max_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_4C)

saveRDS(community_vulnerability_max_4C, file="RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_max_acc_future4C.rds")
Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Clipping_grid_cells_pond.R and the resources used in pbs/Climate_vulnerability/Pond/Clipping_grid_cells_pond.pbs

community_df_max_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_max_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_current), function(i) {
    row <- community_df_max_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_max_acc_current_clipped_cells.rds")



################################# Do the same for the future climate
################################# #########################

community_df_max_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_max_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future2C), function(i) {
    row <- community_df_max_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_max_acc_future2C_clipped_cells.rds")

################

community_df_max_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_max_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future4C), function(i) {
    row <- community_df_max_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_max_acc_future4C_clipped_cells.rds")

Above-ground vegetation

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal.R and the resources used in pbs/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal.pbs

Current climate
daily_CTmax_max_current <- readRDS(file="RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_max_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_current <- daily_CTmax_max_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_current <- daily_vulnerability_max_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_current <- daily_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_max_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_current)

pop_vulnerability_max_current <- pop_vulnerability_max_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_max_current  <- pop_vulnerability_max_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_current <- left_join(pop_vulnerability_max_current, distinct_coord, by="lon_lat")
pop_vulnerability_max_current <- pop_vulnerability_max_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_current, file="RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")

######## Community-level patterns ################

community_vulnerability_max_current <- pop_vulnerability_max_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_current)

saveRDS(community_vulnerability_max_current, file="RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_max_acc_current.rds")
Future climate (+2C)
daily_CTmax_max_2C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_max_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_2C <- daily_CTmax_max_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_2C <- daily_vulnerability_max_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_2C <- daily_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_max_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_2C)

pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_max_2C  <- pop_vulnerability_max_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_2C <- left_join(pop_vulnerability_max_2C, distinct_coord, by="lon_lat")
pop_vulnerability_max_2C <- pop_vulnerability_max_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_2C, file="RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")

######## Community-level patterns ################

community_vulnerability_max_2C <- pop_vulnerability_max_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_2C)

saveRDS(community_vulnerability_max_2C, file="RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_max_acc_future2C.rds")
Future climate (+4C)
daily_CTmax_max_4C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_max_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_max_4C <- daily_CTmax_max_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_max_4C <- daily_vulnerability_max_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_max_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_max_4C <- daily_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_max_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_max_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_max_4C)

pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_max_4C  <- pop_vulnerability_max_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_max_4C <- left_join(pop_vulnerability_max_4C, distinct_coord, by="lon_lat")
pop_vulnerability_max_4C <- pop_vulnerability_max_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_max_4C, file="RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

######## Community-level patterns ################

community_vulnerability_max_4C <- pop_vulnerability_max_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_max_4C)

saveRDS(community_vulnerability_max_4C, file="RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_max_acc_future4C.rds")
Clip grid cells to match land masses

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Clipping_grid_cells_arboreal.R and the resources used in pbs/Climate_vulnerability/Arboreal/Clipping_grid_cells_arboreal.pbs

community_df_max_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_max_acc_current.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_current", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_current), function(i) {
    row <- community_df_max_current[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_max_acc_current_clipped_cells.rds")



################################# Do the same for the future climate
################################# #########################

community_df_max_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_max_acc_future2C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future2C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future2C), function(i) {
    row <- community_df_max_future2C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_max_acc_future2C_clipped_cells.rds")

################

community_df_max_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_max_acc_future4C.rds")

# Create land polygon
world_sf <- ne_countries(scale = "large", returnclass = "sf")
world_sf$geometry <- st_make_valid(world_sf$geometry)
land_polygon <- st_union(world_sf)


# Loop to create the clipped grid cells and keep the geometry column
create_grid_cell_polygon <- function(lon, lat, dx = 0.5, dy = 0.5) {
    cell_polygon <- st_polygon(list(matrix(c(lon - dx, lat - dy, lon + dx, lat -
        dy, lon + dx, lat + dy, lon - dx, lat + dy, lon - dx, lat - dy), ncol = 2,
        byrow = TRUE)))
    cell_sf <- st_sf(geometry = st_sfc(cell_polygon))
    st_set_crs(cell_sf, st_crs(land_polygon))
}

cl <- makeCluster(16)
clusterExport(cl, c("community_df_max_future4C", "land_polygon", "create_grid_cell_polygon"))
clusterEvalQ(cl, {
    library(tidyverse)
    library(sf)
    library(rnaturalearth)
    library(rnaturalearthhires)
    library(lwgeom)
    library(ggspatial)
})

clipped_grid_cells_list <- parLapply(cl, 1:nrow(community_df_max_future4C), function(i) {
    row <- community_df_max_future4C[i, ]
    cell_polygon <- create_grid_cell_polygon(row$lon, row$lat)
    clipped_cell <- st_intersection(cell_polygon, land_polygon)

    if (nrow(clipped_cell) > 0) {
        # check that clipped_cell is not an empty sf data frame
        clipped_cell$lon <- row$lon
        clipped_cell$lat <- row$lat
        clipped_cell$community_CTmax <- row$community_CTmax
        clipped_cell$community_CTmax_se <- row$community_CTmax_se
        clipped_cell$community_max_temp <- row$community_max_temp
        clipped_cell$community_max_temp_se <- row$community_max_temp_se
        clipped_cell$community_TSM <- row$community_TSM
        clipped_cell$community_TSM_se <- row$community_TSM_se
        clipped_cell$n_species <- row$n_species
        clipped_cell$n_species_overheating <- row$n_species_overheating
        clipped_cell$proportion_species_overheating <- row$proportion_species_overheating
        clipped_cell$proportion_species_overheating_se <- row$proportion_species_overheating_se
        clipped_cell$n_species_overheating_strict <- row$n_species_overheating_strict
        clipped_cell$proportion_species_overheating_strict <- row$proportion_species_overheating_strict
        clipped_cell$proportion_species_overheating_se_strict <- row$proportion_species_overheating_se_strict

        return(clipped_cell)
    } else {
        return(NULL)
    }
})

# Stop the cluster
stopCluster(cl)

# Create a list of clipped grid cells
clipped_grid_cells_list <- Filter(Negate(is.null), clipped_grid_cells_list)

# Merge the list of clipped grid cells into a single sf data frame
clipped_grid_cells <- do.call(rbind, clipped_grid_cells_list)

saveRDS(clipped_grid_cells, file = "RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_max_acc_future4C_clipped_cells.rds")

Including larger uncertainty in overheating probability

Here, we restrict the standard deviation of simulated CTmax distributions to the “biological range” of CTmax, that is, the standard deviation of all CTmax estimates across species (s.e. range from different microhabitats: 1.84 - 2.17).

Vegetated substrate

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_large_se.R and the resources used in pbs/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_large_se.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_current$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_large_se.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_2C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_large_se.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_4C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_large_se.rds")

Pond or wetland

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond_sensitivity_large_se.R and the resources used in pbs/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond_large_se.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_current$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_large_se.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_2C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_large_se.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_4C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_large_se.rds")

Above-ground vegetation

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal_large_se.R and the resources used in pbs/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal_large_se.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_current$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_current <- daily_CTmax_mean_current %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_current <- daily_vulnerability_mean_current %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_current)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current <- daily_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_current)

## Calculate number of consecutive overheating days
consecutive_overheating_days_current <- daily_consecutive_mean_current %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_current)

pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  left_join(consecutive_overheating_days_current, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_current)

## Add original coordinates
pop_vulnerability_mean_current  <- pop_vulnerability_mean_current %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current <- left_join(pop_vulnerability_mean_current, distinct_coord, by="lon_lat")
pop_vulnerability_mean_current <- pop_vulnerability_mean_current %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current, file="RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_current <- pop_vulnerability_mean_current %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),    
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_current)

saveRDS(community_vulnerability_mean_current, file="RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_large_se.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_2C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_2C <- daily_CTmax_mean_2C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_2C <- daily_vulnerability_mean_2C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_2C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C <- daily_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_2C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_2C <- daily_consecutive_mean_2C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_2C)

pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  left_join(consecutive_overheating_days_2C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_2C)

## Add original coordinates
pop_vulnerability_mean_2C  <- pop_vulnerability_mean_2C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C <- left_join(pop_vulnerability_mean_2C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C, file="RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C <- pop_vulnerability_mean_2C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_2C)

saveRDS(community_vulnerability_mean_2C, file="RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to the "biological range" of CTmax, defined as the standard deviation of CTmax estimates across species.
# Note that this may overestimate overheating probabilities in some cases.
cap_se <- sd(daily_CTmax_mean_4C$predicted_CTmax)

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

###### Daily TSM and overheating risk ##########
daily_vulnerability_mean_4C <- daily_CTmax_mean_4C %>%
  rowwise() %>%
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob>0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp, # calculate TSM
         daily_TSM_se = predicted_CTmax_se) %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)


# Number of consecutive days of overheating
daily_consecutive_mean_4C <- daily_vulnerability_mean_4C %>%  
  # Arrange by day and year
  group_by(tip.label, lon, lat, YEAR) %>%
  arrange(DOY) %>%
  # Calculate consecutive days of overheating
  mutate(consecutive_overheating_day = {
    rle_run <- rle(overheating_day)
    rep(rle_run$lengths * rle_run$values, times = rle_run$lengths)
  })

# Set number of days
n_days <- 910

rm(daily_CTmax_mean_4C)

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C <- daily_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    # Mean max temp and SE
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop'
  ) %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
    lower_CI = overheating_days - (1.96 * overheating_days_se), 
    overheating_risk_strict = ifelse(lower_CI > 0, 1, 0) # Conservative estimates when 95% CI don't overlap with zero
  ) %>%
  ungroup() %>% 
  dplyr::select(-lower_CI)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% rename(max_temp = mean_max_temp)

rm(daily_vulnerability_mean_4C)

## Calculate number of consecutive overheating days
consecutive_overheating_days_4C <- daily_consecutive_mean_4C %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(consecutive_overheating_days = max(consecutive_overheating_day),
            .groups = 'drop')

rm(daily_consecutive_mean_4C)

pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  left_join(consecutive_overheating_days_4C, by = c("tip.label", "lon", "lat"))

rm(consecutive_overheating_days_4C)

## Add original coordinates
pop_vulnerability_mean_4C  <- pop_vulnerability_mean_4C %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C <- left_join(pop_vulnerability_mean_4C, distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C, file="RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C <- pop_vulnerability_mean_4C %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp),  
    community_max_temp_se = first(max_temp_se), 
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # Conservative metrics for sensitivity analysis
    n_species_overheating_strict = sum(overheating_risk_strict), 
    proportion_species_overheating_strict = if_else(n() == 1, first(overheating_risk_strict), mean(overheating_risk_strict)), 
    proportion_species_overheating_se_strict = if_else(n() == 1, 0, sd(overheating_risk_strict)),  
    .groups = 'drop'
  )

rm(pop_vulnerability_mean_4C)

saveRDS(community_vulnerability_mean_4C, file="RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

Removing outliers or not taking averages for TSM

Here, we either remove body temperatures falling outside the 5% and 95% percentiles (i.e., potential outlier values), and also calculate the maximum operative body temperature predicted across all dates for sensitivity analyses.

Vegetated substrate

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_sensitivity_analysis.R and the resources used in pbs/Climate_vulnerability/Substrate/Calculating_climate_vulnerability_metrics_substrate_sensitivity_analysis.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Substrate/current/daily_CTmax_substrate_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_current_sens <- daily_CTmax_mean_current %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_current_sens <- daily_CTmax_mean_current %>%
  inner_join(daily_percentiles_mean_current_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_current_sens <- daily_filtered_mean_current_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current_sens <- daily_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_current_sens <- daily_filtered_mean_current_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_current_sens_95 <- pop_data_95_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_current_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_current_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_current_sens <- daily_CTmax_mean_current  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_current_sens <- pop_data_extreme_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_current_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_current_sens   <- pop_vulnerability_mean_current_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current_sens  <- left_join(pop_vulnerability_mean_current_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_current_sens  <- pop_vulnerability_mean_current_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Substrate/future2C/daily_CTmax_substrate_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_2C_sens <- daily_CTmax_mean_2C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_2C_sens <- daily_CTmax_mean_2C %>%
  inner_join(daily_percentiles_mean_2C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_2C_sens <- daily_filtered_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C_sens <- daily_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_2C_sens <- daily_filtered_mean_2C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_2C_sens_95 <- pop_data_95_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_2C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_2C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_2C_sens <- daily_CTmax_mean_2C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_2C_sens <- pop_data_extreme_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_2C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_2C_sens   <- pop_vulnerability_mean_2C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C_sens  <- left_join(pop_vulnerability_mean_2C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C_sens  <- pop_vulnerability_mean_2C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Substrate/future4C/daily_CTmax_substrate_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_4C_sens <- daily_CTmax_mean_4C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_4C_sens <- daily_CTmax_mean_4C %>%
  inner_join(daily_percentiles_mean_4C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_4C_sens <- daily_filtered_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C_sens <- daily_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup()

pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_4C_sens <- daily_filtered_mean_4C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_4C_sens_95 <- pop_data_95_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_4C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_4C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_4C_sens <- daily_CTmax_mean_4C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_4C_sens <- pop_data_extreme_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_4C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_4C_sens   <- pop_vulnerability_mean_4C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C_sens  <- left_join(pop_vulnerability_mean_4C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C_sens  <- pop_vulnerability_mean_4C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

Pond or wetland

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond_sensitivity_analysis.R and the resources used in pbs/Climate_vulnerability/Pond/Calculating_climate_vulnerability_metrics_pond_sensitivity_analysis.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Pond/current/daily_CTmax_pond_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_current_sens <- daily_CTmax_mean_current %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_current_sens <- daily_CTmax_mean_current %>%
  inner_join(daily_percentiles_mean_current_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_current_sens <- daily_filtered_mean_current_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current_sens <- daily_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_current_sens <- daily_filtered_mean_current_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_current_sens_95 <- pop_data_95_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_current_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_current_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_current_sens <- daily_CTmax_mean_current  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_current_sens <- pop_data_extreme_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_current_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_current_sens   <- pop_vulnerability_mean_current_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current_sens  <- left_join(pop_vulnerability_mean_current_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_current_sens  <- pop_vulnerability_mean_current_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Pond/future2C/daily_CTmax_pond_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_2C_sens <- daily_CTmax_mean_2C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_2C_sens <- daily_CTmax_mean_2C %>%
  inner_join(daily_percentiles_mean_2C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_2C_sens <- daily_filtered_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C_sens <- daily_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_2C_sens <- daily_filtered_mean_2C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_2C_sens_95 <- pop_data_95_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_2C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_2C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_2C_sens <- daily_CTmax_mean_2C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_2C_sens <- pop_data_extreme_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_2C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_2C_sens   <- pop_vulnerability_mean_2C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C_sens  <- left_join(pop_vulnerability_mean_2C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C_sens  <- pop_vulnerability_mean_2C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Pond/future4C/daily_CTmax_pond_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_4C_sens <- daily_CTmax_mean_4C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_4C_sens <- daily_CTmax_mean_4C %>%
  inner_join(daily_percentiles_mean_4C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_4C_sens <- daily_filtered_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C_sens <- daily_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0), # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_4C_sens <- daily_filtered_mean_4C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_4C_sens_95 <- pop_data_95_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_4C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_4C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_4C_sens <- daily_CTmax_mean_4C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_4C_sens <- pop_data_extreme_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_4C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_4C_sens   <- pop_vulnerability_mean_4C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C_sens  <- left_join(pop_vulnerability_mean_4C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C_sens  <- pop_vulnerability_mean_4C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")

Above-ground vegetation

This code ran on an HPC environment, where the original code can be found in R/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal_sensitivity_analysis.R and the resources used in pbs/Climate_vulnerability/Arboreal/Calculating_climate_vulnerability_metrics_arboreal_sensitivity_analysis.pbs

Current climate
daily_CTmax_mean_current <- readRDS(file="RData/Climate_vulnerability/Arboreal/current/daily_CTmax_arboreal_mean_acc_current.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_current_sens <- daily_CTmax_mean_current %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_current_sens <- daily_CTmax_mean_current %>%
  inner_join(daily_percentiles_mean_current_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_current_sens <- daily_filtered_mean_current_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_current_sens <- daily_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_current_sens <- daily_filtered_mean_current_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_current_sens_95 <- pop_data_95_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_current_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_current_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_current_sens <- daily_CTmax_mean_current  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_current_sens <- pop_data_extreme_mean_current_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 
  
  # Join datasets
  pop_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_current_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_current_sens   <- pop_vulnerability_mean_current_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_current_sens  <- left_join(pop_vulnerability_mean_current_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_current_sens  <- pop_vulnerability_mean_current_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_current_sens <- pop_vulnerability_mean_current_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_current_sens, file="RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
Future climate (+2C)
daily_CTmax_mean_2C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future2C/daily_CTmax_arboreal_mean_acc_future2C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_2C_sens <- daily_CTmax_mean_2C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_2C_sens <- daily_CTmax_mean_2C %>%
  inner_join(daily_percentiles_mean_2C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_2C_sens <- daily_filtered_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_2C_sens <- daily_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_2C_sens <- daily_filtered_mean_2C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_2C_sens_95 <- pop_data_95_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_2C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_2C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_2C_sens <- daily_CTmax_mean_2C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_2C_sens <- pop_data_extreme_mean_2C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_2C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_2C_sens   <- pop_vulnerability_mean_2C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_2C_sens  <- left_join(pop_vulnerability_mean_2C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_2C_sens  <- pop_vulnerability_mean_2C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_2C_sens <- pop_vulnerability_mean_2C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_2C_sens, file="RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
Future climate (+4C)
daily_CTmax_mean_4C <- readRDS(file="RData/Climate_vulnerability/Arboreal/future4C/daily_CTmax_arboreal_mean_acc_future4C.rds")

# Assign a maximum se for observations with very large error. 
# This is capped to avoid large uncertainty to overestimate overheating probabilities
# A SD of 1 simulates values within ~3 degrees of the mean CTmax
cap_se <- 1

# Function to calculate overheating probability and SE
calculate_overheating_probability <- function(predicted_CTmax, predicted_CTmax_se, max_temp) {
  capped_se <- min(predicted_CTmax_se, cap_se)  # Take the predicted SE if under the capped SE
  prob_overheating <- pnorm(max_temp, mean = predicted_CTmax, sd = capped_se) # Probability that max temp exceeds CTmax distribution
  return(list(prob_overheating = prob_overheating))
}

# Calculate 5% and 95% percentile for each group
daily_percentiles_mean_4C_sens <- daily_CTmax_mean_4C %>%
  group_by(tip.label, lon, lat) %>%
  summarise(p5_max_temp = quantile(max_temp, 0.05),
            p95_max_temp = quantile(max_temp, 0.95))

# Filter data within 5% to 95% percentile range
daily_filtered_mean_4C_sens <- daily_CTmax_mean_4C %>%
  inner_join(daily_percentiles_mean_4C_sens, by = c("tip.label", "lon", "lat")) %>%
  filter(max_temp >= p5_max_temp & max_temp <= p95_max_temp)

# Daily TSM and overheating risk 
daily_vulnerability_mean_4C_sens <- daily_filtered_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(overheating_result = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), # Apply function
         overheating_prob = overheating_result$prob_overheating, # retrieve overheating probability
         overheating_day = ifelse(overheating_prob > 0.5, 1, 0), # Consider overheating day when overheating probability > 0.5
         daily_TSM = predicted_CTmax - max_temp,
         daily_TSM_se = predicted_CTmax_se)  %>% 
  ungroup() %>% 
  dplyr::select(-overheating_result)

# Set number of days
n_days <- 910

########## Climate vulnerability metrics at the population-level  ###########
pop_vulnerability_mean_4C_sens <- daily_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(daily_TSM_se^2),
         CTmax_weights = 1/(predicted_CTmax_se^2)) %>% 
  group_by(tip.label, lon, lat) %>%
  summarise(
    # Mean CTmax and maximum temperature (weighted average and SE)
    CTmax = sum(predicted_CTmax * CTmax_weights)/sum(CTmax_weights), 
    CTmax_se = sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2))))),
    mean_max_temp = mean(max_temp),
    max_temp_se = sd(max_temp),
    # Mean TSM (weighted average and SE)
    TSM = sum(daily_TSM * TSM_weights)/sum(TSM_weights), 
    TSM_se = sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2))))),
    # Combine daily overheating probabilities for each population
    overheating_probability = mean(overheating_prob),
    overheating_probability_se = sqrt(overheating_probability * (1 - overheating_probability)),
    .groups = 'drop') %>%
  rowwise() %>%
  mutate(
    overheating_days = n_days * overheating_probability,
    overheating_days_se = sqrt(n_days * overheating_probability * (1 - overheating_probability)), # SE in overheating days
    overheating_risk = ifelse(overheating_days >= 1, 1, 0) # Overheating risk when overheating days >= 1
  ) %>%
  ungroup() 

pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>% rename(max_temp = mean_max_temp)

# Create a dataframe with only the 95th percentile of max_temp for each population
pop_data_95_mean_4C_sens <- daily_filtered_mean_4C_sens %>%
  group_by(tip.label, lon, lat) %>%
  slice_max(order_by = max_temp, n = 1) %>% 
  ungroup()

# Calculate TSM as the difference with the 95th percentile maximum temperature 
pop_vulnerability_mean_4C_sens_95 <- pop_data_95_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_95 = predicted_CTmax - max_temp,
         TSM_95_se = predicted_CTmax_se,
         CTmax_95 = predicted_CTmax,
         CTmax_95_se = predicted_CTmax_se,
         max_temp_95 = max_temp,
         overheating_result_95 = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_95 = overheating_result_95$prob_overheating, 
         overheating_risk_95 = ifelse(overheating_probability_95 > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_95) 


# Combine data frames
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_mean_4C_sens_95,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_95, 
                          TSM_95_se, 
                          CTmax_95, 
                          CTmax_95_se, 
                          max_temp_95,
                          overheating_probability_95,
                          overheating_risk_95), 
            by = c("tip.label", "lon", "lat"))

rm(pop_vulnerability_mean_4C_sens_95)

# Create a dataframe with only the max_temp for each population (minimum TSM)
pop_data_extreme_mean_4C_sens <- daily_CTmax_mean_4C  %>% 
  group_by(tip.label, lon, lat) %>%
  filter(max_temp == max(max_temp)) %>% 
  ungroup()

# Calculate TSM as the difference with the maximum temperature (most extreme TSM)
pop_vulnerability_extreme_mean_4C_sens <- pop_data_extreme_mean_4C_sens %>% 
  rowwise() %>% 
  mutate(TSM_extreme = predicted_CTmax - max_temp,
         TSM_extreme_se = predicted_CTmax_se,
         CTmax_extreme = predicted_CTmax,
         CTmax_extreme_se = predicted_CTmax_se,
         max_temp_extreme = max_temp,
         overheating_result_extreme = list(calculate_overheating_probability(predicted_CTmax, predicted_CTmax_se, max_temp)), 
         overheating_probability_extreme = overheating_result_extreme$prob_overheating, 
         overheating_risk_extreme = ifelse(overheating_probability_extreme > 0.5, 1, 0)) %>%   
  ungroup() %>% 
  dplyr::select(-overheating_result_extreme) 

# Join datasets
pop_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  left_join(dplyr::select(pop_vulnerability_extreme_mean_4C_sens,
                          tip.label, 
                          lon, 
                          lat, 
                          TSM_extreme, 
                          TSM_extreme_se, 
                          CTmax_extreme, 
                          CTmax_extreme_se, 
                          max_temp_extreme,
                          overheating_probability_extreme,
                          overheating_risk_extreme), 
            by = c("tip.label", "lon", "lat"))

## Add original coordinates
pop_vulnerability_mean_4C_sens   <- pop_vulnerability_mean_4C_sens  %>% 
  rename(lon_adj = lon, lat_adj = lat) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) 

distinct_coord <- readRDS("RData/General_data/distinct_coordinates_adjusted_arboreal.rds")
distinct_coord <- distinct_coord %>% 
  dplyr::select(lon_adj = lon, lat_adj = lat, lon = x, lat = y) %>% 
  mutate(lon_lat = paste(lon_adj, lat_adj)) %>% 
  dplyr::select(-lon_adj, -lat_adj)

pop_vulnerability_mean_4C_sens  <- left_join(pop_vulnerability_mean_4C_sens , distinct_coord, by="lon_lat")
pop_vulnerability_mean_4C_sens  <- pop_vulnerability_mean_4C_sens  %>% 
  dplyr::select(-lon_lat)

saveRDS(pop_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

######## Community-level patterns ################

community_vulnerability_mean_4C_sens <- pop_vulnerability_mean_4C_sens %>%
  mutate(TSM_weights = 1/(TSM_se^2),
         CTmax_weights = 1/(CTmax_se^2),
         TSM_extreme_weights = 1/(TSM_extreme_se^2),
         TSM_95_weights = 1/(TSM_95_se^2)) %>%
  group_by(lon, lat) %>%
  summarise(# ifelse statement is used here because in some locations, only one species is present.
    # Mean CTmax and maximum temperature at the community-level (weighted average and SE)
    community_CTmax = if_else(n() == 1, first(CTmax), sum(CTmax * CTmax_weights)/sum(CTmax_weights)), 
    community_CTmax_se = if_else(n() == 1, first(CTmax_se), sqrt(sum(CTmax_weights) * (n() - 1) / (((sum(CTmax_weights)^2) - (sum(CTmax_weights^2)))))),
    community_max_temp = first(max_temp), 
    community_max_temp_se = first(max_temp_se),
    # Mean TSM (weighted average and SE)
    community_TSM = if_else(n() == 1, first(TSM), sum(TSM * TSM_weights)/sum(TSM_weights)), 
    community_TSM_se = if_else(n() == 1, first(TSM_se), sqrt(sum(TSM_weights) * (n() - 1) / (((sum(TSM_weights)^2) - (sum(TSM_weights^2)))))),
    # Number of species
    n_species = n_distinct(tip.label), 
    # Number of species overheating
    n_species_overheating = sum(overheating_risk), 
    # Proportion of species overheating
    proportion_species_overheating = if_else(n() == 1, first(overheating_risk), mean(overheating_risk)), 
    proportion_species_overheating_se = if_else(n() == 1, 0, sd(overheating_risk)),
    # TSM calculated as the difference with the maximum body temperature 
    community_TSM_extreme = if_else(n() == 1, first(TSM_extreme), sum(TSM_extreme * TSM_extreme_weights)/sum(TSM_extreme_weights)), 
    community_TSM_extreme_se = if_else(n() == 1, first(TSM_extreme_se), sqrt(sum(TSM_extreme_weights) * (n() - 1) / (((sum(TSM_extreme_weights)^2) - (sum(TSM_extreme_weights^2)))))),
    # TSM calculated as the difference with the 95th percentile body temperature 
    community_TSM_95 = if_else(n() == 1, first(TSM_95), sum(TSM_95 * TSM_95_weights)/sum(TSM_95_weights)), 
    community_TSM_95_se = if_else(n() == 1, first(TSM_95_se), sqrt(sum(TSM_95_weights) * (n() - 1) / (((sum(TSM_95_weights)^2) - (sum(TSM_95_weights^2)))))),
    .groups = 'drop'
  )

saveRDS(community_vulnerability_mean_4C_sens, file="RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

Thermal safety margin

Only the code and outputs of population-level models are presented here. Community-level models were also fitted, and the outputs can be found in the RData/Models/TSM/sensitivity_analyses/ folder.

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_max_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_max_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_max_acc_future4C.rds")


# Function to run population-level TSM models in parallel
run_TSM_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(TSM ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$TSM_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        TSM = NA, TSM_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_",
        habitat_scenario, "_max_acc.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 922112.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.1195  -0.5370  -0.1926   0.1091  25.4767 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.174  1.474  "                          
## [12] " genus         (Intercept)    8.364  2.892  "                          
## [13] " Xr            s(lat)      1121.291 33.486  "                          
## [14] " Residual                     5.747  2.397  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  13.6267     0.1428    95.4"                              
## [20] "Xs(lat)Fx1    -4.4629     0.3882   -11.5"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x26cae898>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.6267     0.1428    95.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 5026  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0687   "                                      
## [22] "lmer.REML = 9.2211e+05  Scale est. = 5.7469    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 939714.3"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-10.153  -0.492  -0.156   0.149  35.516 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   1.846   1.359  "                          
## [12] " genus         (Intercept)   7.540   2.746  "                          
## [13] " Xr            s(lat)      885.564  29.758  "                          
## [14] " Residual                    6.141   2.478  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.9398     0.1358   95.31"                              
## [20] "Xs(lat)Fx1    -5.6366     0.4042  -13.94"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xb88f870>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.9398     0.1358   95.31   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.991  8.991 4872  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0684   "                                      
## [22] "lmer.REML = 9.3971e+05  Scale est. = 6.141     n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 886728.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-10.4763  -0.4341  -0.0683   0.3382  24.4812 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   1.610   1.269  "                          
## [12] " genus         (Intercept)   5.262   2.294  "                          
## [13] " Xr            s(lat)      689.193  26.252  "                          
## [14] " Residual                    6.052   2.460  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  11.2939     0.1146   98.51"                              
## [20] "Xs(lat)Fx1    -7.6797     0.3933  -19.53"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xe2c1450>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.2939     0.1146   98.51   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.989  8.989 4921  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0318   "                                       
## [22] "lmer.REML = 8.8673e+05  Scale est. = 6.052     n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 998876.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.6065  -0.5920  -0.2422   0.0654  27.7115 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.912  2.216  "                          
## [12] " genus         (Intercept)   11.272  3.357  "                          
## [13] " Xr            s(lat)      1558.235 39.474  "                          
## [14] " Residual                     9.705  3.115  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  15.6747     0.1692   92.66"                              
## [20] "Xs(lat)Fx1    -5.5179     0.4668  -11.82"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xbfe6138>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  15.6747     0.1692   92.66   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3731  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0251   "                                       
## [22] "lmer.REML = 9.9888e+05  Scale est. = 9.7047    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1005149"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.5069  -0.5308  -0.1899   0.1052  29.4534 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.339  2.083  "                          
## [12] " genus         (Intercept)   10.360  3.219  "                          
## [13] " Xr            s(lat)      1724.213 41.524  "                          
## [14] " Residual                     8.671  2.945  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  14.7092     0.1621   90.74"                              
## [20] "Xs(lat)Fx1    -7.1553     0.4609  -15.52"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xe2bd840>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  14.7092     0.1621   90.74   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4182  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0334   "                                       
## [22] "lmer.REML = 1.0051e+06  Scale est. = 8.6712    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 967319.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.6008  -0.4124  -0.0469   0.2878  29.0700 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.455  1.859  "                          
## [12] " genus         (Intercept)    8.086  2.844  "                          
## [13] " Xr            s(lat)      1759.980 41.952  "                          
## [14] " Residual                     8.319  2.884  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.8948     0.1437   89.74"                              
## [20] "Xs(lat)Fx1    -9.9509     0.4632  -21.48"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x26cbd318>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.8948     0.1437   89.74   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4142  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0896   "                                       
## [22] "lmer.REML = 9.6732e+05  Scale est. = 8.3188    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 239873.8"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.3842 -0.6029 -0.2297  0.1051 22.2414 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.988  1.410  "                         
## [12] " genus         (Intercept)    6.175  2.485  "                         
## [13] " Xr            s(lat)      3730.536 61.078  "                         
## [14] " Residual                     5.147  2.269  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  13.4310     0.2068   64.94"                             
## [20] "Xs(lat)Fx1     9.2699     0.7894   11.74"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2a186c60>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.4310     0.2068   64.94   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.984  8.984 1472  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0759   "                                      
## [22] "lmer.REML = 2.3987e+05  Scale est. = 5.1466    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 239549.2"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.6039 -0.5594 -0.1852  0.1444 20.2494 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.675  1.294  "                         
## [12] " genus         (Intercept)    5.597  2.366  "                         
## [13] " Xr            s(lat)      3837.392 61.947  "                         
## [14] " Residual                     4.590  2.143  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  12.7445     0.1969   64.71"                             
## [20] "Xs(lat)Fx1    10.2443     0.7622   13.44"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x60c5dd38>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.7445     0.1969   64.71   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.986  8.986 1499  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0869   "                                      
## [22] "lmer.REML = 2.3955e+05  Scale est. = 4.5905    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 233046.7"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.2007 -0.4499 -0.0605  0.3013 17.6358 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.445  1.202  "                         
## [12] " genus         (Intercept)    4.358  2.088  "                         
## [13] " Xr            s(lat)      2893.592 53.792  "                         
## [14] " Residual                     4.873  2.207  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  11.2630     0.1757   64.11"                             
## [20] "Xs(lat)Fx1     7.0628     0.7865    8.98"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2215bcb8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.2630     0.1757   64.11   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.98   8.98 1075  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0375   "                                      
## [22] "lmer.REML = 2.3305e+05  Scale est. = 4.8728    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label 

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(TSM ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(TSM_se):units, # Genus, species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_max_acc.rds")
saveRDS(predictions, file = "RData/Models/TSM/sensitivity_analyses/predictions_MCMCglmm_TSM_max_acc.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(TSM ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(TSM_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_max_acc.rds")
Model summaries
Overall means
model_MCMC_TSM <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_max_acc.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5342335 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.417    1.296    1.547    683.3
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     13.11    12.19    14.35    520.2
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.626    1.621    1.632     1045
## 
##  Location effects: TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current      12.707    9.874   15.812     1000 <0.001
## habitat_scenarioarboreal_future2C     12.151    9.317   15.259     1000 <0.001
## habitat_scenarioarboreal_future4C     11.048    8.221   14.146     1000 <0.001
## habitat_scenariopond_current          13.617   10.790   16.723     1000 <0.001
## habitat_scenariopond_future2C         12.861   10.037   15.966     1000 <0.001
## habitat_scenariopond_future4C         11.721    8.896   14.815     1000 <0.001
## habitat_scenariosubstrate_current     12.364    9.544   15.472     1000 <0.001
## habitat_scenariosubstrate_future2C    11.744    8.918   14.849     1000 <0.001
## habitat_scenariosubstrate_future4C    10.495    7.671   13.603     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_max_acc.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5342399 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.418    1.303    1.534    747.4
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     13.19    12.25    14.31    560.1
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.626     1.62    1.631     1070
## 
##  Location effects: TSM ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              12.3350
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.3435
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    -0.2125
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    -1.3164
## relevel(habitat_scenario, ref = "substrate_current")pond_current          1.2529
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C         0.4966
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        -0.6434
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   -0.6198
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   -1.8685
##                                                                        l-95% CI
## (Intercept)                                                              3.1597
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.3276
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.2296
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.3336
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1.2417
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        0.4859
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       -0.6544
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.6298
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -1.8803
##                                                                        u-95% CI
## (Intercept)                                                             20.9744
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.3612
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.1976
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.2991
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1.2641
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        0.5076
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       -0.6329
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.6089
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -1.8578
##                                                                        eff.samp
## (Intercept)                                                               702.6
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      901.3
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         941.8
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    832.0
##                                                                         pMCMC
## (Intercept)                                                             0.026
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            *  
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_TSM)

Not averaging TSM (maximum temperature)

Here, we calculated TSM as the difference between the maximum hourly body temperature experienced and the corresponding CTmax.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_no_averaging_max_temp.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_no_averaging_max_temp.pbs

Generalized additive mixed models

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")


# Function to run population-level TSM models in parallel with the maximum
# hourly body temperature (TSM_extreme)
run_TSM_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(TSM_extreme ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$TSM_extreme_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        TSM_extreme = NA, TSM_extreme_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_",
        habitat_scenario, "_max_temp.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_",
        habitat_scenario, "_max_temp.rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_",
        habitat_scenario, "_max_temp.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

options(future.globals.maxSize = 1e+26)

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_current_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1053328"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-8.6106 -0.5885 -0.1273  0.3239 17.9677 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.088  1.757  "                          
## [12] " genus         (Intercept)    7.344  2.710  "                          
## [13] " Xr            s(lat)      1978.771 44.483  "                          
## [14] " Residual                    17.383  4.169  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)   8.6122     0.1386   62.16"                              
## [20] "Xs(lat)Fx1   -11.9234     0.6244  -19.09"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.015 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_current_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x25a549d8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   8.6122     0.1386   62.16   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.991  8.991 1391  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0544   "                                      
## [22] "lmer.REML = 1.0533e+06  Scale est. = 17.383    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future2C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1066933"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-9.0866 -0.5982 -0.1519  0.2954 18.2691 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.885  1.699  "                          
## [12] " genus         (Intercept)    7.947  2.819  "                          
## [13] " Xr            s(lat)      1736.696 41.674  "                          
## [14] " Residual                    15.639  3.955  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)   8.1324     0.1430   56.86"                              
## [20] "Xs(lat)Fx1   -12.4029     0.6034  -20.55"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.013 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future2C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x13a99030>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)    8.132      0.143   56.86   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 1431  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.151   "                                       
## [22] "lmer.REML = 1.0669e+06  Scale est. = 15.639    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future4C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1057248"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-10.0022  -0.5825  -0.1659   0.2767  23.6853 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.649  1.628  "                          
## [12] " genus         (Intercept)    7.565  2.750  "                          
## [13] " Xr            s(lat)      1334.691 36.533  "                          
## [14] " Residual                    12.323  3.510  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)   6.7436     0.1394   48.38"                              
## [20] "Xs(lat)Fx1   -13.2317     0.5392  -24.54"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future4C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0xfddfdd0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   6.7436     0.1394   48.38   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.989  8.989 1603  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.256   "                                       
## [22] "lmer.REML = 1.0572e+06  Scale est. = 12.323    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_current_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1010048"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.2808  -0.5509  -0.1949   0.1461  26.5520 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.326  2.080  "                          
## [12] " genus         (Intercept)   10.636  3.261  "                          
## [13] " Xr            s(lat)      1682.898 41.023  "                          
## [14] " Residual                     9.443  3.073  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  13.9194     0.1641   84.83"                              
## [20] "Xs(lat)Fx1    -8.2266     0.4873  -16.88"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_current_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x143b6678>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.9194     0.1641   84.83   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3320  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.227   "                                       
## [22] "lmer.REML = 1.01e+06  Scale est. = 9.4432    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future2C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1009034"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.4004  -0.4701  -0.1119   0.2341  27.2069 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.859  1.964  "                          
## [12] " genus         (Intercept)    8.946  2.991  "                          
## [13] " Xr            s(lat)      1894.695 43.528  "                          
## [14] " Residual                     9.379  3.062  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.6950     0.1514   83.85"                              
## [20] "Xs(lat)Fx1   -11.3493     0.4916  -23.09"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future2C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0xfdda5e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.6950     0.1514   83.85   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 3283  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.156   "                                       
## [22] "lmer.REML = 1.009e+06  Scale est. = 9.3787    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future4C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 947540.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.6774  -0.3829   0.0175   0.4204  28.3540 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.024  1.739  "                          
## [12] " genus         (Intercept)    6.280  2.506  "                          
## [13] " Xr            s(lat)      1831.190 42.792  "                          
## [14] " Residual                     9.651  3.107  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  10.6143     0.1279   82.99"                              
## [20] "Xs(lat)Fx1   -15.0898     0.4886  -30.88"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future4C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x25a7b030>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  10.6143     0.1279   82.99   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 2481  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0545   "                                      
## [22] "lmer.REML = 9.4754e+05  Scale est. = 9.6509    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_current_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 282134.7"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.6790 -0.6287 -0.1086  0.3817 10.8616 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    2.727  1.651  "                         
## [12] " genus         (Intercept)    5.107  2.260  "                         
## [13] " Xr            s(lat)      7335.666 85.649  "                         
## [14] " Residual                    19.428  4.408  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)   9.4108     0.1996  47.149"                             
## [20] "Xs(lat)Fx1    10.1683     1.3973   7.277"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.016 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_current_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x2f1ab630>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   9.4108     0.1996   47.15   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.976  8.976 506.1  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0225   "                                       
## [22] "lmer.REML = 2.8213e+05  Scale est. = 19.428    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future2C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 282511.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.5960 -0.6495 -0.1301  0.3655 10.2045 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    2.578  1.606  "                         
## [12] " genus         (Intercept)    4.964  2.228  "                         
## [13] " Xr            s(lat)      7220.158 84.972  "                         
## [14] " Residual                    15.496  3.937  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)   8.8660     0.1964   45.15"                             
## [20] "Xs(lat)Fx1    10.4976     1.3007    8.07"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.016 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future2C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x2d4f1f30>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   8.8660     0.1964   45.15   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.979  8.979 504.9  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00306   "                                      
## [22] "lmer.REML = 2.8251e+05  Scale est. = 15.496    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future4C_max_temp.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 285377.7"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-6.5453 -0.6502 -0.1695  0.3028 15.3437 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    2.397  1.548  "                         
## [12] " genus         (Intercept)    4.662  2.159  "                         
## [13] " Xr            s(lat)      4852.165 69.657  "                         
## [14] " Residual                    11.717  3.423  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)   7.7717     0.1911  40.658"                             
## [20] "Xs(lat)Fx1     5.2177     1.1833   4.409"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.016 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future4C_max_temp.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_extreme ~ s(lat, bs = \"tp\")"                             
##  [7] "<environment: 0x2f18bdd8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   7.7717     0.1911   40.66   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.973  8.973 403.4  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0454   "                                      
## [22] "lmer.REML = 2.8538e+05  Scale est. = 11.717    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label 

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(TSM_extreme ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(TSM_extreme_se):units, # Genus, species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_max_temp.rds")
saveRDS(predictions, file = "RData/Models/TSM/sensitivity_analyses/predictions_MCMCglmm_TSM_max_temp.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(TSM_extreme ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(TSM_extreme_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_max_temp.rds")
Model summaries
Overall means
model_MCMC_TSM <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_max_temp.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 6287561 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.464     1.32    1.585    643.3
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     11.37    10.45    12.52    444.4
## 
##                ~idh(TSM_extreme_se):units
## 
##                      post.mean l-95% CI u-95% CI eff.samp
## TSM_extreme_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.443    3.431    3.453     1022
## 
##  Location effects: TSM_extreme ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       7.562    4.832   10.154     1000 <0.001
## habitat_scenarioarboreal_future2C      6.950    4.223    9.552     1000 <0.001
## habitat_scenarioarboreal_future4C      5.754    3.038    8.352     1000 <0.001
## habitat_scenariopond_current          12.173    9.448   14.787     1000 <0.001
## habitat_scenariopond_future2C         11.345    8.614   13.959     1000 <0.001
## habitat_scenariopond_future4C          9.989    7.267   12.595     1000 <0.001
## habitat_scenariosubstrate_current      6.796    4.073    9.397     1000 <0.001
## habitat_scenariosubstrate_future2C     6.162    3.438    8.773     1000 <0.001
## habitat_scenariosubstrate_future4C     4.831    2.112    7.435     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_max_temp.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 6287634 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.469    1.347    1.598    524.5
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     11.38    10.33    12.32    483.5
## 
##                ~idh(TSM_extreme_se):units
## 
##                      post.mean l-95% CI u-95% CI eff.samp
## TSM_extreme_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.443    3.431    3.453     1033
## 
##  Location effects: TSM_extreme ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                               6.7762
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.7670
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.1553
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    -1.0411
## relevel(habitat_scenario, ref = "substrate_current")pond_current          5.3775
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C         4.5492
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         3.1930
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   -0.6338
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   -1.9648
##                                                                        l-95% CI
## (Intercept)                                                              2.5497
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.7420
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.1312
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.0634
## relevel(habitat_scenario, ref = "substrate_current")pond_current         5.3634
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        4.5342
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        3.1787
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.6496
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -1.9792
##                                                                        u-95% CI
## (Intercept)                                                             11.1058
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.7949
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.1791
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.0193
## relevel(habitat_scenario, ref = "substrate_current")pond_current         5.3941
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        4.5643
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        3.2104
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.6190
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -1.9490
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      906.5
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1267.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1289.8
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1052.5
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1117.2
##                                                                         pMCMC
## (Intercept)                                                             0.002
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ** 
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_TSM)

Not averaging TSM (95th percentile temperature)

Here, we calculated TSM as the difference between the 95th percentile hourly body temperature experienced and the corresponding CTmax.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_no_averaging_95th_percentile.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_no_averaging_95th_percentile.pbs

Generalized additive mixed models

## Here, we will calculate TSM based on the difference between the 95th
## percentile hourly operative body temperature and the predicted CTmax at this
## time point This is to contrast with the use of average values (mean maximum
## temperature of the warmest quarter).

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")


# Function to run population-level TSM models in parallel with the maximum
# hourly body temperature (TSM_95)
run_TSM_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(TSM_95 ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$TSM_95_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        TSM_95 = NA, TSM_95_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_",
        habitat_scenario, "_95th_percentile.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_",
        habitat_scenario, "_95th_percentile.rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_",
        habitat_scenario, "_95th_percentile.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

options(future.globals.maxSize = 1e+26)

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_current_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 914674.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-9.2242 -0.5863 -0.2059  0.1723 22.9679 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.459  1.568  "                          
## [12] " genus         (Intercept)    7.339  2.709  "                          
## [13] " Xr            s(lat)      1285.478 35.854  "                          
## [14] " Residual                     8.955  2.993  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  11.4099     0.1353   84.34"                              
## [20] "Xs(lat)Fx1    -6.9383     0.4324  -16.05"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_current_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x23c67b98>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.4099     0.1353   84.34   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 2694  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.104   "                                       
## [22] "lmer.REML = 9.1467e+05  Scale est. = 8.9553    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future2C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 945852.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-9.0654 -0.5904 -0.2280  0.1507 23.5300 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.299   1.516  "                          
## [12] " genus         (Intercept)   7.808   2.794  "                          
## [13] " Xr            s(lat)      844.065  29.053  "                          
## [14] " Residual                    8.773   2.962  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  10.8620     0.1390   78.17"                              
## [20] "Xs(lat)Fx1    -7.7342     0.4457  -17.35"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future2C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x11cb0030>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   10.862      0.139   78.17   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.988  8.988 2605  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.218   "                                       
## [22] "lmer.REML = 9.4585e+05  Scale est. = 8.7726    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future4C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 978053.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-10.0526  -0.5727  -0.2171   0.1931  25.6486 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.215   1.488  "                          
## [12] " genus         (Intercept)   7.295   2.701  "                          
## [13] " Xr            s(lat)      948.054  30.790  "                          
## [14] " Residual                    8.359   2.891  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)   9.3396     0.1350   69.19"                              
## [20] "Xs(lat)Fx1   -11.1026     0.4457  -24.91"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future4C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0xdff6dd0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)    9.340      0.135   69.19   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.989  8.989 2660  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.306   "                                       
## [22] "lmer.REML = 9.7805e+05  Scale est. = 8.3589    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_current_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1008119"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.1228  -0.5628  -0.2092   0.1221  27.0813 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.462  2.112  "                          
## [12] " genus         (Intercept)   10.488  3.238  "                          
## [13] " Xr            s(lat)      1655.905 40.693  "                          
## [14] " Residual                     9.212  3.035  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  14.7258     0.1633   90.17"                              
## [20] "Xs(lat)Fx1    -8.3085     0.4820  -17.24"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_current_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x125cd678>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  14.7258     0.1633   90.17   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3604  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.176   "                                       
## [22] "lmer.REML = 1.0081e+06  Scale est. = 9.2118    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future2C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1008500"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.3923  -0.4854  -0.1292   0.2060  27.0432 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.994  1.999  "                          
## [12] " genus         (Intercept)    8.988  2.998  "                          
## [13] " Xr            s(lat)      2055.897 45.342  "                          
## [14] " Residual                     9.097  3.016  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  13.5259     0.1520   89.02"                              
## [20] "Xs(lat)Fx1   -11.9607     0.4883  -24.50"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future2C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0xdff15e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   13.526      0.152   89.02   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 3672  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.12   "                                        
## [22] "lmer.REML = 1.0085e+06  Scale est. = 9.0969    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future4C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 946024.8"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.7166  -0.3907  -0.0007   0.3905  27.7234 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.137  1.771  "                          
## [12] " genus         (Intercept)    6.449  2.539  "                          
## [13] " Xr            s(lat)      2075.437 45.557  "                          
## [14] " Residual                     9.209  3.035  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  11.4417     0.1296   88.28"                              
## [20] "Xs(lat)Fx1   -15.5664     0.4819  -32.30"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future4C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x23c8e1f0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.4417     0.1296   88.28   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.995  8.995 2957  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0306   "                                      
## [22] "lmer.REML = 9.4602e+05  Scale est. = 9.2085    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_current_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 233195.3"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-5.3566 -0.6146 -0.1983  0.2001 17.6327 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.914  1.383  "                         
## [12] " genus         (Intercept)    5.553  2.357  "                         
## [13] " Xr            s(lat)      3985.719 63.133  "                         
## [14] " Residual                     8.100  2.846  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  11.7904     0.1965  59.990"                             
## [20] "Xs(lat)Fx1     8.8999     0.9010   9.878"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_current_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x2d3c2630>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.7904     0.1965   59.99   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.982  8.982 958.8  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.03   "                                        
## [22] "lmer.REML = 2.332e+05  Scale est. = 8.0996    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future2C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 235414.1"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-6.9723 -0.6399 -0.2250  0.1958 16.0587 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.840  1.356  "                         
## [12] " genus         (Intercept)    5.458  2.336  "                         
## [13] " Xr            s(lat)      4212.238 64.902  "                         
## [14] " Residual                     6.748  2.598  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  11.2108     0.1950   57.48"                             
## [20] "Xs(lat)Fx1     9.2079     0.8355   11.02"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future2C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x2b708f30>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   11.211      0.195   57.48   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df   F p-value    "                           
## [17] "s(lat) 8.985  8.985 960  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.061   "                                       
## [22] "lmer.REML = 2.3541e+05  Scale est. = 6.7481    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future4C_95th_percentile.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 251721.4"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.4532 -0.6380 -0.2371  0.1989 18.2209 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.858  1.363  "                         
## [12] " genus         (Intercept)    5.022  2.241  "                         
## [13] " Xr            s(lat)      3269.482 57.179  "                         
## [14] " Residual                     6.536  2.556  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)   9.9421     0.1896  52.433"                             
## [20] "Xs(lat)Fx1     6.6410     0.8752   7.588"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future4C_95th_percentile.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM_95 ~ s(lat, bs = \"tp\")"                                  
##  [7] "<environment: 0x2d3a2dd8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   9.9421     0.1896   52.43   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.978  8.978 692.6  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.114   "                                       
## [22] "lmer.REML = 2.5172e+05  Scale est. = 6.5355    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label 

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(TSM_95 ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(TSM_95_se):units, # Genus, species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_95th_percentile.rds")
saveRDS(predictions, file = "RData/Models/TSM/sensitivity_analyses/predictions_MCMCglmm_TSM_95th_percentile.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(TSM_95 ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(TSM_95_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_95th_percentile.rds")
Model summaries
Overall means
model_MCMC_TSM <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_95th_percentile.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5774225 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.296    1.185    1.423    667.1
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     11.02    10.11    12.02    485.5
## 
##                ~idh(TSM_95_se):units
## 
##                 post.mean l-95% CI u-95% CI eff.samp
## TSM_95_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     2.216    2.208    2.223    998.4
## 
##  Location effects: TSM_95 ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current      10.540    7.880   13.199     1000 <0.001
## habitat_scenarioarboreal_future2C      9.832    7.230   12.562     1000 <0.001
## habitat_scenarioarboreal_future4C      8.270    5.611   10.948     1000 <0.001
## habitat_scenariopond_current          12.691   10.036   15.374     1000 <0.001
## habitat_scenariopond_future2C         11.864    9.184   14.533     1000 <0.001
## habitat_scenariopond_future4C         10.553    7.880   13.214     1000 <0.001
## habitat_scenariosubstrate_current      9.853    7.185   12.523     1000 <0.001
## habitat_scenariosubstrate_future2C     9.077    6.401   11.746     1000 <0.001
## habitat_scenariosubstrate_future4C     7.419    4.749   10.090     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_95th_percentile.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5774291 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species       1.3    1.184    1.405    653.4
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     11.04    10.09    11.93    528.5
## 
##                ~idh(TSM_95_se):units
## 
##                 post.mean l-95% CI u-95% CI eff.samp
## TSM_95_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     2.216    2.208    2.223     1044
## 
##  Location effects: TSM_95 ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                         post.mean
## (Intercept)                                                             9.6687503
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.6867972
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.0209172
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.5826836
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.8377278
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       2.0104723
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.6993051
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7769529
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.4344531
##                                                                          l-95% CI
## (Intercept)                                                             4.5197817
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.6653024
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.0428482
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.6010613
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.8224506
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       1.9976859
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.6848314
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7911516
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.4474413
##                                                                          u-95% CI
## (Intercept)                                                            15.0415117
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.7125448
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.0001118
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  -1.5628207
## relevel(habitat_scenario, ref = "substrate_current")pond_current        2.8492689
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       2.0236020
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.7119613
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C -0.7644726
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C -2.4218480
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1392.9
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         996.4
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    983.9
##                                                                         pMCMC
## (Intercept)                                                             0.002
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.058
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ** 
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  .  
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_TSM)

Without outliers

Here, we excluded that fell below the 5th percentile or above the 95th percentile maximum operative body temperature for each population. While these may not be true outlier values, this is equivalent to analyses performed in previous studies (e.g., Pinky et al., 2019. Nature)

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_outliers.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_TSM_sensitivity_analysis_outliers.pbs

Generalized additive mixed models

## These datasets are excluding 'outlier' values, i.e., values that are below
## the 5th and above the 95th percentile operative body temperature for each
## population.  These analyses were performed to echo previous work trimming
## outlier values (e.g., Pinsky et al., 2019. Nature)

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")


# Function to run population-level TSM models in parallel
run_TSM_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(TSM ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$TSM_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        TSM = NA, TSM_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$TSM_pred <- pred$fit
    new_data$TSM_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = TSM_pred + 1.96 * TSM_pred_se, lower = TSM_pred -
        1.96 * TSM_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(new_data, file = paste0("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_",
        habitat_scenario, "_without_outliers.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

options(future.globals.maxSize = 1e+26)

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_TSM_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 888066.8"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-9.5651 -0.6141 -0.2354  0.1261 24.8145 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    2.530  1.591  "                          
## [12] " genus         (Intercept)    7.698  2.775  "                          
## [13] " Xr            s(lat)      1010.177 31.783  "                          
## [14] " Residual                     8.462  2.909  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  13.2926     0.1381   96.28"                              
## [20] "Xs(lat)Fx1    -4.5724     0.4050  -11.29"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x24fb6738>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.2926     0.1381   96.28   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.992  8.992 3844  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0347   "                                       
## [22] "lmer.REML = 8.8807e+05  Scale est. = 8.462     n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 920918.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "   Min     1Q Median     3Q    Max "                                   
##  [7] "-9.584 -0.614 -0.256  0.100 37.282 "                                   
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.460   1.568  "                          
## [12] " genus         (Intercept)   7.833   2.799  "                          
## [13] " Xr            s(lat)      846.547  29.095  "                          
## [14] " Residual                    8.219   2.867  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.7054     0.1392   91.24"                              
## [20] "Xs(lat)Fx1    -5.2197     0.4193  -12.45"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x12fdd9b0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.7054     0.1392   91.24   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3581  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0423   "                                      
## [22] "lmer.REML = 9.2092e+05  Scale est. = 8.2193    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_substrate_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 945639.1"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-10.4651  -0.6096  -0.2588   0.1257  23.9700 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.195   1.482  "                          
## [12] " genus         (Intercept)   7.546   2.747  "                          
## [13] " Xr            s(lat)      778.607  27.904  "                          
## [14] " Residual                    6.998   2.645  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  11.3391     0.1366   83.02"                              
## [20] "Xs(lat)Fx1    -7.1813     0.4128  -17.39"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_substrate_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xf325080>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.3391     0.1366   83.02   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.989  8.989 4098  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.149   "                                       
## [22] "lmer.REML = 9.4564e+05  Scale est. = 6.9981    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 999101.3"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-11.5022  -0.5959  -0.2460   0.0682  27.4434 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.970  2.229  "                          
## [12] " genus         (Intercept)   11.345  3.368  "                          
## [13] " Xr            s(lat)      1546.070 39.320  "                          
## [14] " Residual                     9.878  3.143  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  15.7513     0.1697   92.79"                              
## [20] "Xs(lat)Fx1    -4.9830     0.4680  -10.65"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x138fb0f8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  15.7513     0.1697   92.79   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3797  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0285   "                                       
## [22] "lmer.REML = 9.991e+05  Scale est. = 9.8785    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1009284"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.3582  -0.5402  -0.1972   0.1061  29.0216 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    4.444  2.108  "                          
## [12] " genus         (Intercept)   10.533  3.245  "                          
## [13] " Xr            s(lat)      1724.026 41.521  "                          
## [14] " Residual                     8.881  2.980  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  14.7790     0.1635   90.38"                              
## [20] "Xs(lat)Fx1    -6.6605     0.4642  -14.35"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0xf31f898>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  14.7790     0.1635   90.38   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4241  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0297   "                                       
## [22] "lmer.REML = 1.0093e+06  Scale est. = 8.8814    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_pond_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 975478.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-12.4124  -0.4206  -0.0549   0.2819  28.3892 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)    3.593  1.896  "                          
## [12] " genus         (Intercept)    8.318  2.884  "                          
## [13] " Xr            s(lat)      1798.218 42.405  "                          
## [14] " Residual                     8.594  2.932  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  12.9209     0.1458   88.59"                              
## [20] "Xs(lat)Fx1    -9.7316     0.4695  -20.73"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_pond_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x23c7f950>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  12.9209     0.1458   88.59   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4146  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0775   "                                       
## [22] "lmer.REML = 9.7548e+05  Scale est. = 8.5943    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 227929.3"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-4.7601 -0.6317 -0.2154  0.1469 19.9851 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    2.102  1.450  "                         
## [12] " genus         (Intercept)    5.846  2.418  "                         
## [13] " Xr            s(lat)      2773.763 52.667  "                         
## [14] " Residual                     7.900  2.811  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  13.1500     0.2015   65.25"                             
## [20] "Xs(lat)Fx1     8.3040     0.8285   10.02"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2e6f9c50>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  13.1500     0.2015   65.25   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.977  8.977 1214  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.00321   "                                     
## [22] "lmer.REML = 2.2793e+05  Scale est. = 7.9003    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 229320.4"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-5.8827 -0.6554 -0.2429  0.1420 18.6811 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.964  1.401  "                         
## [12] " genus         (Intercept)    5.721  2.392  "                         
## [13] " Xr            s(lat)      3252.895 57.034  "                         
## [14] " Residual                     6.460  2.542  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  12.5445     0.1990   63.04"                             
## [20] "Xs(lat)Fx1     9.2566     0.7953   11.64"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.011 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2ca40550>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   12.544      0.199   63.04   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.982  8.982 1219  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0353   "                                      
## [22] "lmer.REML = 2.2932e+05  Scale est. = 6.4601    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_MER_pop_lat_TSM_arboreal_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 242182.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-7.3338 -0.6658 -0.2733  0.1366 17.0779 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)    1.876  1.370  "                         
## [12] " genus         (Intercept)    5.441  2.333  "                         
## [13] " Xr            s(lat)      3025.223 55.002  "                         
## [14] " Residual                     5.603  2.367  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  11.3439     0.1953  58.079"                             
## [20] "Xs(lat)Fx1     7.3683     0.8100   9.096"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/TSM/sensitivity_analyses/summary_GAM_pop_lat_TSM_arboreal_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "TSM ~ s(lat, bs = \"tp\")"                                     
##  [7] "<environment: 0x2e6da3f8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  11.3439     0.1953   58.08   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.979  8.979 1042  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0907   "                                      
## [22] "lmer.REML = 2.4218e+05  Scale est. = 5.6034    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label 

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(TSM ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(TSM_se):units, # Genus, species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_without_outliers.rds")
saveRDS(new_data, file = "RData/Models/TSM/sensitivity_analyses/predictions_MCMCglmm_TSM_without_outliers.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(TSM ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(TSM_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_without_outliers.rds")
Model summaries
Overall means
model_MCMC_TSM <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_without_outliers.rds")
summary(model_MCMC_TSM)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5635481 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.296    1.171    1.409    672.7
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     12.07    11.03    13.09    509.9
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.959    1.952    1.966     1013
## 
##  Location effects: TSM ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current      12.366    9.461   15.056     1000 <0.001
## habitat_scenarioarboreal_future2C     11.636    8.712   14.318     1000 <0.001
## habitat_scenarioarboreal_future4C     10.170    7.257   12.848     1000 <0.001
## habitat_scenariopond_current          13.658   10.736   16.351     1000 <0.001
## habitat_scenariopond_future2C         12.862   10.073   15.683     1000 <0.001
## habitat_scenariopond_future4C         11.673    8.753   14.363     1000 <0.001
## habitat_scenariosubstrate_current     11.865    8.951   14.549     1000 <0.001
## habitat_scenariosubstrate_future2C    11.061    8.139   13.754     1000 <0.001
## habitat_scenariosubstrate_future4C     9.512    6.596   12.199     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_TSM_contrast <- readRDS("RData/Models/TSM/sensitivity_analyses/model_MCMCglmm_TSM_contrast_without_outliers.rds")
summary(model_MCMC_TSM_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5635581 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     1.299    1.184    1.403    655.3
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label      12.1    11.08    13.03    549.3
## 
##                ~idh(TSM_se):units
## 
##              post.mean l-95% CI u-95% CI eff.samp
## TSM_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     1.959    1.952    1.965     1043
## 
##  Location effects: TSM ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              11.8452
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.5021
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    -0.2275
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    -1.6946
## relevel(habitat_scenario, ref = "substrate_current")pond_current          1.7936
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C         0.9972
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        -0.1921
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   -0.8040
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   -2.3526
##                                                                        l-95% CI
## (Intercept)                                                              5.2777
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.4801
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.2501
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.7138
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1.7793
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        0.9855
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       -0.2056
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.8184
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -2.3662
##                                                                        u-95% CI
## (Intercept)                                                             18.2752
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.5267
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.2068
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   -1.6764
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1.8056
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1.0108
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       -0.1803
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  -0.7914
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  -2.3406
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1092.9
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1010.2
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    960.2
##                                                                         pMCMC
## (Intercept)                                                             0.002
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ** 
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_TSM)

CTmax

Only the code and outputs of population-level models are presented here. Community-level models were also fitted, and the outputs can be found in the RData/Models/CTmax/sensitivity_analyses/ folder.

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_CTmax_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_CTmax_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_max_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_max_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_max_acc_future4C.rds")


# Function to run population-level CTmax models in parallel
run_CTmax_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(CTmax ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$CTmax_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        CTmax = NA, CTmax_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$CTmax_pred <- pred$fit
    new_data$CTmax_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = CTmax_pred + 1.96 * CTmax_pred_se, lower = CTmax_pred -
        1.96 * CTmax_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/CTmax/sensitivity_analyses/predictions_pop_lat_CTmax_",
        habitat_scenario, "_max_acc.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_CTmax_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 145855.3"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.1959  -0.0742   0.1888   0.5120  12.0263 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3264  0.5713  "                          
## [12] " genus         (Intercept)  3.5541  1.8852  "                          
## [13] " Xr            s(lat)      22.2229  4.7141  "                          
## [14] " Residual                   0.1220  0.3493  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.24174    0.08916 417.675"                              
## [20] "Xs(lat)Fx1    0.51955    0.05808   8.945"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x284f99e8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.24174    0.08916   417.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.992  8.992 4489  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.167   "                                        
## [22] "lmer.REML = 1.4586e+05  Scale est. = 0.12201   n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 150804.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-39.597  -0.102   0.147   0.455  11.490 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3194  0.5652  "                          
## [12] " genus         (Intercept)  3.5465  1.8832  "                          
## [13] " Xr            s(lat)      16.8489  4.1047  "                          
## [14] " Residual                   0.1221  0.3495  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.32558    0.08905   419.2"                              
## [20] "Xs(lat)Fx1    0.64687    0.05879    11.0"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xd0f9210>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.32558    0.08905   419.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 4557  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.177   "                                        
## [22] "lmer.REML = 1.508e+05  Scale est. = 0.12214   n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 86736.9"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.0428  -0.2891   0.0479   0.3815  12.3741 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3155  0.5617  "                          
## [12] " genus         (Intercept)  3.5774  1.8914  "                          
## [13] " Xr            s(lat)      11.7133  3.4225  "                          
## [14] " Residual                   0.1134  0.3367  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.52906    0.08937  419.91"                              
## [20] "Xs(lat)Fx1    0.84097    0.05557   15.13"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xfaa9888>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.52906    0.08937   419.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.987  8.987 5387  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.127   "                                        
## [22] "lmer.REML =  86737  Scale est. = 0.11337   n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 237239.5"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.3032  -0.0718   0.2387   0.5901  11.4589 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3948  0.6284  "                          
## [12] " genus         (Intercept)  3.7151  1.9275  "                          
## [13] " Xr            s(lat)      36.4692  6.0390  "                          
## [14] " Residual                   0.2284  0.4779  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.98809    0.09113  405.88"                              
## [20] "Xs(lat)Fx1    0.81410    0.07288   11.17"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xd81bcd8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.98809    0.09113   405.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3587  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.178   "                                        
## [22] "lmer.REML = 2.3724e+05  Scale est. = 0.2284    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 242615.4"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-29.1301  -0.1111   0.1846   0.5284  12.0763 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3848  0.6203  "                          
## [12] " genus         (Intercept)  3.6955  1.9224  "                          
## [13] " Xr            s(lat)      40.3516  6.3523  "                          
## [14] " Residual                   0.2028  0.4503  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.13631    0.09086   408.7"                              
## [20] "Xs(lat)Fx1    1.07033    0.07184    14.9"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xfaa3dc8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.13631    0.09086   408.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 4046  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.185   "                                        
## [22] "lmer.REML = 2.4262e+05  Scale est. = 0.20281   n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 204765.6"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.7462  -0.2903   0.0396   0.4077  12.1767 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3698  0.6081  "                          
## [12] " genus         (Intercept)  3.6941  1.9220  "                          
## [13] " Xr            s(lat)      41.1924  6.4181  "                          
## [14] " Residual                   0.1938  0.4402  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.40721    0.09077  412.12"                              
## [20] "Xs(lat)Fx1    1.51501    0.07242   20.92"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x28508430>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.40721    0.09077   412.1   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4028  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.146   "                                        
## [22] "lmer.REML = 2.0477e+05  Scale est. = 0.19376   n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 29210.1"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-23.3072  -0.0839   0.2282   0.5900   7.1800 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.2732  0.5227  "                         
## [12] " genus         (Intercept)  2.8518  1.6887  "                         
## [13] " Xr            s(lat)      82.1227  9.0622  "                         
## [14] " Residual                   0.1151  0.3392  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.8297     0.1312  288.41"                             
## [20] "Xs(lat)Fx1    -1.3361     0.1220  -10.95"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2b9a5d80>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.8297     0.1312   288.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.983  8.983 1374  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0534   "                                       
## [22] "lmer.REML =  29210  Scale est. = 0.11508   n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 24778.2"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-22.0796  -0.1093   0.1853   0.5347   7.8168 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.26910 0.5188  "                         
## [12] " genus         (Intercept)  2.83840 1.6848  "                         
## [13] " Xr            s(lat)      81.09473 9.0053  "                         
## [14] " Residual                   0.09492 0.3081  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.9245     0.1308  289.87"                             
## [20] "Xs(lat)Fx1    -1.4802     0.1134  -13.05"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x624eb620>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.9245     0.1308   289.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.985  8.985 1497  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0516   "                                       
## [22] "lmer.REML =  24778  Scale est. = 0.094922  n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 11546.1"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-19.7202  -0.2421   0.0602   0.4096   8.0137 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.26823 0.5179  "                         
## [12] " genus         (Intercept)  2.82743 1.6815  "                         
## [13] " Xr            s(lat)      50.93832 7.1371  "                         
## [14] " Residual                   0.08873 0.2979  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  38.1153     0.1305 291.966"                             
## [20] "Xs(lat)Fx1    -0.9161     0.1102  -8.315"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x33ae0bd0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  38.1153     0.1305     292   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.978  8.978 1306  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0313   "                                       
## [22] "lmer.REML =  11546  Scale est. = 0.088733  n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)

split_names <- strsplit(as.character(all_data$tip.label), ' ')
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data$species <- all_data$tip.label

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
# Had to remove phylogenetic effects and weights because this model failed to estimate variance components. Only a nested genus/species structure was kept.
model_MCMC <- MCMCglmm(CTmax ~ habitat_scenario - 1, # No intercept
                       random = ~ species + genus:species, 
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_max_acc.rds")
saveRDS(predictions, file = "RData/Models/CTmax/sensitivity_analyses/predictions_MCMCglmm_CTmax_max_acc.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# Had to remove phylogenetic effects and weights because this model failed to estimate variance components. Only a nested genus/species structure was kept.
model_MCMC_contrast <- MCMCglmm(CTmax ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ genus + genus:species,
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_contrast_max_acc.rds")
Model summaries
Overall means
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_max_acc.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 186563.5 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species    0.3401   0.0668    1.031    3.175
## 
##                ~genus:species
## 
##               post.mean l-95% CI u-95% CI eff.samp
## genus:species     3.802    3.046    4.174    8.466
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units   0.06668  0.06653  0.06685    859.4
## 
##  Location effects: CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       37.16    37.11    37.22     1000 <0.001
## habitat_scenarioarboreal_future2C      37.25    37.20    37.31     1000 <0.001
## habitat_scenarioarboreal_future4C      37.42    37.36    37.47     1000 <0.001
## habitat_scenariopond_current           37.07    37.02    37.13     1000 <0.001
## habitat_scenariopond_future2C          37.21    37.16    37.26     1000 <0.001
## habitat_scenariopond_future4C          37.43    37.38    37.49     1000 <0.001
## habitat_scenariosubstrate_current      37.21    37.15    37.26     1000 <0.001
## habitat_scenariosubstrate_future2C     37.30    37.24    37.35     1000 <0.001
## habitat_scenariosubstrate_future4C     37.48    37.43    37.54     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_CTmax_contrast <- readRDS("RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_contrast_max_acc.rds")
summary(model_MCMC_CTmax_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 186512.1 
## 
##  G-structure:  ~genus
## 
##       post.mean l-95% CI u-95% CI eff.samp
## genus     4.226    3.538    4.994     1000
## 
##                ~genus:species
## 
##               post.mean l-95% CI u-95% CI eff.samp
## genus:species     0.381   0.3671    0.396     1000
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units   0.06668  0.06652  0.06684     1000
## 
##  Location effects: CTmax ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                            37.349660
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.044077
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.041063
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.213323
## relevel(habitat_scenario, ref = "substrate_current")pond_current       -0.135549
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.003152
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.226240
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.088995
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.278367
##                                                                         l-95% CI
## (Intercept)                                                            36.487134
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.046449
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.038402
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.210913
## relevel(habitat_scenario, ref = "substrate_current")pond_current       -0.137012
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.001490
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.224606
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.087458
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.276787
##                                                                         u-95% CI
## (Intercept)                                                            38.041915
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.041484
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.043321
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.215736
## relevel(habitat_scenario, ref = "substrate_current")pond_current       -0.133956
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.004656
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.227762
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.090779
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.279846
##                                                                        eff.samp
## (Intercept)                                                              1180.4
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         885.9
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1000.0
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_CTmax)

Without outliers

Here, we excluded that fell below the 5th percentile or above the 95th percentile maximum operative body temperature for each population. While these may not be true outlier values, this is equivalent to analyses performed in previous studies (e.g., Pinky et al., 2019. Nature)

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_CTmax_sensitivity_analysis_outliers.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_CTmax_sensitivity_analysis_outliers.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")


# Function to run population-level CTmax models in parallel
run_CTmax_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(CTmax ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$CTmax_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        CTmax = NA, CTmax_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$CTmax_pred <- pred$fit
    new_data$CTmax_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = CTmax_pred + 1.96 * CTmax_pred_se, lower = CTmax_pred -
        1.96 * CTmax_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(new_data, file = paste0("RData/Models/CTmax/sensitivity_analyses/predictions_pop_lat_CTmax_",
        habitat_scenario, "_without_outliers.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

options(future.globals.maxSize = 1e+26)

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_CTmax_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 190372.2"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-27.9825  -0.0832   0.2468   0.6009   9.1328 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3768  0.6139  "                          
## [12] " genus         (Intercept)  3.6659  1.9146  "                          
## [13] " Xr            s(lat)      28.5283  5.3412  "                          
## [14] " Residual                   0.2659  0.5157  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.85921    0.09074 406.202"                              
## [20] "Xs(lat)Fx1    0.61367    0.07371   8.325"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x240c25a8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.85921    0.09074   406.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.991  8.991 3086  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.125   "                                        
## [22] "lmer.REML = 1.9037e+05  Scale est. = 0.26595   n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 198876.7"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "    Min      1Q  Median      3Q     Max "                              
##  [7] "-37.553  -0.057   0.259   0.600   8.911 "                              
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3671  0.6059  "                          
## [12] " genus         (Intercept)  3.6342  1.9064  "                          
## [13] " Xr            s(lat)      24.8322  4.9832  "                          
## [14] " Residual                   0.2288  0.4783  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.95614    0.09033  409.14"                              
## [20] "Xs(lat)Fx1    0.74398    0.07203   10.33"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x1201e2a0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.95614    0.09033   409.1   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3170  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.138   "                                        
## [22] "lmer.REML = 1.9888e+05  Scale est. = 0.22876   n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_substrate_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 188744.5"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-29.0961  -0.0593   0.2417   0.5782   9.7548 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3528  0.5940  "                          
## [12] " genus         (Intercept)  3.6109  1.9002  "                          
## [13] " Xr            s(lat)      20.6591  4.5452  "                          
## [14] " Residual                   0.1634  0.4043  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.13505    0.08998  412.70"                              
## [20] "Xs(lat)Fx1    0.88913    0.06508   13.66"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_substrate_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xe3dc630>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.13505    0.08998   412.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.99   8.99 3764  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.157   "                                        
## [22] "lmer.REML = 1.8874e+05  Scale est. = 0.16342   n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 238533.7"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.3826  -0.0741   0.2430   0.5952  11.4248 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3963  0.6295  "                          
## [12] " genus         (Intercept)  3.7186  1.9284  "                          
## [13] " Xr            s(lat)      36.3089  6.0257  "                          
## [14] " Residual                   0.2338  0.4835  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 36.96787    0.09118  405.44"                              
## [20] "Xs(lat)Fx1    0.74873    0.07326   10.22"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x129f7858>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 36.96787    0.09118   405.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 3632  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.179   "                                        
## [22] "lmer.REML = 2.3853e+05  Scale est. = 0.23377   n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 247452.7"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.6678  -0.1107   0.1921   0.5383  11.9086 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3873  0.6223  "                          
## [12] " genus         (Intercept)  3.6998  1.9235  "                          
## [13] " Xr            s(lat)      40.4386  6.3591  "                          
## [14] " Residual                   0.2085  0.4567  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.11766    0.09093  408.21"                              
## [20] "Xs(lat)Fx1    1.01069    0.07247   13.95"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0xe3d8d68>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.11766    0.09093   408.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.993  8.993 4089  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.186   "                                        
## [22] "lmer.REML = 2.4745e+05  Scale est. = 0.20853   n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_pond_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 213172"                                 
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-28.4379  -0.2835   0.0481   0.4144  11.9786 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)  0.3729  0.6107  "                          
## [12] " genus         (Intercept)  3.6981  1.9230  "                          
## [13] " Xr            s(lat)      42.3561  6.5082  "                          
## [14] " Residual                   0.2006  0.4479  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 37.39530    0.09084  411.68"                              
## [20] "Xs(lat)Fx1    1.50161    0.07344   20.45"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_pond_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x22d8b7c0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 37.39530    0.09084   411.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.994  8.994 4032  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.149   "                                        
## [22] "lmer.REML = 2.1317e+05  Scale est. = 0.20057   n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 40962.4"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-18.4092  -0.0966   0.2467   0.5922   4.3746 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.3143  0.5606  "                         
## [12] " genus         (Intercept)  2.9910  1.7294  "                         
## [13] " Xr            s(lat)      81.5440  9.0302  "                         
## [14] " Residual                   0.2715  0.5211  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.4866     0.1346 278.453"                             
## [20] "Xs(lat)Fx1    -1.1917     0.1591  -7.491"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2d803ba0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.4866     0.1346   278.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df     F p-value    "                         
## [17] "s(lat) 8.972  8.972 956.5  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0573   "                                       
## [22] "lmer.REML =  40962  Scale est. = 0.27155   n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 39784.6"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-17.9531  -0.0848   0.2547   0.6105   5.3869 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.3070  0.5541  "                         
## [12] " genus         (Intercept)  2.9703  1.7235  "                         
## [13] " Xr            s(lat)      84.2044  9.1763  "                         
## [14] " Residual                   0.2117  0.4601  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.5912     0.1341 280.311"                             
## [20] "Xs(lat)Fx1    -1.3298     0.1489  -8.928"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2bb4a4a0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.5912     0.1341   280.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.976  8.976 1047  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0576   "                                       
## [22] "lmer.REML =  39785  Scale est. = 0.21166   n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_MER_pop_lat_CTmax_arboreal_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 41649.4"                               
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-17.6255  -0.0664   0.2577   0.6184   7.4162 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)  0.2995  0.5473  "                         
## [12] " genus         (Intercept)  2.9346  1.7131  "                         
## [13] " Xr            s(lat)      68.1036  8.2525  "                         
## [14] " Residual                   0.1502  0.3876  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  37.7623     0.1333 283.341"                             
## [20] "Xs(lat)Fx1    -0.9951     0.1373  -7.249"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.003 "
# Generalized additive model
print(readRDS("RData/Models/CTmax/sensitivity_analyses/summary_GAM_pop_lat_CTmax_arboreal_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "CTmax ~ s(lat, bs = \"tp\")"                                   
##  [7] "<environment: 0x2d7e4348>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  37.7623     0.1333   283.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.974  8.974 1113  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0593   "                                       
## [22] "lmer.REML =  41649  Scale est. = 0.1502    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label

split_names <- strsplit(as.character(all_data$tip.label), ' ')
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(CTmax ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(CTmax_se):units, # Species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_without_outliers.rds")
saveRDS(predictions, file = "RData/Models/CTmax/sensitivity_analyses/predictions_MCMCglmm_CTmax_without_outliers.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# Had to remove phylogenetic effects and weights because this model failed to estimate variance components. Only a nested genus/species structure was kept.

prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000))) 

model_MCMC_contrast <- MCMCglmm(CTmax ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ genus + genus:species,
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_contrast_without_outliers.rds")
Model summaries
Overall means
model_MCMC_CTmax <- readRDS("RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_without_outliers.rds")
summary(model_MCMC_CTmax)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: -1547953 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species   0.06298  0.05202  0.07487    298.4
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     3.117    2.747    3.624    809.8
## 
##                ~idh(CTmax_se):units
## 
##                post.mean l-95% CI u-95% CI eff.samp
## CTmax_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units  0.007208 0.007008 0.007405    30.79
## 
##  Location effects: CTmax ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp pMCMC
## habitat_scenarioarboreal_current       35.14    11.40    60.36     1000 0.012
## habitat_scenarioarboreal_future2C      35.21    11.48    60.45     1000 0.012
## habitat_scenarioarboreal_future4C      35.34    11.61    60.56     1000 0.012
## habitat_scenariopond_current           35.29    11.56    60.51     1000 0.012
## habitat_scenariopond_future2C          35.38    11.65    60.60     1000 0.012
## habitat_scenariopond_future4C          35.52    11.78    60.74     1000 0.008
## habitat_scenariosubstrate_current      35.13    11.40    60.36     1000 0.012
## habitat_scenariosubstrate_future2C     35.22    11.49    60.44     1000 0.012
## habitat_scenariosubstrate_future4C     35.35    11.62    60.58     1000 0.012
##                                      
## habitat_scenarioarboreal_current   * 
## habitat_scenarioarboreal_future2C  * 
## habitat_scenarioarboreal_future4C  * 
## habitat_scenariopond_current       * 
## habitat_scenariopond_future2C      * 
## habitat_scenariopond_future4C      **
## habitat_scenariosubstrate_current  * 
## habitat_scenariosubstrate_future2C * 
## habitat_scenariosubstrate_future4C * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_CTmax_contrast <- readRDS("RData/Models/CTmax/sensitivity_analyses/model_MCMCglmm_CTmax_contrast_without_outliers.rds")
summary(model_MCMC_CTmax_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 409342.6 
## 
##  G-structure:  ~genus
## 
##       post.mean l-95% CI u-95% CI eff.samp
## genus     4.254    3.626    4.983     1000
## 
##                ~genus:species
## 
##               post.mean l-95% CI u-95% CI eff.samp
## genus:species    0.4009   0.3847   0.4168     1000
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units   0.07823  0.07804  0.07842    967.3
## 
##  Location effects: CTmax ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                            37.002878
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.012685
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.095559
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.271939
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.186822
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.329548
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.558544
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.111172
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.295211
##                                                                         l-95% CI
## (Intercept)                                                            36.285105
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.015080
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.093063
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.269057
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.185173
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.327919
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.556832
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.109456
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.293576
##                                                                         u-95% CI
## (Intercept)                                                            37.690524
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.009916
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.098505
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.274578
## relevel(habitat_scenario, ref = "substrate_current")pond_current        0.188518
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       0.331278
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C       0.560082
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.112630
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  0.296905
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      752.1
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1000.0
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_CTmax)

Maximum operative body temperature

Only the code and outputs of population-level models are presented here. Community-level models were also fitted, and the outputs can be found in the RData/Models/max_temp/sensitivity_analyses/ folder.

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_max_temp_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_max_temp_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_max_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_max_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_max_acc_future4C.rds")


# Function to run population-level max_temp models in parallel
run_max_temp_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(max_temp ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$max_temp_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        max_temp = NA, max_temp_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$max_temp_pred <- pred$fit
    new_data$max_temp_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = max_temp_pred + 1.96 * max_temp_pred_se,
        lower = max_temp_pred - 1.96 * max_temp_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/max_temp/sensitivity_analyses/predictions_pop_lat_max_temp_",
        habitat_scenario, "_max_acc.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_max_temp_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 970523.9"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-15.1972  -0.2173   0.1027   0.4365   5.1313 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.244   1.498  "                          
## [12] " genus         (Intercept)   3.243   1.801  "                          
## [13] " Xr            s(lat)      514.222  22.676  "                          
## [14] " Residual                    6.884   2.624  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 23.91799    0.09766 244.915"                              
## [20] "Xs(lat)Fx1    1.84149    0.35746   5.152"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x27faca88>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 23.91799    0.09766   244.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.986  8.986 7027  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =   0.62   "                                        
## [22] "lmer.REML = 9.7052e+05  Scale est. = 6.8838    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1014454"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.3780  -0.1976   0.0962   0.3968   4.4059 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.376   1.542  "                          
## [12] " genus         (Intercept)   3.078   1.754  "                          
## [13] " Xr            s(lat)      499.461  22.349  "                          
## [14] " Residual                    8.259   2.874  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 24.74313    0.09687 255.439"                              
## [20] "Xs(lat)Fx1    1.36874    0.39258   3.487"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xcb841c0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 24.74313    0.09687   255.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.982  8.982 6463  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.575   "                                        
## [22] "lmer.REML = 1.0145e+06  Scale est. = 8.2586    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1041554"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.5708  -0.2237   0.0911   0.3813   4.2896 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.090   1.446  "                          
## [12] " genus         (Intercept)   2.963   1.721  "                          
## [13] " Xr            s(lat)      500.779  22.378  "                          
## [14] " Residual                    9.580   3.095  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 26.47169    0.09524  277.95"                              
## [20] "Xs(lat)Fx1    3.01508    0.41474    7.27"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf5b7230>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 26.47169    0.09524     278   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df    F p-value    "                           
## [17] "s(lat) 8.98   8.98 6215  <2e-16 ***"                           
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.529   "                                        
## [22] "lmer.REML = 1.0416e+06  Scale est. = 9.5802    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1021784"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-19.9213  -0.2537   0.0951   0.3906   7.7988 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.648   2.156  "                          
## [12] " genus         (Intercept)   7.104   2.665  "                          
## [13] " Xr            s(lat)      452.827  21.280  "                          
## [14] " Residual                    4.941   2.223  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  21.9278     0.1408 155.699"                              
## [20] "Xs(lat)Fx1     0.5651     0.3864   1.463"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xd2daa88>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  21.9278     0.1408   155.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.981  8.981 6281  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.513   "                                        
## [22] "lmer.REML = 1.0218e+06  Scale est. = 4.941     n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1022036"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-19.1205  -0.2647   0.0918   0.3875   7.5190 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.530   2.128  "                          
## [12] " genus         (Intercept)   6.744   2.597  "                          
## [13] " Xr            s(lat)      516.377  22.724  "                          
## [14] " Residual                    5.046   2.246  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  23.0311     0.1377  167.21"                              
## [20] "Xs(lat)Fx1     1.8997     0.3885    4.89"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf5b3620>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  23.0311     0.1377   167.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.983  8.983 5598  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.519   "                                        
## [22] "lmer.REML = 1.022e+06  Scale est. = 5.0461    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1017630"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.8425  -0.2984   0.0858   0.3993   6.9493 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.404   2.099  "                          
## [12] " genus         (Intercept)   6.414   2.533  "                          
## [13] " Xr            s(lat)      536.559  23.164  "                          
## [14] " Residual                    5.180   2.276  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  24.8034     0.1348  184.01"                              
## [20] "Xs(lat)Fx1     2.8585     0.3900    7.33"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x27fbb118>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.8034     0.1348     184   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.984  8.984 4899  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.506   "                                        
## [22] "lmer.REML = 1.0176e+06  Scale est. = 5.1803    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_current_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 218385.4"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-27.0679  -0.3346   0.0899   0.5178   5.1108 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.489   1.578  "                         
## [12] " genus         (Intercept)   2.937   1.714  "                         
## [13] " Xr            s(lat)      398.989  19.975  "                         
## [14] " Residual                    2.041   1.429  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "              Estimate Std. Error t value"                            
## [19] "X(Intercept) 2.491e+01  1.566e-01 159.037"                            
## [20] "Xs(lat)Fx1   8.231e-04  3.644e-01   0.002"                            
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2b4720e0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.9051     0.1566     159   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.958  8.958 2177  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0809   "                                       
## [22] "lmer.REML = 2.1839e+05  Scale est. = 2.0412    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_future2C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 218039.9"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-31.1293  -0.3508   0.0852   0.5182   5.5533 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.292   1.514  "                         
## [12] " genus         (Intercept)   2.641   1.625  "                         
## [13] " Xr            s(lat)      457.378  21.386  "                         
## [14] " Residual                    1.985   1.409  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  25.6767     0.1494 171.915"                             
## [20] "Xs(lat)Fx1    -0.4224     0.3601  -1.173"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x3fe70fa8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  25.6767     0.1494   171.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.964  8.964 2299  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.025   "                                        
## [22] "lmer.REML = 2.1804e+05  Scale est. = 1.9852    n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_future4C_max_acc.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 223065.6"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-30.6825  -0.4150   0.0965   0.5336   4.7667 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.208   1.486  "                         
## [12] " genus         (Intercept)   2.315   1.522  "                         
## [13] " Xr            s(lat)      482.097  21.957  "                         
## [14] " Residual                    2.227   1.492  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  27.1886     0.1424   190.9"                             
## [20] "Xs(lat)Fx1     1.8764     0.3753     5.0"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x335ad110>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  27.1886     0.1424   190.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.963  8.963 1855  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0331   "                                      
## [22] "lmer.REML = 2.2307e+05  Scale est. = 2.227     n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

plan(sequential) 

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(max_temp ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(max_temp_se):units, # Species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_max_acc.rds")
saveRDS(predictions, file = "RData/Models/max_temp/sensitivity_analyses/predictions_MCMCglmm_max_temp_max_acc.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(max_temp ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(max_temp_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_contrast_max_acc.rds")
Overall means
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_max_acc.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5936794 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.075    1.907    2.252    708.4
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.81    18.22    21.26    636.8
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.343    3.334    3.353     1000
## 
##  Location effects: max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       22.72    19.16    26.29     1000 <0.001
## habitat_scenarioarboreal_future2C      23.51    19.95    27.07     1000 <0.001
## habitat_scenarioarboreal_future4C      25.16    21.61    28.72     1000 <0.001
## habitat_scenariopond_current           21.54    17.99    25.11     1000 <0.001
## habitat_scenariopond_future2C          22.67    19.11    26.24     1000 <0.001
## habitat_scenariopond_future4C          24.50    20.94    28.07     1000 <0.001
## habitat_scenariosubstrate_current      23.20    19.64    26.77     1000 <0.001
## habitat_scenariosubstrate_future2C     24.05    20.50    27.62     1000 <0.001
## habitat_scenariosubstrate_future4C     25.83    22.27    29.40     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_max_temp_contrast <- readRDS("RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_contrast_max_acc.rds")
summary(model_MCMC_max_temp_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5936783 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.072    1.905    2.252    677.7
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.91    18.41    21.64    566.9
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.343    3.334    3.353     1000
## 
##  Location effects: max_temp ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              23.1623
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     -0.4780
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.3133
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     1.9616
## relevel(habitat_scenario, ref = "substrate_current")pond_current         -1.6561
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        -0.5244
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         1.3018
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.8587
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    2.6309
##                                                                        l-95% CI
## (Intercept)                                                             15.3956
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4981
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.2943
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.9414
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6681
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.5358
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.2880
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8464
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6184
##                                                                        u-95% CI
## (Intercept)                                                             29.2021
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4606
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.3322
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.9800
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6421
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.5104
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.3136
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8713
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6444
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      880.5
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     898.7
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         833.3
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    916.9
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_max_temp)

Without outliers

Here, we excluded that fell below the 5th percentile or above the 95th percentile maximum operative body temperature for each population. While these may not be true outlier values, this is equivalent to analyses performed in previous studies (e.g., Pinky et al., 2019. Nature)

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_max_temp_sensitivity_analysis_outliers.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_max_temp_sensitivity_analysis_outliers.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_sensitivity_analysis.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_sensitivity_analysis.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_sensitivity_analysis.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_sensitivity_analysis.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_sensitivity_analysis.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_sensitivity_analysis.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_sensitivity_analysis.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_sensitivity_analysis.rds")


# Function to run population-level max_temp models in parallel
run_max_temp_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(max_temp ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, weights = 1/(data$max_temp_se^2), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        max_temp = NA, max_temp_se = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$max_temp_pred <- pred$fit
    new_data$max_temp_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = max_temp_pred + 1.96 * max_temp_pred_se,
        lower = max_temp_pred - 1.96 * max_temp_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model summaries and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_",
        habitat_scenario, "_without_outliers.rds"))
    saveRDS(new_data, file = paste0("RData/Models/max_temp/sensitivity_analyses/predictions_pop_lat_max_temp_",
        habitat_scenario, "_without_outliers.rds"))
}

# Create a list of datasets
dataset_list <- list(pond_current = pop_pond_current, pond_future2C = pop_pond_future2C,
    pond_future4C = pop_pond_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C, arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C)

# Set up parallel processing
plan(multicore(workers = 2))

options(future.globals.maxSize = 1e+26)

# Run function
results_pop <- future_lapply(names(dataset_list), function(x) {
    run_max_temp_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 994754.5"                               
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-16.2443  -0.1979   0.1024   0.4184   4.9093 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.248   1.499  "                          
## [12] " genus         (Intercept)   3.301   1.817  "                          
## [13] " Xr            s(lat)      522.150  22.851  "                          
## [14] " Residual                    5.920   2.433  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 23.83541    0.09873 241.417"                              
## [20] "Xs(lat)Fx1    1.82523    0.37318   4.891"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x255a4c48>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 23.83541    0.09873   241.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.984  8.984 6662  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.603   "                                        
## [22] "lmer.REML = 9.9475e+05  Scale est. = 5.9204    n = 203853"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1039976"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-18.6325  -0.1796   0.0956   0.3786   4.3476 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.424   1.557  "                          
## [12] " genus         (Intercept)   3.129   1.769  "                          
## [13] " Xr            s(lat)      534.589  23.121  "                          
## [14] " Residual                    7.154   2.675  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 24.66246    0.09809 251.435"                              
## [20] "Xs(lat)Fx1    1.04946    0.41186   2.548"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.009 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x134fac30>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 24.66246    0.09809   251.4   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.981  8.981 6155  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.557   "                                        
## [22] "lmer.REML = 1.04e+06  Scale est. = 7.1542    n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_substrate_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1064212"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.8606  -0.2076   0.0883   0.3625   4.5081 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   2.101   1.450  "                          
## [12] " genus         (Intercept)   3.043   1.744  "                          
## [13] " Xr            s(lat)      507.301  22.523  "                          
## [14] " Residual                    8.271   2.876  "                          
## [15] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept) 26.40272    0.09674 272.935"                              
## [20] "Xs(lat)Fx1    2.71928    0.43267   6.285"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.010 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_substrate_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf8b8410>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept) 26.40272    0.09674   272.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.978  8.978 5976  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.512   "                                        
## [22] "lmer.REML = 1.0642e+06  Scale est. = 8.2707    n = 203853"
Pond or wetland

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1028590"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-20.5749  -0.2487   0.0937   0.3849   8.2314 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.677   2.163  "                          
## [12] " genus         (Intercept)   7.199   2.683  "                          
## [13] " Xr            s(lat)      471.086  21.705  "                          
## [14] " Residual                    4.143   2.036  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  21.9168     0.1418 154.592"                              
## [20] "Xs(lat)Fx1     0.1691     0.3889   0.435"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x13ed41e8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  21.9168     0.1418   154.6   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.981  8.981 6141  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.508   "                                        
## [22] "lmer.REML = 1.0286e+06  Scale est. = 4.1433    n = 204808"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1029479"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-19.0802  -0.2601   0.0894   0.3809   7.9788 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.553   2.134  "                          
## [12] " genus         (Intercept)   6.833   2.614  "                          
## [13] " Xr            s(lat)      542.577  23.293  "                          
## [14] " Residual                    4.255   2.063  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  23.0215     0.1387 166.040"                              
## [20] "Xs(lat)Fx1     1.5118     0.3909   3.868"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0xf8b4b48>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  23.0215     0.1387     166   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.984  8.984 5457  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.514   "                                        
## [22] "lmer.REML = 1.0295e+06  Scale est. = 4.2553    n = 204808"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_pond_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                            
##  [2] ""                                                                      
##  [3] "REML criterion at convergence: 1024666"                                
##  [4] ""                                                                      
##  [5] "Scaled residuals: "                                                    
##  [6] "     Min       1Q   Median       3Q      Max "                         
##  [7] "-17.7047  -0.2943   0.0833   0.3921   7.3585 "                         
##  [8] ""                                                                      
##  [9] "Random effects:"                                                       
## [10] " Groups        Name        Variance Std.Dev."                          
## [11] " species:genus (Intercept)   4.434   2.106  "                          
## [12] " genus         (Intercept)   6.505   2.551  "                          
## [13] " Xr            s(lat)      566.508  23.801  "                          
## [14] " Residual                    4.371   2.091  "                          
## [15] "Number of obs: 204808, groups:  species:genus, 5203; genus, 467; Xr, 8"
## [16] ""                                                                      
## [17] "Fixed effects:"                                                        
## [18] "             Estimate Std. Error t value"                              
## [19] "X(Intercept)  24.7931     0.1358 182.619"                              
## [20] "Xs(lat)Fx1     2.4680     0.3913   6.307"                              
## [21] ""                                                                      
## [22] "Correlation of Fixed Effects:"                                         
## [23] "           X(Int)"                                                     
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_pond_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2426de60>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.7931     0.1358   182.6   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.985  8.985 4787  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.501   "                                        
## [22] "lmer.REML = 1.0247e+06  Scale est. = 4.3714    n = 204808"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_current_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 220977.5"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "     Min       1Q   Median       3Q      Max "                        
##  [7] "-30.2793  -0.3179   0.0985   0.5252   4.8536 "                        
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.505   1.583  "                         
## [12] " genus         (Intercept)   2.971   1.724  "                         
## [13] " Xr            s(lat)      373.995  19.339  "                         
## [14] " Residual                    1.581   1.257  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "              Estimate Std. Error t value"                            
## [19] "X(Intercept) 2.483e+01  1.574e-01 157.753"                            
## [20] "Xs(lat)Fx1   3.246e-04  3.589e-01   0.001"                            
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_current_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2ecf9980>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  24.8336     0.1574   157.8   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.956  8.956 2255  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0678   "                                       
## [22] "lmer.REML = 2.2098e+05  Scale est. = 1.5808    n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_future2C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 220781"                                
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-34.436  -0.335   0.093   0.521   5.854 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.306   1.518  "                         
## [12] " genus         (Intercept)   2.675   1.635  "                         
## [13] " Xr            s(lat)      437.190  20.909  "                         
## [14] " Residual                    1.547   1.244  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  25.6090     0.1502  170.46"                             
## [20] "Xs(lat)Fx1    -0.5476     0.3557   -1.54"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.007 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_future2C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2ecb1e40>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)  25.6090     0.1502   170.5   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.963  8.963 2411  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00789   "                                      
## [22] "lmer.REML = 2.2078e+05  Scale est. = 1.547     n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_MER_pop_lat_max_temp_arboreal_future4C_without_outliers.rds"))
##  [1] "Linear mixed model fit by REML ['lmerMod']"                           
##  [2] ""                                                                     
##  [3] "REML criterion at convergence: 225039.4"                              
##  [4] ""                                                                     
##  [5] "Scaled residuals: "                                                   
##  [6] "    Min      1Q  Median      3Q     Max "                             
##  [7] "-33.901  -0.403   0.097   0.528   4.901 "                             
##  [8] ""                                                                     
##  [9] "Random effects:"                                                      
## [10] " Groups        Name        Variance Std.Dev."                         
## [11] " species:genus (Intercept)   2.225   1.492  "                         
## [12] " genus         (Intercept)   2.329   1.526  "                         
## [13] " Xr            s(lat)      464.959  21.563  "                         
## [14] " Residual                    1.747   1.322  "                         
## [15] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [16] ""                                                                     
## [17] "Fixed effects:"                                                       
## [18] "             Estimate Std. Error t value"                             
## [19] "X(Intercept)  27.1337     0.1430 189.730"                             
## [20] "Xs(lat)Fx1     1.8718     0.3717   5.036"                             
## [21] ""                                                                     
## [22] "Correlation of Fixed Effects:"                                        
## [23] "           X(Int)"                                                    
## [24] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/max_temp/sensitivity_analyses/summary_GAM_pop_lat_max_temp_arboreal_future4C_without_outliers.rds"))
##  [1] ""                                                              
##  [2] "Family: gaussian "                                             
##  [3] "Link function: identity "                                      
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "max_temp ~ s(lat, bs = \"tp\")"                                
##  [7] "<environment: 0x2ecda128>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error t value Pr(>|t|)    "          
## [11] "(Intercept)   27.134      0.143   189.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df    F p-value    "                          
## [17] "s(lat) 8.962  8.962 1916  <2e-16 ***"                          
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.0446   "                                      
## [22] "lmer.REML = 2.2504e+05  Scale est. = 1.7474    n = 56210"

Bayesian linear mixed models

all_data <- bind_rows(
  pop_sub_current %>% mutate(habitat_scenario = "substrate_current"), 
  pop_sub_future2C %>% mutate(habitat_scenario = "substrate_future2C"), 
  pop_sub_future4C %>% mutate(habitat_scenario = "substrate_future4C"), 
  pop_arb_current %>% mutate(habitat_scenario = "arboreal_current"), 
  pop_arb_future2C %>% mutate(habitat_scenario = "arboreal_future2C"), 
  pop_arb_future4C %>% mutate(habitat_scenario = "arboreal_future4C"), 
  pop_pond_current %>% mutate(habitat_scenario = "pond_current"), 
  pop_pond_future2C %>% mutate(habitat_scenario = "pond_future2C"), 
  pop_pond_future4C %>% mutate(habitat_scenario = "pond_future4C")
)


all_data$species <- all_data$tip.label

# Match phylogeny to dataset
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

tree <- drop.tip(tree, tree$tip.label[-match(all_data$tip.label, tree$tip.label)])  

tree <- force.ultrametric(tree, method="extend") # Force the tree to be ultrametric

Ainv<-inverseA(tree)$Ainv
all_data <- as.data.frame(all_data)

plan(sequential) 

# Run models with MCMCglmm 
prior  <- list(R = list(V = 1, nu = 0.002), 
               G = list(G1 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G2 = list(V = 1, nu = 0.002, 
                                  alpha.mu = 0, 
                                  alpha.V = 1000),
                        G3 = list(V = 1, fix = 1)))

set.seed(123)

# Intercept-less model, variation between microhabitat and climate scenarios
model_MCMC <- MCMCglmm(max_temp ~ habitat_scenario - 1, # No intercept
                       random = ~ species + tip.label + idh(max_temp_se):units, # Species, phylogenetic relatedness, and weights
                       ginverse=list(tip.label = Ainv),
                       singular.ok=TRUE,
                       prior = prior,
                       verbose=FALSE,
                       data = all_data)

# Get predictions
predictions <- data.frame(emmeans(model_MCMC, 
                                  by="habitat_scenario", 
                                  specs="habitat_scenario", 
                                  data=all_data, 
                                  type="response"))

predictions <- predictions %>% rename(prediction = emmean)

# Save model summaries and predictions
saveRDS(model_MCMC, file = "RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_without_outliers.rds")
saveRDS(predictions, file = "RData/Models/max_temp/sensitivity_analyses/predictions_MCMCglmm_max_temp_without_outliers.rds")


# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_MCMC_contrast <- MCMCglmm(max_temp ~ relevel(habitat_scenario, ref = "substrate_current"), # substrate_current as the reference level
                                random = ~ species + tip.label + idh(max_temp_se):units, 
                                ginverse=list(tip.label = Ainv),
                                singular.ok=TRUE,
                                prior = prior,
                                verbose=FALSE,
                                data = all_data)

saveRDS(model_MCMC_contrast, file = "RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_contrast_without_outliers.rds")
Model summaries
Overall means
model_MCMC_max_temp <- readRDS("RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_without_outliers.rds")
summary(model_MCMC_max_temp)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5971991 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.079    1.909    2.252    710.8
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.73    18.14    21.18    636.6
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.659    3.649    3.669     1000
## 
##  Location effects: max_temp ~ habitat_scenario - 1 
## 
##                                    post.mean l-95% CI u-95% CI eff.samp  pMCMC
## habitat_scenarioarboreal_current       22.67    19.23    26.29     1000 <0.001
## habitat_scenarioarboreal_future2C      23.47    20.02    27.09     1000 <0.001
## habitat_scenarioarboreal_future4C      25.13    21.69    28.73     1000 <0.001
## habitat_scenariopond_current           21.52    18.08    25.13     1000 <0.001
## habitat_scenariopond_future2C          22.66    19.22    26.26     1000 <0.001
## habitat_scenariopond_future4C          24.50    21.07    28.10     1000 <0.001
## habitat_scenariosubstrate_current      23.14    19.70    26.75     1000 <0.001
## habitat_scenariosubstrate_future2C     24.02    20.58    27.63     1000 <0.001
## habitat_scenariosubstrate_future4C     25.81    22.37    29.42     1000 <0.001
##                                       
## habitat_scenarioarboreal_current   ***
## habitat_scenarioarboreal_future2C  ***
## habitat_scenarioarboreal_future4C  ***
## habitat_scenariopond_current       ***
## habitat_scenariopond_future2C      ***
## habitat_scenariopond_future4C      ***
## habitat_scenariosubstrate_current  ***
## habitat_scenariosubstrate_future2C ***
## habitat_scenariosubstrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contrasts
model_MCMC_max_temp_contrast <- readRDS("RData/Models/max_temp/sensitivity_analyses/model_MCMCglmm_max_temp_contrast_without_outliers.rds")
summary(model_MCMC_max_temp_contrast)
## 
##  Iterations = 3001:12991
##  Thinning interval  = 10
##  Sample size  = 1000 
## 
##  DIC: 5971985 
## 
##  G-structure:  ~species
## 
##         post.mean l-95% CI u-95% CI eff.samp
## species     2.077    1.909    2.254    682.3
## 
##                ~tip.label
## 
##           post.mean l-95% CI u-95% CI eff.samp
## tip.label     19.83    18.46    21.69    568.8
## 
##                ~idh(max_temp_se):units
## 
##                   post.mean l-95% CI u-95% CI eff.samp
## max_temp_se.units         1        1        1        0
## 
##  R-structure:  ~units
## 
##       post.mean l-95% CI u-95% CI eff.samp
## units     3.659    3.649    3.669     1000
## 
##  Location effects: max_temp ~ relevel(habitat_scenario, ref = "substrate_current") 
## 
##                                                                        post.mean
## (Intercept)                                                              23.0784
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     -0.4657
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.3321
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     1.9926
## relevel(habitat_scenario, ref = "substrate_current")pond_current         -1.6221
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        -0.4838
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         1.3552
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.8755
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    2.6714
##                                                                        l-95% CI
## (Intercept)                                                             16.1167
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4843
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.3121
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.9729
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6348
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.4963
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.3410
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8629
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6585
##                                                                        u-95% CI
## (Intercept)                                                             29.4740
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4469
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.3501
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    2.0113
## relevel(habitat_scenario, ref = "substrate_current")pond_current        -1.6093
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C       -0.4712
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C        1.3666
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.8874
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.6835
##                                                                        eff.samp
## (Intercept)                                                              1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      884.3
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1000.0
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     899.9
## relevel(habitat_scenario, ref = "substrate_current")pond_current         1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C        1000.0
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C         833.2
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1000.0
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1036.6
##                                                                         pMCMC
## (Intercept)                                                            <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_current       <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C <0.001
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C <0.001
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")pond_current       ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future2C      ***
## relevel(habitat_scenario, ref = "substrate_current")pond_future4C      ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model diagnostics
plot(model_MCMC_max_temp)

Overheating risk

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

## We do not load pond data because none of the species overheat in water
## bodies

# Function to run population-level overheating_risk models in parallel
run_overheating_risk_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(overheating_risk ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        overheating_risk = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/predictions_pop_lat_overheating_risk_",
        habitat_scenario, "_max_acc.rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Set up parallel processing
plan(multicore(workers = 2))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_overheating_risk_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  3701.7   3752.9  -1845.9   3691.7   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-1.368 -0.001 -0.001  0.000 36.612 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)  101.508 10.075  "                          
## [15] " genus         (Intercept)    2.253  1.501  "                          
## [16] " Xr            s(lat)      2397.285 48.962  "                          
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -15.3828     0.5424 -28.361   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    -5.5270     3.1784  -1.739   0.0821 .  "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.008 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xc46b618>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -15.383      1.144  -13.44   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.057  7.057  129.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.41e-05   "                                    
## [22] "glmer.ML = 3099.7  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  5820.6   5871.7  -2905.3   5810.6   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-2.3504 -0.0011 -0.0007 -0.0003 26.1469 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   99.833  9.992  "                          
## [15] " genus         (Intercept)    2.117  1.455  "                          
## [16] " Xr            s(lat)      1667.621 40.837  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -15.0977     0.4932 -30.613   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    -1.2612     3.7371  -0.337    0.736    "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.055"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xef30ea0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -15.0977     0.9251  -16.32   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.425  7.425  221.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.65e-05   "                                    
## [22] "glmer.ML = 4962.7  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 14790.1  14841.3  -7390.1  14780.1   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-4.279 -0.005 -0.001 -0.001 46.836 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept) 102.469  10.123  "                          
## [15] " genus         (Intercept)   1.195   1.093  "                          
## [16] " Xr            s(lat)      457.128  21.381  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept)  -13.608      0.350 -38.883   <2e-16 ***"                 
## [22] "Xs(lat)Fx1      2.962      1.854   1.597     0.11    "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.010"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x27aa27d0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -13.6076     0.5819  -23.38   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.866  7.866  618.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.58e-05   "                                    
## [22] "glmer.ML =  12806  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "   644.5    689.2   -317.3    634.5    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-0.7042 -0.0013 -0.0006 -0.0001 17.8545 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)    7.065  2.658  "                         
## [15] " genus         (Intercept)   38.123  6.174  "                         
## [16] " Xr            s(lat)      1610.794 40.135  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "               Estimate Std. Error z value Pr(>|z|)    "              
## [21] "X(Intercept) -20.034461   0.001077  -18607   <2e-16 ***"              
## [22] "Xs(lat)Fx1    -4.011487   0.001077   -3726   <2e-16 ***"              
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 -0.001"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xc98c0a0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -20.034      3.916  -5.116 3.13e-07 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq  p-value    "                        
## [17] "s(lat) 2.34   2.34  27.62 3.55e-06 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.97e-05   "                                    
## [22] "glmer.ML = 542.98  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1098.1   1142.8   -544.1   1088.1    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.0685 -0.0005 -0.0003  0.0000 15.8219 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)  171.327 13.089  "                         
## [15] " genus         (Intercept)    6.089  2.468  "                         
## [16] " Xr            s(lat)      3097.487 55.655  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -21.625      1.637 -13.210   <2e-16 ***"                
## [22] "Xs(lat)Fx1     -1.613      5.012  -0.322    0.748    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.227 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xee6c970>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -21.625      4.465  -4.843 1.28e-06 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 3.367  3.367   40.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -5.96e-05   "                                    
## [22] "glmer.ML = 956.31  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  2592.5   2637.2  -1291.3   2582.5    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.4180 -0.0011 -0.0008 -0.0001 13.3765 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)  150.584 12.271  "                         
## [15] " genus         (Intercept)    3.428  1.851  "                         
## [16] " Xr            s(lat)      6280.149 79.247  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -17.7872     0.9018 -19.724   <2e-16 ***"                
## [22] "Xs(lat)Fx1     3.1894     3.2065   0.995     0.32    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.164 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xe458ce0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -17.787      2.558  -6.953 3.58e-12 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.941  4.941  114.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -8.71e-05   "                                    
## [22] "glmer.ML = 2302.8  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model
model_risk <- glmer(overheating_risk ~ habitat_scenario - 1 + (1 | genus/species),
    family = "binomial", control = glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb")),
    data = all_data)

# Get predictions
predictions <- as.data.frame(ggpredict(model_risk, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)
# Save model and predictions
saveRDS(model_risk, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_max_acc.rds")
saveRDS(predictions, file = "RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_max_acc.rds")

# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_risk_contrast <- glmer(overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "binomial", control = glmerControl(optimizer = "optimx",
    optCtrl = list(method = "nlminb")), data = all_data)


saveRDS(model_risk_contrast, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_max_acc.rds")
Model summaries
Overall means
# Model summary
model_overheating_risk <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_max_acc.rds")
summary(model_overheating_risk)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: overheating_risk ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  29567.6  29660.2 -14775.8  29551.6   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.918 -0.002 -0.001 -0.001 45.624 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 81.5706  9.0316  
##  genus         (Intercept)  0.4659  0.6826  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -15.6418     0.4959  -31.55   <2e-16 ***
## habitat_scenarioarboreal_future2C  -14.8025     0.4842  -30.57   <2e-16 ***
## habitat_scenarioarboreal_future4C  -13.2896     0.4779  -27.81   <2e-16 ***
## habitat_scenariosubstrate_current  -14.7069     0.4783  -30.75   <2e-16 ***
## habitat_scenariosubstrate_future2C -14.0563     0.4774  -29.44   <2e-16 ***
## habitat_scenariosubstrate_future4C -12.4522     0.4743  -26.26   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.960                                                            
## hbtt_scnrr_4C 0.968       0.981                                                
## hbtt_scnrs_   0.967       0.980         0.988                                  
## hbtt_scnrs_2C 0.969       0.982         0.990         0.992                    
## hbtt_scnrs_4C 0.970       0.983         0.991         0.994       0.996
# Predictions
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_max_acc.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 1.610156e-07 0.4958600 6.092438e-08 4.255441e-07
## 2  arboreal_future2C 3.727044e-07 0.4842092 1.442796e-07 9.627729e-07
## 3  arboreal_future4C 1.691918e-06 0.4778910 6.631293e-07 4.316779e-06
## 4  substrate_current 4.100781e-07 0.4783021 1.605962e-07 1.047123e-06
## 5 substrate_future2C 7.859973e-07 0.4774354 3.083383e-07 2.003615e-06
## 6 substrate_future4C 3.908934e-06 0.4742619 1.543003e-06 9.902576e-06
Contrasts
model_overheating_risk_contrast <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_max_acc.rds")
summary(model_overheating_risk_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  29567.6  29660.2 -14775.8  29551.6   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.918 -0.002 -0.001 -0.001 45.624 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 81.5711  9.0317  
##  genus         (Intercept)  0.4659  0.6826  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -14.70695
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.93485
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.09556
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.41727
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.65061
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.25468
##                                                                        Std. Error
## (Intercept)                                                               0.50246
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.12532
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.09642
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.07400
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.05950
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.05369
##                                                                        z value
## (Intercept)                                                            -29.270
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -7.460
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.991
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   19.152
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  10.934
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  41.993
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   8.68e-14
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.322
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.032             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.042  0.241      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.058  0.305      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.074  0.291      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.089  0.312      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.397                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.379                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.408                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.496                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.545                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.695                              
## optimizer (optimx) convergence code: 0 (OK)
## unable to evaluate scaled gradient
## Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

Uncertain estimates

Here, we capped the distribution of simulated CTmax estimates to the “biological range”, that is, the standard deviation of all CTmax estimats across species (s.e. range across habitats: 1.84-2.17).

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_large_se.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_large_se.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_large_se.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_large_se.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_large_se.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_large_se.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

# Function to run population-level overheating_risk models in parallel
run_overheating_risk_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(overheating_risk ~ s(lat, bs = "tp"), random = ~(1 | genus/species),
        data = data, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        overheating_risk = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_",
        habitat_scenario, "_large_se.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_",
        habitat_scenario, "_large_se.rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/predictions_pop_lat_overheating_risk_",
        habitat_scenario, "_large_se.rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Run in parallel
plan(multicore(workers = 2))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_overheating_risk_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 13134.4  13185.6  -6562.2  13124.4   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-2.346 -0.013 -0.004 -0.002 36.093 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   10.75   3.279  "                          
## [15] " genus         (Intercept)   27.06   5.202  "                          
## [16] " Xr            s(lat)      2401.27  49.003  "                          
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -12.1521     0.4389  -27.69   <2e-16 ***"                 
## [22] "Xs(lat)Fx1    19.4681     1.6442   11.84   <2e-16 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.012 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xd152b28>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -12.1521     0.5221  -23.27   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq p-value    "                         
## [17] "s(lat) 8.13   8.13  289.1  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -5.21e-06   "                                    
## [22] "glmer.ML =  10870  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 18342.4  18393.6  -9166.2  18332.4   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-3.997 -0.028 -0.009 -0.004 34.761 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)    7.769  2.787  "                          
## [15] " genus         (Intercept)   25.511  5.051  "                          
## [16] " Xr            s(lat)      2213.285 47.046  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -10.7965     0.4248 -25.415  < 2e-16 ***"                 
## [22] "Xs(lat)Fx1    22.6735     3.5351   6.414 1.42e-10 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.043 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xfc2dd60>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -10.7965     0.4311  -25.05   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.298  8.298  443.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  1.7e-05   "                                      
## [22] "glmer.ML =  15319  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_substrate_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 45494.1  45545.2 -22742.0  45484.1   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-11.156  -0.096  -0.024  -0.009  45.889 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)    6.587  2.566  "                          
## [15] " genus         (Intercept)   19.040  4.363  "                          
## [16] " Xr            s(lat)      1118.540 33.445  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "               Estimate Std. Error z value Pr(>|z|)    "               
## [21] "X(Intercept) -7.868e+00  1.214e-04  -64809   <2e-16 ***"               
## [22] "Xs(lat)Fx1    1.659e+01  8.652e-05  191762   <2e-16 ***"               
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.000 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_substrate_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x27da4e40>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -7.868      0.280   -28.1   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq p-value    "                         
## [17] "s(lat) 8.65   8.65   3111  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.000337   "                                     
## [22] "glmer.ML =  40037  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1849.5   1894.1   -919.7   1839.5    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.9316 -0.0016 -0.0004 -0.0001 19.5060 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept)     17.91   4.232 "                        
## [15] " genus         (Intercept)    162.23  12.737 "                        
## [16] " Xr            s(lat)      146071.72 382.193 "                        
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -34.189      1.754  -19.49   <2e-16 ***"                
## [22] "Xs(lat)Fx1    -54.681      1.381  -39.59   <2e-16 ***"                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.081 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xda1f890>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -34.189      6.642  -5.148 2.64e-07 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.618  5.618  122.8  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -9.94e-05   "                                    
## [22] "glmer.ML = 1584.6  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  2333.0   2377.7  -1161.5   2323.0    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.9333 -0.0039 -0.0005 -0.0001 17.1610 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept)     12.84   3.584 "                        
## [15] " genus         (Intercept)    303.02  17.408 "                        
## [16] " Xr            s(lat)      247157.81 497.150 "                        
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -42.4092     0.9078  -46.71   <2e-16 ***"                
## [22] "Xs(lat)Fx1   -95.1064     2.8268  -33.64   <2e-16 ***"                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 -0.117"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xfbe2300>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -42.409      7.465  -5.681 1.34e-08 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.802  5.802  157.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.000103   "                                    
## [22] "glmer.ML = 1965.6  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_arboreal_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  4949.4   4994.1  -2469.7   4939.4    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "   Min     1Q Median     3Q    Max "                                  
## [10] "-2.264 -0.002 -0.001  0.000 46.184 "                                  
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept) 1.974e+02  14.05  "                        
## [15] " genus         (Intercept) 1.664e+00   1.29  "                        
## [16] " Xr            s(lat)      2.643e+05 514.06  "                        
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "               Estimate Std. Error z value Pr(>|z|)    "              
## [21] "X(Intercept) -1.829e+01  6.313e-04  -28964   <2e-16 ***"              
## [22] "Xs(lat)Fx1   -1.221e+02  6.120e-04 -199453   <2e-16 ***"              
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.256 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_arboreal_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x1311f2e0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -18.285      1.441  -12.69   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.794  7.794  234.8  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -0.000137   "                                    
## [22] "glmer.ML = 4066.6  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model
model_risk <- glmer(overheating_risk ~ habitat_scenario - 1 + (1 | genus/species),
    family = "binomial", control = glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb")),
    data = all_data)

# Get predictions
predictions <- as.data.frame(ggpredict(model_risk, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model and predictions
saveRDS(model_risk, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_large_se.rds")
saveRDS(predictions, file = "RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_large_se.rds")

#### Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# Run model
model_risk_contrast <- glmer(overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "binomial", control = glmerControl(optimizer = "optimx",
    optCtrl = list(method = "nlminb")), data = all_data)

# Save model
saveRDS(model_risk_contrast, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_large_se.rds")
Model summaries
Overall means
# Model summary
model_overheating_risk <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_large_se.rds")
summary(model_overheating_risk)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: overheating_risk ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  90485.7  90578.2 -45234.8  90469.7   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -6.746 -0.051 -0.013 -0.005 51.912 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept)  7.539   2.746   
##  genus         (Intercept) 13.856   3.722   
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -10.9196     0.6984  -15.63   <2e-16 ***
## habitat_scenarioarboreal_future2C  -10.5035     0.7049  -14.90   <2e-16 ***
## habitat_scenarioarboreal_future4C   -9.1584     0.6953  -13.17   <2e-16 ***
## habitat_scenariosubstrate_current   -9.6894     0.6896  -14.05   <2e-16 ***
## habitat_scenariosubstrate_future2C  -9.0441     0.6876  -13.15   <2e-16 ***
## habitat_scenariosubstrate_future4C  -7.1405     0.6836  -10.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.994                                                            
## hbtt_scnrr_4C 0.995       0.996                                                
## hbtt_scnrs_   0.996       0.996         0.997                                  
## hbtt_scnrs_2C 0.996       0.997         0.998         0.999                    
## hbtt_scnrs_4C 0.996       0.997         0.998         0.999       0.999
# Predictions
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_large_se.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 1.809897e-05 0.6984369 4.604146e-06 0.0000711445
## 2  arboreal_future2C 2.743895e-05 0.7049310 6.891885e-06 0.0001092371
## 3  arboreal_future4C 1.053213e-04 0.6952511 2.696196e-05 0.0004113221
## 4  substrate_current 6.193364e-05 0.6896438 1.602953e-05 0.0002392630
## 5 substrate_future2C 1.180714e-04 0.6876270 3.068128e-05 0.0004542634
## 6 substrate_future4C 7.916939e-04 0.6835597 2.074742e-04 0.0030160363
Contrasts
model_overheating_risk_contrast <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_large_se.rds")
summary(model_overheating_risk_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  90485.7  90578.2 -45234.8  90469.7   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -6.746 -0.051 -0.013 -0.005 51.911 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept)  7.539   2.746   
##  genus         (Intercept) 13.856   3.722   
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                            -9.68936
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -1.23024
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.81416
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.53098
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.64527
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  2.54882
##                                                                        Std. Error
## (Intercept)                                                               0.25390
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.06400
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.05911
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.04973
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.03078
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.02906
##                                                                        z value
## (Intercept)                                                             -38.16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -19.22
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -13.77
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    10.68
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   20.97
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   87.71
##                                                                        Pr(>|z|)
## (Intercept)                                                              <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   <2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.024             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.045  0.278      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.048  0.285      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.074  0.258      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.123  0.244      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.311                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.284                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.273                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.350                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.362                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.650

Strict estimates

Here, we classified an overheating event only when 95% confidence intervals did not overlap with zero.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_strict_estimates.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_overheating_risk_sensitivity_analysis_strict_estimates.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

## We do not load pond data because none of the species overheat in water
## bodies

# Function to run population-level overheating_risk models in parallel
run_overheating_risk_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(overheating_risk_strict ~ s(lat, bs = "tp"), random = ~(1 |
        genus/species), data = data, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        overheating_risk_strict = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_risk/sensitivity_analyses/predictions_pop_lat_overheating_risk_strict_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Run sequentially to reduce computational demands
plan(sequential)

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_overheating_risk_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "   445.7    496.9   -217.9    435.7   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-3.439  0.000  0.000  0.000 12.591 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)  666.16  25.810  "                          
## [15] " genus         (Intercept)   44.94   6.703  "                          
## [16] " Xr            s(lat)      7113.14  84.339  "                          
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept)  -34.633      1.855 -18.675   <2e-16 ***"                 
## [22] "Xs(lat)Fx1     23.173      2.614   8.865   <2e-16 ***"                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.148 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0xe2932f0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -34.63      14.48  -2.391   0.0168 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 2.446  2.446  16.08 0.00043 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -1.2e-05   "                                     
## [22] "glmer.ML = 353.27  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  1170.0   1221.2   -580.0   1160.0   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-3.171  0.000  0.000  0.000 38.512 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   306.17  17.498 "                          
## [15] " genus         (Intercept)    12.16   3.486 "                          
## [16] " Xr            s(lat)      10926.91 104.532 "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept)  -27.838      1.262 -22.055   <2e-16 ***"                 
## [22] "Xs(lat)Fx1      1.283      2.222   0.577    0.564    "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.068"
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0x14df9088>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -27.838      4.505   -6.18 6.42e-10 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.216  4.216  71.97  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -2.05e-05   "                                    
## [22] "glmer.ML = 962.26  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: binomial  ( logit )"                                          
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] "  7287.7   7338.8  -3638.8   7277.7   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-3.9298 -0.0008 -0.0004 -0.0003 24.7282 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept) 149.237  12.216  "                          
## [15] " genus         (Intercept)   2.223   1.491  "                          
## [16] " Xr            s(lat)      920.691  30.343  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -15.6467     0.4495 -34.813  < 2e-16 ***"                 
## [22] "Xs(lat)Fx1     6.8896     2.6389   2.611  0.00903 ** "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.046 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0x12c01c60>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -15.6467     0.9921  -15.77   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.594  7.594  364.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -3.66e-05   "                                    
## [22] "glmer.ML = 6167.8  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "    85.5    130.2    -37.8     75.5    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-0.2519 -0.0002 -0.0001 -0.0001  5.8028 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept) 137.82   11.740  "                         
## [15] " genus         (Intercept)  15.88    3.985  "                         
## [16] " Xr            s(lat)        0.00    0.000  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -17.848      3.864  -4.620 3.85e-06 ***"                
## [22] "Xs(lat)Fx1     -1.146      1.446  -0.792    0.428    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.378 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0xdf6f530>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -17.848      8.519  -2.095   0.0362 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "       edf Ref.df Chi.sq p-value"                              
## [17] "s(lat)   1      1  0.532   0.466"                              
## [18] ""                                                              
## [19] "R-sq.(adj) =  -1.78e-05   "                                    
## [20] "glmer.ML = 60.336  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "   151.4    196.1    -70.7    141.4    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-0.5508 -0.0002 -0.0001 -0.0001  5.7212 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept) 165.86   12.879  "                         
## [15] " genus         (Intercept)  16.33    4.041  "                         
## [16] " Xr            s(lat)        0.00    0.000  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -17.9391     3.7416  -4.795 1.63e-06 ***"                
## [22] "Xs(lat)Fx1    -0.9363     0.9616  -0.974     0.33    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.215 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0xbbdd790>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -17.939      9.265  -1.936   0.0528 ."            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "       edf Ref.df Chi.sq p-value"                              
## [17] "s(lat)   1      1   0.89   0.346"                              
## [18] ""                                                              
## [19] "R-sq.(adj) =  -1.78e-05   "                                    
## [20] "glmer.ML = 124.57  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_MER_pop_lat_overheating_risk_strict_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: binomial  ( logit )"                                         
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1216.9   1261.6   -603.4   1206.9    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-1.1930 -0.0003 -0.0002  0.0000  6.2139 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)    8.394  2.897  "                         
## [15] " genus         (Intercept)  107.348 10.361  "                         
## [16] " Xr            s(lat)      6292.572 79.326  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept)  -24.242      2.363 -10.257   <2e-16 ***"                
## [22] "Xs(lat)Fx1     -9.226      5.506  -1.676   0.0938 .  "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.254 "
# Generalized additive model
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/summary_GAM_pop_lat_overheating_risk_strict_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_risk_strict ~ s(lat, bs = \"tp\")"                 
##  [7] "<environment: 0xeebd3e0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)  -24.242      7.727  -3.137   0.0017 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 2.726  2.726   67.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.83e-05   "                                    
## [22] "glmer.ML = 1085.9  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model
model_risk <- glmer(overheating_risk_strict ~ habitat_scenario - 1 + (1 | genus/species),
    family = "binomial", control = glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb")),
    data = all_data)

# Get predictions
predictions <- as.data.frame(ggpredict(model_risk, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model and predictions
saveRDS(model_risk, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_strict.rds")
saveRDS(predictions, file = "RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_strict.rds")

#### Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

# Run model
model_risk_contrast <- glmer(overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "binomial", control = glmerControl(optimizer = "optimx",
    optCtrl = list(method = "nlminb")), data = all_data)

# Save model
saveRDS(model_risk_contrast, file = "RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_strict.rds")
Model summaries
Overall means
# Model summary
model_overheating_risk <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_strict.rds")
summary(model_overheating_risk)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: overheating_risk_strict ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  11175.4  11267.9  -5579.7  11159.4   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.623 -0.001  0.000  0.000 42.784 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 102.4743 10.1230 
##  genus         (Intercept)   0.9632  0.9814 
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -18.5911     0.4907  -37.89   <2e-16 ***
## habitat_scenarioarboreal_future2C  -17.4748     0.3882  -45.01   <2e-16 ***
## habitat_scenarioarboreal_future4C  -14.6345     0.3385  -43.24   <2e-16 ***
## habitat_scenariosubstrate_current  -17.3393     0.3486  -49.74   <2e-16 ***
## habitat_scenariosubstrate_future2C -16.2389     0.3385  -47.97   <2e-16 ***
## habitat_scenariosubstrate_future4C -13.5638     0.3300  -41.10   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.535                                                            
## hbtt_scnrr_4C 0.635       0.809                                                
## hbtt_scnrs_   0.603       0.767         0.906                                  
## hbtt_scnrs_2C 0.628       0.798         0.943         0.914                    
## hbtt_scnrs_4C 0.641       0.815         0.963         0.927       0.965
# Predictions
print(readRDS("RData/Models/overheating_risk/sensitivity_analyses/predictions_lme4_overheating_risk_strict.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 8.432919e-09 0.4907030 3.223226e-09 2.206303e-08
## 2  arboreal_future2C 2.574975e-08 0.3882067 1.203181e-08 5.510805e-08
## 3  arboreal_future4C 4.408666e-07 0.3384592 2.270964e-07 8.558626e-07
## 4  substrate_current 2.948686e-08 0.3486067 1.488998e-08 5.839330e-08
## 5 substrate_future2C 8.862341e-08 0.3385445 4.564349e-08 1.720751e-07
## 6 substrate_future4C 1.286225e-06 0.3299985 6.736308e-07 2.455906e-06
Contrasts
model_overheating_risk_contrast <- readRDS("RData/Models/overheating_risk/sensitivity_analyses/model_lme4_overheating_risk_contrast_strict.rds")
summary(model_overheating_risk_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## overheating_risk ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
## 
##      AIC      BIC   logLik deviance df.resid 
##  42530.0  42622.5 -21257.0  42514.0   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -2.622 -0.014 -0.002 -0.001 48.777 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 69.6531  8.3458  
##  genus         (Intercept)  0.3059  0.5531  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -13.81696
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.73922
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.02065
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.31597
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.65985
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.20877
##                                                                        Std. Error
## (Intercept)                                                               0.27087
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.09717
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.07987
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.06421
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.04859
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.04395
##                                                                        z value
## (Intercept)                                                            -51.010
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -7.608
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.259
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   20.493
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  13.579
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  50.254
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   2.79e-14
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.796
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.065             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.077  0.263      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.088  0.315      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.102  0.303      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.131  0.319      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.384                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.371                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.392                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.461                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.500                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.690

Overheating days

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_overheating_days_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_overheating_days_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

# Load population-level data
## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")

## We do not load pond data because none of the species overheat in water bodies

# Function to run population-level overheating_days models in parallel 
run_overheating_days_analysis <- function(dataset, habitat_scenario) {
  
  split_names <- strsplit(as.character(dataset$tip.label), ' ')
  dataset$genus <- sapply(split_names, `[`, 1)
  dataset$species <- sapply(split_names, `[`, 2)
  dataset$overheating_days <- round(dataset$overheating_days)
  
  data <- dataset
  
  # Run model
  model <- gamm4::gamm4(overheating_days ~ s(lat, bs = "tp"), 
                        data = data, # Did not run with random effects
                        family = poisson(),
                        REML = TRUE)
  
  # Generate data set for predictions
  new_data <- data.frame(
    lat = seq(min(data$lat), max(data$lat), length = 1000),
    overheating_days = NA)
  
  # Predict for each latitude value
  pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
  new_data$overheating_days_pred <- pred$fit
  new_data$overheating_days_pred_se <- pred$se.fit
  
  # Calculate 95% confidence intervals
  new_data <- mutate(new_data, 
                     upper = overheating_days_pred + 1.96 * overheating_days_pred_se,
                     lower = overheating_days_pred - 1.96 * overheating_days_pred_se)
  
  # Model summaries 
  summary_gam <- capture.output(summary(model$gam)) # Generalised additive model
  summary_mer <- capture.output(summary(model$mer)) # Mixed effect regression
  
  # Save model and predictions
  saveRDS(summary_gam, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_", habitat_scenario, "_max_acc.rds"))
  saveRDS(summary_mer, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_", habitat_scenario, "_max_acc.rds"))
  saveRDS(new_data, file = paste0("RData/Models/overheating_days/sensitivity_analyses/predictions_pop_lat_overheating_days_", habitat_scenario, "_max_acc.rds"))
}


# Create a list of all the datasets
dataset_list <- list(
  arboreal_current = pop_arb_current,
  arboreal_future2C = pop_arb_future2C,
  arboreal_future4C = pop_arb_future4C,
  substrate_current = pop_sub_current,
  substrate_future2C = pop_sub_future2C,
  substrate_future4C = pop_sub_future4C
)


# Set up parallel processing
plan(multicore(workers=2))

# Run function
results <- future_lapply(
  names(dataset_list), 
  function(x) {run_overheating_days_analysis(dataset_list[[x]], x)},
  future.packages = c("gamm4", "mgcv", "dplyr")
)
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 19902.1  19932.8  -9948.1  19896.1   203851 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.162  -0.116  -0.074  -0.039 114.127 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 904.9    30.08   "                                 
## [15] "Number of obs: 203854, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error  z value Pr(>|z|)    "           
## [19] "X(Intercept) -5.33758    0.04222 -126.425   <2e-16 ***"           
## [20] "Xs(lat)Fx1    7.33028    0.88326    8.299   <2e-16 ***"           
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.012"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xc0d1910>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.3376     0.0423  -126.2   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.436  8.436   1042  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00376   "                                      
## [22] "glmer.ML =  17123  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 34342.6  34373.3 -17168.3  34336.6   203850 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.224  -0.157  -0.095  -0.054 141.703 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1201     34.66   "                                 
## [15] "Number of obs: 203853, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -4.73765    0.03141 -150.84   <2e-16 ***"            
## [20] "Xs(lat)Fx1    9.88070    0.80950   12.21   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.026"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x10451bd8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -4.73765    0.03159    -150   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.593  8.593   2005  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00468   "                                      
## [22] "glmer.ML =  29877  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "164977.5 165008.2 -82485.8 164971.5   203850 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.500  -0.404  -0.210  -0.114 257.582 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 2489     49.89   "                                 
## [15] "Number of obs: 203853, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -3.13970    0.01446 -217.12   <2e-16 ***"            
## [20] "Xs(lat)Fx1   22.00773    0.35008   62.86   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.046"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xebc1620>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -3.13970    0.01505  -208.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.925  8.925   9784  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00379   "                                      
## [22] "glmer.ML = 1.5252e+05  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  3506.2   3533.0  -1750.1   3500.2    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.146 -0.095 -0.038 -0.022 66.999 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 42713    206.7   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -11.522      1.330   -8.66   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -18.342      1.547  -11.86   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.037"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xc522538>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -11.522      2.648  -4.351 1.36e-05 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.739  5.739  214.5  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00653   "                                      
## [22] "glmer.ML = 2892.7  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  5804.5   5831.3  -2899.2   5798.5    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.199 -0.131 -0.048 -0.020 50.138 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 58479    241.8   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -12.261      1.113  -11.02   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -41.165      1.298  -31.72   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.045"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x104798f0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -12.261      2.959  -4.143 3.43e-05 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.846  5.846  380.9  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00839   "                                      
## [22] "glmer.ML = 4855.4  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 24997.9  25024.7 -12495.9  24991.9    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.433  -0.282  -0.123  -0.044 124.828 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 314967   561.2   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "               Estimate Std. Error z value Pr(>|z|)    "          
## [19] "X(Intercept)   -5.91015    0.06077  -97.25   <2e-16 ***"          
## [20] "Xs(lat)Fx1   -197.40931    0.82733 -238.61   <2e-16 ***"          
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.150 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x125ea4d8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.9101     0.4132   -14.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.632  8.632   1864  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00605   "                                      
## [22] "glmer.ML =  22466  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)
all_data$overheating_days <- round(all_data$overheating_days)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model Note that this model fails if we add an observation-level random
# effect
model_days <- glmer(overheating_days ~ habitat_scenario - 1 + (1 | genus/species),
    family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_days, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)


# Save model and predictions
saveRDS(model_days, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_max_acc.rds")
saveRDS(predictions, file = "RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_overheating_days_max_acc.rds")

# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_days_contrast <- glmer(overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_data)

saveRDS(model_days_contrast, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_contrast_max_acc.rds")
Model summaries
Overall means
# Model summary
model_overheating_days <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_max_acc.rds")
summary(model_overheating_days)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
## 100864.9 100957.5 -50424.5 100848.9   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -5.080 -0.037 -0.003 -0.001 87.818 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 64.8573  8.0534  
##  genus         (Intercept)  0.2616  0.5115  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -14.2460     0.3477  -40.97   <2e-16 ***
## habitat_scenarioarboreal_future2C  -13.6453     0.3456  -39.48   <2e-16 ***
## habitat_scenarioarboreal_future4C  -12.0414     0.3435  -35.05   <2e-16 ***
## habitat_scenariosubstrate_current  -13.5700     0.3437  -39.48   <2e-16 ***
## habitat_scenariosubstrate_future2C -12.9451     0.3433  -37.71   <2e-16 ***
## habitat_scenariosubstrate_future4C -11.2541     0.3429  -32.82   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.979                                                            
## hbtt_scnrr_4C 0.985       0.991                                                
## hbtt_scnrs_   0.984       0.990         0.996                                  
## hbtt_scnrs_2C 0.985       0.991         0.997         0.996                    
## hbtt_scnrs_4C 0.986       0.992         0.998         0.997       0.998        
## optimizer (bobyqa) convergence code: 0 (OK)
## unable to evaluate scaled gradient
## Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
# Predictions
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_overheating_days_max_acc.rds"))
##     habitat_scenario  prediction         se     lower_CI   upper_CI
## 1   arboreal_current 0.005498666 0.01871166 0.000000e+00 0.03150240
## 2  arboreal_future2C 0.010008308 0.02622641 0.000000e+00 0.06091754
## 3  arboreal_future4C 0.049771571 0.06257812 5.797456e-03 0.16715487
## 4  substrate_current 0.008670887 0.02832957 9.688306e-06 0.05198242
## 5 substrate_future2C 0.016189362 0.03993918 7.498050e-04 0.08495202
## 6 substrate_future4C 0.087825325 0.09656397 1.978362e-02 0.29340799
Contrasts
model_overheating_days_contrast <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_contrast_max_acc.rds")
summary(model_overheating_days_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
## 100863.0 100955.6 -50423.5 100847.0   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -5.080 -0.037 -0.004 -0.001 87.825 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 57.4615  7.5803  
##  genus         (Intercept)  0.1881  0.4337  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -13.15799
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.67223
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.07374
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.53071
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.62623
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   2.31662
##                                                                        Std. Error
## (Intercept)                                                               0.15738
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.06147
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.04878
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.03146
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.02923
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.02472
##                                                                        z value
## (Intercept)                                                            -83.607
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -10.937
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -1.512
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   48.653
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  21.424
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  93.700
##                                                                        Pr(>|z|)
## (Intercept)                                                              <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.131
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   <2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.023             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.032  0.209      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.063  0.324      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.071  0.303      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.082  0.359      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.411                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.386                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.457                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.601                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.712                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.767

Uncertain estimates

Here, we capped the distribution of simulated CTmax estimates to the “biological range”, that is, the standard deviation of all CTmax estimats across species (s.e. range across habitats: 1.84-2.17).

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_overheating_days_sensitivity_analysis_strict_estimates.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_overheating_days_sensitivity_analysis_strict_estimates.pbs

Generalized additive mixed models

# Load population-level data
## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_large_se.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_large_se.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_large_se.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_large_se.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

# Function to run population-level overheating_days models in parallel 
run_overheating_days_analysis <- function(dataset, habitat_scenario) {
  
  split_names <- strsplit(as.character(dataset$tip.label), ' ')
  dataset$genus <- sapply(split_names, `[`, 1)
  dataset$species <- sapply(split_names, `[`, 2)
  dataset$overheating_days <- round(dataset$overheating_days)

  data <- dataset
  
  # Run model
  model <- gamm4::gamm4(overheating_days ~ s(lat, bs = "tp"), 
                        data = data, # Did not run with random effects
                        family = poisson(),
                        REML = TRUE)
  
  # Generate data set for predictions
  new_data <- data.frame(
    lat = seq(min(data$lat), max(data$lat), length = 1000),
    overheating_days = NA)
  
  # Predict for each latitude value
  pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
  new_data$overheating_days_pred <- pred$fit
  new_data$overheating_days_pred_se <- pred$se.fit
  
  # Calculate 95% confidence intervals
  new_data <- mutate(new_data, 
                     upper = overheating_days_pred + 1.96 * overheating_days_pred_se,
                     lower = overheating_days_pred - 1.96 * overheating_days_pred_se)
  
  # Model summaries 
  summary_gam <- capture.output(summary(model$gam)) # Generalised additive model
  summary_mer <- capture.output(summary(model$mer)) # Mixed effect regression
  
  # Save model and predictions
  saveRDS(summary_gam, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_", habitat_scenario, "_large_se.rds"))
  saveRDS(summary_mer, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_", habitat_scenario, "_large_se.rds"))
  saveRDS(new_data, file = paste0("RData/Models/overheating_days/sensitivity_analyses/predictions_pop_lat_overheating_days_", habitat_scenario, "_large_se.rds"))
}


# Create a list of all the datasets
dataset_list <- list(
  arboreal_current = pop_arb_current,
  arboreal_future2C = pop_arb_future2C,
  arboreal_future4C = pop_arb_future4C,
  substrate_current = pop_sub_current,
  substrate_future2C = pop_sub_future2C,
  substrate_future4C = pop_sub_future4C
)

# Run in parallel
plan(multicore(workers=2))

# Run function
results <- future_lapply(
  names(dataset_list), 
  function(x) {run_overheating_days_analysis(dataset_list[[x]], x)},
  future.packages = c("gamm4", "mgcv", "dplyr")
)
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "115881.1 115911.8 -57937.6 115875.1   203851 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.464  -0.312  -0.199  -0.111 133.524 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 24460    156.4   "                                 
## [15] "Number of obs: 203854, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -3.61613    0.02288  -158.0   <2e-16 ***"            
## [20] "Xs(lat)Fx1   85.67589    0.32942   260.1   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.055"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xd1990f8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -3.616      0.033  -109.6   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.956  8.956   8220  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00823   "                                      
## [22] "glmer.ML = 1.0259e+05  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "162415.8 162446.5 -81204.9 162409.8   203850 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.536  -0.376  -0.261  -0.153 162.364 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 19196    138.6   "                                 
## [15] "Number of obs: 203853, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -3.14639    0.01842  -170.8   <2e-16 ***"            
## [20] "Xs(lat)Fx1   77.66747    0.32015   242.6   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.069"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x114bcac8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -3.14639    0.02788  -112.9   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.961  8.961  10150  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00714   "                                      
## [22] "glmer.ML = 1.4393e+05  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_substrate_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "      AIC       BIC    logLik  deviance  df.resid "               
##  [6] " 630551.0  630581.6 -315272.5  630545.0    203850 "               
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] " -1.01  -0.75  -0.60  -0.44 419.25 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 22055    148.5   "                                 
## [15] "Number of obs: 203853, groups:  Xr, 8"                            
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "              Estimate Std. Error z value Pr(>|z|)    "           
## [19] "X(Intercept) -1.586341   0.008987  -176.5   <2e-16 ***"           
## [20] "Xs(lat)Fx1   83.254237   0.178676   466.0   <2e-16 ***"           
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.092"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_substrate_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xe171518>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -1.58634    0.01266  -125.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.996  8.996  23137  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.00521   "                                      
## [22] "glmer.ML = 5.7947e+05  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 10541.3  10568.1  -5267.7  10535.3    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.288  -0.194  -0.070  -0.034 130.583 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 80509    283.7   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -11.5214     0.9559  -12.05   <2e-16 ***"            
## [20] "Xs(lat)Fx1   -30.1984     1.3309  -22.69   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.313"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0xd9f7440>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -11.521      2.972  -3.877 0.000106 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 6.051  6.051  784.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.015   "                                        
## [22] "glmer.ML =   8846  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 15513.6  15540.4  -7753.8  15507.6    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.358 -0.208 -0.089 -0.045 69.440 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 95349    308.8   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -7.9900     0.5766  -13.86   <2e-16 ***"            
## [20] "Xs(lat)Fx1    12.6144     0.8222   15.34   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.013"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x115aa788>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)   -7.990      2.855  -2.798  0.00514 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 6.298  6.298   1248  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0169   "                                       
## [22] "glmer.ML =  13171  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_overheating_days_arboreal_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 77351.1  77378.0 -38672.6  77345.1    56207 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.822  -0.496  -0.229  -0.125 165.241 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 897657   947.4   "                                 
## [15] "Number of obs: 56210, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "              Estimate Std. Error z value Pr(>|z|)    "           
## [19] "X(Intercept)   -6.1628     0.1965  -31.36   <2e-16 ***"           
## [20] "Xs(lat)Fx1   -306.7558     0.6639 -462.08   <2e-16 ***"           
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.001 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_overheating_days_arboreal_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "overheating_days ~ s(lat, bs = \"tp\")"                        
##  [7] "<environment: 0x1376f580>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -6.1628     0.2677  -23.02   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.915  8.915   7289  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0118   "                                       
## [22] "glmer.ML =  71613  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)
all_data$overheating_days <- round(all_data$overheating_days)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model
model_days <- glmer(overheating_days ~ habitat_scenario - 1 + (1 | genus/species),
    family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05)),
    data = all_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_days, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)


# Save model and predictions
saveRDS(model_days, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_large_se.rds")
saveRDS(predictions, file = "RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_overheating_days_large_se.rds")

#### Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_days_contrast <- glmer(overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | genus/species), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 2e+05)), data = all_data)

# Save model
saveRDS(model_days_contrast, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_contrast_large_se.rds")
Model summaries
Overall means
# Model summary
model_overheating_days <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_large_se.rds")
summary(model_overheating_days)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: overheating_days ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##       AIC       BIC    logLik  deviance  df.resid 
##  353715.1  353807.7 -176849.6  353699.1    780182 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
##  -7.757  -0.119  -0.036  -0.013 116.125 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept)  5.126   2.264   
##  genus         (Intercept) 10.810   3.288   
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -8.78303    0.08972  -97.89   <2e-16 ***
## habitat_scenarioarboreal_future2C  -8.33161    0.08824  -94.42   <2e-16 ***
## habitat_scenarioarboreal_future4C  -6.61641    0.08574  -77.17   <2e-16 ***
## habitat_scenariosubstrate_current  -7.50610    0.08568  -87.61   <2e-16 ***
## habitat_scenariosubstrate_future2C -7.11985    0.08557  -83.20   <2e-16 ***
## habitat_scenariosubstrate_future4C -5.63146    0.08538  -65.96   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.913                                                            
## hbtt_scnrr_4C 0.939       0.958                                                
## hbtt_scnrs_   0.940       0.959         0.987                                  
## hbtt_scnrs_2C 0.941       0.960         0.989         0.992                    
## hbtt_scnrs_4C 0.944       0.963         0.991         0.994       0.996        
## optimizer (bobyqa) convergence code: 0 (OK)
## Model failed to converge with max|grad| = 0.00293739 (tol = 0.002, component 1)
# Predictions
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_overheating_days_large_se.rds"))
##     habitat_scenario prediction         se    lower_CI  upper_CI
## 1   arboreal_current 0.02077671 0.04627302 0.000000000 0.1079345
## 2  arboreal_future2C 0.03266344 0.05930896 0.000000000 0.1542724
## 3  arboreal_future4C 0.18160059 0.14768843 0.045337573 0.4675765
## 4  substrate_current 0.06750145 0.11069186 0.007180139 0.3050997
## 5 substrate_future2C 0.09934247 0.13535109 0.015693662 0.3870997
## 6 substrate_future4C 0.44006150 0.29049445 0.160420867 1.0852381
Contrasts
model_overheating_days_contrast <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_overheating_days_contrast_large_se.rds")
summary(model_overheating_days_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
## 
##       AIC       BIC    logLik  deviance  df.resid 
##  353715.1  353807.7 -176849.6  353699.1    780182 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
##  -7.757  -0.119  -0.036  -0.013 116.125 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept)  5.127   2.264   
##  genus         (Intercept) 10.826   3.290   
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -7.509992
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -1.276933
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.825492
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.889697
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.386253
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  1.874651
##                                                                        Std. Error
## (Intercept)                                                              0.146079
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.030592
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.025095
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    0.013700
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.011029
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   0.009127
##                                                                        z value
## (Intercept)                                                             -51.41
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -41.74
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -32.90
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    64.94
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   35.02
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  205.40
##                                                                        Pr(>|z|)
## (Intercept)                                                              <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   <2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   <2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.023             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.013  0.116      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.030  0.211      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.039  0.210      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.040  0.254      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.262                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.261                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.314                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.476                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.575                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.717                              
## optimizer (bobyqa) convergence code: 0 (OK)
## Model failed to converge with max|grad| = 0.00569692 (tol = 0.002, component 1)

Consecutive overheating days

Here, we specifically quantified the consecutive number of overheating events populations were predicted to experience.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_consecutive_overheating_days.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_consecutive_overheating_days.pbs

Generalized additive mixed models

# Load population-level data Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

## We do not load pond data because none of the species overheat in water
## bodies

# Function to run population-level consecutive_overheating_days models in
# parallel
run_consecutive_overheating_days_analysis <- function(dataset, habitat_scenario) {

    split_names <- strsplit(as.character(dataset$tip.label), " ")
    dataset$genus <- sapply(split_names, `[`, 1)
    dataset$species <- sapply(split_names, `[`, 2)

    data <- dataset

    # Run model
    model <- gamm4::gamm4(consecutive_overheating_days ~ s(lat, bs = "tp"), random = ~(1 |
        genus/species), data = data, family = poisson(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        consecutive_overheating_days = NA, genus = NA, species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$consecutive_overheating_days_pred <- pred$fit
    new_data$consecutive_overheating_days_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = consecutive_overheating_days_pred + 1.96 *
        consecutive_overheating_days_pred_se, lower = consecutive_overheating_days_pred -
        1.96 * consecutive_overheating_days_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/overheating_days/sensitivity_analyses/predictions_pop_lat_consecutive_overheating_days_",
        habitat_scenario, ".rds"))
}


# Create a list of all the datasets
dataset_list <- list(arboreal_current = pop_arb_current, arboreal_future2C = pop_arb_future2C,
    arboreal_future4C = pop_arb_future4C, substrate_current = pop_sub_current, substrate_future2C = pop_sub_future2C,
    substrate_future4C = pop_sub_future4C)


# Run sequentially to reduce memory demands
plan(sequential)

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_consecutive_overheating_days_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))

Model summaries

Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 10567.1  10618.2  -5278.6  10557.1   203849 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "   Min     1Q Median     3Q    Max "                                   
## [10] "-1.084 -0.006 -0.002 -0.001 36.700 "                                   
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   62.790  7.924  "                          
## [15] " genus         (Intercept)    1.174  1.084  "                          
## [16] " Xr            s(lat)      1095.464 33.098  "                          
## [17] "Number of obs: 203854, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept)  -13.026      0.397  -32.81  < 2e-16 ***"                 
## [22] "Xs(lat)Fx1      4.930      1.654    2.98  0.00288 ** "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 -0.015"
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xe343b50>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -13.0257     0.5234  -24.89   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.002  8.002  344.5  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.23e-05   "                                    
## [22] "glmer.ML = 6097.7  Scale est. = 1         n = 203854"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 16165.6  16216.7  -8077.8  16155.6   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-1.4659 -0.0430 -0.0043 -0.0024 22.1602 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)  44.0781  6.6391 "                          
## [15] " genus         (Intercept)   0.5247  0.7244 "                          
## [16] " Xr            s(lat)      790.3078 28.1124 "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                 
## [21] "X(Intercept) -11.4747     0.3336 -34.401   <2e-16 ***"                 
## [22] "Xs(lat)Fx1     4.3013     2.1272   2.022   0.0432 *  "                 
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.031 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xd9c6350>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -11.4747     0.3496  -32.82   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.081  8.081  560.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.36e-05   "                                    
## [22] "glmer.ML = 9476.5  Scale est. = 1         n = 203853"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"     
##  [2] "  Approximation) [glmerMod]"                                           
##  [3] " Family: poisson  ( log )"                                             
##  [4] ""                                                                      
##  [5] "     AIC      BIC   logLik deviance df.resid "                         
##  [6] " 31422.8  31473.9 -15706.4  31412.8   203848 "                         
##  [7] ""                                                                      
##  [8] "Scaled residuals: "                                                    
##  [9] "    Min      1Q  Median      3Q     Max "                              
## [10] "-2.2471 -0.0914 -0.0403 -0.0176 28.4693 "                              
## [11] ""                                                                      
## [12] "Random effects:"                                                       
## [13] " Groups        Name        Variance Std.Dev."                          
## [14] " species:genus (Intercept)   3.666   1.915  "                          
## [15] " genus         (Intercept)   8.657   2.942  "                          
## [16] " Xr            s(lat)      443.697  21.064  "                          
## [17] "Number of obs: 203853, groups:  species:genus, 5177; genus, 464; Xr, 8"
## [18] ""                                                                      
## [19] "Fixed effects:"                                                        
## [20] "               Estimate Std. Error   z value Pr(>|z|)    "             
## [21] "X(Intercept) -7.8885767  0.0001768 -44616.15   <2e-16 ***"             
## [22] "Xs(lat)Fx1    2.1689940  4.5142451      0.48    0.631    "             
## [23] "---"                                                                   
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"        
## [25] ""                                                                      
## [26] "Correlation of Fixed Effects:"                                         
## [27] "           X(Int)"                                                     
## [28] "Xs(lat)Fx1 0.002 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0x1261dc90>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -7.8886     0.2285  -34.52   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.427  8.427   1254  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.000199   "                                     
## [22] "glmer.ML =  18308  Scale est. = 1         n = 203853"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  1900.3   1945.0   -945.2   1890.3    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] "-0.6999 -0.0013 -0.0009 -0.0002 13.3971 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)  111.028 10.537  "                         
## [15] " genus         (Intercept)    2.784  1.669  "                         
## [16] " Xr            s(lat)      3067.634 55.386  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -15.9803     0.9147 -17.471   <2e-16 ***"                
## [22] "Xs(lat)Fx1     3.9938     3.4993   1.141    0.254    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.179 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xbd25658>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -15.980      2.298  -6.955 3.53e-12 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.506  4.506  61.62  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -7.89e-05   "                                    
## [22] "glmer.ML = 1085.8  Scale est. = 1         n = 56210"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  2877.3   2922.0  -1433.6   2867.3    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "    Min      1Q  Median      3Q     Max "                             
## [10] " -0.750  -0.002  -0.001   0.000 140.558 "                             
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance Std.Dev."                         
## [14] " species:genus (Intercept)   99.646  9.982  "                         
## [15] " genus         (Intercept)    1.805  1.344  "                         
## [16] " Xr            s(lat)      1928.291 43.912  "                         
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -15.0245     0.7542 -19.922   <2e-16 ***"                
## [22] "Xs(lat)Fx1     4.6891     3.1243   1.501    0.133    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.197 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_arboreal_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xc4ca6e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -15.024      1.752  -8.577   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 4.447  4.447  81.28  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -7.6e-05   "                                     
## [22] "glmer.ML = 1605.6  Scale est. = 1         n = 56210"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_MER_pop_lat_consecutive_overheating_days_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"    
##  [2] "  Approximation) [glmerMod]"                                          
##  [3] " Family: poisson  ( log )"                                            
##  [4] ""                                                                     
##  [5] "     AIC      BIC   logLik deviance df.resid "                        
##  [6] "  5934.9   5979.6  -2962.4   5924.9    56205 "                        
##  [7] ""                                                                     
##  [8] "Scaled residuals: "                                                   
##  [9] "   Min     1Q Median     3Q    Max "                                  
## [10] "-0.931 -0.062 -0.008 -0.004 80.227 "                                  
## [11] ""                                                                     
## [12] "Random effects:"                                                      
## [13] " Groups        Name        Variance  Std.Dev."                        
## [14] " species:genus (Intercept)   35.9172  5.9931 "                        
## [15] " genus         (Intercept)    0.3581  0.5984 "                        
## [16] " Xr            s(lat)      1457.8449 38.1817 "                        
## [17] "Number of obs: 56210, groups:  species:genus, 1771; genus, 174; Xr, 8"
## [18] ""                                                                     
## [19] "Fixed effects:"                                                       
## [20] "             Estimate Std. Error z value Pr(>|z|)    "                
## [21] "X(Intercept) -10.9443     0.5265 -20.787   <2e-16 ***"                
## [22] "Xs(lat)Fx1    -1.1617     4.7325  -0.245    0.806    "                
## [23] "---"                                                                  
## [24] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"       
## [25] ""                                                                     
## [26] "Correlation of Fixed Effects:"                                        
## [27] "           X(Int)"                                                    
## [28] "Xs(lat)Fx1 0.077 "
# Generalized additive model
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/summary_GAM_pop_lat_consecutive_overheating_days_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "consecutive_overheating_days ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0x1261e710>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -10.9443     0.5671   -19.3   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.985  5.985  190.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  -4.95e-05   "                                    
## [22] "glmer.ML = 3302.8  Scale est. = 1         n = 56210"

Linear mixed models

all_data <- bind_rows(pop_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), pop_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), pop_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), pop_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), pop_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), pop_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

# Load training data for taxonomic information
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
training_data <- dplyr::select(training_data, tip.label, family)

all_data <- distinct(left_join(all_data, training_data, by = "tip.label"))

split_names <- strsplit(as.character(all_data$tip.label), " ")
all_data$genus <- sapply(split_names, `[`, 1)
all_data$species <- sapply(split_names, `[`, 2)

all_data <- as.data.frame(all_data)

set.seed(123)

# Run model Note that this model fails if we add an observation-level random
# effect
model_days <- glmer(consecutive_overheating_days ~ habitat_scenario - 1 + (1 | genus/species),
    family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_days, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)


# Save model summaries and predictions
saveRDS(model_days, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_consecutive_overheating_days.rds")
saveRDS(predictions, file = "RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_consecutive_overheating_days.rds")

# Contrasts
all_data$habitat_scenario <- as.factor(all_data$habitat_scenario)

model_days_contrast <- glmer(consecutive_overheating_days ~ relevel(habitat_scenario,
    ref = "substrate_current") + (1 | genus/species), family = "poisson", control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_data)


saveRDS(model_days_contrast, file = "RData/Models/overheating_days/sensitivity_analyses/model_lme4_consecutive_overheating_days_contrast.rds")
Model summaries
Overall means
# Model summary
model_consecutive_overheating_days <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_consecutive_overheating_days.rds")
summary(model_consecutive_overheating_days)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## consecutive_overheating_days ~ habitat_scenario - 1 + (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  69438.1  69530.7 -34711.1  69422.1   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.137 -0.059 -0.005 -0.003 39.821 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 44.4123  6.6643  
##  genus         (Intercept)  0.1269  0.3562  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -12.2565     0.1754  -69.86   <2e-16 ***
## habitat_scenarioarboreal_future2C  -11.7922     0.1724  -68.42   <2e-16 ***
## habitat_scenarioarboreal_future4C  -11.0017     0.1690  -65.10   <2e-16 ***
## habitat_scenariosubstrate_current  -11.8071     0.1670  -70.71   <2e-16 ***
## habitat_scenariosubstrate_future2C -11.3683     0.1675  -67.89   <2e-16 ***
## habitat_scenariosubstrate_future4C -10.4993     0.1665  -63.07   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.906                                                            
## hbtt_scnrr_4C 0.925       0.945                                                
## hbtt_scnrs_   0.926       0.946         0.966                                  
## hbtt_scnrs_2C 0.930       0.951         0.970         0.980                    
## hbtt_scnrs_4C 0.935       0.955         0.975         0.985       0.989
# Predictions
print(readRDS("RData/Models/overheating_days/sensitivity_analyses/predictions_lme4_consecutive_overheating_days.rds"))
##     habitat_scenario  prediction         se lower_CI   upper_CI
## 1   arboreal_current 0.005058175 0.02749854        0 0.04777664
## 2  arboreal_future2C 0.008042768 0.03578911        0 0.07052482
## 3  arboreal_future4C 0.017733962 0.05502097        0 0.11259829
## 4  substrate_current 0.007285969 0.03835059        0 0.06515276
## 5 substrate_future2C 0.011307854 0.04856460        0 0.09458924
## 6 substrate_future4C 0.026949645 0.07643345        0 0.17518150
Contrasts
model_consecutive_overheating_days_contrast <- readRDS("RData/Models/overheating_days/sensitivity_analyses/model_lme4_consecutive_overheating_days_contrast.rds")
summary(model_consecutive_overheating_days_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## consecutive_overheating_days ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | genus/species)
##    Data: all_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  69438.1  69530.7 -34711.1  69422.1   780182 
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.137 -0.059 -0.005 -0.003 39.821 
## 
## Random effects:
##  Groups        Name        Variance Std.Dev.
##  species:genus (Intercept) 44.4191  6.6648  
##  genus         (Intercept)  0.1269  0.3563  
## Number of obs: 780190, groups:  species:genus, 5177; genus, 464
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -11.80747
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.44937
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.01492
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    0.80538
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.43878
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.30776
##                                                                        Std. Error
## (Intercept)                                                               0.23523
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.06623
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.05565
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.04362
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.03306
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.02909
##                                                                        z value
## (Intercept)                                                            -50.195
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -6.785
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.268
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   18.464
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  13.273
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  44.949
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   1.16e-11
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.789
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.042             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.054  0.245      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.070  0.312      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.082  0.301      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.093  0.342      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.373                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.359                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.409                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.459                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.522                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.690

Number of species overheating

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_max_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_max_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_max_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_max_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_max_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_max_acc_future4C.rds")

# Function to run models quantifying the number of species overheating in each
# community
run_community_n_species_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(n_species_overheating ~ s(lat, bs = "tp"), data = data,
        family = poisson(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        n_species_overheating = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$n_species_overheating_pred <- pred$fit
    new_data$n_species_overheating_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = n_species_overheating_pred + 1.96 * n_species_overheating_pred_se,
        lower = n_species_overheating_pred - 1.96 * n_species_overheating_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/predictions_lat_number_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
}

# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))


# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_n_species_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_substrate_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  4246.9   4269.6  -2120.5   4240.9    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.569 -0.167 -0.047 -0.033 45.827 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 3219     56.73   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -5.7355     0.2811 -20.402   <2e-16 ***"            
## [20] "Xs(lat)Fx1     0.7937     4.8830   0.163    0.871    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.119"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xa5ac168>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.7355     0.3067   -18.7   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.538  7.538  640.8  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0265   "                                       
## [22] "glmer.ML = 3701.6  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_substrate_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  6761.3   6783.9  -3377.6   6755.3    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.724  -0.238  -0.082  -0.064 114.299 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1100     33.17   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -4.5629     0.1774 -25.725   <2e-16 ***"            
## [20] "Xs(lat)Fx1     1.4772     8.9050   0.166    0.868    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.418"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x92f7398>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -4.5629     0.1774  -25.72   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.655  7.655   1072  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0353   "                                       
## [22] "glmer.ML = 5942.6  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_substrate_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 16909.5  16932.2  -8451.8  16903.5    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.047 -0.510 -0.264 -0.077 51.278 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 487.1    22.07   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -2.70074    0.06041 -44.705  < 2e-16 ***"            
## [20] "Xs(lat)Fx1   10.04588    2.08636   4.815 1.47e-06 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.108"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xfd6d398>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -2.70074    0.06094  -44.31   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.632  8.632   2380  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0555   "                                       
## [22] "glmer.ML =  14248  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_arboreal_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   704.0    724.4   -349.0    698.0     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.3337 -0.0519 -0.0007  0.0000 21.2315 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 3142     56.06   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)  "              
## [19] "X(Intercept)  -20.526      8.105  -2.532   0.0113 *"              
## [20] "Xs(lat)Fx1     -4.741     13.506  -0.351   0.7256  "              
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.385 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x7c942e0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -20.53      10.74  -1.912   0.0559 ."            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq  p-value    "                       
## [17] "s(lat) 2.602  2.602  24.77 1.04e-05 ***"                       
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0316   "                                       
## [22] "glmer.ML = 554.55  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_arboreal_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1345.3   1365.7   -669.6   1339.3     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.457 -0.095 -0.015 -0.001 38.033 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1818     42.63   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept)   -9.847      3.496  -2.816  0.00486 **"             
## [20] "Xs(lat)Fx1      1.476      6.420   0.230  0.81811   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.313 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xa59dd08>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -9.847      5.349  -1.841   0.0656 ."            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 3.918  3.918  133.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0443   "                                       
## [22] "glmer.ML = 1106.1  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_lat_number_sp_overheating_arboreal_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  3309.0   3329.4  -1651.5   3303.0     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.7987 -0.2181 -0.0598  0.0000 20.3801 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 12885    113.5   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -16.379      2.304  -7.109 1.17e-12 ***"            
## [20] "Xs(lat)Fx1    -17.604      2.736  -6.435 1.24e-10 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.019 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_lat_number_sp_overheating_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x9b47c00>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -16.379      6.944  -2.359   0.0183 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.728  5.728  484.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0854   "                                       
## [22] "glmer.ML = 2637.8  Scale est. = 1         n = 6614"

Linear mixed models

all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_n_sp <- glmer(n_species_overheating ~ habitat_scenario - 1 + (1 | obs), family = "poisson",
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_n_sp, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_n_sp, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_max_acc.rds")
saveRDS(predictions, file = "RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_max_acc.rds")


# Contrast
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_n_sp_contrast <- glmer(n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | obs), family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)

saveRDS(model_n_sp_contrast, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_max_acc.rds")
Model summaries
Overall means
model_n_sp <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_max_acc.rds")
summary(model_n_sp)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: n_species_overheating ~ habitat_scenario - 1 + (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  16494.9  16558.1  -8240.4  16480.9    62106 
## 
## Scaled residuals: 
##       Min        1Q    Median        3Q       Max 
## -0.018260 -0.013230 -0.010071 -0.008235  0.176696 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 61.34    7.832   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -10.1001     0.3312  -30.49   <2e-16 ***
## habitat_scenarioarboreal_future2C   -9.6775     0.2792  -34.67   <2e-16 ***
## habitat_scenarioarboreal_future4C   -8.6398     0.1795  -48.14   <2e-16 ***
## habitat_scenariosubstrate_current   -9.5946     0.1930  -49.72   <2e-16 ***
## habitat_scenariosubstrate_future2C  -9.1899     0.1643  -55.94   <2e-16 ***
## habitat_scenariosubstrate_future4C  -7.9856     0.1147  -69.65   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.064                                                            
## hbtt_scnrr_4C 0.096       0.120                                                
## hbtt_scnrs_   0.091       0.114         0.172                                  
## hbtt_scnrs_2C 0.107       0.133         0.201         0.191                    
## hbtt_scnrs_4C 0.154       0.192         0.289         0.275       0.321
# Predictions
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_max_acc.rds"))
##     habitat_scenario prediction         se     lower_CI   upper_CI
## 1   arboreal_current 0.01139583 0.01029020 0.0004535833 0.03220819
## 2  arboreal_future2C 0.02515014 0.01838379 0.0025703054 0.06214469
## 3  arboreal_future4C 0.08264167 0.05548052 0.0143596916 0.19430753
## 4  substrate_current 0.03622688 0.02145316 0.0089418778 0.07920304
## 5 substrate_future2C 0.06280582 0.03427338 0.0174556423 0.13137686
## 6 substrate_future4C 0.19927296 0.11325213 0.0517264017 0.42998581
Contrasts
model_n_sp_contrast <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_max_acc.rds")
summary(model_n_sp_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  16494.9  16558.1  -8240.4  16480.9    62106 
## 
## Scaled residuals: 
##       Min        1Q    Median        3Q       Max 
## -0.018260 -0.013230 -0.010071 -0.008236  0.176707 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 61.34    7.832   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                            -9.59441
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.50633
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.08315
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.95460
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.40444
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  1.60873
##                                                                        Std. Error
## (Intercept)                                                               0.19061
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.36943
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.32216
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.23653
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.22694
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.19326
##                                                                        z value
## (Intercept)                                                            -50.335
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -1.371
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.258
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    4.036
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   1.782
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   8.324
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.1705
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.7963
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  5.44e-05
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.0747
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C .  
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.424             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.499  0.256      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.664  0.340      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.699  0.359      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.818  0.420      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.398                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.421                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.493                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.559                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.655                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.692

Uncertain estimates

Here, we capped the distribution of simulated CTmax estimates to the “biological range”, that is, the standard deviation of all CTmax estimats across species (s.e. range across habitats: 1.84-2.17).

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_large_se.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_large_se.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_large_se.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_large_se.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_large_se.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_large_se.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

# Function to run models quantifying the number of species overheating in each
# community
run_community_n_species_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(n_species_overheating ~ s(lat, bs = "tp"), data = data,
        family = poisson(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        n_species_overheating = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$n_species_overheating_pred <- pred$fit
    new_data$n_species_overheating_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = n_species_overheating_pred + 1.96 * n_species_overheating_pred_se,
        lower = n_species_overheating_pred - 1.96 * n_species_overheating_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_",
        habitat_scenario, "_large_se.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_",
        habitat_scenario, "_large_se.rds"))
    saveRDS(new_data, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/predictions_community_lat_n_sp_overheating_",
        habitat_scenario, "_large_se.rds"))
}

# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_n_species_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_substrate_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 14866.9  14889.6  -7430.5  14860.9    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.229 -0.350 -0.146 -0.043 54.384 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 302.4    17.39   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -3.5628     0.1181 -30.156  < 2e-16 ***"            
## [20] "Xs(lat)Fx1     7.4356     2.7936   2.662  0.00778 ** "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.028"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_substrate_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x9d8c118>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -3.5628     0.1194  -29.83   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.912  7.912   3165  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0971   "                                       
## [22] "glmer.ML =  12440  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_substrate_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 20167.6  20190.3 -10080.8  20161.6    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.410 -0.453 -0.190 -0.047 56.227 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 411.7    20.29   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -3.10649    0.09956 -31.201  < 2e-16 ***"            
## [20] "Xs(lat)Fx1   12.94131    4.35164   2.974  0.00294 ** "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.267"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_substrate_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xd597fc8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -3.10649    0.09805  -31.68   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.364  8.364   4126  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.107   "                                        
## [22] "glmer.ML =  16829  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_substrate_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 42673.1  42695.8 -21333.6  42667.1    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.7830 -0.9173 -0.1787 -0.0361 30.5305 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 2153     46.41   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -2.0233     0.0603  -33.56   <2e-16 ***"            
## [20] "Xs(lat)Fx1    33.0983     2.1216   15.60   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.353"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_substrate_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xec72990>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -2.02333    0.06436  -31.44   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.927  8.927   4802  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.124   "                                        
## [22] "glmer.ML =  33976  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_arboreal_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  2589.8   2610.2  -1291.9   2583.8     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.7578 -0.1406 -0.0645  0.0000 24.4840 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 51368    226.6   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)  "              
## [19] "X(Intercept)   -35.73      14.30  -2.500   0.0124 *"              
## [20] "Xs(lat)Fx1     -46.79      82.90  -0.564   0.5725  "              
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.579 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_arboreal_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xd2400a8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -35.73      14.30  -2.499   0.0124 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.758  5.758  391.9  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0784   "                                       
## [22] "glmer.ML = 2100.1  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_arboreal_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  3299.4   3319.8  -1646.7   3293.4     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.8633 -0.1872 -0.0790  0.0000 20.7263 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 92849    304.7   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -49.977      1.210  -41.29   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -84.121      1.041  -80.83   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.185 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_arboreal_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0x9d5ed10>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)   -49.98      18.40  -2.716  0.00661 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.887  5.887  532.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0844   "                                       
## [22] "glmer.ML = 2650.3  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_n_sp_overheating_arboreal_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  6592.9   6613.3  -3293.4   6586.9     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.1127 -0.3557 -0.2074 -0.0052 20.3349 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 248182   498.2   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -15.164      1.508  -10.06   <2e-16 ***"            
## [20] "Xs(lat)Fx1   -198.051      2.945  -67.25   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.081"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_n_sp_overheating_arboreal_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating ~ s(lat, bs = \"tp\")"                   
##  [7] "<environment: 0xd4905b8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -15.164      2.003  -7.571 3.69e-14 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "        edf Ref.df Chi.sq p-value    "                         
## [17] "s(lat) 8.47   8.47   1328  <2e-16 ***"                         
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0972   "                                       
## [22] "glmer.ML = 5309.8  Scale est. = 1         n = 6614"

Linear mixed models

all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_n_sp <- glmer(n_species_overheating ~ habitat_scenario - 1 + (1 | obs), family = "poisson",
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_n_sp, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_n_sp, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_large_se.rds")
saveRDS(predictions, file = "RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_large_se.rds")


# Contrast
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_n_sp_contrast <- glmer(n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | obs), family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)

saveRDS(model_n_sp_contrast, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_large_se.rds")
Model summaries
Overall means
model_n_sp_large_se <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_large_se.rds")
summary(model_n_sp_large_se)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: n_species_overheating ~ habitat_scenario - 1 + (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  53178.7  53241.9 -26582.3  53164.7    62106 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -0.0544 -0.0320 -0.0274 -0.0203  0.2446 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 36.19    6.016   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -8.08053    0.16614  -48.64   <2e-16 ***
## habitat_scenarioarboreal_future2C  -7.77967    0.14636  -53.15   <2e-16 ***
## habitat_scenarioarboreal_future4C  -7.08235    0.11408  -62.08   <2e-16 ***
## habitat_scenariosubstrate_current  -7.16722    0.08833  -81.14   <2e-16 ***
## habitat_scenariosubstrate_future2C -6.84713    0.08165  -83.86   <2e-16 ***
## habitat_scenariosubstrate_future4C -5.71584    0.07083  -80.70   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.102                                                            
## hbtt_scnrr_4C 0.132       0.149                                                
## hbtt_scnrs_   0.171       0.193         0.252                                  
## hbtt_scnrs_2C 0.186       0.210         0.273         0.354                    
## hbtt_scnrs_4C 0.226       0.255         0.332         0.430       0.468
# Predictions
readRDS("RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_large_se.rds")
##     habitat_scenario prediction         se   lower_CI  upper_CI
## 1   arboreal_current 0.05967750 0.04389789 0.01057227 0.1392652
## 2  arboreal_future2C 0.08119822 0.05895920 0.01525930 0.1903689
## 3  arboreal_future4C 0.18172437 0.11845051 0.04278047 0.4052275
## 4  substrate_current 0.19846675 0.11488562 0.05817898 0.4146228
## 5 substrate_future2C 0.29441363 0.15943887 0.09145848 0.5967158
## 6 substrate_future4C 0.83881519 0.41051857 0.27138396 1.6457399
Contrasts
model_n_sp_large_se_contrast <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_large_se.rds")
summary(model_n_sp_large_se_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  53178.7  53241.9 -26582.3  53164.7    62106 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -0.0544 -0.0320 -0.0274 -0.0203  0.2446 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 36.19    6.016   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                            -7.16711
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.91338
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.61264
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.08482
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.32002
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  1.45132
##                                                                        Std. Error
## (Intercept)                                                               0.08692
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.17573
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.15624
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.12425
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.09614
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.08537
##                                                                        z value
## (Intercept)                                                            -82.458
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -5.198
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -3.921
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    0.683
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   3.329
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  17.001
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   2.02e-07
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  8.81e-05
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  0.494829
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C 0.000872
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.344             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.381  0.194      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.472  0.240      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.611  0.312      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.669  0.351      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.266                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.346                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.389                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.428                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.481                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.626

Strict estimates

Here, we classified an overheating event only when 95% confidence intervals did not overlap with zero.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_strict_estimates.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_n_species_overheating_sensitivity_analysis_strict_estimates.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")


# Function to run models quantifying the number of species overheating in each
# community
run_community_n_species_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(n_species_overheating_strict ~ s(lat, bs = "tp"), data = data,
        family = poisson(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        n_species_overheating_strict = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$n_species_overheating_pred <- pred$fit
    new_data$n_species_overheating_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = n_species_overheating_pred + 1.96 * n_species_overheating_pred_se,
        lower = n_species_overheating_pred - 1.96 * n_species_overheating_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/n_species_overheating/sensitivity_analyses/predictions_community_lat_number_sp_overheating_strict_",
        habitat_scenario, ".rds"))
}

# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_n_species_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   716.4    739.0   -355.2    710.4    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.312 -0.006  0.000  0.000 70.935 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 4459     66.78   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -19.452      4.873  -3.992 6.56e-05 ***"            
## [20] "Xs(lat)Fx1      9.664      4.072   2.373   0.0176 *  "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.182 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xaaf43e8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)"              
## [11] "(Intercept)   -19.45      17.87  -1.088    0.276"              
## [12] ""                                                              
## [13] "Approximate significance of smooth terms:"                     
## [14] "         edf Ref.df Chi.sq p-value    "                        
## [15] "s(lat) 2.937  2.937  52.85  <2e-16 ***"                        
## [16] "---"                                                           
## [17] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [18] ""                                                              
## [19] "R-sq.(adj) =  0.0285   "                                       
## [20] "glmer.ML = 568.09  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1553.4   1576.1   -773.7   1547.4    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.484  -0.047  -0.006   0.000 106.991 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 4236     65.08   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -13.0237     1.7377  -7.495 6.65e-14 ***"            
## [20] "Xs(lat)Fx1     0.7986     2.3508   0.340    0.734    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.015"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xe2377f0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)  -13.024      4.378  -2.975  0.00293 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.084  5.084  218.8  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0426   "                                       
## [22] "glmer.ML = 1257.3  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  9509.9   9532.5  -4751.9   9503.9    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.797 -0.349 -0.198 -0.023 62.672 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 2203     46.93   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -4.2362     0.1687 -25.106  < 2e-16 ***"            
## [20] "Xs(lat)Fx1    27.1669     5.3046   5.121 3.03e-07 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.284"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0x1384d5a0>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -4.2362     0.1727  -24.52   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.649  8.649   1172  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0492   "                                       
## [22] "glmer.ML = 8014.1  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   103.9    124.3    -49.0     97.9     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.0968 -0.0136 -0.0002  0.0000 12.9639 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 5508     74.21   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)  "              
## [19] "X(Intercept) -23.2856    13.1526  -1.770   0.0767 ."              
## [20] "Xs(lat)Fx1    -0.5435    25.2009  -0.022   0.9828  "              
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.351 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_arboreal_current.rds"))
##  [1] ""                                                  
##  [2] "Family: poisson "                                  
##  [3] "Link function: log "                               
##  [4] ""                                                  
##  [5] "Formula:"                                          
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"
##  [7] "<environment: 0xdedf7a0>"                          
##  [8] ""                                                  
##  [9] "Parametric coefficients:"                          
## [10] "            Estimate Std. Error z value Pr(>|z|)"  
## [11] "(Intercept)   -23.29      15.21  -1.531    0.126"  
## [12] ""                                                  
## [13] "Approximate significance of smooth terms:"         
## [14] "         edf Ref.df Chi.sq p-value"                
## [15] "s(lat) 1.752  1.752    1.3   0.422"                
## [16] ""                                                  
## [17] "R-sq.(adj) =  0.00674   "                          
## [18] "glmer.ML = 68.824  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   222.9    243.2   -108.4    216.9     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.2012 -0.0024  0.0000  0.0000 11.5111 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 21680    147.2   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -39.934      9.186  -4.347 1.38e-05 ***"            
## [20] "Xs(lat)Fx1     -2.660      9.498  -0.280    0.779    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.006 "
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_arboreal_future2C.rds"))
##  [1] ""                                                  
##  [2] "Family: poisson "                                  
##  [3] "Link function: log "                               
##  [4] ""                                                  
##  [5] "Formula:"                                          
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"
##  [7] "<environment: 0xaab9ca0>"                          
##  [8] ""                                                  
##  [9] "Parametric coefficients:"                          
## [10] "            Estimate Std. Error z value Pr(>|z|)"  
## [11] "(Intercept)   -39.93      28.58  -1.397    0.162"  
## [12] ""                                                  
## [13] "Approximate significance of smooth terms:"         
## [14] "         edf Ref.df Chi.sq p-value"                
## [15] "s(lat) 1.922  1.922  1.584   0.428"                
## [16] ""                                                  
## [17] "R-sq.(adj) =  0.0214   "                           
## [18] "glmer.ML = 158.89  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_MER_community_lat_number_sp_overheating_strict_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: poisson  ( log )"                                        
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1658.4   1678.8   -826.2   1652.4     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.6068 -0.0613 -0.0007  0.0000 14.9049 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 3817     61.78   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -21.332      4.850  -4.398 1.09e-05 ***"            
## [20] "Xs(lat)Fx1     -6.616      7.536  -0.878     0.38    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.090"
# Generalized additive model
print(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/summary_GAM_community_lat_number_sp_overheating_strict_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: poisson "                                              
##  [3] "Link function: log "                                           
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "n_species_overheating_strict ~ s(lat, bs = \"tp\")"            
##  [7] "<environment: 0xe12fde0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -21.33      10.95  -1.949   0.0513 ."            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 2.861  2.861  109.3  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.065   "                                        
## [22] "glmer.ML = 1341.3  Scale est. = 1         n = 6614"

Linear mixed models

# Run analyses with lme4 to estimate the mean number of species overheating in
# each microhabitat and scenario
all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_n_sp <- glmer(n_species_overheating_strict ~ habitat_scenario - 1 + (1 | obs),
    family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)


# Get predictions
predictions <- as.data.frame(ggpredict(model_n_sp, terms = "habitat_scenario", type = "simulate",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_n_sp, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_strict.rds")
saveRDS(predictions, file = "RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_strict.rds")


# Contrast
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_n_sp_contrast <- glmer(n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +
    (1 | obs), family = "poisson", control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)

saveRDS(model_n_sp_contrast, file = "RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_strict.rds")
Model summaries
Overall means
model_n_sp_strict <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_strict.rds")
summary(model_n_sp_strict)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: n_species_overheating_strict ~ habitat_scenario - 1 + (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##   7553.6   7616.9  -3769.8   7539.6    62106 
## 
## Scaled residuals: 
##       Min        1Q    Median        3Q       Max 
## -0.011703 -0.007796 -0.005328 -0.003787  0.181138 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 73.39    8.567   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -12.3257     0.8713  -14.15   <2e-16 ***
## habitat_scenarioarboreal_future2C  -11.4395     0.5854  -19.54   <2e-16 ***
## habitat_scenarioarboreal_future4C   -9.7038     0.2717  -35.72   <2e-16 ***
## habitat_scenariosubstrate_current  -11.1514     0.3630  -30.72   <2e-16 ***
## habitat_scenariosubstrate_future2C -10.4676     0.2723  -38.44   <2e-16 ***
## habitat_scenariosubstrate_future4C  -8.8858     0.1613  -55.09   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.019                                                            
## hbtt_scnrr_4C 0.044       0.073                                                
## hbtt_scnrs_   0.032       0.054         0.124                                  
## hbtt_scnrs_2C 0.044       0.074         0.169         0.126                    
## hbtt_scnrs_4C 0.074       0.124         0.284         0.211       0.287
# Predictions
summary(readRDS("RData/Models/n_species_overheating/sensitivity_analyses/predictions_lme4_number_sp_overheating_strict.rds"))
##            habitat_scenario   prediction              se          
##  arboreal_current  :1       Min.   :0.0008704   Min.   :0.001098  
##  arboreal_future2C :1       1st Qu.:0.0034003   1st Qu.:0.003413  
##  arboreal_future4C :1       Median :0.0094288   Median :0.007419  
##  substrate_current :1       Mean   :0.0263921   Mean   :0.017401  
##  substrate_future2C:1       3rd Qu.:0.0314779   3rd Qu.:0.021490  
##  substrate_future4C:1       Max.   :0.0984064   Max.   :0.060211  
##     lower_CI            upper_CI       
##  Min.   :0.000e+00   Min.   :0.003175  
##  1st Qu.:5.322e-05   1st Qu.:0.010459  
##  Median :8.871e-04   Median :0.024629  
##  Mean   :4.441e-03   Mean   :0.062029  
##  3rd Qu.:3.563e-03   3rd Qu.:0.075685  
##  Max.   :2.064e-02   Max.   :0.221304
Contrasts
model_n_sp_strict_contrast <- readRDS("RData/Models/n_species_overheating/sensitivity_analyses/model_lme4_number_sp_overheating_contrast_strict.rds")
summary(model_n_sp_strict_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: poisson  ( log )
## Formula: 
## n_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  22227.8  22291.0 -11106.9  22213.8    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.02314 -0.01565 -0.01330 -0.01045  0.18585 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 55.46    7.447   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                             -9.1163
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.4640
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.0677
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    0.8149
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.4859
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.6135
##                                                                        Std. Error
## (Intercept)                                                                0.1566
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current       0.3006
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C      0.2563
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C      0.2024
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C     0.1830
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C     0.1586
##                                                                        z value
## (Intercept)                                                            -58.229
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -1.544
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -0.264
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    4.026
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   2.655
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  10.176
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.12266
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.79168
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  5.67e-05
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.00793
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ** 
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.415             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.482  0.248      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.623  0.322      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.692  0.358      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.798  0.413      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.372                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.413                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.477                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.536                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.619                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.688

Proportion of species overheating

Acclimation to the maximum weekly body temperature

Here, animals were acclimated daily to the weekly maximum body temperature experienced, as opposed to the weekly mean body temperature.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_max_acc.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_max_acc.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_max_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_max_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_max_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_max_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_max_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_max_acc_future4C.rds")

# Function to run models estimating the mean overheating risk (i.e., proportion
# of species overheating)
run_community_proportion_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(proportion_species_overheating ~ s(lat, bs = "tp"), data = data,
        weights = data$n_species, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        proportion_species_overheating = NA, n_species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_proportion_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_proportion_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
    saveRDS(new_data, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_community_lat_proportion_sp_overheating_",
        habitat_scenario, "_max_acc.rds"))
}


# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_proportion_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_substrate_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  3747.8   3770.5  -1870.9   3741.8    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.977  -0.121  -0.048  -0.024 121.194 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 3406     58.36   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -8.0219     0.3028 -26.493   <2e-16 ***"            
## [20] "Xs(lat)Fx1     0.5608     6.7522   0.083    0.934    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.138"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_substrate_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xddc6840>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -8.0219     0.3131  -25.62   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.551  7.551  266.5  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.017   "                                        
## [22] "glmer.ML = 3220.7  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_substrate_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  5853.5   5876.1  -2923.7   5847.5    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -1.248  -0.179  -0.083  -0.043 129.775 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1112     33.35   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -6.8209     0.1677 -40.667   <2e-16 ***"            
## [20] "Xs(lat)Fx1     1.8846     5.3069   0.355    0.722    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.247"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_substrate_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xaa7ae10>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -6.8209     0.1766  -38.62   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 7.664  7.664  439.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0247   "                                       
## [22] "glmer.ML = 5074.6  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_substrate_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 14444.7  14467.4  -7219.4  14438.7    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.809 -0.419 -0.196 -0.078 55.196 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 410.2    20.25   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -4.93669    0.06125 -80.602  < 2e-16 ***"            
## [20] "Xs(lat)Fx1    9.65786    2.79579   3.454 0.000551 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.145"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_substrate_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0x115917f8>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -4.9367     0.0615  -80.27   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.533  8.533   1071  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0446   "                                       
## [22] "glmer.ML =  11986  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_arboreal_current_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   536.3    556.7   -265.1    530.3     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.6223 -0.0377 -0.0006  0.0000 15.3169 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 2894     53.8    "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept)  -23.148      7.743  -2.990  0.00279 **"             
## [20] "Xs(lat)Fx1     -5.986     12.590  -0.475  0.63449   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.306 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_arboreal_current_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0x92f0a60>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -23.15      10.37  -2.232   0.0256 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq  p-value    "                       
## [17] "s(lat) 2.601  2.601  23.07 2.41e-05 ***"                       
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0668   "                                       
## [22] "glmer.ML = 388.85  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_arboreal_future2C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   999.2   1019.6   -496.6    993.2     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.8368 -0.0775 -0.0104 -0.0006 30.7742 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1844     42.94   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -11.4408     3.4131  -3.352 0.000802 ***"            
## [20] "Xs(lat)Fx1     0.8913     9.2013   0.097 0.922835    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.382 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_arboreal_future2C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xbd17410>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -11.441      5.406  -2.116   0.0343 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 3.914  3.914  110.2  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0914   "                                       
## [22] "glmer.ML = 764.23  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_lat_prop_sp_overheating_arboreal_future4C_max_acc.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  2359.8   2380.2  -1176.9   2353.8     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.4676 -0.1675 -0.0444  0.0000 25.8171 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 19642    140.1   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -21.940      3.781  -5.802 6.54e-09 ***"            
## [20] "Xs(lat)Fx1    -29.835      3.467  -8.606  < 2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.310 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_lat_prop_sp_overheating_arboreal_future4C_max_acc.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xb2ca228>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)  -21.940      8.596  -2.552   0.0107 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.775  5.775  342.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.152   "                                        
## [22] "glmer.ML = 1705.8  Scale est. = 1         n = 6614"

Linear mixed models

all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_prop <- glmer(proportion_species_overheating ~ habitat_scenario - 1 + (1 |
    obs), family = "binomial", weights = n_species, control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)



# Get predictions
predictions <- as.data.frame(ggpredict(model_prop, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_prop, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_max_acc.rds")
saveRDS(predictions, file = "RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_max_acc.rds")


# Contrast
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

model_prop_contrast <- glmer(proportion_species_overheating ~ relevel(habitat_scenario,
    ref = "substrate_current") + (1 | obs), family = "binomial", weights = n_species,
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)

saveRDS(model_prop_contrast, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_max_acc.rds")
Model summaries
Overall means
model_n_sp <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_max_acc.rds")
summary(model_n_sp)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: proportion_species_overheating ~ habitat_scenario - 1 + (1 |      obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  15507.3  15570.5  -7746.6  15493.3    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.08103 -0.01606 -0.00928 -0.00521  0.63320 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 42.34    6.507   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -11.7171     0.3201  -36.61   <2e-16 ***
## habitat_scenarioarboreal_future2C  -11.2608     0.2657  -42.39   <2e-16 ***
## habitat_scenarioarboreal_future4C  -10.1017     0.1780  -56.74   <2e-16 ***
## habitat_scenariosubstrate_current  -11.6579     0.1835  -63.51   <2e-16 ***
## habitat_scenariosubstrate_future2C -11.2045     0.1588  -70.56   <2e-16 ***
## habitat_scenariosubstrate_future4C  -9.8106     0.1195  -82.10   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.088                                                            
## hbtt_scnrr_4C 0.132       0.160                                                
## hbtt_scnrs_   0.128       0.156         0.234                                  
## hbtt_scnrs_2C 0.149       0.181         0.272         0.264                    
## hbtt_scnrs_4C 0.203       0.246         0.370         0.360       0.417
# Predictions
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_max_acc.rds"))
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 8.152996e-06 0.3200699 4.353865e-06 1.526716e-05
## 2  arboreal_future2C 1.286760e-05 0.2656602 7.644860e-06 2.165829e-05
## 3  arboreal_future4C 4.100811e-05 0.1780290 2.892920e-05 5.813007e-05
## 4  substrate_current 8.650537e-06 0.1835489 6.036804e-06 1.239592e-05
## 5 substrate_future2C 1.361252e-05 0.1588019 9.971666e-06 1.858270e-05
## 6 substrate_future4C 5.486433e-05 0.1195021 4.340849e-05 6.934324e-05
Contrasts
model_n_sp_contrast <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_max_acc.rds")
summary(model_n_sp_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## proportion_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  15507.3  15570.5  -7746.6  15493.3    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.08102 -0.01606 -0.00928 -0.00521  0.63320 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 42.34    6.507   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -11.65795
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.05933
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.39721
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.55619
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.45339
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.84731
##                                                                        Std. Error
## (Intercept)                                                               0.18286
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.34937
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.29848
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.22318
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.20810
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.17889
##                                                                        z value
## (Intercept)                                                            -63.753
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.170
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1.331
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    6.973
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   2.179
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  10.326
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current     0.8652
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.1833
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  3.11e-12
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.0294
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C *  
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.408             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.475  0.250      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.632  0.333      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.678  0.358      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.783  0.416      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.388                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.417                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.485                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.555                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.646                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.694

Uncertain estimates

Here, we capped the distribution of simulated CTmax estimates to the “biological range”, that is, the standard deviation of all CTmax estimats across species (s.e. range across habitats: 1.84-2.17).

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_large_se.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_large_se.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_large_se.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_large_se.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_large_se.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_large_se.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

# Function to run models estimating the mean overheating risk (i.e., proportion of species overheating) 
run_community_proportion_overheating_analysis <- function(dataset, habitat_scenario) {
  
  data <- dataset
  
  # Run model
  model <- gamm4::gamm4(proportion_species_overheating ~ s(lat, bs = "tp"),
                        data = data,
                        weights = data$n_species,
                        family = binomial(),
                        REML = TRUE)
  
  # Generate data set for predictions
  new_data <- data.frame(
    lat = seq(min(data$lat), max(data$lat), length = 1000),
    proportion_species_overheating = NA, 
    n_species = NA)
  
  # Predict for each latitude value
  pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
  new_data$overheating_risk_pred <- pred$fit
  new_data$overheating_risk_pred_se <- pred$se.fit
  
  # Calculate 95% confidence intervals
  new_data <- mutate(new_data, 
                     upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
                     lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)
  
  # Model summaries 
  summary_gam <- capture.output(summary(model$gam)) # Generalised additive model
  summary_mer <- capture.output(summary(model$mer)) # Mixed effect regression
  
  # Save model and predictions
  saveRDS(summary_gam, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_", habitat_scenario, "_large_se.rds"))
  saveRDS(summary_mer, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_", habitat_scenario, "_large_se.rds"))
  saveRDS(new_data, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_commu_lat_prop_sp_overheating_", habitat_scenario, "_large_se.rds"))
}


# Create a list of datasets
dataset_list <- list(
  arboreal_current = community_arb_current,
  arboreal_future2C = community_arb_future2C,
  arboreal_future4C = community_arb_future4C,
  substrate_current = community_sub_current,
  substrate_future2C = community_sub_future2C,
  substrate_future4C = community_sub_future4C
)

# Set up parallel processing
plan(multicore(workers=3))

# Run function
results <- future_lapply(
  names(dataset_list), 
  function(x) {run_community_proportion_overheating_analysis(dataset_list[[x]], x)},
  future.packages = c("gamm4", "mgcv", "dplyr")
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_substrate_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 12711.3  12734.0  -6352.7  12705.3    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-2.007 -0.322 -0.110 -0.042 31.857 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 752.9    27.44   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -5.8330     0.1197 -48.726  < 2e-16 ***"            
## [20] "Xs(lat)Fx1    15.5420     4.0031   3.883 0.000103 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.146"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_substrate_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0x9e05970>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -5.8330     0.1211  -48.18   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.203  8.203   1281  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0559   "                                       
## [22] "glmer.ML =  10409  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_substrate_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 17402.9  17425.6  -8698.4  17396.9    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-2.3307 -0.3917 -0.1445 -0.0449 29.3353 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 1906     43.66   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -5.4564     0.1138 -47.942  < 2e-16 ***"            
## [20] "Xs(lat)Fx1    32.0749     8.2738   3.877 0.000106 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.531"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_substrate_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xd6564d8>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -5.456      0.107  -51.01   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.652  8.652   1461  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0555   "                                       
## [22] "glmer.ML =  14286  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_substrate_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] " 39815.5  39838.1 -19904.7  39809.5    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-3.638 -0.758 -0.169 -0.030 38.506 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 4317     65.71   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -4.39290    0.06298  -69.75   <2e-16 ***"            
## [20] "Xs(lat)Fx1   48.99481    2.23300   21.94   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.373"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_substrate_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xf59c110>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept) -4.39290    0.07021  -62.57   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.948  8.948   1418  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.059   "                                        
## [22] "glmer.ML =  32264  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_arboreal_current_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1823.0   1843.4   -908.5   1817.0     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.3969 -0.1265 -0.0349  0.0000 17.7816 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 86921    294.8   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -48.486      2.167  -22.38   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -66.180      2.664  -24.84   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.334"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_arboreal_current_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xd2de310>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)   -48.49      18.17  -2.668  0.00763 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.819  5.819  289.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.158   "                                        
## [22] "glmer.ML = 1343.5  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_arboreal_future2C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  2287.1   2307.4  -1140.5   2281.1     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.5769 -0.1699 -0.0371  0.0000 14.9548 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 146972   383.4   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -65.356      1.584  -41.26   <2e-16 ***"            
## [20] "Xs(lat)Fx1   -119.579      1.196 -100.00   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.330 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_arboreal_future2C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0x9f411d0>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)   "           
## [11] "(Intercept)   -65.36      22.62  -2.889  0.00387 **"           
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.933  5.933  367.1  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.166   "                                        
## [22] "glmer.ML = 1654.8  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_commu_lat_prop_sp_overheating_arboreal_future4C_large_se.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  4614.4   4634.8  -2304.2   4608.4     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-2.0319 -0.3270 -0.1433 -0.0099 26.8211 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 367955   606.6   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -19.878      1.941  -10.24   <2e-16 ***"            
## [20] "Xs(lat)Fx1   -251.606      4.440  -56.66   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.079"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_commu_lat_prop_sp_overheating_arboreal_future4C_large_se.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating ~ s(lat, bs = \"tp\")"          
##  [7] "<environment: 0xd535b00>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -19.878      2.288  -8.686   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.537  8.537  723.6  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.138   "                                        
## [22] "glmer.ML = 3412.9  Scale est. = 1         n = 6614"

Linear mixed models

all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_prop <- glmer(proportion_species_overheating ~ habitat_scenario - 1 + (1 |
    obs), family = "binomial", weights = n_species, control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)



# Get predictions
predictions <- as.data.frame(ggpredict(model_prop, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_prop, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_large_se.rds")
saveRDS(predictions, file = "RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_large_se.rds")


###### Contrasts
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

# Run model
model_prop_contrast <- glmer(proportion_species_overheating ~ relevel(habitat_scenario,
    ref = "substrate_current") + (1 | obs), family = "binomial", weights = n_species,
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)
# Save model
saveRDS(model_prop_contrast, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_large_se.rds")
Model summaries
Overall means
model_n_sp_large_se <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_large_se.rds")
summary(model_n_sp_large_se)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: proportion_species_overheating ~ habitat_scenario - 1 + (1 |      obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  48645.4  48708.6 -24315.7  48631.4    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.24072 -0.05874 -0.03242 -0.01717  0.90020 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 19.78    4.448   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -9.22240    0.15276  -60.37   <2e-16 ***
## habitat_scenarioarboreal_future2C  -8.87931    0.13806  -64.31   <2e-16 ***
## habitat_scenarioarboreal_future4C  -8.00574    0.11265  -71.07   <2e-16 ***
## habitat_scenariosubstrate_current  -8.64539    0.09159  -94.39   <2e-16 ***
## habitat_scenariosubstrate_future2C -8.22320    0.08751  -93.97   <2e-16 ***
## habitat_scenariosubstrate_future4C -6.60761    0.08255  -80.05   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.188                                                            
## hbtt_scnrr_4C 0.232       0.258                                                
## hbtt_scnrs_   0.289       0.322         0.397                                  
## hbtt_scnrs_2C 0.308       0.342         0.422         0.526                    
## hbtt_scnrs_4C 0.347       0.386         0.476         0.593       0.631
# Predictions
readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_large_se.rds")
##     habitat_scenario   prediction         se     lower_CI     upper_CI
## 1   arboreal_current 9.879103e-05 0.15276366 7.323117e-05 0.0001332709
## 2  arboreal_future2C 1.392209e-04 0.13806292 1.062183e-04 0.0001824756
## 3  arboreal_future4C 3.334303e-04 0.11265114 2.673898e-04 0.0004157747
## 4  substrate_current 1.759056e-04 0.09159112 1.470042e-04 0.0002104879
## 5 substrate_future2C 2.682820e-04 0.08750893 2.260071e-04 0.0003184619
## 6 substrate_future4C 1.348234e-03 0.08254668 1.147067e-03 0.0015846240
Contrasts
model_n_sp_large_se_contrast <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_large_se.rds")
summary(model_n_sp_large_se_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## proportion_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  48645.4  48708.6 -24315.7  48631.4    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.24072 -0.05874 -0.03242 -0.01717  0.90019 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 19.78    4.448   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                        Estimate
## (Intercept)                                                            -8.64542
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   -0.57699
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  -0.23386
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C   0.63967
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.42221
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  2.03779
##                                                                        Std. Error
## (Intercept)                                                               0.09105
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.15362
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.13837
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.11341
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.08708
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.07873
##                                                                        z value
## (Intercept)                                                            -94.951
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -3.756
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   -1.690
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    5.640
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   4.849
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  25.882
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   0.000173
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  0.091009
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  1.70e-08
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C 1.24e-06
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current   ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  .  
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.304             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.336  0.196      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.409  0.241      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.520  0.314      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.537  0.347      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.266                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.347                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.383                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.425                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.470                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.614

Strict estimates

Here, we classified an overheating event only when 95% confidence intervals did not overlap with zero.

This code ran on an HPC environment, where the original code can be found in R/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_strict_estimates.R and the resources used in pbs/Models/Sensitivity_analyses/Running_models_prop_species_overheating_sensitivity_analysis_strict_estimates.pbs

Generalized additive mixed models

# Load community-level data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C.rds")

community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C.rds")

# Function to run models estimating the mean overheating risk (i.e., proportion
# of species overheating)
run_community_proportion_overheating_analysis <- function(dataset, habitat_scenario) {

    data <- dataset

    # Run model
    model <- gamm4::gamm4(proportion_species_overheating_strict ~ s(lat, bs = "tp"),
        data = data, weights = data$n_species, family = binomial(), REML = TRUE)

    # Generate data set for predictions
    new_data <- data.frame(lat = seq(min(data$lat), max(data$lat), length = 1000),
        proportion_species_overheating_strict = NA, n_species = NA)

    # Predict for each latitude value
    pred <- predict(model$gam, newdata = new_data, type = "response", se.fit = TRUE)
    new_data$overheating_risk_pred <- pred$fit
    new_data$overheating_risk_pred_se <- pred$se.fit

    # Calculate 95% confidence intervals
    new_data <- mutate(new_data, upper = overheating_risk_pred + 1.96 * overheating_risk_pred_se,
        lower = overheating_risk_pred - 1.96 * overheating_risk_pred_se)

    # Model summaries
    summary_gam <- capture.output(summary(model$gam))  # Generalised additive model
    summary_mer <- capture.output(summary(model$mer))  # Mixed effect regression

    # Save model and predictions
    saveRDS(summary_gam, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_",
        habitat_scenario, ".rds"))
    saveRDS(summary_mer, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_",
        habitat_scenario, ".rds"))
    saveRDS(new_data, file = paste0("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_community_lat_prop_sp_overheating_strict_",
        habitat_scenario, ".rds"))
}


# Create a list of datasets
dataset_list <- list(arboreal_current = community_arb_current, arboreal_future2C = community_arb_future2C,
    arboreal_future4C = community_arb_future4C, substrate_current = community_sub_current,
    substrate_future2C = community_sub_future2C, substrate_future4C = community_sub_future4C)

# Set up parallel processing
plan(multicore(workers = 3))

# Run function
results <- future_lapply(names(dataset_list), function(x) {
    run_community_proportion_overheating_analysis(dataset_list[[x]], x)
}, future.packages = c("gamm4", "mgcv", "dplyr"))
Model summaries
Vegetated substrate

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_substrate_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   611.9    634.6   -303.0    605.9    14088 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-0.530 -0.004  0.000  0.000 69.410 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 4223     64.98   "                                 
## [15] "Number of obs: 14091, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept)  -20.981      7.622  -2.753  0.00591 **"             
## [20] "Xs(lat)Fx1      9.505      9.332   1.019  0.30841   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.247 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_substrate_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"   
##  [7] "<environment: 0xa9e7d70>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)"              
## [11] "(Intercept)   -20.98      18.06  -1.161    0.245"              
## [12] ""                                                              
## [13] "Approximate significance of smooth terms:"                     
## [14] "         edf Ref.df Chi.sq p-value    "                        
## [15] "s(lat) 2.852  2.852   44.5 6.8e-07 ***"                        
## [16] "---"                                                           
## [17] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [18] ""                                                              
## [19] "R-sq.(adj) =  0.0475   "                                       
## [20] "glmer.ML = 465.39  Scale est. = 1         n = 14091"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_substrate_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1278.2   1300.9   -636.1   1272.2    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] " -0.825  -0.035  -0.004   0.000 107.154 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 4246     65.16   "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept) -15.4350     2.6324  -5.864 4.53e-09 ***"            
## [20] "Xs(lat)Fx1    -0.8089     5.1938  -0.156    0.876    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.098"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_substrate_future2C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"   
##  [7] "<environment: 0xe250940>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -15.435      4.468  -3.454 0.000552 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 5.061  5.061  143.7  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.069   "                                        
## [22] "glmer.ML = 985.55  Scale est. = 1         n = 14090"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_substrate_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  8054.5   8077.2  -4024.3   8048.5    14087 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "   Min     1Q Median     3Q    Max "                              
## [10] "-1.364 -0.294 -0.120 -0.022 72.331 "                              
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 2411     49.1    "                                 
## [15] "Number of obs: 14090, groups:  Xr, 8"                             
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -6.4870     0.1639 -39.572   <2e-16 ***"            
## [20] "Xs(lat)Fx1    30.2281     3.1348   9.643   <2e-16 ***"            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 -0.164"
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_substrate_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"   
##  [7] "<environment: 0x13888688>"                                     
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)  -6.4870     0.1743  -37.21   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 8.619  8.619  660.4  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.0434   "                                       
## [22] "glmer.ML = 6651.9  Scale est. = 1         n = 14090"
Above-ground vegetation

Current climate

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_arboreal_current.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "    89.8    110.2    -41.9     83.8     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.1049 -0.0360 -0.0197 -0.0116 13.1537 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 0        0       "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -9.2006     0.5270 -17.458   <2e-16 ***"            
## [20] "Xs(lat)Fx1    -0.4470     0.6746  -0.663    0.508    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.697 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_arboreal_current.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"   
##  [7] "<environment: 0xded8738>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)    "          
## [11] "(Intercept)   -9.201      0.527  -17.46   <2e-16 ***"          
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "       edf Ref.df Chi.sq p-value"                              
## [17] "s(lat)   1      1  0.439   0.508"                              
## [18] ""                                                              
## [19] "R-sq.(adj) =  -0.000333   "                                    
## [20] "glmer.ML = 69.982  Scale est. = 1         n = 6614"

Future climate (+2C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_arboreal_future2C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "   178.7    199.1    -86.4    172.7     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-0.3629 -0.0018  0.0000  0.0000  7.8397 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 22391    149.6   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)   "             
## [19] "X(Intercept)  -43.234     13.529  -3.196   0.0014 **"             
## [20] "Xs(lat)Fx1     -2.442     14.077  -0.173   0.8623   "             
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.037 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_arboreal_future2C.rds"))
##  [1] ""                                                           
##  [2] "Family: binomial "                                          
##  [3] "Link function: logit "                                      
##  [4] ""                                                           
##  [5] "Formula:"                                                   
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"
##  [7] "<environment: 0xaa12598>"                                   
##  [8] ""                                                           
##  [9] "Parametric coefficients:"                                   
## [10] "            Estimate Std. Error z value Pr(>|z|)"           
## [11] "(Intercept)   -43.23      29.08  -1.487    0.137"           
## [12] ""                                                           
## [13] "Approximate significance of smooth terms:"                  
## [14] "         edf Ref.df Chi.sq p-value"                         
## [15] "s(lat) 1.917  1.917  1.559   0.431"                         
## [16] ""                                                           
## [17] "R-sq.(adj) =  0.0532   "                                    
## [18] "glmer.ML = 115.12  Scale est. = 1         n = 6614"

Future climate (+4C)

# Mixed effect regression
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_MER_community_lat_prop_sp_overheating_strict_arboreal_future4C.rds"))
##  [1] "Generalized linear mixed model fit by maximum likelihood (Laplace"
##  [2] "  Approximation) [glmerMod]"                                      
##  [3] " Family: binomial  ( logit )"                                     
##  [4] ""                                                                 
##  [5] "     AIC      BIC   logLik deviance df.resid "                    
##  [6] "  1151.6   1172.0   -572.8   1145.6     6611 "                    
##  [7] ""                                                                 
##  [8] "Scaled residuals: "                                               
##  [9] "    Min      1Q  Median      3Q     Max "                         
## [10] "-1.0938 -0.0429 -0.0005  0.0000 13.9113 "                         
## [11] ""                                                                 
## [12] "Random effects:"                                                  
## [13] " Groups Name   Variance Std.Dev."                                 
## [14] " Xr     s(lat) 3833     61.91   "                                 
## [15] "Number of obs: 6614, groups:  Xr, 8"                              
## [16] ""                                                                 
## [17] "Fixed effects:"                                                   
## [18] "             Estimate Std. Error z value Pr(>|z|)    "            
## [19] "X(Intercept)  -24.146      5.658  -4.267 1.98e-05 ***"            
## [20] "Xs(lat)Fx1     -8.128      6.176  -1.316    0.188    "            
## [21] "---"                                                              
## [22] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"   
## [23] ""                                                                 
## [24] "Correlation of Fixed Effects:"                                    
## [25] "           X(Int)"                                                
## [26] "Xs(lat)Fx1 0.122 "
# Generalized additive model
print(readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/summary_GAM_community_lat_prop_sp_overheating_strict_arboreal_future4C.rds"))
##  [1] ""                                                              
##  [2] "Family: binomial "                                             
##  [3] "Link function: logit "                                         
##  [4] ""                                                              
##  [5] "Formula:"                                                      
##  [6] "proportion_species_overheating_strict ~ s(lat, bs = \"tp\")"   
##  [7] "<environment: 0xe12ff68>"                                      
##  [8] ""                                                              
##  [9] "Parametric coefficients:"                                      
## [10] "            Estimate Std. Error z value Pr(>|z|)  "            
## [11] "(Intercept)   -24.15      11.05  -2.185   0.0289 *"            
## [12] "---"                                                           
## [13] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [14] ""                                                              
## [15] "Approximate significance of smooth terms:"                     
## [16] "         edf Ref.df Chi.sq p-value    "                        
## [17] "s(lat) 2.875  2.875  100.5  <2e-16 ***"                        
## [18] "---"                                                           
## [19] "Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1"
## [20] ""                                                              
## [21] "R-sq.(adj) =  0.145   "                                        
## [22] "glmer.ML = 840.19  Scale est. = 1         n = 6614"

Linear mixed models

all_community_data <- bind_rows(community_sub_current %>%
    mutate(habitat_scenario = "substrate_current"), community_sub_future2C %>%
    mutate(habitat_scenario = "substrate_future2C"), community_sub_future4C %>%
    mutate(habitat_scenario = "substrate_future4C"), community_arb_current %>%
    mutate(habitat_scenario = "arboreal_current"), community_arb_future2C %>%
    mutate(habitat_scenario = "arboreal_future2C"), community_arb_future4C %>%
    mutate(habitat_scenario = "arboreal_future4C"))

all_community_data <- all_community_data %>%
    mutate(obs = as.character(row_number()))

all_community_data <- as.data.frame(all_community_data)

set.seed(123)

# Intercept-less model
model_prop <- glmer(proportion_species_overheating_strict ~ habitat_scenario - 1 +
    (1 | obs), family = "binomial", weights = n_species, control = glmerControl(optimizer = "bobyqa",
    optCtrl = list(maxfun = 1e+09)), data = all_community_data)



# Get predictions
predictions <- as.data.frame(ggpredict(model_prop, terms = "habitat_scenario", type = "random",
    interval = "confidence", nsim = 1000))

predictions <- predictions %>%
    rename(habitat_scenario = x, prediction = predicted, se = std.error, lower_CI = conf.low,
        upper_CI = conf.high) %>%
    dplyr::select(-group)

# Save model summaries and predictions
saveRDS(model_prop, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_strict.rds")
saveRDS(predictions, file = "RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_strict.rds")


###### Contrasts
all_community_data$habitat_scenario <- as.factor(all_community_data$habitat_scenario)

# Run model
model_prop_contrast <- glmer(proportion_species_overheating ~ relevel(habitat_scenario,
    ref = "substrate_current") + (1 | obs), family = "binomial", weights = n_species,
    control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09)),
    data = all_community_data)
# Save model
saveRDS(model_prop_contrast, file = "RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_strict.rds")
Model summaries
Overall means
model_n_sp_strict <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_strict.rds")
summary(model_n_sp_strict)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: proportion_species_overheating_strict ~ habitat_scenario - 1 +  
##     (1 | obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##   7134.6   7197.9  -3560.3   7120.6    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.05266 -0.00858 -0.00454 -0.00262  0.55801 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 50.44    7.102   
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                    Estimate Std. Error z value Pr(>|z|)    
## habitat_scenarioarboreal_current   -13.9494     0.8367  -16.67   <2e-16 ***
## habitat_scenarioarboreal_future2C  -13.0627     0.5534  -23.61   <2e-16 ***
## habitat_scenarioarboreal_future4C  -11.2535     0.2654  -42.40   <2e-16 ***
## habitat_scenariosubstrate_current  -13.2738     0.3417  -38.84   <2e-16 ***
## habitat_scenariosubstrate_future2C -12.5746     0.2594  -48.48   <2e-16 ***
## habitat_scenariosubstrate_future4C -10.8107     0.1640  -65.92   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##               hbtt_scnrr_ hbtt_scnrr_2C hbtt_scnrr_4C hbtt_scnrs_ hbtt_scnrs_2C
## hbtt_scnrr_2C 0.031                                                            
## hbtt_scnrr_4C 0.066       0.102                                                
## hbtt_scnrs_   0.051       0.079         0.168                                  
## hbtt_scnrs_2C 0.067       0.104         0.221         0.171                    
## hbtt_scnrs_4C 0.109       0.168         0.356         0.276       0.363
# Predictions
readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/predictions_lme4_prop_species_overheating_strict.rds")
##     habitat_scenario   prediction        se     lower_CI     upper_CI
## 1   arboreal_current 8.746715e-07 0.8367464 1.696702e-07 4.509031e-06
## 2  arboreal_future2C 2.122889e-06 0.5533989 7.175858e-07 6.280287e-06
## 3  arboreal_future4C 1.296141e-05 0.2654148 7.704295e-06 2.180569e-05
## 4  substrate_current 1.718946e-06 0.3417164 8.798183e-07 3.358389e-06
## 5 substrate_future2C 3.458650e-06 0.2593858 2.080260e-06 5.750362e-06
## 6 substrate_future4C 2.018227e-05 0.1640013 1.463438e-05 2.783331e-05
Contrasts
model_n_sp_strict_contrast <- readRDS("RData/Models/prop_species_overheating/sensitivity_analyses/model_lme4_prop_species_overheating_contrast_strict.rds")
summary(model_n_sp_strict_contrast)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: 
## proportion_species_overheating ~ relevel(habitat_scenario, ref = "substrate_current") +  
##     (1 | obs)
##    Data: all_community_data
## Weights: n_species
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+09))
## 
##      AIC      BIC   logLik deviance df.resid 
##  20831.7  20895.0 -10408.9  20817.7    62106 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.09403 -0.01869 -0.01102 -0.00645  0.63761 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  obs    (Intercept) 42.25    6.5     
## Number of obs: 62113, groups:  obs, 62113
## 
## Fixed effects:
##                                                                         Estimate
## (Intercept)                                                            -11.31335
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.02249
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    0.41915
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    1.40769
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   0.53569
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C   1.89604
##                                                                        Std. Error
## (Intercept)                                                               0.15758
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      0.29126
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C     0.25333
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C     0.20018
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C    0.17698
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C    0.15448
##                                                                        z value
## (Intercept)                                                            -71.796
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    -0.077
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C    1.655
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C    7.032
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C   3.027
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  12.274
##                                                                        Pr(>|z|)
## (Intercept)                                                             < 2e-16
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current    0.93845
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C   0.09802
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  2.04e-12
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C  0.00247
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C  < 2e-16
##                                                                           
## (Intercept)                                                            ***
## relevel(habitat_scenario, ref = "substrate_current")arboreal_current      
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future2C  .  
## relevel(habitat_scenario, ref = "substrate_current")arboreal_future4C  ***
## relevel(habitat_scenario, ref = "substrate_current")substrate_future2C ** 
## relevel(habitat_scenario, ref = "substrate_current")substrate_future4C ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                                      (Intr) rl(_,r="_")_
## rl(_,r="_")_                         -0.409             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C -0.473  0.252      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C -0.602  0.322      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C -0.679  0.363      
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C -0.768  0.416      
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C  0.373                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.421                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.482                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C  0.537                              
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.615                              
##                                      rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C
## rl(_,r="_")_                                                             
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")r_4C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_2C                                     
## rlvl(hbtt_scnr,r="sbstrt_crrnt")s_4C  0.694

Main figures

Note that cosmetic adjustments were made to all figures in Adobe Illustrator.

Figure 1

# Load data from Pottier et al. 2022
data <- read_csv("data/data_Pottier_et_al_2022.csv")

# Load one of the datasets for species richness
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")

world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))

# Map
map_diversity <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = log10(n_species)), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "viridis",
    na.value = "gray1", name = "Species", breaks = c(0, log10(10), log10(50), log10(100),
        log10(150)), labels = c(1, 10, 50, 100, 150), guide = guide_colorbar(barwidth = 2,
        barheight = 10), begin = 0.1, end = 1) + ggnewscale::new_scale_fill() + geom_point(data = data,
    aes(y = latitude, x = longitude), alpha = 0.85, size = 4, stroke = 1.5, shape = 21,
    fill = "#CE5B97", col = "black") + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0.5, 0.5), "cm"), legend.position = c(0.02,
    0.27), legend.justification = c(0, 0.5), legend.background = element_blank(),
    text = element_text(color = "black"), legend.text = element_text(size = 15),
    legend.title = element_text(size = 20), panel.border = element_rect(fill = NA,
        size = 2))

# Density of points
community_pond_expanded <- community_pond_current %>%
    uncount(n_species, .remove = FALSE)

density <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_density(data = data, aes(x = latitude), fill = "#CE5B97",
    alpha = 0.5) + geom_density(data = community_pond_expanded, aes(x = lat), fill = "#21918c",
    alpha = 0.5) + xlim(-55.00099, 72.00064) + ylab("Density") + coord_flip() + theme_classic() +
    theme(axis.title.x = element_text(size = 25, margin = margin(t = 10, r = 0, b = 0,
        l = 0)), axis.text.x = element_text(size = 20, colour = "black"), axis.text.y = element_text(size = 20,
        colour = "black"), axis.title.y = element_blank(), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
        colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
        panel.border = element_rect(fill = NA, size = 2))

map <- map_diversity + density + plot_layout(ncol = 2)

map

ggsave(map, file = "fig/Figure_1.svg", width = 20, height = 11, dpi = 500)

Fig. 1 | Contrast between the geographical locations at which experimental data were collected, and patterns in species richness. Pink points denote experimental data, while the color gradients refer to species richness calculated in 1 x 1 ° grid cells in the imputed data (n = 5,203 species). Density plots represent the distribution of experimental data (pink) and the number of species inhabiting these areas (blue) across latitudes. Dashed lines represent the equator and tropics.

Figure 2

# Load data 
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Add species-level data to population-level dataset
species_data <- readRDS("RData/General_data/pre_data_for_imputation.rds")
species_data <- dplyr::select(species_data, 
                              tip.label, 
                              order, 
                              imputed)

pop_sub_future4C <- distinct(left_join(pop_sub_future4C, species_data))

# Import tree from Jetz and Pyron (with slight modifications in species names)
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

# Calculate data summary
data_summary <- pop_sub_future4C %>% 
   group_by(tip.label) %>% 
   summarise(mean_CTmax = mean(CTmax),
             mean_TSM = mean(TSM),
             mean_overheating_days = mean(overheating_days),
             log_overheating_days = log2(mean_overheating_days + 1))

# Add order of the species to the data summary
data_summary <- distinct(left_join(data_summary, dplyr::select(pop_sub_future4C, tip.label, order, imputed))) 

# Flag species that were tested previously or full imputed
data_summary <- data_summary %>% 
  group_by(tip.label) %>% 
  filter(if(any(imputed=="no")) imputed == "no" else TRUE) %>% 
  ungroup()

# Prune tree
pruned_tree <- drop.tip(tree, tree$tip.label[-match(data_summary$tip.label, tree$tip.label)]) 

# Build tree skeleton
p1 <- ggtree(pruned_tree, 
             layout = "fan", 
             lwd = 0.05) + 
       xlim(0,800)

# Match data to the tree
p1 <- p1 %<+% data_summary 

p2 <-  p1 + geom_fruit(geom = geom_tile, # Heat map
                       mapping = aes(fill = order), 
                       width=10, 
                       offset=0.035,
                       alpha = 1)+ 
               scale_fill_manual(values =c("gray60", "gray20"))

p3 <-  p2 + ggnewscale::new_scale_fill() +
            geom_fruit(geom = geom_tile, # Heat map
                       mapping = aes(fill = imputed), 
                       width=20, 
                       offset=0.075,
                       alpha = 1)+ 
               scale_fill_manual(values =c("#CE5B97", "gray85"))

p4 <- p3 + ggnewscale::new_scale_fill()+
           geom_fruit(geom = geom_tile, # Heat map
                      mapping = aes(fill = mean_CTmax), 
                                    width=55, 
                                    offset=0.15,
                                    alpha = 1) + 
           scale_fill_viridis(option="viridis", 
                              begin=0, 
                              end=1, 
                              name="CTmax") 

p5 <- p4 + ggnewscale::new_scale_fill()+
           geom_fruit(geom = geom_tile, # Heat map
                      mapping = aes(fill = mean_TSM), 
                                    width=55, 
                                    offset=0.2,
                                    alpha = 1) + 

           scale_fill_viridis(option="inferno", 
                              direction = -1, 
                              begin=0, 
                              end=0.9, 
                              name="TSM") 

p6 <- p5 + 
  geom_fruit(geom = geom_bar, # Bar plot
             mapping = aes(x = log_overheating_days),
             col = "#fb9b06",
             fill = "#fb9b06",
             size = 0.1,
             stat = "identity", 
             orientation = "y", 
             axis.params = list(axis = "x", # Barplot parameters
                                text.angle = 0, 
                                hjust = 0, 
                                text.size = 1,
                                col="transparent"), 
             grid.params = list(alpha = 0.1),
             offset = 0.11, 
             pwidth = 0.5, 
             alpha = 1)

p6

ggsave(p6, file="fig/Figure_2.svg", width=10, height=10, dpi=1000)

Fig. 2 | Phylogenetic coverage and taxonomic variation in climate vulnerability. Chronograms show heat tolerance limits (CTmax), thermal safety margins (TSM), and histograms the number of overheating events (days) averaged across each species’ distribution range. Pink bars refer to species with prior knowledge, while gray bars refer to entirely imputed species. This figure was constructed assuming ground-level microclimates occurring under 4°C of global warming above pre-industrial levels. Phylogeny is based on the consensus of 10,000 trees sampled from a posterior distribution (see Jetz & Pyron, 2018 for details).

Figure 3

Vegetated Substrate

world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>% 
  filter(!grepl("Antarctica", name))

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds") 

# Pond data 
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")

# Find limits for colours of the plot
tsm_min <- min(min(community_sub_current$community_TSM, na.rm = TRUE), 
               min(community_sub_future4C$community_TSM, na.rm = TRUE),
               min(community_arb_current$community_TSM, na.rm = TRUE), 
               min(community_arb_future4C$community_TSM, na.rm = TRUE),
               min(community_pond_current$community_TSM, na.rm = TRUE), 
               min(community_pond_future4C$community_TSM, na.rm = TRUE))

tsm_max <- max(max(community_sub_current$community_TSM, na.rm = TRUE), 
               max(community_sub_future4C$community_TSM, na.rm = TRUE),
               max(community_arb_current$community_TSM, na.rm = TRUE), 
               max(community_arb_future4C$community_TSM, na.rm = TRUE),
               max(community_pond_current$community_TSM, na.rm = TRUE), 
               max(community_pond_future4C$community_TSM, na.rm = TRUE))

# Current
map_sub_TSM_current <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_sub_current, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     name = "TSM",
                     na.value = "gray1", 
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(legend.position = "none",
        plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0.1, 0, 0), "cm"),
        panel.border = element_rect(fill=NA, size = 2, colour = "#5DC8D9"))



# Future +4C
map_sub_TSM_future4C <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_sub_future4C, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     na.value = "gray1", 
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        legend.position = "none",
        panel.border = element_rect(fill=NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future4C.rds")

lat_sub <- ggplot() +
  geom_vline(xintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_point(data = community_sub_future4C, 
             aes(x = lat, y = community_TSM, size = 1/community_TSM_se), 
             alpha = 0.7,
             fill = "#EF4187",
             col = "transparent",
             shape = 22,
             stroke = 0.1) + 
  geom_point(data = community_sub_current, 
             aes(x = lat, y = community_TSM, size = 1/community_TSM_se), 
             alpha = 0.7,
             fill = "#5DC8D9",
             col = "transparent",
             shape = 22,
             stroke = 0.1) +
  geom_line(data = pred_community_sub_current, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_sub_current, 
             aes(x = lat, y = TSM_pred),
             color = "#5DC8D9", 
             size = 0.75) + # model predictions
  geom_line(data = pred_community_sub_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_sub_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "#EF4187", 
             size = 0.75) + # model predictions
  scale_size_continuous(range=c(0.001, 2.5),
                        guide = "none")+
  xlim(-55.00099, 72.00064) +
  ylim(0, 40)+
  xlab("") +
  ylab("") +
  coord_flip() +
  theme_classic() +
  theme(axis.text.y = element_text(color = "black", size = 11),
        aspect.ratio = 1,
        plot.background = element_rect(fill = "transparent", colour=NA),
        panel.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        text = element_text(color = "black"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(color = "black", size = 11),        
        axis.line = element_line(color = "black"),
        panel.border = element_rect(fill=NA, size = 2))

substrate_plot <- map_sub_TSM_current + 
                  map_sub_TSM_future4C + 
                  lat_sub + 
                  plot_layout(ncol = 3)

Pond or wetland

# Current
map_pond_TSM_current <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_pond_current, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     name = "TSM",
                     na.value = "gray1", 
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(legend.position = "none",
        plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0.1, 0, 0), "cm"),
        panel.border = element_rect(fill=NA, size = 2, colour = "#5DC8D9"))



# Future +4C
map_pond_TSM_future4C <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_pond_future4C, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     na.value = "gray1", 
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        legend.position = "none",
        panel.border = element_rect(fill=NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_pond_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_pond_current.rds")
pred_community_pond_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_pond_future2C.rds")
pred_community_pond_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_pond_future4C.rds")

lat_pond <- ggplot() +
  geom_vline(xintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_point(data = community_pond_future4C, 
             aes(x = lat, y = community_TSM, size=1/community_TSM_se), 
             alpha = 0.7,
             fill = "#EF4187",
             col = "transparent",
             shape = 22,
             stroke = 0.1) + 
  geom_point(data = community_pond_current, 
             aes(x = lat, y = community_TSM, size = 1/community_TSM_se), 
             alpha = 0.7,
             fill = "#5DC8D9",
             col = "transparent",
             shape = 22,
             stroke = 0.1) +
  geom_line(data = pred_community_pond_current, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_pond_current, 
             aes(x = lat, y = TSM_pred),
             color = "#5DC8D9", 
             size = 0.75) + # model predictions
  geom_line(data = pred_community_pond_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_pond_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "#EF4187", 
             size = 0.75) + # model predictions
 scale_size_continuous(range=c(0.001, 2.5),
                        guide = "none") +
 xlim(-55.00099, 72.00064) +
  ylim(0, 40)+
  xlab("") +
  ylab("") +
  coord_flip() +
  theme_classic() +
  theme(axis.text.y = element_text(color = "black", size = 11),
        aspect.ratio = 1,
        plot.background = element_rect(fill = "transparent", colour=NA),
        panel.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        text = element_text(color = "black"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(color = "black", size = 11),        
        axis.line = element_line(color = "black"),
        panel.border = element_rect(fill=NA, size = 2))

pond_plot <- (map_pond_TSM_current + 
              map_pond_TSM_future4C + 
              lat_pond + 
              plot_layout(ncol = 3))

Above-ground vegetation

# Current
map_arb_TSM_current <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_arb_current, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     name = "TSM",
                     na.value = "gray1", 
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(legend.position = "none",
        plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0.1, 0, 0), "cm"),
        panel.border = element_rect(fill=NA, size = 2, colour = "#5DC8D9"))

# Future +4C
map_arb_TSM_future4C <- ggplot() +
  geom_hline(yintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_hline(yintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_sf(data = world, 
          fill = "black",  
          col="black") +
  geom_sf(data = community_arb_future4C, 
          aes(fill = community_TSM), 
          color = NA, 
          alpha = 1) +
  coord_sf(ylim = c(-55.00099, 72.00064), 
           xlim = c(-166.82905, 178.56617)) +
  scale_fill_viridis(option = "plasma", 
                     na.value = "gray1", 
                     name = "TSM",
                     direction = -1, 
                     breaks = seq(0, 40, by = 5), 
                     limits=c(tsm_min, tsm_max), 
                     begin=0, end=1) +
  theme_void() +
  theme(legend.position = "bottom",
        legend.text = element_text(size = 11),
        legend.title = element_text(size = 14),
        legend.key.height = unit(0.5, "cm"),
        legend.key.width = unit(1, "cm"),
        plot.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        panel.border = element_rect(fill=NA, size = 2, colour = "#EF4187"))


# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future4C.rds")

lat_arb <- ggplot() +
  geom_vline(xintercept = 0, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = 23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_vline(xintercept = -23.43663, 
             colour = "gray", 
             linetype = "dashed", 
             size = 0.5) +
  geom_point(data = community_arb_future4C, 
             aes(x = lat, y = community_TSM, size=1/community_TSM_se), 
             alpha = 0.7,
             fill = "#EF4187",
             col = "transparent",
             shape = 22,
             stroke = 0.1) + 
  geom_point(data = community_arb_current, 
             aes(x = lat, y = community_TSM, size=1/community_TSM_se), 
             alpha = 0.7,
             fill = "#5DC8D9",
             col = "transparent",
             shape = 22,
             stroke = 0.1) +
  geom_line(data = pred_community_arb_current, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_arb_current, 
             aes(x = lat, y = TSM_pred),
             color = "#5DC8D9", 
             size = 0.75) + # model predictions
  geom_line(data = pred_community_arb_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "black", 
             size = 1.05) + # black line
  geom_line(data = pred_community_arb_future4C, 
             aes(x = lat, y = TSM_pred),
             color = "#EF4187", 
             size = 0.75) + # model predictions
  scale_size_continuous(range=c(0.001, 2.5),
                        guide = "none") +
  xlim(-55.00099, 72.00064) +
  ylim(0, 40)+
  xlab("") +
  ylab("Thermal safety margin") +
  coord_flip() +
  theme_classic() +
  theme(axis.text.y = element_text(color = "black", size = 11),
        aspect.ratio = 1,
        plot.background = element_rect(fill = "transparent", colour=NA),
        panel.background = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        text = element_text(color = "black"),
        axis.title.x = element_text(size = 13),
        axis.text.x = element_text(color = "black", size = 11),
        axis.line = element_line(color = "black"),
        legend.text = element_text(size = 15),
        legend.title = element_text(size = 18),
        legend.key.height = unit(0.6, "cm"),
        legend.key.width = unit(0.5, "cm"),
        panel.border = element_rect(fill=NA, size = 2))

arboreal_plot <- (map_arb_TSM_current + 
                  map_arb_TSM_future4C + 
                  lat_arb + 
                  plot_layout(ncol = 3))

Final plot

figure3 <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

figure3

ggsave("fig/Figure_3.svg", width = 14, height = 7, dpi = 500)

Fig. 3 | Community-level patterns in thermal safety margin for amphibians in terrestrial (top row), aquatic (middle row) or arboreal (bottom row) microhabitats. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature in full shade during the warmest quarters of 2006-2015 in each community (1-degree grid cell). Black color depicts areas with no data. The right panel depicts latitudinal patterns in TSM in current climates (blue) or assuming 4°C of global warming above pre-industrial levels (pink), as predicted from generalized additive mixed models. Dashed lines represent the equator and tropics.

Figure 4

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_sub_current)

Vegetated Substrate

# Set colours
color_palette <- colorRampPalette(colors = c("#FAF218", "#EF4187", "#d90429"))
colors <- color_palette(100)
color_func <- colorRampPalette(c("gray65", colors))
color_palette <- color_func(100)

sp_min <- min(min(community_sub_current$n_species_overheating, na.rm = TRUE), min(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), min(community_pond_current$n_species_overheating, na.rm = TRUE),
    min(community_pond_future4C$n_species_overheating, na.rm = TRUE), min(community_arb_current$n_species_overheating,
        na.rm = TRUE), min(community_arb_future4C$n_species_overheating, na.rm = TRUE))

sp_max <- max(max(community_sub_current$n_species_overheating, na.rm = TRUE), max(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), max(community_pond_current$n_species_overheating, na.rm = TRUE),
    max(community_pond_future4C$n_species_overheating, na.rm = TRUE), max(community_arb_current$n_species_overheating,
        na.rm = TRUE), max(community_arb_future4C$n_species_overheating, na.rm = TRUE))

# Substrate (current)
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Substrate (Future +4C)
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_sub <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_sub_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_sub_current,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(0, 38) + xlab("") + ylab("") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.text.x = element_text(color = "black", size = 11), axis.line = element_line(color = "black"),
    panel.border = element_rect(fill = NA, size = 2))

substrate_plot <- map_sub_TSM_current + map_sub_TSM_future4C + lat_sub + plot_layout(ncol = 3)

Pond or wetland

# Aquatic (current)
map_pond_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Aquatic (Future +4C)
map_pond_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_pond <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_pond_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + xlim(-55.00099, 72.00064) +
    ylim(0, 38) + xlab("") + ylab("") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

pond_plot <- map_pond_TSM_current + map_pond_TSM_future4C + lat_pond + plot_layout(ncol = 3)

Above-ground vegetation

# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "bottom", legend.text = element_text(size = 11),
    legend.title = element_text(size = 14), legend.key.height = unit(0.5, "cm"),
    legend.key.width = unit(1, "cm"), plot.background = element_rect(fill = "transparent",
        colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_arb <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_arb_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_arb_current,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(0, 38) + xlab("") + ylab("Species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(size = 13), axis.text.x = element_text(color = "black",
        size = 11), axis.line = element_line(color = "black"), legend.text = element_text(size = 15),
    legend.title = element_text(size = 18), legend.key.height = unit(0.6, "cm"),
    legend.key.width = unit(0.5, "cm"), panel.border = element_rect(fill = NA, size = 2))

arboreal_plot <- map_arb_TSM_current + map_arb_TSM_future4C + lat_arb + plot_layout(ncol = 3)

Final plot

figure4 <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

figure4

ggsave(figure4, file = "fig/Figure_4.svg", width = 14, height = 7, dpi = 500)

Fig. 4 | Number of species predicted to experience overheating events in terrestrial (top row), aquatic (middle row), and arboreal (bottom row) microhabitats. The number of species overheating was assessed as the sum of species overheating at least once in the period surveyed (warmest quarters of 2006-2015) in each community (1-degree grid cell). Black color depicts areas with no data, and gray color communities without species at risk. The right panel depicts latitudinal patterns in the number of species predicted to overheat in current climates (blue) or assuming 4°C of global warming above pre-industrial levels (pink). Dashed lines represent the equator and tropics. No species were predicted to experience overheating events in water bodies, and hence are not displayed.

Figure 5

Load data

# Vegetated substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Arboreal conditions
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")


# Find limits for colours of the plot
days_min <- min(min(pop_sub_current$overheating_days, na.rm = TRUE), min(pop_sub_future4C$overheating_days,
    na.rm = TRUE), min(pop_arb_current$overheating_days, na.rm = TRUE), min(pop_arb_future4C$overheating_days,
    na.rm = TRUE))

days_max <- max(max(pop_sub_current$overheating_days, na.rm = TRUE), max(pop_sub_future4C$overheating_days,
    na.rm = TRUE), max(pop_arb_current$overheating_days, na.rm = TRUE), max(pop_arb_future4C$overheating_days,
    na.rm = TRUE))

Overheating days by latitude - Substrate

n_days_sub <- ggplot() + geom_point(data = filter(pop_sub_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Overheating days by latitude - Above-ground vegetation

n_days_arb <- ggplot() + geom_point(data = filter(pop_arb_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Overheating days by TSM - Substrate

days_TSM_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = TSM, y = overheating_days),
    fill = "#EF4187", shape = 21, alpha = 0.85, size = 3.5) + geom_point(data = pop_sub_future2C,
    aes(x = TSM, y = overheating_days), fill = "#FAA43A", shape = 21, alpha = 0.85,
    size = 3.5) + geom_point(data = pop_sub_current, aes(x = TSM, y = overheating_days),
    fill = "#5DC8D9", shape = 21, alpha = 0.85, size = 3.5) + ylim(-0.35, days_max +
    0.35) + xlim(0, 18) + xlab("Thermal safety margin") + ylab("") + theme_classic() +
    theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
        colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
        text = element_text(color = "black"), axis.title.x = element_blank(), axis.title.y = element_blank(),
        axis.text.x = element_text(color = "black", size = 25, margin = margin(t = 8,
            r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black", size = 25,
            margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
            size = 3))

Overheating days by TSM - Above-ground vegetation

days_TSM_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = TSM, y = overheating_days),
    fill = "#EF4187", shape = 21, alpha = 0.85, size = 3.5) + geom_point(data = pop_arb_future2C,
    aes(x = TSM, y = overheating_days), fill = "#FAA43A", shape = 21, alpha = 0.85,
    size = 3.5) + geom_point(data = pop_arb_current, aes(x = TSM, y = overheating_days),
    fill = "#5DC8D9", shape = 21, alpha = 0.85, size = 3.5) + ylim(-0.35, days_max +
    0.35) + xlim(0, 18) + xlab("Thermal safety margin") + ylab("") + theme_classic() +
    theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
        colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
        text = element_text(color = "black"), axis.title.x = element_text(size = 35),
        axis.title.y = element_blank(), axis.text.x = element_text(color = "black",
            size = 25, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
            size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
            size = 3))

Final plot

figure5 <- (n_days_sub | days_TSM_sub)/(n_days_arb | days_TSM_arb)


figure5

ggsave("fig/Figure_5.svg", width = 16, height = 12, dpi = 300)

Fig. 5 | Latitudinal variation in the number of overheating events in terrestrial (top row) and arboreal (bottom row) microhabitats as a function of latitude (left column) and thermal safety margin (right column). The number of overheating events (days) were calculated as the sum of overheating events (when daily maximum temperatures exceed CTmax) during the warmest quarters of 2006-2015 for each population. Blue points depict the number of overheating events in historical microclimates, while orange and pink points depict the number of overheating events assuming 2°C and 4°C of global warming above pre-industrial levels, respectively. For clarity, only the populations predicted to experience overheating events across latitudes are depicted (left column).

Extended Data figures

Extended data - Figure 2

# Load data that was used for the imputation
data_for_imp <- readRDS("RData/General_data/pre_data_for_imputation.rds")

# Load datasets from the cross-validation
first_crossV <- readRDS(file = "Rdata/Imputation/results/1st_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "1")
second_crossV <- readRDS(file = "Rdata/Imputation/results/2nd_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "2")
third_crossV <- readRDS(file = "Rdata/Imputation/results/3rd_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "3")
fourth_crossV <- readRDS(file = "Rdata/Imputation/results/4th_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "4")
fifth_crossV <- readRDS(file = "Rdata/Imputation/results/5th_cross_validation_5th_cycle.Rds") %>%
    mutate(crossV = "5")

all_imputed_dat <- bind_rows(first_crossV, second_crossV, third_crossV, fourth_crossV,
    fifth_crossV)

# Filter to data that was used for the cross-validation
imp_data <- all_imputed_dat[all_imputed_dat$dat_to_validate == "yes", ]
imp_data <- dplyr::filter(imp_data, is.na(tip.label) == FALSE)

# Add row number
row_n_imp <- data.frame(row_n = imp_data$row_n)

# Filter to original data
original_data <- data_for_imp[data_for_imp$row_n %in% row_n_imp$row_n, ]
original_data <- dplyr:::select(original_data, row_n, mean_UTL)

# Combine dataframes
data <- dplyr::left_join(original_data, imp_data, by = "row_n")
data <- rename(data, original_CTmax = mean_UTL.x, imputed_CTmax = filled_mean_UTL5)

# Remove observations that were cross-validated twice
duplicates <- data %>%
    group_by(row_n) %>%
    summarise(n = n()) %>%
    filter(n > 1)
duplicates <- duplicates$row_n

data <- data[!(data$row_n %in% duplicates & data$crossV == "5"), ]


data %>%
    summarise(mean = mean(original_CTmax), sd = sd(original_CTmax), n = n())
##       mean       sd   n
## 1 36.18638 2.669832 375
data %>%
    summarise(mean = mean(imputed_CTmax), sd = sd(imputed_CTmax), n = n())
##       mean       sd   n
## 1 35.93433 2.543695 375
plot_crossV <- ggplot(data) + geom_density(aes(original_CTmax), fill = "#21918c",
    alpha = 0.8) + geom_density(aes(imputed_CTmax), fill = "#CE5B97", alpha = 0.8) +
    xlab("CTmax") + ylab("Density") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 60, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 60, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 50, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 50, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))

plot_crossV

ggsave(plot_crossV, file = "fig/Extended_data_figure_2a.svg", width = 18, height = 16,
    dpi = 500)

Extended Data Fig. 2a | Probability density distributions of experimental CTmax (blue) and CTmax cross-validated using our data imputation procedure (pink).

plot_corr <- ggplot(data) + geom_abline(intercept = 0, slope = 1, linewidth = 1.25) +
    geom_point(aes(x = imputed_CTmax, y = original_CTmax), fill = "#CE5B97", alpha = 0.8,
        shape = 21, size = 10) + ylab("Experimental CTmax") + xlab("Imputed CTmax") +
    xlim(27, 43.5) + ylim(27, 43.5) + geom_text(aes(x = 40, y = 29), label = "r = 0.86",
    size = 20) + theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 60,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 60,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 50,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 50,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))
plot_corr

ggsave(plot_corr, file = "fig/Extended_data_figure_2b.svg", width = 18, height = 16,
    dpi = 500)

Extended Data Fig. 2b | Correlation between experimental CTmax and CTmax cross-validated using our data imputation procedure.

# Load imputed data
imputed_data <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

imputed_data <- filter(imputed_data, imputed=="yes")

# Calculate data summary
data_summary <- imputed_data %>% 
   mutate(SE = (upper_mean_UTL - filled_mean_UTL5)/1.96,
          weights = 1/(SE^2)) %>% 
   group_by(tip.label) %>% 
   summarise(CTmax = (sum(filled_mean_UTL5 * weights)/sum(weights)),
             SE = sqrt(sum(weights) * (n() - 1) / (((sum(weights)^2) - (sum(weights^2))))),
             order = order)

# Calculate data summary for the training data
training_data <- readRDS("RData/General_data/training_data.rds") 

data_summary_exp <- training_data %>% 
   group_by(tip.label) %>% 
   summarise(CTmax_exp = mean(mean_UTL),
             order = order)

data_summary <- distinct(left_join(data_summary, data_summary_exp))

data_summary <- mutate(data_summary, tested = ifelse(is.na(CTmax_exp)== "FALSE", "tested", "not_tested"))

# Set colour
CTmax_min <- min(min(data_summary$CTmax, na.rm = TRUE))

CTmax_max <- max(max(data_summary$CTmax, na.rm = TRUE))


# Import tree from Jetz and Pyron (with slight modifications in species names)
tree <- readRDS("RData/General_data/tree_for_imputation.rds")

# Prune tree
pruned_tree <- drop.tip(tree, tree$tip.label[-match(data_summary$tip.label, tree$tip.label)]) 


# Build tree skeleton
p1 <- ggtree(pruned_tree, 
             layout = "fan", 
             lwd = 0.05) + 
       xlim(0,800)

# Match data to the tree
p1 <- p1 %<+% data_summary 

p2 <-  p1 + geom_fruit(geom = geom_tile, # Heat map
                       mapping = aes(fill = order), 
                       width=10, 
                       offset=0.035)+ 
               scale_fill_manual(values =c("gray60", "gray20"))

p3 <- p2 + ggnewscale::new_scale_fill()+
           geom_fruit(geom = geom_tile, # Heat map
                      mapping = aes(fill = tested), 
                                    width=55, 
                                    offset=0.15) + 
           scale_fill_manual(values = c("gray85", "#21918c"))

p4 <- p3 + ggnewscale::new_scale_fill()+
           geom_fruit(geom = geom_tile, # Heat map
                      mapping = aes(fill = SE), 
                                    width=55, 
                                    offset=0.19) + 
           scale_fill_viridis(option="plasma", 
                              begin=0, 
                              end=1, 
                              name="SE",
                              na.value = "gray85")

p4

ggsave(file="fig/Extended_data_figure_2c.svg", width=10, height=10, dpi=1000)

Extended Data Fig. 2c | Variation in the uncertainty (standard error, SE) of imputed CTmax predictions (outer chronogram) across studied (blue) and imputed (grey) species.

Extended data - Figure 3

# Load data

## Substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

## Pond
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

## Arboreal
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

TSM

Vegetated substrate

# Load model predictions
pred_sub_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_future4C.rds")


pop_TSM_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = TSM,
    size = 1/TSM_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = TSM, size = 1/TSM_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_sub_current, aes(x = lat, y = TSM, size = 1/TSM_se), col = "#5DC8D9",
        shape = 20, alpha = 0.85) + geom_ribbon(data = pred_sub_current, aes(x = lat,
    ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") + geom_ribbon(data = pred_sub_future2C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#FAA43A", colour = "black") +
    geom_ribbon(data = pred_sub_future4C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#EF4187", colour = "black") + scale_size_continuous(range = c(0.25,
    3), guide = "none") + xlab("") + ylab("") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

Pond or wetland

# Load model predictions
pred_pond_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_pond_future4C.rds")

pop_TSM_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat, y = TSM,
    size = 1/TSM_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = TSM, size = 1/TSM_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_pond_current, aes(x = lat, y = TSM, size = 1/TSM_se), col = "#5DC8D9",
        shape = 20, alpha = 0.85) + geom_ribbon(data = pred_pond_current, aes(x = lat,
    ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") + geom_ribbon(data = pred_pond_future2C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#FAA43A", colour = "black") +
    geom_ribbon(data = pred_pond_future4C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#EF4187", colour = "black") + scale_size_continuous(range = c(0.25,
    3), guide = "none") + xlab("") + ylab("Thermal safety margin") + ylim(-10, 50) +
    scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) +
    theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 45), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

Above-ground vegetation

# Load model predictions
pred_arb_current <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_arboreal_future4C.rds")


pop_TSM_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = TSM,
    size = 1/TSM_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = TSM, size = 1/TSM_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_arb_current, aes(x = lat, y = TSM, size = 1/TSM_se), col = "#5DC8D9",
        shape = 20, alpha = 0.85) + geom_ribbon(data = pred_arb_current, aes(x = lat,
    ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") + geom_ribbon(data = pred_arb_future2C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#FAA43A", colour = "black") +
    geom_ribbon(data = pred_arb_future4C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#EF4187", colour = "black") + scale_size_continuous(range = c(0.25,
    3), guide = "none") + xlab("Latitude") + ylab("") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 45),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

All habitats

TSM <- pop_TSM_sub/pop_TSM_pond/pop_TSM_arb/plot_layout(ncol = 1)

CTmax

Vegetated substrate

# Load model predictions
pred_sub_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_substrate_future4C.rds")

pop_CTmax_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = CTmax,
    size = 1/CTmax_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = CTmax, size = 1/CTmax_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_sub_current, aes(x = lat, y = CTmax, size = 1/CTmax_se),
        col = "#5DC8D9", shape = 20, alpha = 0.85) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    scale_size_continuous(range = c(0.25, 3), guide = "none") + xlab("") + ylab("") +
    ylim(-10, 50) + scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099,
    72.00064)) + theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

Pond or wetland

# Load model predictions
pred_pond_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_pond_future4C.rds")


pop_CTmax_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat, y = CTmax,
    size = 1/CTmax_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = CTmax, size = 1/CTmax_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_pond_current, aes(x = lat, y = CTmax, size = 1/CTmax_se),
        col = "#5DC8D9", shape = 20, alpha = 0.85) + geom_ribbon(data = pred_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_pond_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    scale_size_continuous(range = c(0.25, 3), guide = "none") + xlab("") + ylab("Critical thermal maximum") +
    ylim(-10, 50) + scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), limits = c(-55.00099,
    72.00064)) + theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 45), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

Above-ground vegetation

# Load model predictions
pred_arb_current <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/CTmax/predictions_pop_lat_CTmax_arboreal_future4C.rds")


pop_CTmax_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = CTmax,
    size = 1/CTmax_se), col = "#EF4187", shape = 20, alpha = 0.85) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = CTmax, size = 1/CTmax_se), col = "#FAA43A", shape = 20, alpha = 0.85) +
    geom_point(data = pop_arb_current, aes(x = lat, y = CTmax, size = 1/CTmax_se),
        col = "#5DC8D9", shape = 20, alpha = 0.85) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    scale_size_continuous(range = c(0.25, 3), guide = "none") + xlab("Latitude") +
    ylab("") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50, -25, 0, 25, 50),
    limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 45),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), plot.margin = unit(c(0,
        0.25, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 3))

All habitats

CTmax <- pop_CTmax_sub/pop_CTmax_pond/pop_CTmax_arb/plot_layout(ncol = 1)

Operative body temperature

Vegetated substrate

# Load model predictions
pred_sub_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_current.rds")
pred_sub_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_future2C.rds")
pred_sub_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_substrate_future4C.rds")


pop_max_temp_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = lat, y = max_temp),
    col = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_sub_future2C,
    aes(x = lat, y = max_temp), col = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_sub_current, aes(x = lat, y = max_temp), col = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_sub_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("") + ylab("") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50, -25,
    0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Pond or wetland

# Load model predictions
pred_pond_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_current.rds")
pred_pond_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_future2C.rds")
pred_pond_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_pond_future4C.rds")


pop_max_temp_pond <- ggplot() + geom_point(data = pop_pond_future4C, aes(x = lat,
    y = max_temp), col = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_pond_future2C,
    aes(x = lat, y = max_temp), col = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_pond_current, aes(x = lat, y = max_temp), col = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_pond_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("") + ylab("Operative body temperature") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 30),
    axis.title.y = element_text(size = 45), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))
Above-ground vegetation
# Load model predictions
pred_arb_current <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_current.rds")
pred_arb_future2C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_future2C.rds")
pred_arb_future4C <- readRDS("RData/Models/max_temp/predictions_pop_lat_max_temp_arboreal_future4C.rds")


pop_max_temp_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = lat, y = max_temp),
    col = "#EF4187", shape = 20, alpha = 0.85, size = 2) + geom_point(data = pop_arb_future2C,
    aes(x = lat, y = max_temp), col = "#FAA43A", shape = 20, alpha = 0.85, size = 2) +
    geom_point(data = pop_arb_current, aes(x = lat, y = max_temp), col = "#5DC8D9",
        shape = 20, alpha = 0.85, size = 2) + geom_ribbon(data = pred_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black") +
    geom_ribbon(data = pred_arb_future2C, aes(x = lat, ymin = lower, ymax = upper),
        fill = "#FAA43A", colour = "black") + geom_ribbon(data = pred_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black") +
    xlab("Latitude") + ylab("") + ylim(-10, 50) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 45),
    axis.title.y = element_text(size = 30), axis.text.x = element_text(color = "black",
        size = 20, margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 20, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

All habitats

body_temp <- pop_max_temp_sub/pop_max_temp_pond/pop_max_temp_arb/plot_layout(ncol = 1)

Combine TSM, CTmax and body temperature plots

all_traits <- (TSM | CTmax | body_temp)

all_traits

ggsave(all_traits, file = "fig/Extended_data_figure_3.svg", width = 30, height = 20,
    dpi = 1000)

Extended Data Fig. 3 | Thermal safety margin, critical thermal maximum, and operative body temperatures in different microhabitats and climatic scenarios. Population-level mean thermal safety margins (TSM; left column), critical thermal maximum (CTmax; middle column) and operative body temperatures (right column) in terrestrial (top row), aquatic (middle row) and arboreal (bottom row) microhabitats are depicted in current microclimates (blue data points), or assuming 2°C and 4°C of global warming above pre-industrial levels (orange, and pink data points, respectively) across latitudes. Lines represent 95% confidence intervals of model predictions from generalized additive mixed models.

Extended data - Figure 4

Population-level patterns

# Vegetated substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Pond or wetland
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

# Filter substrate data to only arboreal species
pop_sub_current <- pop_sub_current[pop_sub_current$tip.label %in% pop_arb_current$tip.label,
    ]
pop_sub_future2C <- pop_sub_future2C[pop_sub_future2C$tip.label %in% pop_arb_future2C$tip.label,
    ]
pop_sub_future4C <- pop_sub_future4C[pop_sub_future4C$tip.label %in% pop_arb_future4C$tip.label,
    ]

Overheating days by latitude - Substrate

n_days_sub <- ggplot() + geom_point(data = filter(pop_sub_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, 154) + xlab("") +
    ylab("") + theme_classic() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    text = element_text(color = "black"), axis.title.x = element_blank(), axis.title.y = element_blank(),
    axis.text.x = element_text(color = "black", size = 25), axis.text.y = element_text(color = "black",
        size = 25), panel.border = element_rect(fill = NA, size = 3))

Overheating days by latitude - Above-ground vegetation

n_days_arb <- ggplot() + geom_point(data = filter(pop_arb_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, 154) + xlab("Latitude") +
    ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25),
    axis.text.y = element_text(color = "black", size = 25), panel.border = element_rect(fill = NA,
        size = 3))

Overheating days by TSM - Substrate

days_TSM_sub <- ggplot() + geom_point(data = pop_sub_future4C, aes(x = TSM, y = overheating_days),
    fill = "#EF4187", shape = 21, alpha = 0.85, size = 3.5) + geom_point(data = pop_sub_future2C,
    aes(x = TSM, y = overheating_days), fill = "#FAA43A", shape = 21, alpha = 0.85,
    size = 3.5) + geom_point(data = pop_sub_current, aes(x = TSM, y = overheating_days),
    fill = "#5DC8D9", shape = 21, alpha = 0.85, size = 3.5) + ylim(-0.35, 154) +
    xlim(0, 18) + xlab("Thermal safety margin") + ylab("") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Overheating days by TSM - Above-ground vegetation

days_TSM_arb <- ggplot() + geom_point(data = pop_arb_future4C, aes(x = TSM, y = overheating_days),
    fill = "#EF4187", shape = 21, alpha = 0.85, size = 3.5) + geom_point(data = pop_arb_future2C,
    aes(x = TSM, y = overheating_days), fill = "#FAA43A", shape = 21, alpha = 0.85,
    size = 3.5) + geom_point(data = pop_arb_current, aes(x = TSM, y = overheating_days),
    fill = "#5DC8D9", shape = 21, alpha = 0.85, size = 3.5) + ylim(-0.35, 154) +
    xlim(0, 18) + xlab("Thermal safety margin") + ylab("") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Combine plot

ext_fig4 <- (n_days_sub | days_TSM_sub)/(n_days_arb | days_TSM_arb)


ext_fig4

ggsave(ext_fig4, file = "fig/Extended_data_figure_4abcd.svg", width = 16, height = 12,
    dpi = 500)

Community-level patterns

# Load data Substrate
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells_arboreal_sp.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells_arboreal_sp.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells_arboreal_sp.rds")

## Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")

# Set colours
color_palette <- colorRampPalette(colors = c("#FAF218", "#EF4187", "#d90429"))
colors <- color_palette(100)
color_func <- colorRampPalette(c("gray65", colors))
color_palette <- color_func(100)

sp_min <- min(min(community_sub_current$n_species_overheating, na.rm = TRUE), min(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), min(community_arb_current$n_species_overheating, na.rm = TRUE),
    min(community_arb_future4C$n_species_overheating, na.rm = TRUE))

sp_max <- max(max(community_sub_current$n_species_overheating, na.rm = TRUE), max(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), max(community_arb_current$n_species_overheating, na.rm = TRUE),
    max(community_arb_future4C$n_species_overheating, na.rm = TRUE))

Extended Data Fig. 4a-d | Number of overheating events experienced by arboreal species across latitudes (left column) and in relation to thermal safety margins (right column) in terrestrial (top row) and arboreal microhabitats (bottom row). The number of overheating events were calculated as the sum of overheating events (when daily maximum temperatures exceed CTmax) during the warmest quarters of 2006-2015 for each population. Blue points depict the number of overheating events in historical microclimates, while orange and pink points depict the number of overheating events assuming 2°C and 4°C of global warming above pre-industrial levels, respectively. In the left column, only the populations predicted to overheat are displayed.

Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", limits = c(0, sp_max)) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", limits = c(0, sp_max)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_sub_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_sub_current,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(0, 14) + xlab("") + ylab("") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.text.x = element_text(color = "black",
        size = 10), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future4C + lat_all + plot_layout(ncol = 3))
Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", limits = c(0, sp_max)) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))


# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(0, sp_max)) + theme_void() +
    theme(plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), legend.position = "bottom", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

lat_all_arb <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_arb_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_arb_current,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(0, 14) + xlab("") + ylab("Species overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(color = "black", size = 12), axis.text.x = element_text(color = "black",
        size = 10), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future4C + lat_all_arb + plot_layout(ncol = 3))
All habitats
all_habitats <- (substrate_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

ggsave(all_habitats, file = "fig/Extended_data_figure_4ef.svg", width = 14, height = 5,
    dpi = 500)

Extended Data Fig. 4e-f | Number of arboreal species predicted to experience overheating events terrestrial (top row) and arboreal (bottom row) microhabitats in each community. The number of species overheating was assessed as the sum of species overheating at least once in the period surveyed (warmest quarters of 2006-2015) in each community (1-degree grid cell). Black color depicts areas with no data, and gray color communities without species at risk. The right panel depicts latitudinal patterns in the number of species predicted to overheat in current climates (blue) or assuming 4°C of global warming above pre-industrial levels (pink). Dashed lines represent the equator and tropics. No species were predicted to experience overheating events in water bodies, and hence are not displayed.

Extended data - Figure 5

# Load data Substrate
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

## Arboreal
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")

## Pond
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")
Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_sub_future4C, proportion_species_overheating >
    0), aes(x = lat, y = proportion_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_sub_current,
    proportion_species_overheating > 0), aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(-0.01, 1) + xlab("") + ylab("") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.text.x = element_text(color = "black",
        size = 10), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future4C + lat_all + plot_layout(ncol = 3))
Pond or wetland
# Current
map_pond_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Future +4C
map_pond_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future4C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_pond_future4C, proportion_species_overheating >
    0), aes(x = lat, y = proportion_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + xlim(-55.00099, 72.00064) +
    ylim(-0.01, 1) + xlab("") + ylab("") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.text.x = element_text(color = "black", size = 10), axis.line = element_line(color = "black"),
    panel.border = element_rect(fill = NA, size = 2))

pond_plot <- (map_pond_TSM_current + map_pond_TSM_future4C + lat_all + plot_layout(ncol = 3))
Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))


# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = proportion_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Proportion of species overheating", limits = c(0,
        1)) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "bottom",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns

lat_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_arb_future4C, proportion_species_overheating >
    0), aes(x = lat, y = proportion_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_arb_current,
    proportion_species_overheating > 0), aes(x = lat, y = proportion_species_overheating),
    alpha = 0.85, fill = "#5DC8D9", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    xlim(-55.00099, 72.00064) + ylim(-0.01, 1) + xlab("") + ylab("Proportion of species 
overheating") +
    coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_text(color = "black", size = 12), axis.text.x = element_text(color = "black",
        size = 10), axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future4C + lat_all + plot_layout(ncol = 3))
All habitats
all_habitats <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

all_habitats

ggsave(all_habitats, file = "fig/Extended_data_figure_5.svg", width = 14, height = 7,
    dpi = 500)

Extended Data Fig. 5 | Proportion of species predicted to experience overheating events in terrestrial (top row), aquatic (middle row) and arboreal (bottom row) microhabitats. The proportion of species overheating was assessed as the sum of species overheating at least once in the period surveyed (warmest quarters of 2006-2015) divided by the number of species in each community (1-degree grid cell). Black color depicts areas with no data, and gray color communities without species at risk. The right panel depicts latitudinal patterns in the proportion of species predicted to overheat in current climates (blue) or assuming 4°C of global warming above pre-industrial levels (pink). Dashed lines represent the equator and tropics. No species were predicted to experience overheating events in water bodies, and hence are not displayed.

Extended data - Figure 6

# Load current data
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Load sensitivity analysis data 
pop_sub_future4C_sens <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_sensitivity_analysis.rds")


# Load current model predictions
pred_sub_future4C <- readRDS("RData/Models/TSM/predictions_pop_lat_TSM_substrate_future4C.rds") # # Load model predictions after removing outliers (temperatures below the 5th and above the 95th percentile body temperatures)
pred_sub_future4C_no_outliers <- readRDS("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_substrate_future4C_without_outliers.rds")
# Load model predictions without averaging (taking TSM as the difference between the 95th percentile body temperature and the corresponding CTmax)
pred_sub_future4C_95th_perc <- readRDS("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_substrate_future4C_95th_percentile.rds")
# Load model predictions without averaging (taking TSM as the difference between the maximum hourly body temperature and the corresponding CTmax; i.e., lowest possible TSM)
pred_sub_future4C_max_temp <- readRDS("RData/Models/TSM/sensitivity_analyses/predictions_pop_lat_TSM_substrate_future4C_max_temp.rds")

# Find limit of the plot
tsm_max <- max(pop_sub_future4C$TSM)
tsm_min <- min(pop_sub_future4C_sens$TSM_extreme)

TSM_sensitivity <- ggplot()+
  geom_point(data = pop_sub_future4C_sens, 
             aes(x = lat, y = TSM_extreme), # No averaging (lowest TSM)
             colour="#bf0603", 
             shape = 20, 
             alpha=0.85,
             size = 3) +
  geom_point(data = pop_sub_future4C_sens,
             aes(x = lat, y = TSM_95), # No averaging (95th percentile)
             colour="#f4d58d", 
             shape = 20, 
             alpha=0.85,
             size = 3) +
  geom_point(data = pop_sub_future4C_sens, 
             aes(x = lat, y = TSM), # Without outliers
             colour="#5DC8D9", 
             shape = 20, 
             alpha=0.85,
             size = 3) +
  geom_point(data = pop_sub_future4C,  
             aes(x = lat, y = TSM),  # Current TSM used in analyses
             colour="#adb5bd", 
             shape = 20, 
             alpha=0.85,
             size = 3) +
  geom_ribbon(data = pred_sub_future4C_max_temp, 
              aes(x = lat, ymin = lower, ymax = upper), 
              fill="#bf0603", 
              colour="black") +
  geom_ribbon(data = pred_sub_future4C_95th_perc, 
              aes(x = lat, ymin = lower, ymax = upper), 
              fill="#f4d58d", 
              colour="black") +
  geom_ribbon(data = pred_sub_future4C_no_outliers, 
              aes(x = lat, ymin = lower, ymax = upper), 
              fill="#5DC8D9", 
              colour="black") +
  geom_ribbon(data = pred_sub_future4C, 
              aes(x = lat, ymin = lower, ymax = upper), 
              fill="#adb5bd", 
              colour="black") +
  geom_hline(yintercept = 0, linetype = "dashed", size = 1.5) + 
  xlab("Latitude") +
  ylab("Thermal safety margin") +
  ylim(tsm_min, tsm_max) +
  scale_x_continuous(breaks = c(-50, -25, 0, 25, 50), 
                     limits = c(-55.00099, 72.00064)) +
  theme_classic() +
  theme(legend.position = "none",
        plot.background = element_rect(fill = "transparent", colour = NA),
        panel.background = element_rect(fill = "transparent", colour = NA),
        text = element_text(color = "black"),
        axis.title.x = element_text(size = 30),
        axis.title.y = element_text(size = 30),
        axis.text.x = element_text(color = "black", 
                                   size = 20, 
                                   margin = margin(t = 8, r = 0, b = 0, l = 0)),
        axis.text.y = element_text(color = "black", 
                                   size = 20, 
                                   margin = margin(t = 0, r = 10, b = 0, l = 0)),
        panel.border = element_rect(fill=NA, size = 3))

TSM_sensitivity 

ggsave("fig/Extended_data_figure_6.svg", width=16, height=11, dpi = 300)

Extended Data Fig. 6 | Variation in thermal safety margin calculated using different assumptions. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature in full shade during the warmest quarters of 2006-2015 (grey colour), as the mean difference between CTmax and the predicted operative body temperature in full shade during the warmest quarters of 2006-2015 excluding body temperatures falling outside the 5% and 95% percentile temperatures (blue), as the difference between the 95% percentile operative body temperature and the corresponding CTmax (yellow), or as the difference between the maximum operative body temperature and the corresponding CTmax (red). Lines represented 95% confidence interval ranges predicted from generalized additive mixed models. This figure was constructed assuming ground-level microclimates occurring under 4°C of global warming above pre-industrial levels.

Extended data - Figure 7

Load data

# Vegetated substrate (acclimation to the mean weekly temperature)
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Arboreal conditions (acclimation to the mean weekly temperature)
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

# Vegetated substrate (acclimation to the max weekly temperature)
pop_sub_current_max <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_max_acc_current.rds")
pop_sub_future2C_max <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_max_acc_future2C.rds")
pop_sub_future4C_max <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_max_acc_future4C.rds")

# Arboreal conditions (acclimation to the max weekly temperature)
pop_arb_current_max <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_max_acc_current.rds")
pop_arb_future2C_max <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_max_acc_future2C.rds")
pop_arb_future4C_max <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_max_acc_future4C.rds")


# Find limits for colours of the plot
days_min <- min(min(pop_sub_current$overheating_days, na.rm = TRUE), min(pop_sub_future4C$overheating_days,
    na.rm = TRUE), min(pop_arb_current$overheating_days, na.rm = TRUE), min(pop_arb_future4C$overheating_days,
    na.rm = TRUE), min(pop_sub_current_max$overheating_days, na.rm = TRUE), min(pop_sub_future4C_max$overheating_days,
    na.rm = TRUE), min(pop_arb_current_max$overheating_days, na.rm = TRUE), min(pop_arb_future4C_max$overheating_days,
    na.rm = TRUE))

days_max <- max(max(pop_sub_current$overheating_days, na.rm = TRUE), max(pop_sub_future4C$overheating_days,
    na.rm = TRUE), max(pop_arb_current$overheating_days, na.rm = TRUE), max(pop_arb_future4C$overheating_days,
    na.rm = TRUE), max(pop_sub_current_max$overheating_days, na.rm = TRUE), max(pop_sub_future4C_max$overheating_days,
    na.rm = TRUE), max(pop_arb_current_max$overheating_days, na.rm = TRUE), max(pop_arb_future4C_max$overheating_days,
    na.rm = TRUE))

Acclimation to the mean weekly temperature - Substrate

n_days_sub <- ggplot() + geom_point(data = filter(pop_sub_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Acclimation to the max weekly temperature - Substrate

n_days_sub_max <- ggplot() + geom_point(data = filter(pop_sub_future4C_max, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C_max,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current_max, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Acclimation to the mean weekly temperature - Above-ground vegetation

n_days_arb <- ggplot() + geom_point(data = filter(pop_arb_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Acclimation to the max weekly temperature - Above-ground vegetation

n_days_arb_max <- ggplot() + geom_point(data = filter(pop_arb_future4C_max, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C_max,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current_max, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Combine plots

ext_fig_7 <- (n_days_sub | n_days_sub_max)/(n_days_arb | n_days_arb_max)

ext_fig_7

ggsave(ext_fig_7, file = "fig/Extended_data_figure_7.svg", width = 16, height = 12,
    dpi = 500)

Extended Data Fig. 7 | Latitudinal variation in the number of overheating events when animals are acclimated to the mean (left column) or maximum weekly body temperature experienced in the seven days prior (right column) in terrestrial (top row) and arboreal (bottom row) microhabitats. The number of overheating events (days) were calculated as the sum of overheating events (when daily maximum temperatures exceed CTmax) during the warmest quarters of 2006-2015 for each population. Blue points depict the number of overheating events in historical microclimates, while orange and pink points depict the number of overheating events assuming 2°C and 4°C of global warming above pre-industrial levels, respectively. For clarity, only the populations predicted to experience overheating events across latitudes are depicted.

Extended data - Figure 8

Load data

# Vegetated substrate
pop_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current.rds")
pop_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C.rds")
pop_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C.rds")

# Arboreal conditions
pop_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current.rds")
pop_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C.rds")
pop_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C.rds")

# Aquatic conditions
pop_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current.rds")
pop_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C.rds")
pop_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C.rds")

# Vegetated substrate (large se used for estimating overheating probabilities)
pop_sub_current_se <- readRDS("RData/Climate_vulnerability/Substrate/current/population_vulnerability_substrate_mean_acc_current_large_se.rds")
pop_sub_future2C_se <- readRDS("RData/Climate_vulnerability/Substrate/future2C/population_vulnerability_substrate_mean_acc_future2C_large_se.rds")
pop_sub_future4C_se <- readRDS("RData/Climate_vulnerability/Substrate/future4C/population_vulnerability_substrate_mean_acc_future4C_large_se.rds")

# Arboreal conditions (large se used for estimating overheating probabilities)
pop_arb_current_se <- readRDS("RData/Climate_vulnerability/Arboreal/current/population_vulnerability_arboreal_mean_acc_current_large_se.rds")
pop_arb_future2C_se <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/population_vulnerability_arboreal_mean_acc_future2C_large_se.rds")
pop_arb_future4C_se <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/population_vulnerability_arboreal_mean_acc_future4C_large_se.rds")

# Aquatic conditions (large se used for estimating overheating probabilities)
pop_pond_current_se <- readRDS("RData/Climate_vulnerability/Pond/current/population_vulnerability_pond_mean_acc_current_large_se.rds")
pop_pond_future2C_se <- readRDS("RData/Climate_vulnerability/Pond/future2C/population_vulnerability_pond_mean_acc_future2C_large_se.rds")
pop_pond_future4C_se <- readRDS("RData/Climate_vulnerability/Pond/future4C/population_vulnerability_pond_mean_acc_future4C_large_se.rds")

# Find limits for colours of the plot
days_min <- 0

days_max <- max(max(pop_sub_future4C$overheating_days, na.rm = TRUE), max(pop_arb_future4C$overheating_days,
    na.rm = TRUE), max(pop_pond_future4C$overheating_days, na.rm = TRUE), max(pop_sub_future4C_se$overheating_days,
    na.rm = TRUE), max(pop_arb_future4C_se$overheating_days, na.rm = TRUE), max(pop_pond_future4C_se$overheating_days,
    na.rm = TRUE))

Regular estimates - Substrate

n_days_sub <- ggplot() + geom_point(data = filter(pop_sub_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Estimates with large uncertainty - Substrate

n_days_sub_se <- ggplot() + geom_point(data = filter(pop_sub_future4C_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C_se,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Strict estimates - Substrate

n_days_sub_strict <- ggplot() + geom_point(data = filter(pop_sub_future4C, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_sub_future2C,
    overheating_risk_strict > 0), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_sub_current, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Regular estimates - Aquatic

n_days_pond <- ggplot() + geom_point(data = filter(pop_pond_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_pond_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_pond_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Estimates with large uncertainty - Aquatic

n_days_pond_se <- ggplot() + geom_point(data = filter(pop_pond_future4C_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_pond_future2C_se,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_pond_current_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Strict estimates - Aquatic

n_days_pond_strict <- ggplot() + geom_point(data = filter(pop_pond_future4C, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_pond_future2C,
    overheating_risk_strict > 0), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_pond_current, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_blank(),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Regular estimates - Above-ground vegetation

n_days_arb <- ggplot() + geom_point(data = filter(pop_arb_future4C, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Estimates with large uncertainty - Above-ground vegetation

n_days_arb_se <- ggplot() + geom_point(data = filter(pop_arb_future4C_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C_se,
    overheating_days >= 1), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current_se, overheating_days >=
    1), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Strict estimates - Above-ground vegetation

n_days_arb_strict <- ggplot() + geom_point(data = filter(pop_arb_future4C, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#EF4187", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + geom_point(data = filter(pop_arb_future2C,
    overheating_risk_strict > 0), aes(x = lat, y = overheating_days), fill = "#FAA43A",
    shape = 21, alpha = 0.85, size = 3.5, position = position_jitter(width = 0.35,
        height = 0.35)) + geom_point(data = filter(pop_arb_current, overheating_risk_strict >
    0), aes(x = lat, y = overheating_days), fill = "#5DC8D9", shape = 21, alpha = 0.85,
    size = 3.5, position = position_jitter(width = 0.35, height = 0.35)) + scale_x_continuous(breaks = c(-50,
    -25, 0, 25, 50), limits = c(-55.00099, 72.00064)) + ylim(-0.35, days_max + 0.35) +
    xlab("Latitude") + ylab("Number of overheating days") + theme_classic() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
        colour = NA), text = element_text(color = "black"), axis.title.x = element_text(size = 35),
    axis.title.y = element_blank(), axis.text.x = element_text(color = "black", size = 25,
        margin = margin(t = 8, r = 0, b = 0, l = 0)), axis.text.y = element_text(color = "black",
        size = 25, margin = margin(t = 0, r = 10, b = 0, l = 0)), panel.border = element_rect(fill = NA,
        size = 3))

Combine plots

ext_fig_8 <- (n_days_sub | n_days_sub_se | n_days_sub_strict)/(n_days_pond | n_days_pond_se |
    n_days_pond_strict)/(n_days_arb | n_days_arb_se | n_days_arb_strict)

ext_fig_8

ggsave(ext_fig_8, file = "fig/Extended_data_figure_8.svg", width = 20, height = 13,
    dpi = 500)

Extended Data Fig. 8 | Latitudinal variation in the number of overheating events using regular (left column) or conservative estimates (right column) in terrestrial (top row) and arboreal (bottom row) microhabitats. The number of overheating events (days) were calculated as the sum of overheating events (when daily maximum temperatures exceed CTmax) during the warmest quarters of 2006-2015 for each population. Conservative estimates are those where overheating events were counted only when operative body temperatures exceeded 50% of the predicted distribution of CTmax. Blue points depict the number of overheating events in historical microclimates, while orange and pink points depict the number of overheating events assuming 2°C and 4°C of global warming above pre-industrial levels, respectively. For clarity, only the populations predicted to experience overheating events across latitudes are depicted.

Extended data - Figure 9

Terrestrial biophysical models with different parameters

# Open habitats and burrows
habitat_selection <- ggplot() + geom_density(data = daily_vulnerability_open, aes(x = daily_TSM),
    alpha = 0.6, fill = "red") + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "2.5cm"), aes(x = daily_TSM), fill = "gold", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "5cm"), aes(x = daily_TSM), fill = "#BA9E49", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "10cm"), aes(x = daily_TSM), fill = "darkorange", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "15cm"), aes(x = daily_TSM), fill = "#F1AF79", alpha = 0.7) + geom_density(data = filter(daily_vulnerability_burrow,
    DEPTH == "20cm"), aes(x = daily_TSM), fill = "#995C51", alpha = 0.7) + geom_density(data = daily_vulnerability,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-6.5, 5) + ylim(0, 1.05) + xlab("Daily TSM") +
    ylab("Density") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))


# Body size
body_size <- ggplot() + geom_density(data = daily_vulnerability_small, aes(x = daily_TSM),
    alpha = 0.5, fill = "#49BAAE") + geom_density(data = daily_vulnerability_large,
    aes(x = daily_TSM), alpha = 0.5, fill = "#BA4989") + geom_density(data = daily_vulnerability,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("Density") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))


terrestrial_parameters <- body_size/habitat_selection

terrestrial_parameters

Aquatic biophysical models with different parameters

aquatic_parameters <- ggplot() + geom_density(data = daily_vulnerability_pond_shallow,
    aes(x = daily_TSM), alpha = 0.5, fill = "lightblue") + geom_density(data = daily_vulnerability_pond_deep,
    aes(x = daily_TSM), alpha = 0.5, fill = "darkblue") + geom_density(data = daily_vulnerability_pond,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 6) + xlab("") + ylab("Density") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

aquatic_parameters

Arboreal biophysical models with different parameters

# Plant height
plant_height <- ggplot() + geom_density(data = daily_vulnerability_arb_tall, aes(x = daily_TSM),
    alpha = 0.5, fill = "darkgreen") + geom_density(data = daily_vulnerability_arb_short,
    aes(x = daily_TSM), alpha = 0.5, fill = "lightgreen") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

# Diffusion of solar radiation
plant_solar_rad <- ggplot() + geom_density(data = daily_vulnerability_arb_low_diff,
    aes(x = daily_TSM), alpha = 0.5, fill = "#cc4778") + geom_density(data = daily_vulnerability_arb_mid_diff,
    aes(x = daily_TSM), alpha = 0.5, fill = "#7e03a8") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("") + ylab("") +
    theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

# Wind reduction
plant_wind_reduc <- ggplot() + geom_density(data = daily_vulnerability_arb_no_wind,
    aes(x = daily_TSM), alpha = 0.5, fill = "#BA4953") + geom_density(data = daily_vulnerability_arb_high_wind,
    aes(x = daily_TSM), alpha = 0.5, fill = "#49BAAE") + geom_density(data = daily_vulnerability_arb,
    aes(x = daily_TSM), alpha = 0.6, fill = "black") + geom_vline(xintercept = 0,
    colour = "black", lwd = 1, alpha = 0.75) + xlim(-5, 5) + xlab("Daily TSM") +
    ylab("") + theme_classic() + theme(text = element_text(color = "black"), axis.title.x = element_text(size = 50,
    margin = margin(t = 40, r = 0, b = 0, l = 0)), axis.title.y = element_text(size = 50,
    margin = margin(t = 0, r = 40, b = 0, l = 0)), axis.text.x = element_text(size = 40,
    margin = margin(t = 20, r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40,
    margin = margin(t = 0, r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA,
    size = 2))

arboreal_parameters <- plant_height/plant_solar_rad/plant_wind_reduc

arboreal_parameters

All habitats

all_habitat_parameters <- (terrestrial_parameters/aquatic_parameters) | arboreal_parameters

all_habitat_parameters

ggsave(all_habitat_parameters, file = "fig/Extended_data_figure_9.svg", height = 30,
    width = 25, dpi = 500)

Extended Data Fig. 9 |

Extended data - Figure 10

Here, we provide a brief validation of operative body temperatures predicted from our models. As a case in point, we compare our estimates to field body temperatures of 11 species of frogs in Mexico (taken from Lara-Resendiz & Luja, 2018, Revista Mexicana de Biodiversidad)

Prepare data

# Get Tb measurements from the study (Table 1)
data <- data.frame(Species = c("Agalychnis dacnicolor", "Craugastor occidentalis",
    "Hyla eximia", "Incilius mazatlanensis", "Leptodactylus melanonotus", "Lithobates catesbeianus",
    "Lithobates forreri", "Plectrohyla bistincta", "Smilisca baudinii", "Smilisca fodiens",
    "Tlalocohyla smithii"), Tb = c("21.7±1.97 (17.2-29.8)", "20.5±2.29 (18.2-25.8)",
    "22.8±1.12 (20.4-24)", "24.4±1.48 (22.5-26.6)", "24.6±3.36 (21.5-33.3)", "24.8±0.88 (23.4-25.8)",
    "23.9±1.84 (20.9-27.7)", "22.5±3.09 (15.1-29.9)", "23.4±2.29 (20.8-29)", "22.7±1.07 (21.4-24)",
    "21.3±2.03 (14.5-25.7)"))

# Extract the mean and range of body temperatures
data$Tb_mean <- as.numeric(sub("\\±.*", "", data$Tb))
data$Tb_range <- gsub(".*\\((.*)\\).*", "\\1", data$Tb)
range_split <- strsplit(as.character(data$Tb_range), "-")
data$Min <- sapply(range_split, function(x) as.numeric(x[1]))
data$Max <- sapply(range_split, function(x) as.numeric(x[2]))


data <- data %>%
    dplyr::select(Species, Mean = Tb_mean, Min, Max)

# Species at the first site
data_Tepic <- filter(data, Species == "Agalychnis dacnicolor" | Species == "Hyla eximia" |
    Species == "Incilius mazatlanensis" | Species == "Leptodactylus melanonotus" |
    Species == "Lithobates catesbeianus" | Species == "Lithobates forreri" | Species ==
    "Smilisca baudinii" | Species == "Smilisca fodiens" | Species == "Tlalocohyla smithii")

# Species at the second site
data_CD <- filter(data, Species == "Craugastor occidentalis" | Species == "Lithobates forreri" |
    Species == "Plectrohyla bistincta" | Species == "Smilisca baudinii" | Species ==
    "Tlalocohyla smithii")

Compare body temperatures at the first site

# Set parameters
dstart <- "01/01/2013"
dfinish <- "31/12/2015" # Wide range of dates, but will only select June to October 2013/2015
coords<- c(-104.85, 21.48) # Tepic, most sampled site

# Run the microclimate model
micro_valid <-  NicheMapR::micro_ncep(loc = coords, 
                                      dstart = dstart, 
                                      dfinish = dfinish, 
                                      scenario=0,
                                      minshade=85,
                                      maxshade=90,
                                      Usrhyt = 0.01,
                                      cap = 1,
                                      ERR = 1.5, 
                                      spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2012 (need a bit of the previous year) 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  1095  days from  2013-01-01  to  2015-12-31 23:00:00  at site  long -104.85 lat 21.48 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  105.83    1.36  160.36
micro <- micro_valid

# Find body mass of the closest location
presence <- readRDS(file = "RData/General_data/species_coordinates_adjusted.rds")
data_for_imp <- readRDS(file = "RData/General_data/pre_data_for_imputation.rds")

presence_body_mass <- merge(presence, dplyr::select(data_for_imp, tip.label,
                                                    body_mass), by = "tip.label")
median_body_mass <- presence_body_mass %>%
  dplyr::group_by(lon, lat) %>%
  dplyr::summarise(median_mass = median(body_mass, na.rm = TRUE)) %>%
  dplyr::ungroup()

median_body_mass[median_body_mass$lon == -104.5 & median_body_mass$lat == 21.5,] # 24.9 g
## # A tibble: 1 × 3
##     lon   lat median_mass
##   <dbl> <dbl>       <dbl>
## 1 -104.  21.5        24.9
# Run the ectotherm model
ecto <- NicheMapR::ectotherm(live= 0, 
                             Ww_g = 24.9,  
                             shape = 4, 
                             pct_wet = 80)
environ <- as.data.frame(ecto$environ)

environ_2013 <- filter(environ, 
                      YEAR == "1" & 
                      DAY > 152 & DAY < 304 & 
                      (TIME < 2 | TIME > 17)) # June to October 2013; between 18h and 0:30h
environ_2015 <- filter(environ, 
                       YEAR == "3" & 
                         DAY > 882 & DAY < 1034 & 
                         (TIME < 2 | TIME > 17)) # June to October 2015; between 18h and 0:30h

stats_2013 <- environ_2013 %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2015 <- environ_2015 %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2013
##        Min      Max    Mean       sd
## 1 17.95255 27.69047 23.1765 1.636191
stats_2015 # Virtually the same
##        Min      Max     Mean       sd
## 1 17.85327 27.89148 23.78714 1.701461
x_limits <- c(0.99, 1.01) # Define plot margins

# Space out species equally
num_points <- nrow(data_Tepic)
x_values <- seq(from = 0.991, to = 1.009, length.out = num_points)

Tb_jittered <- data_Tepic %>%
  mutate(x_jitter = x_values)

first_site <- 
ggplot() +
  geom_rect(data = stats_2013,   # Add a "ribbon" to represent the range 
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Min, ymax = Max),
            fill = "grey80", alpha = 0.5) +
    geom_segment(data = stats_2013,   # Add a line for the Mean
                 aes(x = x_limits[1], xend = x_limits[2], 
                     y = Mean, yend = Mean), 
                 color = "black", size = 1.5)  +
    geom_rect(data = stats_2013,    # Add SD for the Mean
              aes(xmin = x_limits[1], xmax = x_limits[2], 
                  ymin = Mean - sd, ymax = Mean + sd),
               fill = "grey60", alpha = 0.5) +
    geom_pointrange(data = Tb_jittered,   # Add body temperature data
                    aes(x = x_jitter, y = Mean, 
                        ymin = Min, ymax = Max, col = Species),
                    size = 1.5, linewidth = 1.3) + 
  scale_x_continuous(name = "", labels = NULL, breaks = NULL) +
  theme_classic() + 
  xlab("") + 
  ylab("Temperature (°C)") + 
  theme_classic() + 
  theme(text = element_text(color = "black"),
        axis.title.y = element_text(size = 40, margin = margin(t = 0, r = 30, b = 0, l = 0)), 
        axis.text.y = element_text(size = 30, margin = margin(t = 0, r = 20, b = 0, l = 0)), 
        legend.text = element_text(size = 15, face = "italic"),
        legend.title = element_text(size = 18),
        panel.border = element_rect(fill = NA, size = 2))


first_site

Compare body temperatures at the second site

coords <- c(-105.03, 21.45) # El  Cuarenteño

# Run the microclimate model
micro_valid_CD <-  NicheMapR::micro_ncep(loc = coords, 
                                      dstart = dstart, 
                                      dfinish = dfinish, 
                                      scenario=0,
                                      minshade=85,
                                      maxshade=90,
                                      Usrhyt = 0.01,
                                      cap = 1,
                                      ERR = 1.5, 
                                      spatial = 'E:/p_pottier/Climatic_data/data/NCEP_time')
## downloading DEM via package elevatr 
## extracting weather data locally from E:/p_pottier/Climatic_data/data/NCEP_time 
## reading weather input for 2012 (need a bit of the previous year) 
## reading weather input for 2013 
## reading weather input for 2014 
## reading weather input for 2015 
## reading weather input for 2016 (need a bit of the next year) 
## computing radiation and elevation effects with package microclima 
## Downscaling radiation and wind speed 
## Calculating meso-scale terrain effects 
## running microclimate model for  1095  days from  2013-01-01  to  2015-12-31 23:00:00  at site  long -105.03 lat 21.45 
## Note: the output column `SOLR` in metout and shadmet is for unshaded solar radiation adjusted for slope, aspect and horizon angle 
##    user  system elapsed 
##  112.62    1.16  160.44
micro <- micro_valid_CD

# Run the ectotherm model
ecto_CD <- NicheMapR::ectotherm(live= 0, 
                             Ww_g = 24.9,  
                             shape = 4, 
                             pct_wet = 80)
environ_CD <- as.data.frame(ecto$environ)

environ_2013_CD <- filter(environ_CD, 
                       YEAR == "1" & 
                         DAY > 152 & DAY < 304 & 
                      (TIME < 2 | TIME > 17)) # June to October 2013
environ_2015_CD <- filter(environ, 
                       YEAR == "3" & 
                         DAY > 882 & DAY < 1034 & 
                      (TIME < 2 | TIME > 17)) # June to October 2015

stats_2013_CD <- environ_2013_CD %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2015_CD <- environ_2015_CD %>%
  summarise(
    Min = min(TC, na.rm = TRUE),
    Max = max(TC, na.rm = TRUE),
    Mean = mean(TC, na.rm = TRUE),
    sd = sd(TC, na.rm = TRUE)
  )

stats_2013_CD
##        Min      Max    Mean       sd
## 1 17.95255 27.69047 23.1765 1.636191
stats_2015_CD # Virtually the same
##        Min      Max     Mean       sd
## 1 17.85327 27.89148 23.78714 1.701461
# Space out species equally
num_points <- nrow(data_CD)
x_values <- seq(from = 0.991, to = 1.009, length.out = num_points)

Tb_jittered_CD <- data_CD %>%
  mutate(x_jitter = x_values)

second_site <- 
ggplot() +
   
  geom_rect(data = stats_2013_CD, # Add a "ribbon" to represent the range
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Min, ymax = Max),
            fill = "grey80", alpha = 0.5) +
  geom_segment(data = stats_2013_CD, # Add a line for the Mean
               aes(x = x_limits[1], xend = x_limits[2], 
                   y = Mean, yend = Mean), color = "black", size = 1.5) +
  geom_rect(data = stats_2013_CD, # Add SD for the Mean
            aes(xmin = x_limits[1], xmax = x_limits[2], 
                ymin = Mean - sd, ymax = Mean + sd),
            fill = "grey60", alpha = 0.5) +
  geom_pointrange(data = Tb_jittered_CD, # Add body temperature
                  aes(x = x_jitter, y = Mean, 
                      ymin = Min, ymax = Max, 
                      col = Species),
                  size = 1.5, linewidth = 1.3) + 
  scale_x_continuous(name = "", labels = NULL, breaks = NULL) + 
  theme_classic() + 
  xlab("") + 
  ylab("Temperature (°C)") + 
  theme_classic() + 
  theme(text = element_text(color = "black"),
        axis.title.y = element_text(size = 40, margin = margin(t = 0, r = 30, b = 0, l = 0)), 
        axis.text.y = element_text(size = 30, margin = margin(t = 0, r = 20, b = 0, l = 0)), 
        legend.text = element_text(size = 15, face = "italic"),
        legend.title = element_text(size = 18),
        panel.border = element_rect(fill = NA, size = 2))

second_site

Final plot

validation_OBT <- first_site/second_site

validation_OBT

ggsave(validation_OBT, file = "fig/Extended_data_figure_10.svg", height = 15, width = 11,
    dpi = 500)

Supplementary figures

Here, we list additional figures that were originally in the Supplementary materials, but subsequently removed (as per editorial policies). For transparency, these figures are presented here.

Fig. S1 - Imputation convergence

imputed_data <- readRDS("RData/Imputation/results/imputation_5th_cycle.Rds")

imputed_data <- filter(imputed_data, imputed == "yes")

imp_convergence <- ggplot(imputed_data) + geom_jitter(aes(x = 1, y = filled_mean_UTL1),
    alpha = 0.5, size = 3, position = position_jitter(width = 0.2, height = 0), col = "#ede0d4") +
    geom_jitter(aes(x = 2, y = filled_mean_UTL2), alpha = 0.5, size = 3, position = position_jitter(width = 0.2,
        height = 0), col = "#c9ada7") + geom_jitter(aes(x = 3, y = filled_mean_UTL3),
    alpha = 0.5, size = 3, position = position_jitter(width = 0.2, height = 0), col = "#9a8c98") +
    geom_jitter(aes(x = 4, y = filled_mean_UTL4), alpha = 0.5, size = 3, position = position_jitter(width = 0.2,
        height = 0), col = "#4a4e69") + geom_jitter(aes(x = 5, y = filled_mean_UTL5),
    alpha = 0.5, size = 3, position = position_jitter(width = 0.2, height = 0), col = "#373760") +
    geom_boxplot(aes(x = 1, y = filled_mean_UTL1), notch = TRUE, fill = NA, col = "black",
        outlier.colour = NA, size = 1.25, na.rm = TRUE) + geom_boxplot(aes(x = 2,
    y = filled_mean_UTL2), notch = TRUE, fill = NA, col = "black", outlier.colour = NA,
    size = 1.25, na.rm = TRUE) + geom_boxplot(aes(x = 3, y = filled_mean_UTL3), notch = TRUE,
    fill = NA, col = "black", outlier.colour = NA, size = 1.25, na.rm = TRUE) + geom_boxplot(aes(x = 4,
    y = filled_mean_UTL4), notch = TRUE, fill = NA, col = "black", outlier.colour = NA,
    size = 1.25, na.rm = TRUE) + geom_boxplot(aes(x = 5, y = filled_mean_UTL5), notch = TRUE,
    fill = NA, col = "black", outlier.colour = NA, size = 1.25, na.rm = TRUE) + xlab("Imputation cycle") +
    ylab("Predicted CTmax") + theme_classic() + theme(legend.position = "none", text = element_text(color = "black"),
    axis.title.x = element_text(size = 45, margin = margin(t = 8, r = 0, b = 0, l = 0)),
    axis.title.y = element_text(size = 45, margin = margin(t = 0, r = 0, b = 0, l = 8)),
    axis.text.x = element_text(size = 25), axis.text.y = element_text(size = 25),
    panel.border = element_rect(fill = NA, size = 2))

imp_convergence

ggsave(imp_convergence, file = "fig/Figure_S1.png", width = 18, height = 12, dpi = 500)

Fig. S1 | Predicted critical thermal maximum (CTmax) across imputation cycles. Boxplots depict median (horizontal line), interquartile ranges (boxes), and whiskers extend to 1.5 times the interquartile range.

Fig. S2 - Predictors of CTmax

# Load experimental dataset
training_data <- readRDS("RData/General_data/pre_data_for_imputation.rds") %>%
    rename(CTmax = mean_UTL) %>%
    filter(imputed == "no")

# Plot predictors used for the imputation

## Acclimation temperature
acc <- ggplot(training_data) + geom_smooth(aes(y = CTmax, x = acclimation_temp, group = tip.label),
    method = "lm", se = FALSE, col = "gray35") + geom_point(aes(y = CTmax, x = acclimation_temp,
    col = acclimation_temp), alpha = 0.5, size = 4, position = position_jitter(width = 0.1,
    height = 0)) + scale_colour_viridis(option = "inferno", name = "Acclimation temperature") +
    xlab("Acclimation temperature (°C)") + ylab("CTmax") + theme_classic() + theme(legend.position = "none",
    text = element_text(color = "black"), axis.title.x = element_text(size = 25),
    axis.title.y = element_text(size = 25), axis.text.x = element_text(size = 15),
    axis.text.y = element_text(size = 15), panel.border = element_rect(fill = NA,
        size = 2))

# Duration of acclimation
dur <- ggplot(training_data, aes(y = CTmax, x = log(acclimation_time), col = log(acclimation_time))) +
    geom_point(alpha = 0.5, size = 4, position = position_jitter(width = 0.1, height = 0)) +
    geom_smooth(method = "lm", se = FALSE, linewidth = 3, col = "gray35") + scale_colour_viridis(option = "magma",
    name = "Acclimation time") + xlab("Acclimation time (days, log scale)") + ylab("") +
    theme_classic() + theme(legend.position = "none", text = element_text(color = "black"),
    axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
    axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 15),
    panel.border = element_rect(fill = NA, size = 2))

# Ramping rate
ramp <- ggplot(training_data, aes(y = CTmax, x = ramping, col = ramping)) + geom_point(alpha = 0.5,
    size = 4, position = position_jitter(width = 0.1, height = 0)) + geom_smooth(method = "lm",
    se = FALSE, linewidth = 3, col = "gray35") + scale_colour_viridis(option = "plasma",
    name = "Ramping rate") + xlab("Ramping rate (°C)") + ylab("") + theme_classic() +
    theme(legend.position = "none", text = element_text(color = "black"), axis.title.x = element_text(size = 25),
        axis.title.y = element_text(size = 25), axis.text.x = element_text(size = 15),
        axis.text.y = element_text(size = 15), panel.border = element_rect(fill = NA,
            size = 2))

## Endpoint
training_data <- mutate(training_data, endpoint = factor(endpoint, levels = c("LRR",
    "OS", "LOE", "prodding", "other", "death"), labels = c("LRR", "OS", "LRR", "other",
    "other", "other")))  # Reorder and regroup
endp <- ggplot(training_data, aes(y = CTmax, x = endpoint, col = endpoint)) + geom_jitter(alpha = 0.5,
    size = 4, position = position_jitter(width = 0.25, height = 0)) + geom_boxplot(notch = TRUE,
    fill = NA, col = "black", outlier.colour = NA, size = 1.25) + scale_colour_manual(values = c("#e9d8a6",
    "#e09f3e", "#9e2a2b")) + xlab("Endpoint") + ylab("CTmax") + theme_classic() +
    theme(legend.position = "none", text = element_text(color = "black"), axis.title.x = element_text(size = 25),
        axis.title.y = element_text(size = 25), axis.text.x = element_text(size = 15),
        axis.text.y = element_text(size = 15), panel.border = element_rect(fill = NA,
            size = 2))

## Medium
training_data <- mutate(training_data, medium_test_temp = factor(medium_test_temp,
    levels = c("body_water", "ambient"), labels = c("body/water", "ambient")))  # Reorder 
medium <- ggplot(filter(training_data, is.na(medium_test_temp) == FALSE), aes(y = CTmax,
    x = medium_test_temp, col = medium_test_temp), na.rm = TRUE) + geom_jitter(alpha = 0.5,
    size = 4, position = position_jitter(width = 0.25, height = 0), na.rm = TRUE) +
    geom_boxplot(notch = TRUE, fill = NA, col = "black", outlier.colour = NA, size = 1.25,
        na.rm = TRUE) + scale_colour_manual(values = c("#84a59d", "#f28482")) + xlab("Temperature assayed") +
    ylab("") + theme_classic() + theme(legend.position = "none", text = element_text(color = "black"),
    axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
    axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 15),
    panel.border = element_rect(fill = NA, size = 2))

## Life stage of the animals
training_data <- mutate(training_data, life_stage_tested = factor(life_stage_tested,
    levels = c("larvae", "adults"), labels = c("larvae", "adults")))  # Reorder 

lifestage <- ggplot(training_data, aes(y = CTmax, x = life_stage_tested, col = life_stage_tested),
    na.rm = TRUE) + geom_jitter(alpha = 0.5, size = 4, position = position_jitter(width = 0.25,
    height = 0), na.rm = TRUE) + geom_boxplot(notch = TRUE, fill = NA, col = "black",
    outlier.colour = NA, size = 1.25, na.rm = TRUE) + scale_colour_manual(values = c("#e09f3e",
    "#4f772d")) + xlab("Life stage") + ylab("") + theme_classic() + theme(legend.position = "none",
    text = element_text(color = "black"), axis.title.x = element_text(size = 25),
    axis.title.y = element_text(size = 25), axis.text.x = element_text(size = 15),
    axis.text.y = element_text(size = 15), panel.border = element_rect(fill = NA,
        size = 2))

# Ecotype
training_data$ecotype <- factor(training_data$ecotype, levels = c("Aquatic", "Stream-dwelling",
    "Semi-aquatic", "Ground-dwelling", "Fossorial", "Arboreal"))


ecotype <- ggplot(training_data, aes(y = CTmax, x = ecotype, col = ecotype), na.rm = TRUE) +
    geom_jitter(alpha = 0.5, size = 4, position = position_jitter(width = 0.25, height = 0),
        na.rm = TRUE) + geom_boxplot(notch = TRUE, fill = NA, col = "black", outlier.colour = NA,
    size = 1.25, na.rm = TRUE) + scale_colour_manual(values = c("#21918c", "#2c728e",
    "#472d7b", "#F1AF79", "#995C51", "#28ae80")) + xlab("Ecotype") + ylab("CTmax") +
    theme_classic() + theme(legend.position = "none", text = element_text(color = "black"),
    axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
    axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 15),
    panel.border = element_rect(fill = NA, size = 2))

all <- (acc + dur + ramp)/(endp + medium + lifestage)/ecotype

all

ggsave(all, file = "fig/Figure_S2.png", width = 20, height = 18, dpi = 500)

Fig. S2 | Correlations between critical thermal maximum (CTmax) and predictors used for the imputation. CTmax from the experimental dataset was plotted against acclimation temperature (a), acclimation time (b, log scale), ramping rate (c). Colours are proportional to the values of the continuous predictors and the line refers to predictions from a simple linear regression between CTmax and the predictors. Individual slopes for each species are depicted for species when CTmax was estimated at different acclimation temperatures (a). Depicted is also the variation in CTmax with different endpoints (d), media used to infer body temperature (e), life stages (f), and ecotypes (g). Boxplots depict median (horizontal line), interquartile ranges (boxes), and whiskers extend to 1.5 times the interquartile range. LRR: loss of righting response. OS: onset of spasms.

Fig. S3 - Variation in plasticity

# Load estimated intercepts and acclimation response ratios
species_ARR <- readRDS("RData/Climate_vulnerability/Pond/current/species_ARR_pond_current.rds")

# Display data
kable(species_ARR, "html") %>%
    row_spec(0, background = "white", color = "black", bold = TRUE) %>%
    kable_styling(fixed_thead = T, position = "left", full_width = F) %>%
    scroll_box(width = "100%", height = "500px")
tip.label intercept intercept_se slope slope_se
Pleurodema thaul 35.90767 1.4968582 0.1419952 0.0917530
Anaxyrus americanus 37.17172 0.9556022 0.0914746 0.0490691
Dryophytes versicolor 37.37297 3.0542887 0.1254332 0.1366829
Pseudacris crucifer 34.91936 3.2099507 0.1241034 0.1449068
Rana cascadae 32.07766 2.8450193 0.1268415 0.1560132
Rana luteiventris 32.83118 2.8260619 0.1424495 0.1724273
Lithobates sphenocephalus 35.78824 5.6650724 0.1288926 0.2199606
Hylomantis aspera 35.23926 18.3796928 0.1341506 0.7236338
Alytes cisternasii 32.92891 3.0861756 0.1669401 0.1446988
Alytes dickhilleni 34.61466 4.6161589 0.1216522 0.2061491
Alytes obstetricans 33.14787 3.0136465 0.1517981 0.1554486
Bufotes boulengeri 36.30905 8.6350966 0.1379723 0.3649727
Barbarophryne brongersmai 35.97622 4.1091377 0.1131505 0.1828543
Bufo bufo 34.61728 1.4318987 0.1075313 0.0770052
Epidalea calamita 34.97773 1.8687862 0.1512542 0.0998857
Ceratophrys aurita 36.84152 13.6556746 0.1307139 0.5331869
Dendropsophus branneri 36.33712 8.0488758 0.1098838 0.3085076
Dendropsophus elegans 35.91089 8.3460092 0.1185909 0.3258930
Dendropsophus haddadi 34.78968 13.9032440 0.1064546 0.5473902
Dendropsophus novaisi 37.59220 7.4331543 0.1240432 0.2940948
Discoglossus galganoi 32.71215 4.8703373 0.1739762 0.2327465
Discoglossus pictus 34.11433 8.4205481 0.1508807 0.3563427
Discoglossus scovazzi 33.81670 7.8268129 0.1495117 0.3518580
Hyla arborea 35.46782 2.4402588 0.1429389 0.1263647
Hyla meridionalis 35.00066 2.4975613 0.1225487 0.1153174
Boana albomarginata 37.05342 9.8182168 0.1319985 0.3822931
Boana faber 37.74968 4.0566618 0.1220565 0.1558899
Leptodactylus fuscus 38.64980 15.5496516 0.1353399 0.5705433
Leptodactylus latrans 37.49833 5.9607367 0.1211408 0.2236524
Pelobates cultripes 35.05683 3.0873347 0.1446740 0.1473795
Pelodytes ibericus 33.60718 2.2699440 0.0913140 0.1033273
Pelodytes punctatus 33.57987 2.7660345 0.1154146 0.1360515
Phasmahyla spectabilis 34.85572 10.4742114 0.1276487 0.4072916
Phyllodytes luteolus 36.47355 12.7425672 0.1279742 0.5008105
Phyllodytes melanomystax 37.24333 16.7241585 0.1330341 0.6591738
Pithecopus rohdei 36.82828 11.2799193 0.1360178 0.4346870
Physalaemus camacan 36.32224 20.4784728 0.1339034 0.8018721
Physalaemus erikae 36.63712 19.8677707 0.1345101 0.7786767
Pipa carvalhoi 36.01514 17.8179208 0.1395476 0.6933710
Pleurodeles waltl 33.56475 4.6485278 0.1364741 0.2145150
Pelophylax perezi 35.45840 4.7071927 0.1399468 0.2227183
Rana temporaria 33.25867 0.7437576 0.1314276 0.0418929
Rhinella crucifer 36.91400 13.5789891 0.1325925 0.5298529
Rhinella hoogmoedi 36.01245 15.7363110 0.1226459 0.6116361
Rhinella diptycha 37.67846 7.1037589 0.1255264 0.2574013
Salamandra salamandra 31.92020 3.0745371 0.1309795 0.1508895
Ololygon agilis 38.07360 19.4875879 0.1284396 0.7608263
Scinax eurydice 37.70814 11.8918001 0.1287549 0.4578202
Sphaenorhynchus prasinus 37.22559 14.0899427 0.1273486 0.5514213
Trachycephalus mesophaeus 37.07261 12.3070037 0.1251925 0.4848371
Triturus pygmaeus 33.90250 5.6450539 0.1313584 0.2636277
Desmognathus carolinensis 31.90158 7.5792690 0.1233274 0.2895605
Desmognathus fuscus 32.21470 1.7904952 0.1418146 0.0775668
Desmognathus monticola 32.07484 5.1014552 0.1263172 0.2019459
Desmognathus ochrophaeus 31.27907 2.4019815 0.1265893 0.1082744
Desmognathus ocoee 31.91811 9.0663088 0.1252681 0.3374157
Desmognathus orestes 31.99354 8.5763637 0.1252990 0.3331097
Plethodon cinereus 32.90209 1.8679561 0.1128909 0.0918481
Plethodon hubrichti 31.66814 5.1070949 0.1183808 0.2044553
Plethodon richmondi 31.96018 5.7113536 0.1237528 0.2253615
Plethodon virginia 31.86418 6.3878034 0.1227377 0.2561231
Plethodon cylindraceus 31.55514 2.6132503 0.1116987 0.1090486
Plethodon glutinosus 32.11147 2.6036651 0.1157815 0.1057241
Plethodon montanus 31.63822 7.2028220 0.1222038 0.2800241
Plethodon teyahalee 31.93891 7.6708146 0.1234175 0.2882602
Plethodon punctatus 31.69873 5.9842884 0.1237999 0.2428210
Plethodon wehrlei 31.97423 4.9338506 0.1272147 0.2047725
Rhinella spinulosa 36.77510 1.6792336 0.0839307 0.1031322
Bryophryne cophites 26.70259 3.0079874 0.1497181 0.2011119
Bryophryne hanssaueri 24.73739 3.2455593 0.1445457 0.2145290
Bryophryne nubilosus 25.65551 2.8955671 0.1468640 0.1937736
Noblella myrmecoides 29.17549 13.8297552 0.1445667 0.5297371
Noblella pygmaea 26.23381 3.0214653 0.1404028 0.2005598
Oreobates cruralis 32.63153 11.5208401 0.1485885 0.5415513
Pristimantis buccinator 31.23264 12.4973642 0.1331129 0.5412214
Pristimantis carvalhoi 29.91050 16.2550269 0.1366556 0.5975981
Pristimantis danae 28.63742 9.1868209 0.1394979 0.4784075
Pristimantis lindae 27.67285 4.2325748 0.1374622 0.2859249
Pristimantis ockendeni 29.07599 14.0152912 0.1335453 0.5412334
Pristimantis platydactylus 28.88496 12.0374648 0.1378684 0.6353338
Pristimantis salaputium 28.72880 3.1989424 0.1420520 0.2115826
Pristimantis toftae 29.47045 12.5175212 0.1428816 0.5548656
Psychrophrynella usurpator 27.47295 3.1758567 0.1445062 0.2132946
Eurycea nana 34.62224 10.8515253 0.1231991 0.4040657
Aneides ferreus 31.15977 5.7447453 0.1267984 0.3131427
Ensatina eschscholtzii 30.54211 6.8673734 0.1259896 0.3625886
Plethodon dunni 31.18135 5.7547071 0.1258671 0.3171349
Plethodon vehiculum 30.87583 4.7451189 0.1256419 0.2777759
Rhyacotriton olympicus 27.63918 4.4272095 0.1371720 0.2669584
Agalychnis dacnicolor 32.21004 13.4220497 0.1668800 0.5269765
Anaxyrus boreas 35.37909 1.3685809 0.1060820 0.0839189
Anaxyrus canorus 35.12555 4.1644123 0.1332097 0.2284401
Anaxyrus cognatus 37.74822 2.7076482 0.1351643 0.1264390
Anaxyrus compactilis 35.50241 8.0925766 0.1204651 0.3482736
Anaxyrus retiformis 37.51842 5.5736821 0.1319652 0.2316246
Anaxyrus exsul 35.33852 4.1627347 0.1113743 0.2074005
Anaxyrus fowleri 35.24840 3.3335841 0.1393498 0.1370017
Anaxyrus nelsoni 35.47392 4.1072399 0.0997265 0.2087943
Dendrobates auratus 32.37270 21.7199292 0.1397169 0.8078943
Incilius alvarius 36.49633 4.6698208 0.1392618 0.1993624
Incilius canaliferus 36.22440 13.4962497 0.1177060 0.4974011
Incilius marmoreus 36.72723 9.9300228 0.1423793 0.3747158
Incilius mazatlanensis 36.72131 7.5022253 0.1317468 0.2936653
Leptodactylus melanonotus 35.79088 12.3049591 0.1354684 0.4624952
Lithobates catesbeianus 34.98783 2.3630041 0.0779649 0.1044071
Lithobates palmipes 33.89274 13.6682895 0.1299539 0.4977325
Lithobates palustris 30.89755 2.7310802 0.1267352 0.1182065
Lithobates pipiens 32.58702 0.7462146 0.1773336 0.0384003
Lithobates sylvaticus 32.03755 0.5918826 0.1483915 0.0349865
Lithobates warszewitschii 31.31035 19.0644512 0.1262679 0.7048592
Pseudacris cadaverina 31.92663 6.0174258 0.1715263 0.2799594
Pseudacris regilla 33.61363 1.5293991 0.1155792 0.0919788
Rana boylii 31.63922 4.3222790 0.1310769 0.2281221
Lithobates clamitans 33.41402 1.8323922 0.1509304 0.0821521
Rana pretiosa 32.53709 3.1877356 0.1279934 0.1757095
Rhaebo haematiticus 34.76432 13.9456366 0.1302363 0.5329895
Rhinella marina 36.84045 2.9077570 0.1491506 0.1070747
Scaphiopus holbrookii 30.26072 4.1736591 0.1941850 0.1661914
Smilisca fodiens 35.24641 6.1814436 0.1754397 0.2498349
Smilisca baudinii 36.15278 11.7692333 0.1487184 0.4502001
Spea hammondii 34.64317 3.1144172 0.1429053 0.1554243
Tlalocohyla smithii 36.64299 11.2312276 0.1739553 0.4420024
Adelotus brevis 31.91534 10.0038436 0.1465029 0.4296026
Assa darlingtoni 31.10420 12.1461689 0.1562575 0.5207402
Cophixalus ornatus 30.95022 8.6003614 0.1381921 0.3325436
Crinia parinsignifera 32.98110 6.2121160 0.1548452 0.2840692
Crinia signifera 32.98573 2.0934469 0.1332107 0.1019387
Geocrinia laevis 31.03966 4.1411135 0.1719357 0.2412690
Geocrinia victoriana 31.59138 2.8832335 0.1781639 0.1539253
Limnodynastes dorsalis 32.86558 2.9247113 0.1491678 0.1412983
Limnodynastes fletcheri 29.63963 7.5362132 0.1745970 0.3318408
Limnodynastes peronii 32.21026 2.5415572 0.1845834 0.1155415
Limnodynastes salmini 32.76633 7.1728659 0.1469080 0.3054585
Limnodynastes tasmaniensis 32.58545 3.5149936 0.1648466 0.1549739
Litoria aurea 33.46141 3.4581957 0.1327104 0.1680405
Litoria bicolor 35.98738 10.4689601 0.1766691 0.3799321
Cyclorana brevipes 36.58744 7.3740156 0.1411053 0.2957682
Litoria caerulea 35.09641 3.1440472 0.1659396 0.1243468
Litoria chloris 36.36788 4.4903733 0.1207016 0.1927979
Litoria citropa 31.39531 4.2940795 0.1247556 0.2111795
Litoria ewingii 33.00333 2.0509106 0.0968506 0.1146215
Litoria fallax 36.51312 3.4798735 0.1267154 0.1477013
Litoria freycineti 33.04389 8.7525171 0.1629739 0.3863970
Litoria gracilenta 35.95938 2.9342908 0.1066263 0.1204283
Litoria lesueurii 31.99473 2.5686918 0.1387758 0.1266606
Litoria peronii 34.15075 3.2466334 0.1407803 0.1475272
Litoria phyllochroa 31.19378 5.6810297 0.1402817 0.2558809
Litoria rothii 34.31159 6.4267948 0.1798600 0.2368473
Litoria rubella 35.78480 3.4554432 0.1599977 0.1373021
Litoria verreauxii 31.00342 2.9865697 0.1469790 0.1443763
Mixophyes fasciolatus 29.39715 6.0470434 0.1308217 0.2615626
Neobatrachus pictus 30.60911 4.7448920 0.1505485 0.2301309
Philoria frosti 27.45344 2.6593773 0.1288291 0.1355863
Philoria loveridgei 29.83052 9.1528030 0.1535991 0.3919913
Philoria sphagnicolus 28.21748 10.1398282 0.1704582 0.4433988
Pseudophryne bibronii 33.39529 2.8232694 0.1509215 0.1369985
Pseudophryne corroboree 29.95901 3.2041108 0.2156861 0.1677196
Pseudophryne dendyi 34.48447 6.0859968 0.1381492 0.3118419
Dicamptodon tenebrosus 28.17619 6.6784953 0.1360270 0.3653086
Rhyacotriton variegatus 26.38422 5.8523707 0.1437428 0.3225512
Buergeria japonica 38.20828 9.3704908 0.1541821 0.3416879
Eleutherodactylus coqui 36.31050 11.8820506 0.1762884 0.4562115
Eleutherodactylus portoricensis 34.73325 21.4735869 0.1217940 0.7970227
Ascaphus truei 28.60808 2.9974450 0.1473752 0.1840779
Ambystoma jeffersonianum 33.92129 1.1796412 0.1184082 0.0528307
Ambystoma tigrinum 34.39242 1.4877056 0.1285672 0.0687734
Pseudacris triseriata 36.02640 0.8914264 0.0818421 0.0403610
Anaxyrus woodhousii 37.66817 1.6114378 0.0952896 0.0732470
Gastrophryne carolinensis 37.11722 2.2654925 0.1325774 0.0866698
Fejervarya cancrivora 37.32253 20.4261160 0.1313539 0.7337612
Ceratophrys cranwelli 37.81002 10.0227642 0.1312649 0.3784074
Dermatonotus muelleri 38.54105 14.0967514 0.1394330 0.5211526
Elachistocleis bicolor 36.84878 6.1546992 0.1353074 0.2423385
Boana raniceps 38.06152 10.4971606 0.1384480 0.3801402
Lepidobatrachus llanensis 39.34535 9.5149285 0.1379822 0.3750165
Leptodactylus bufonius 38.77449 8.3672087 0.1341124 0.3152022
Leptodactylus latinasus 38.27009 5.8183790 0.1320783 0.2302662
Leptodactylus podicipinus 37.87559 14.4799374 0.1402565 0.5219127
Phyllomedusa sauvagii 37.67543 9.6019536 0.1343727 0.3604422
Physalaemus albonotatus 36.59699 9.9170749 0.1390884 0.3632352
Lysapsus limellum 37.64544 9.1483241 0.1280850 0.3382767
Pseudis platensis 37.75647 11.2255465 0.1300566 0.4085919
Scinax acuminatus 38.75717 10.3115539 0.1293263 0.3744487
Scinax nasicus 37.95959 8.0911223 0.1278548 0.3059548
Crossodactylus schmidti 32.77616 10.5435216 0.1341895 0.3912888
Dendropsophus minutus 34.72222 7.4978651 0.0722797 0.2777232
Boana curupi 34.73464 11.2013633 0.1223155 0.4111194
Limnomedusa macroglossa 35.88779 6.7262789 0.1385921 0.2725921
Melanophryniscus devincenzii 34.86807 8.2427217 0.1346833 0.3338350
Melanophryniscus krauczuki 35.35608 10.3083216 0.1335857 0.3820430
Phyllomedusa tetraploidea 37.56040 9.3741969 0.1338808 0.3508478
Rhinella ornata 36.49696 6.2650174 0.1331049 0.2407876
Scinax fuscovarius 37.61067 10.2358998 0.1275453 0.3815967
Alytes muletensis 34.21688 7.9365090 0.1373381 0.3400058
Lissotriton boscai 34.10608 6.3592929 0.1354845 0.3060497
Pelophylax lessonae 34.60030 3.6109739 0.1325715 0.1869427
Rana arvalis 31.88324 1.3440480 0.1263218 0.0762326
Rana iberica 32.45930 3.2263097 0.1104507 0.1632883
Triturus cristatus 33.81386 3.4883609 0.1367414 0.1882583
Acris crepitans 40.09492 1.8287392 0.0485946 0.0720471
Necturus maculosus 31.75270 1.3357826 0.1259081 0.0605515
Ambystoma maculatum 34.91646 2.9041412 0.1089694 0.1323105
Hyperolius tuberilinguis 36.07376 14.8917055 0.1212065 0.5890562
Hyperolius viridiflavus 39.06977 9.2697090 0.0749002 0.3723930
Triturus dobrogicus 34.00271 3.2914769 0.1381718 0.1646092
Eleutherodactylus richmondi 32.57754 39.3787565 0.1291711 1.4599971
Lithobates virgatipes 34.79505 3.8395145 0.1292643 0.1534824
Ambystoma macrodactylum 32.60164 1.8390732 0.1175102 0.1147252
Aneides aeneus 30.95585 8.1932833 0.1251327 0.3229445
Eurycea longicauda 35.02888 3.7933869 0.0626395 0.1574310
Eurycea lucifuga 34.63830 3.6741607 0.0689443 0.1469518
Notophthalmus viridescens 34.89463 0.7531419 0.1814518 0.0334014
Ambystoma opacum 34.85929 2.9830361 0.1145548 0.1183904
Ambystoma mabeei 34.43831 4.9438114 0.1291223 0.1963845
Ambystoma talpoideum 34.47394 8.4275926 0.1293395 0.3122923
Ambystoma laterale 33.86765 2.7412634 0.1228391 0.1458573
Taricha granulosa 33.49126 3.9048929 0.1365402 0.2511301
Amphiuma tridactylum 33.90365 10.9727406 0.1261646 0.4006385
Desmognathus quadramaculatus 30.18392 5.0116277 0.1347364 0.1947823
Plethodon jordani 32.25698 4.2062091 0.1282402 0.1604490
Hemidactylium scutatum 33.38379 5.6270616 0.1233687 0.2444489
Gyrinophilus porphyriticus 32.03470 5.4674750 0.1108568 0.2321687
Pseudotriton montanus 33.49504 6.9134445 0.1154531 0.2684086
Eurycea quadridigitata 34.69269 8.7711484 0.1152250 0.3240464
Cryptobranchus alleganiensis 32.70015 2.4149966 0.1205661 0.0995114
Dryophytes andersonii 37.59761 4.6404496 0.1403212 0.1830401
Osteopilus septentrionalis 35.67680 11.4377573 0.1278421 0.4153134
Acris gryllus 37.31159 8.0327112 0.1151088 0.2972578
Dryophytes cinereus 36.81852 6.5173686 0.1385377 0.2461396
Dryophytes squirellus 35.77479 9.2334835 0.1249346 0.3424816
Cyclorana alboguttata 36.65889 10.1018142 0.1418270 0.3996545
Cyclorana australis 36.72582 11.6545415 0.1405814 0.4283080
Litoria eucnemis 32.58559 19.7648495 0.1312137 0.7297794
Litoria nasuta 33.18227 12.8569767 0.1316665 0.4770837
Litoria nigrofrenata 34.83169 16.6318799 0.1393916 0.5999016
Litoria pearsoniana 31.36166 8.4588587 0.1392071 0.3706182
Neobatrachus sudelli 30.33585 6.3276999 0.1610945 0.2770086
Pseudophryne major 31.49809 10.8357712 0.1524089 0.4417851
Pseudophryne semimarmorata 31.80583 5.9154740 0.1519834 0.3253112
Uperoleia laevigata 31.22234 8.3358806 0.1437851 0.3647188
Uperoleia rugosa 31.97367 8.9650806 0.1528784 0.3833756
Platyplectrum ornatum 35.98971 6.2551289 0.1785995 0.2427903
Eurycea bislineata 33.87822 1.2697053 0.1027152 0.0621476
Plethodon ouachitae 32.10273 5.8705926 0.1235682 0.2209510
Lithobates berlandieri 36.79609 7.4917476 0.1267671 0.3119510
Dryophytes chrysoscelis 38.00793 4.0087859 0.1152905 0.1735754
Rhinella granulosa 37.82245 7.2093286 0.1506642 0.2657099
Pleurodema bufoninum 35.79825 2.2795403 0.1193099 0.1544833
Alsodes gargola 31.46361 2.8668143 0.1217670 0.1807451
Anaxyrus terrestris 36.15789 2.9195681 0.1138981 0.1072395
Xenopus laevis 32.94557 2.6576173 0.1383514 0.1178029
Eleutherodactylus cundalli 33.03194 36.0029414 0.1329940 1.3062070
Eleutherodactylus gossei 32.77041 34.7071136 0.1170241 1.2600756
Eleutherodactylus johnstonei 35.34416 16.7535730 0.1320435 0.6364972
Eleutherodactylus planirostris 35.50404 15.6554686 0.1479865 0.5697575
Odontophrynus occidentalis 32.01959 3.0741075 0.1509751 0.1501935
Rhinella arenarum 36.83196 3.2410565 0.1053951 0.1458827
Melanophryniscus rubriventris 33.41002 7.7579801 0.1201093 0.3981939
Kaloula kalingensis 33.27966 24.8123773 0.1317459 0.8906992
Occidozyga laevis 33.33221 28.0718552 0.1279565 1.0113107
Philautus surdus 32.03380 29.3905791 0.1263874 1.0590492
Platymantis banahao 31.92813 23.9522192 0.1385645 0.8733605
Platymantis corrugatus 31.29564 29.5635217 0.1346269 1.0660484
Platymantis dorsalis 30.81432 34.2458209 0.1318600 1.2381518
Platymantis luzonensis 31.66845 34.5725059 0.1385819 1.2448622
Sanguirana luzonensis 32.51587 25.2378911 0.1329160 0.9050631
Hylarana erythraea 32.49387 19.2677775 0.1315926 0.6872791
Limnonectes woodworthi 34.11164 31.3681914 0.1240071 1.1261051
Platymantis montanus 31.39919 22.4055001 0.1355109 0.8064588
Kaloula walteri 33.77540 27.9842009 0.1428703 1.0085508
Physalaemus cuvieri 34.91222 6.1098230 0.1325461 0.2242250
Pleurodema diplolister 38.63260 5.5369857 0.1374842 0.2113209
Rhinella icterica 37.15915 3.6409673 0.1329886 0.1394009
Rana chensinensis 31.11038 1.8506335 0.1467677 0.0893644
Batrachuperus tibetanus 31.83790 4.9414162 0.1317089 0.2784241
Batrachuperus yenyuanensis 31.25527 9.9207581 0.1319309 0.4888598
Paramesotriton chinensis 33.83186 9.1517601 0.1357275 0.3409739
Tylototriton kweichowensis 33.75427 11.7534203 0.1341059 0.5013229
Quasipaa spinosa 40.90802 7.0160903 0.1431462 0.2632096
Pseudotriton ruber 32.77218 5.4165694 0.1142044 0.2203067
Scaphiopus couchii 35.37886 4.1171028 0.1535052 0.1725881
Leptodactylus mystacinus 38.34201 9.6993963 0.1311239 0.3791203
Pelophylax saharicus 35.23388 9.1849030 0.1360483 0.3959768
Bufotes viridis 35.91465 3.9201107 0.1320976 0.1959403
Leptodactylus albilabris 34.86532 20.5068737 0.1196700 0.7559496
Aplastodiscus ibirapitanga 36.24157 17.8375037 0.1315123 0.7022669
Aplastodiscus sibilatus 34.59024 15.3764665 0.1277686 0.6133786
Aplastodiscus weygoldti 35.01054 12.5387152 0.1243410 0.4894652
Ceratophrys joazeirensis 37.66166 13.3339207 0.1281378 0.5202602
Phyllomedusa burmeisteri 38.02514 11.4839922 0.1423121 0.4464460
Physalaemus cicada 35.61035 11.8180707 0.1373315 0.4657086
Proceratophrys schirchi 35.07616 17.1223913 0.1378430 0.6686164
Physalaemus signifer 37.51504 15.3120342 0.1325745 0.5979565
Scinax alter 37.73443 13.1673778 0.1251735 0.5202877
Stereocyclops incrassatus 36.53194 16.9488922 0.1379128 0.6639400
Scinax pachycrus 37.99501 14.1499495 0.1277623 0.5567946
Gabohyla pauloalvini 37.22576 18.6530002 0.1251870 0.7300249
Dendropsophus sanborni 35.53476 9.3517677 0.1231605 0.3676516
Boana albopunctata 35.65948 12.9959503 0.1173953 0.4790018
Boana pulchella 34.51224 4.5011381 0.1203295 0.1850671
Scinax uruguayus 36.70591 4.9293859 0.1141760 0.1972055
Leptodactylus gracilis 37.24712 8.1966646 0.1328845 0.3303090
Odontophrynus americanus 35.32737 5.8540691 0.1464466 0.2346533
Ololygon aromothyella 37.70005 12.1984375 0.1290977 0.4522051
Phyllomedusa iheringii 37.36712 3.8151065 0.1240612 0.1628297
Physalaemus gracilis 35.63592 4.7443052 0.1224137 0.1908778
Physalaemus henselii 34.49212 4.0667762 0.1083173 0.1670750
Physalaemus riograndensis 37.90734 9.0585595 0.1355549 0.3610913
Pseudis minuta 36.31666 4.4533447 0.1102303 0.1808001
Pseudopaludicola falcipes 37.09572 11.0082315 0.1352730 0.4312673
Rhinella dorbignyi 36.69807 6.7803217 0.1276916 0.2909403
Scinax granulatus 37.05197 8.5475004 0.1250713 0.3454127
Scinax squalirostris 37.99786 10.7132064 0.1285257 0.4159500
Gastrotheca pseustes 34.79926 3.3373357 0.1007766 0.1415829
Gastrotheca riobambae 35.44378 2.6660986 0.1175301 0.1261569
Agalychnis spurrelli 36.94061 6.7432450 0.1527273 0.2579657
Boana geographica 36.91832 6.2669011 0.1430783 0.2311900
Smilisca phaeota 36.76117 6.3919994 0.1474125 0.2424009
Boana crepitans 36.87646 8.6838146 0.1090146 0.3282811
Boana semilineata 36.71193 9.8058724 0.1214357 0.3815155
Leptodactylus troglodytes 37.70078 12.2790740 0.1349928 0.4635892
Physalaemus crombiei 37.74129 15.8438124 0.1357552 0.6205202
Pithecopus nordestinus 36.93523 10.4592646 0.1355698 0.4053558
Scinax x-signatus 38.02416 12.4752840 0.1294922 0.4537159
Trachycephalus atlas 37.63317 8.8551553 0.1335052 0.3519818
Agalychnis hulli 35.84437 17.5575752 0.1421333 0.6771627
Allobates insperatus 33.94459 16.4381344 0.1404480 0.6346450
Allobates zaparo 34.58866 15.9720322 0.1341842 0.6196941
Atelopus elegans 33.07710 9.9784587 0.1288160 0.4195556
Atelopus spumarius 33.36409 22.0896181 0.1299274 0.7954695
Boana boans 36.86326 16.7159480 0.1307887 0.6088735
Boana cinerascens 36.37692 15.5506307 0.1313267 0.5607729
Boana fasciata 36.44485 20.8703240 0.1261314 0.7561467
Boana lanciformis 37.31167 13.6271577 0.1484445 0.4961304
Boana pellucens 37.11919 11.5558499 0.1300659 0.4734882
Chiasmocleis ventrimaculata 35.54454 19.7000582 0.1388993 0.7793272
Chimerella mariaelenae 34.15983 8.7615844 0.1321940 0.3662215
Cruziohyla calcarifer 36.16971 19.0738848 0.1424958 0.7628452
Dendropsophus bifurcus 37.26774 17.0447853 0.1259601 0.6401093
Dendropsophus bokermanni 35.97660 22.1389189 0.1215854 0.8185853
Dendropsophus brevifrons 35.74029 15.9966236 0.1210312 0.5863426
Dendropsophus carnifex 36.44208 5.0670802 0.1288830 0.2493030
Dendropsophus ebraccatus 37.72514 13.0925151 0.1305459 0.4986442
Dendropsophus marmoratus 37.63966 20.2879131 0.1287028 0.7311458
Dendropsophus parviceps 35.86126 20.2233579 0.1221267 0.7327706
Dendropsophus sarayacuensis 36.77383 13.5668930 0.1214954 0.4939026
Dendropsophus triangulum 37.13498 15.6460837 0.1184125 0.5666817
Engystomops coloradorum 36.58316 7.7815661 0.1294375 0.3377967
Engystomops guayaco 36.48918 9.7452974 0.1302980 0.3837839
Engystomops petersi 35.67082 13.0254991 0.1322863 0.4954118
Engystomops randi 37.07417 10.8775615 0.1362801 0.4520530
Epipedobates anthonyi 34.56060 4.2020361 0.1451780 0.1740421
Epipedobates boulengeri 35.05421 11.1267512 0.1382626 0.4530946
Epipedobates espinosai 34.78491 13.4642250 0.1327288 0.5053362
Epipedobates machalilla 35.04932 9.0768196 0.1393055 0.3751468
Epipedobates tricolor 34.89604 7.3379972 0.1343050 0.3011955
Espadarana callistomma 33.20965 13.4907341 0.1388461 0.5403309
Espadarana prosoblepon 32.50357 9.9643329 0.0826525 0.3845727
Gastrotheca lateonota 34.57027 9.4886554 0.1299536 0.4154239
Gastrotheca litonedis 34.77106 7.6610457 0.1304998 0.3555916
Hyloscirtus alytolylax 33.74647 10.3133698 0.1284278 0.4209250
Hyloscirtus lindae 33.32656 9.0817821 0.1262004 0.3771023
Hyloscirtus phyllognathus 34.25477 9.4258254 0.1313580 0.4206969
Hyloxalus bocagei 34.09311 11.7800157 0.1412941 0.4806715
Hyloxalus elachyhistus 32.98280 15.6663978 0.1361408 0.6642536
Colostethus jacobuspetersi 30.53724 5.5654316 0.1256346 0.2769279
Hyloxalus maculosus 33.48969 10.8054622 0.1356817 0.4509721
Hyloxalus nexipus 33.53705 12.8977856 0.1411288 0.5398966
Hyloxalus pulchellus 31.53619 12.8924363 0.1316912 0.5516327
Hyloxalus toachi 33.70892 10.4435403 0.1370672 0.4469094
Hyloxalus vertebralis 32.03762 10.0082614 0.1352692 0.4196539
Leptodactylus labrosus 36.25969 13.3714264 0.1298902 0.5481166
Leptodactylus rhodomystax 35.80443 19.6099393 0.1266547 0.7035120
Leptodactylus ventrimaculatus 35.97225 10.6855210 0.1293890 0.4238892
Leptodactylus wagneri 36.14684 16.8663898 0.1243738 0.6436862
Osteocephalus mutabor 35.84502 11.2507568 0.1221176 0.4530401
Phyllomedusa coelestis 37.14370 16.9645000 0.1379726 0.6698584
Phyllomedusa vaillantii 36.70918 15.4689647 0.1389365 0.5557441
Lithobates bwana 34.37513 11.6957552 0.1389692 0.4704499
Lithobates vaillanti 34.88632 17.2976428 0.1401843 0.6600671
Rhinella margaritifera 35.72005 12.6552292 0.1167276 0.4622606
Scinax elaeochroa 36.90757 21.6644918 0.1267652 0.8109837
Scinax garbei 36.57811 19.2984564 0.1243511 0.6990507
Scinax quinquefasciatus 38.10032 12.7426519 0.1261394 0.5136522
Scinax ruber 37.38576 11.9797490 0.1240679 0.4325272
Eleutherodactylus antillensis 39.84469 31.1562860 0.2074894 1.1465045
Eleutherodactylus brittoni 33.97998 36.4281384 0.0936755 1.3493097
Eleutherodactylus wightmanae 35.08720 30.6327505 0.1246027 1.1362676
Plethodon yonahlossee 31.99571 5.5356724 0.1203781 0.2158428
Plethodon caddoensis 32.52509 6.0048499 0.1210234 0.2237491
Plethodon dorsalis 31.14106 7.0939645 0.1231865 0.2754046
Eurycea multiplicata 35.29046 5.5789261 0.0923948 0.2182359
Plethodon serratus 32.08807 6.9692184 0.1223185 0.2701675
Adenomera andreae 34.65016 19.8495923 0.1207805 0.7176132
Allobates conspicuus 33.05201 20.2153465 0.1298142 0.7545555
Allobates femoralis 35.76609 19.0531374 0.1532516 0.6874322
Allobates trilineatus 32.38898 19.4758602 0.1241443 0.7695610
Ameerega hahneli 34.87428 19.2989992 0.1392685 0.6919355
Ameerega trivittata 35.08190 20.2279073 0.1467246 0.7268737
Chiasmocleis bassleri 35.73983 19.9829625 0.1339145 0.7132882
Ctenophryne geayi 36.28575 19.5443420 0.1410027 0.7112951
Dendropsophus koechlini 36.36041 17.7516225 0.1329053 0.6691826
Dendropsophus leucophyllatus 37.27329 18.5071389 0.1312714 0.6666759
Dendropsophus schubarti 35.16455 18.9547886 0.1190446 0.6973872
Edalorhina perezi 36.28423 18.2449638 0.1308065 0.6647651
Engystomops freibergi 35.53396 17.3524756 0.1219516 0.6371524
Hamptophryne boliviana 36.30525 20.7335299 0.1351112 0.7493332
Boana punctata 36.93842 15.2330094 0.1377188 0.5572430
Leptodactylus bolivianus 35.71466 20.5149165 0.1237567 0.7456278
Leptodactylus didymus 35.41066 16.4395312 0.1213713 0.7372448
Leptodactylus leptodactyloides 36.14050 18.3938871 0.1281492 0.6629116
Leptodactylus petersii 36.35015 17.5258808 0.1263186 0.6268164
Lithodytes lineatus 36.20001 19.0647513 0.1325848 0.6947641
Oreobates quixensis 33.10891 17.6188957 0.1664060 0.6438333
Osteocephalus buckleyi 36.08096 20.2336657 0.1349008 0.7370392
Phyllomedusa camba 37.63045 15.1538985 0.1428968 0.5648873
Pristimantis fenestratus 31.35547 17.8433763 0.1432215 0.6375118
Ranitomeya sirensis 34.72916 16.3712952 0.1506547 0.7397430
Scarthyla goinorum 35.46039 18.1555330 0.1145509 0.6457283
Scinax ictericus 37.21921 21.4807690 0.1262205 0.9269441
Sphaenorhynchus lacteus 37.85198 19.9921156 0.1311824 0.7227151
Leptodactylus lithonaetes 36.98472 15.4510149 0.1514773 0.5525890
Chiropterotriton multidentatus 31.26475 6.0028860 0.1222220 0.2586117
Bufo bankorensis 35.56948 5.7767231 0.1566579 0.2091798
Odorrana swinhoana 32.45261 19.1247487 0.1364150 0.6953413
Kurixalus eiffingeri 32.69997 12.2894191 0.1028447 0.4447803
Fejervarya limnocharis 36.80688 5.7534787 0.1254149 0.2158818
Hylarana latouchii 34.73251 9.3596051 0.1345240 0.3410991
Rana longicrus 33.23651 16.5423759 0.1323306 0.6035160
Rana sauteri 31.83992 19.1654726 0.1317941 0.6961106
Kaloula pulchra 36.29268 6.5902624 0.1731697 0.2383341
Batrachyla taeniata 34.00455 1.6683514 0.1091738 0.1126937
Atelopus limosus 34.06267 23.8008976 0.1356618 0.8722778
Physalaemus nattereri 37.71244 6.5977471 0.1348520 0.2419743
Boana pardalis 38.07937 8.0850765 0.1364192 0.3140255
Hylorina sylvatica 32.95919 3.3644839 0.1328401 0.2369259
Craugastor crassidigitus 33.88668 23.1609538 0.1358378 0.8597226
Craugastor fitzingeri 34.59417 19.1867051 0.1442309 0.7157156
Dendropsophus anceps 35.37279 10.3874111 0.1205514 0.4034062
Dendropsophus decipiens 34.67701 12.1544764 0.1114419 0.4664445
Alytes maurus 34.22058 8.5504907 0.1419431 0.3846693
Bufo gargarizans 34.40812 1.9213489 0.1411800 0.0908227
Pseudacris feriarum 35.41802 5.7263248 0.1250849 0.2231041
Cophixalus aenigma 28.12543 13.5322046 0.1423999 0.5063692
Cophixalus bombiens 31.14672 15.6303478 0.1439942 0.5811071
Cophixalus concinnus 28.77287 12.8486771 0.1409551 0.4802522
Cophixalus exiguus 32.91085 14.6947925 0.1487390 0.5337749
Cophixalus hosmeri 30.61092 14.1419269 0.1471042 0.5281092
Cophixalus infacetus 32.43335 17.7911809 0.1463361 0.6837361
Cophixalus mcdonaldi 31.14597 11.2581993 0.1429628 0.4455380
Cophixalus monticola 30.15332 14.3794489 0.1418168 0.5376343
Cophixalus neglectus 30.15729 18.6832545 0.1448550 0.7472612
Cophixalus saxatilis 32.19438 13.9897850 0.1487174 0.5078909
Craugastor rhodopis 31.62385 12.1089501 0.1336858 0.4902416
Rheohyla miotympanum 36.31561 12.9831485 0.1306760 0.5320724
Engystomops pustulosus 36.30104 6.1937275 0.1468198 0.2320241
Craugastor loki 32.42587 8.8905521 0.1320943 0.3328506
Pleurodema brachyops 38.59158 12.0302096 0.1573112 0.4459004
Pristimantis frater 30.73729 12.8370273 0.1285885 0.5375634
Pristimantis medemi 31.50748 17.8107510 0.1455362 0.7287983
Pristimantis taeniatus 32.86541 15.1973238 0.1488610 0.5771638
Pristimantis fallax 32.36195 16.8607977 0.1506951 0.7085255
Pristimantis w-nigrum 32.26499 13.2799844 0.1604242 0.5433993
Pristimantis bicolor 32.25870 18.3232803 0.1451603 0.7667730
Pristimantis bogotensis 32.08614 10.4578354 0.1400834 0.4510933
Pristimantis savagei 30.24743 18.4527802 0.1394652 0.7588160
Pristimantis renjiforum 33.12582 18.7757760 0.1383669 0.7998374
Pristimantis conspicillatus 31.93100 19.3279089 0.1405764 0.7242452
Pristimantis elegans 32.13891 10.2760100 0.1391916 0.4402823
Pristimantis nervicus 32.49752 15.4326814 0.1390076 0.6639109
Eurycea sosorum 33.82483 9.6247304 0.0969221 0.3576186
Duttaphrynus melanostictus 35.37124 9.3047391 0.1344155 0.3411658
Limnonectes blythii 33.52474 20.2279058 0.1279579 0.7134996
Limnonectes malesianus 33.87734 21.4122666 0.1279963 0.7533289
Nyctixalus pictus 33.62010 24.0844152 0.1322157 0.8607765
Polypedates leucomystax 35.40683 19.4718675 0.1352311 0.7125531
Microhyla butleri 34.71235 15.1200224 0.1402786 0.5571824
Microhyla heymonsi 36.59422 15.5112200 0.1447279 0.5646290
Microhyla mantheyi 33.55581 21.6092877 0.1360796 0.7575153
Pseudis paradoxa 37.77251 14.5719362 0.1245937 0.5275504
Anaxyrus punctatus 37.28466 4.9168091 0.1293904 0.2156454
Craugastor longirostris 36.31172 18.1619050 0.1441543 0.7020346
Pristimantis achatinus 34.61531 13.1697466 0.1498401 0.5238302
Pristimantis latidiscus 33.27723 19.5615145 0.1450631 0.7676233
Pristimantis laticlavius 31.67845 9.8006337 0.1432213 0.4272497
Pristimantis incomptus 31.49632 10.2265411 0.1422970 0.4421868
Pristimantis quaquaversus 31.56357 14.7593372 0.1452524 0.5910952
Pristimantis crenunguis 30.87098 9.9561726 0.1446881 0.4317986
Pristimantis trachyblepharis 30.21793 12.5085250 0.1373349 0.5209421
Pristimantis actites 31.48284 9.0749079 0.1390777 0.3918722
Pristimantis unistrigatus 32.42753 7.2587580 0.1433203 0.3242432
Pristimantis vertebralis 28.61296 8.5455981 0.1389958 0.3798749
Pristimantis riveti 31.71116 12.5755184 0.1440930 0.5668911
Pristimantis phoxocephalus 29.11756 8.8250174 0.1395150 0.3804169
Pristimantis pycnodermis 31.21826 9.5217024 0.1424704 0.4095413
Pristimantis curtipes 31.48554 9.9298012 0.1402477 0.4422142
Pleurodema marmoratum 34.11738 6.2184942 0.1295535 0.3762044
Microhyla fissipes 35.74556 7.6932754 0.1365291 0.2899093
Hoplobatrachus rugulosus 38.70076 14.3792039 0.1419918 0.5278267
Microhyla ornata 36.15122 8.9141705 0.1471349 0.3318942
Rana dybowskii 27.48359 1.6451739 0.1030049 0.0871131
Hyperolius marmoratus 41.01820 4.3041378 0.2079399 0.1765936
Oophaga pumilio 29.81233 16.0856858 0.1151173 0.6012899
Odontophrynus barrioi 34.62070 4.1065931 0.1479946 0.2018624
Pleurodema nebulosum 36.98184 5.7986323 0.1375285 0.2852390
Pleurodema tucumanum 37.21321 6.2037682 0.1323888 0.2681083
Desmognathus brimleyorum 32.40243 8.0125689 0.1270742 0.2986658
Ambystoma californiense 34.08800 7.8010906 0.1223616 0.3915001
Ambystoma mavortium 33.89635 5.4109834 0.1232949 0.2650791
Batrachuperus karlschmidti 30.64659 7.4796180 0.1341000 0.4479413
Batrachuperus londongensis 30.50442 11.2102842 0.1341546 0.5383008
Batrachuperus pinchonii 31.44109 8.8260055 0.1307414 0.4756909
Liua shihi 31.10349 12.5303648 0.1341216 0.4989493
Liua tsinpaensis 31.06816 10.4086499 0.1355559 0.4592655
Pseudohynobius flavomaculatus 30.75546 15.4703492 0.1368695 0.5927038
Pseudohynobius kuankuoshuiensis 31.04559 20.3094689 0.1357769 0.8024141
Pseudohynobius shuichengensis 30.79754 18.0792175 0.1340304 0.7712110
Pseudohynobius puxiongensis 30.82670 16.4183418 0.1375821 0.7854088
Hynobius abei 30.49769 12.2965933 0.1356243 0.4973077
Hynobius lichenatus 30.73622 10.1917846 0.1369758 0.4323137
Hynobius tokyoensis 30.67489 11.7382560 0.1367335 0.4706414
Hynobius nigrescens 30.53368 10.0761629 0.1349505 0.4202248
Hynobius takedai 30.70928 9.8104647 0.1365622 0.4239986
Hynobius stejnegeri 30.74945 14.8590176 0.1367228 0.5709296
Hynobius amjiensis 30.71464 11.9913934 0.1353108 0.4428365
Hynobius chinensis 30.71969 11.0398376 0.1360455 0.4505146
Hynobius guabangshanensis 30.66685 23.5276583 0.1350072 0.8489041
Hynobius maoershanensis 30.64347 19.1462931 0.1357441 0.7154024
Hynobius yiwuensis 30.76008 14.6375133 0.1340303 0.5469888
Hynobius hidamontanus 30.60222 9.3149957 0.1353178 0.4074523
Hynobius katoi 30.77728 13.9288430 0.1337531 0.5473697
Hynobius naevius 30.44969 15.1297963 0.1345739 0.5913775
Hynobius dunni 30.65102 16.3707111 0.1366338 0.6265392
Hynobius nebulosus 30.67083 13.5177025 0.1386055 0.5307393
Hynobius tsuensis 30.65512 13.0685721 0.1362849 0.5133373
Hynobius okiensis 30.46744 11.7772649 0.1335379 0.4707558
Hynobius leechii 30.38638 7.7408997 0.1374037 0.3518578
Hynobius yangi 30.74625 11.2052490 0.1337609 0.4682474
Hynobius quelpaertensis 30.72215 10.2389272 0.1369450 0.4228601
Hynobius turkestanicus 30.67778 7.5769380 0.1353492 0.4931962
Hynobius arisanensis 30.37658 37.9728790 0.1367191 1.3736466
Hynobius sonani 30.44121 34.6841917 0.1375569 1.2576967
Hynobius formosanus 30.44837 29.9607650 0.1357983 1.1080957
Hynobius boulengeri 30.73057 14.5496067 0.1364301 0.5649662
Hynobius kimurae 31.49229 11.2396658 0.1358163 0.4571324
Hynobius retardatus 30.71250 8.4984148 0.1356605 0.4327785
Pachyhynobius shangchengensis 30.97503 14.8734032 0.1363908 0.5333558
Salamandrella keyserlingii 30.88068 5.0286169 0.1348573 0.3196623
Ranodon sibiricus 30.25731 8.3046883 0.1345034 0.5508509
Onychodactylus fischeri 31.70963 11.4501276 0.1328235 0.5338727
Onychodactylus japonicus 31.72963 17.4393062 0.1328329 0.6996913
Andrias japonicus 32.06936 15.0367928 0.1284768 0.5949036
Andrias davidianus 32.90436 16.2650047 0.1279828 0.6352520
Siren intermedia 32.03656 23.8382565 0.1309385 0.8943095
Siren lacertina 32.17471 23.0164659 0.1327166 0.8598806
Pseudobranchus striatus 32.01936 34.3477732 0.1309484 1.2442807
Pseudobranchus axanthus 32.15028 42.3464181 0.1308479 1.5104747
Chioglossa lusitanica 33.29848 15.2518502 0.1343753 0.7848602
Mertensiella caucasica 33.21515 10.7109947 0.1354821 0.5459939
Lyciasalamandra antalyana 32.40243 13.9500558 0.1366049 0.5824283
Lyciasalamandra helverseni 32.36080 20.8720863 0.1360216 0.8607517
Lyciasalamandra fazilae 32.40875 13.1815002 0.1339058 0.5786232
Lyciasalamandra flavimembris 32.27943 14.2721930 0.1389711 0.5970138
Lyciasalamandra atifi 32.24300 12.3149642 0.1382568 0.5340517
Lyciasalamandra luschani 32.28495 11.9957010 0.1372193 0.5277007
Salamandra algira 32.38302 11.6133978 0.1390955 0.5040257
Salamandra infraimmaculata 32.16805 10.1478279 0.1391480 0.4582350
Salamandra corsica 32.21785 10.4380956 0.1368745 0.4375236
Salamandra lanzai 32.26716 7.0780020 0.1352901 0.3497992
Salamandra atra 32.22615 5.8391256 0.1342051 0.2955551
Calotriton arnoldi 33.12200 13.1391374 0.1354935 0.5777992
Calotriton asper 33.91979 8.7213724 0.1364886 0.4238993
Triturus carnifex 34.16912 6.6064247 0.1339638 0.3204145
Triturus karelinii 34.13699 6.7697749 0.1368373 0.3401071
Triturus marmoratus 34.08574 7.5241507 0.1326368 0.3783076
Neurergus crocatus 33.90220 12.6362573 0.1380420 0.5938622
Neurergus kaiseri 33.89288 14.0894598 0.1381165 0.6037200
Neurergus strauchii 33.97061 11.0474380 0.1369343 0.5450603
Ommatotriton ophryticus 33.73633 8.8641315 0.1367067 0.4469247
Ommatotriton vittatus 33.88021 16.6955088 0.1374960 0.7026157
Lissotriton helveticus 34.02893 7.7273086 0.1350480 0.4190697
Lissotriton italicus 33.98332 10.0159541 0.1357079 0.4214111
Lissotriton montandoni 33.76779 4.8004968 0.1320433 0.2478373
Lissotriton vulgaris 33.96899 6.1081251 0.1359628 0.4067436
Ichthyosaura alpestris 33.73193 7.5236742 0.1366478 0.3839833
Cynops ensicauda 34.02365 35.1669684 0.1363645 1.2809177
Cynops pyrrhogaster 34.01787 11.1667146 0.1349227 0.4503527
Laotriton laoensis 33.92406 22.4795548 0.1340717 0.8290478
Pachytriton brevipes 33.96047 16.9733560 0.1330793 0.6357693
Paramesotriton caudopunctatus 33.79567 16.6808203 0.1352111 0.6200444
Paramesotriton deloustali 33.78610 18.3931040 0.1346938 0.7025355
Paramesotriton fuzhongensis 33.88422 16.3394845 0.1359692 0.5906686
Paramesotriton hongkongensis 33.62524 23.1678069 0.1354974 0.8293314
Euproctus montanus 33.63953 12.5071033 0.1366891 0.5222454
Euproctus platycephalus 33.77891 13.6732766 0.1351713 0.5629785
Notophthalmus meridionalis 34.89036 23.3841998 0.1354032 0.9185094
Notophthalmus perstriatus 34.93538 18.6426789 0.1376509 0.6758152
Taricha torosa 33.61512 11.5851173 0.1369894 0.5845840
Taricha rivularis 33.66739 12.2376307 0.1368843 0.6755586
Echinotriton andersoni 33.51272 36.7955820 0.1355455 1.3415668
Echinotriton chinhaiensis 33.71924 15.7627107 0.1352863 0.5973383
Tylototriton asperrimus 33.45637 22.0400314 0.1347812 0.8219103
Tylototriton notialis 33.46644 26.5141027 0.1342082 0.9462252
Tylototriton hainanensis 33.49042 39.0489347 0.1332379 1.3976060
Tylototriton wenxianensis 33.54965 12.0100599 0.1315564 0.5077694
Tylototriton vietnamensis 33.77347 21.1549088 0.1333026 0.7665829
Tylototriton shanjing 33.50214 16.3893963 0.1339166 0.7367820
Tylototriton verrucosus 33.78934 19.1530569 0.1320581 0.8295233
Pleurodeles poireti 33.45716 11.8889289 0.1356879 0.4807881
Salamandrina perspicillata 33.33051 9.0770399 0.1362843 0.4137340
Salamandrina terdigitata 33.30186 14.1885303 0.1375561 0.5781181
Ambystoma altamirani 33.29857 9.4064529 0.1227514 0.4632531
Ambystoma amblycephalum 34.24511 15.7578915 0.1247365 0.7042737
Ambystoma lermaense 34.11683 13.6782378 0.1236195 0.6131111
Ambystoma andersoni 33.51877 12.8721003 0.1281269 0.5727922
Ambystoma mexicanum 34.31735 9.6521504 0.1266998 0.4552944
Ambystoma rosaceum 34.38571 10.7498222 0.1270151 0.4495329
Ambystoma dumerilii 34.34006 14.2255388 0.1243099 0.6354994
Ambystoma ordinarium 34.16735 14.6440150 0.1239705 0.6326163
Ambystoma annulatum 35.02609 6.9568376 0.1240880 0.2784965
Ambystoma bishopi 34.04761 14.5940933 0.1245842 0.5196798
Ambystoma cingulatum 35.02077 14.8094644 0.1233339 0.5424819
Ambystoma barbouri 34.23880 9.9449650 0.1232005 0.3874320
Ambystoma texanum 34.40005 10.3894775 0.1242690 0.4059289
Ambystoma flavipiperatum 34.08040 18.2288193 0.1232737 0.7462354
Ambystoma gracile 33.87794 5.1667211 0.1250665 0.3171579
Ambystoma granulosum 34.15190 15.8633091 0.1261140 0.7024886
Ambystoma leorae 34.11775 12.5441792 0.1247283 0.5680981
Ambystoma taylori 34.15021 10.2612810 0.1238336 0.4766545
Ambystoma silvense 33.31849 9.9843353 0.1255840 0.4313137
Ambystoma rivulare 34.52187 12.1561504 0.1214480 0.5533229
Ambystoma velasci 33.92154 14.7073979 0.1257905 0.6238437
Dicamptodon ensatus 29.06861 13.1798740 0.1374339 0.7048267
Dicamptodon aterrimus 29.01722 6.6164380 0.1378488 0.3780612
Dicamptodon copei 29.05049 8.0640322 0.1371717 0.4667919
Necturus punctatus 31.80630 10.3280932 0.1287307 0.4026699
Necturus lewisi 31.79039 7.0604238 0.1310469 0.2819973
Necturus beyeri 31.71140 14.4898356 0.1318239 0.5222395
Necturus alabamensis 31.73837 12.1573003 0.1301301 0.4393504
Rhyacotriton kezeri 28.14413 8.8862142 0.1371375 0.4883957
Rhyacotriton cascadae 28.16118 8.8889235 0.1362376 0.4915142
Amphiuma pholeter 33.47551 20.5749743 0.1246467 0.7328381
Amphiuma means 33.44040 16.1567605 0.1213527 0.5965102
Aneides vagrans 31.25734 9.3746835 0.1273085 0.5775994
Aneides flavipunctatus 31.27246 12.0253628 0.1245383 0.6747683
Aneides lugubris 31.20745 14.4762805 0.1224873 0.7326539
Aneides hardii 31.27918 10.5610748 0.1243078 0.4909234
Desmognathus abditus 31.96916 11.3543141 0.1257547 0.4326139
Desmognathus welteri 31.96433 10.0761131 0.1283603 0.3897247
Desmognathus apalachicolae 31.96778 13.0842953 0.1263009 0.4683053
Desmognathus auriculatus 31.87974 7.3118586 0.1279551 0.2899367
Desmognathus santeetlah 31.89972 11.2025906 0.1259068 0.4192348
Desmognathus imitator 31.92766 11.4988529 0.1267315 0.4338333
Desmognathus aeneus 31.70610 13.7405510 0.1260155 0.4983610
Desmognathus folkertsi 31.27510 12.3268813 0.1263018 0.4584972
Desmognathus marmoratus 31.29829 12.6480799 0.1277179 0.4779198
Desmognathus wrighti 31.41782 13.1624103 0.1276158 0.5011380
Phaeognathus hubrichti 31.47247 20.3380877 0.1247251 0.7195900
Plethodon albagula 31.91582 9.4256764 0.1253351 0.3678227
Plethodon sequoyah 32.00763 10.3683913 0.1221347 0.3831725
Plethodon kisatchie 31.99676 11.1414980 0.1226802 0.4058635
Plethodon kiamichi 31.92430 10.5342040 0.1243300 0.3930793
Plethodon amplus 31.82088 10.0599037 0.1254268 0.3792102
Plethodon meridianus 31.81754 9.7561320 0.1251175 0.3659866
Plethodon metcalfi 31.81681 10.5549013 0.1222540 0.3985473
Plethodon aureolus 31.90622 9.2987283 0.1243347 0.3508432
Plethodon cheoah 31.88507 10.3550302 0.1254781 0.3938599
Plethodon shermani 31.91953 9.6651010 0.1210337 0.3661640
Plethodon fourchensis 32.00837 10.5998594 0.1237957 0.3968356
Plethodon kentucki 32.00257 9.0602869 0.1254503 0.3594969
Plethodon petraeus 31.92171 11.3588955 0.1229151 0.4248010
Plethodon angusticlavius 31.71449 7.6902063 0.1239121 0.3028233
Plethodon ventralis 31.45361 11.4416768 0.1232368 0.4270030
Plethodon welleri 31.67048 10.8767313 0.1258705 0.4182339
Plethodon websteri 31.88089 14.5720385 0.1225273 0.5241342
Plethodon shenandoah 32.19997 8.1460089 0.1228530 0.3259209
Plethodon electromorphus 31.95433 6.0770520 0.1256187 0.2537725
Plethodon nettingi 31.97708 8.0504155 0.1234894 0.3307486
Plethodon hoffmani 31.96429 6.4041573 0.1231300 0.2886482
Plethodon sherando 31.97704 9.3640482 0.1235793 0.3681270
Plethodon asupak 31.30883 12.4190758 0.1258753 0.6623358
Plethodon elongatus 31.44887 11.5034696 0.1243653 0.6159507
Plethodon stormi 31.40626 10.8463366 0.1261817 0.5753655
Plethodon idahoensis 31.68302 6.7819629 0.1233595 0.3877092
Plethodon vandykei 31.47947 8.6927006 0.1218053 0.5002256
Plethodon larselli 31.40337 8.3140893 0.1248482 0.4573971
Plethodon neomexicanus 31.35090 8.4460723 0.1259067 0.4351228
Hydromantes brunus 31.57055 14.5507030 0.1256025 0.7924925
Hydromantes platycephalus 31.58842 12.6687133 0.1248078 0.6615079
Hydromantes shastae 31.58728 13.2171173 0.1239961 0.7037080
Karsenia koreana 31.61242 14.3843820 0.1261234 0.5960138
Eurycea junaluska 34.04846 10.9144264 0.1123841 0.4115936
Eurycea cirrigera 34.09875 7.6567257 0.1077117 0.2955207
Eurycea wilderae 34.10814 10.8771303 0.1087171 0.4102182
Eurycea guttolineata 34.33334 9.3321633 0.1076537 0.3563235
Eurycea chisholmensis 34.09367 15.8785487 0.1116993 0.5915914
Eurycea tonkawae 34.17668 13.9877040 0.1095350 0.5206468
Eurycea naufragia 34.18901 13.4357519 0.1114468 0.4975072
Eurycea tridentifera 34.13831 17.6916812 0.1102591 0.6694034
Eurycea pterophila 34.17322 16.0785147 0.1109265 0.6033881
Eurycea troglodytes 34.19313 18.3461068 0.1095041 0.6973339
Eurycea waterlooensis 34.09651 13.2438909 0.1122203 0.4888025
Eurycea tynerensis 34.20947 7.2095250 0.1078525 0.2931531
Urspelerpes brucei 34.31257 11.8189921 0.1142154 0.4392921
Stereochilus marginatus 32.72033 7.9875206 0.1175385 0.3140362
Batrachoseps gregarius 32.21430 14.2126056 0.1194103 0.7345412
Batrachoseps nigriventris 32.23854 16.0045519 0.1205506 0.7705137
Batrachoseps stebbinsi 32.24159 13.5616499 0.1198362 0.6935682
Batrachoseps simatus 32.20864 12.3195142 0.1190511 0.6854904
Batrachoseps kawia 32.19962 10.2450831 0.1208971 0.6412445
Batrachoseps relictus 32.18946 13.5694973 0.1175611 0.7500328
Batrachoseps diabolicus 32.26996 17.6362582 0.1192425 0.8620515
Batrachoseps regius 32.23450 18.6690939 0.1194778 0.8630113
Batrachoseps gabrieli 32.31850 13.3529022 0.1159342 0.6562995
Batrachoseps gavilanensis 32.24050 16.3545323 0.1191635 0.8187124
Batrachoseps incognitus 32.28068 18.8633563 0.1198935 0.9639366
Batrachoseps minor 32.20986 17.8521138 0.1195006 0.8859637
Batrachoseps major 32.30070 16.8578065 0.1179415 0.7865252
Batrachoseps pacificus 32.26916 15.7598789 0.1181209 0.8050158
Batrachoseps luciae 32.22508 18.1402511 0.1192654 0.9267602
Batrachoseps robustus 32.21937 14.2937106 0.1215410 0.7339153
Batrachoseps attenuatus 32.27125 15.7764698 0.1191629 0.8226890
Batrachoseps campi 32.34415 13.7234994 0.1205916 0.7512857
Batrachoseps wrighti 32.34658 10.7947584 0.1198992 0.5883531
Bolitoglossa adspersa 32.18719 28.0596380 0.1210211 1.1990370
Bolitoglossa medemi 31.97705 41.4229793 0.1225699 1.5563853
Bolitoglossa alberchi 32.12215 27.4980530 0.1194473 0.9964234
Bolitoglossa altamazonica 32.02497 36.5131741 0.1222613 1.3548147
Bolitoglossa peruviana 32.10381 39.5578055 0.1194531 1.6311321
Bolitoglossa palmata 32.09099 17.7224290 0.1188099 0.7692825
Bolitoglossa alvaradoi 32.08612 33.3598837 0.1212691 1.3265743
Bolitoglossa dofleini 32.28265 31.5361419 0.1202047 1.1910497
Bolitoglossa anthracina 32.20218 49.0897900 0.1221572 1.7509235
Bolitoglossa biseriata 32.06921 38.0033664 0.1207242 1.4627860
Bolitoglossa sima 32.11936 24.9241747 0.1180578 1.0295916
Bolitoglossa borburata 32.25033 36.2329316 0.1213557 1.3504699
Bolitoglossa bramei 32.31616 37.5044916 0.1197011 1.5396740
Bolitoglossa pesrubra 32.34402 22.1406488 0.1175052 1.2894709
Bolitoglossa capitana 32.29017 38.3691243 0.1171797 1.5307424
Bolitoglossa carri 32.08081 20.7163326 0.1209707 0.8537026
Bolitoglossa oresbia 32.06759 20.8578521 0.1199959 0.8593628
Bolitoglossa celaque 32.26051 26.6047599 0.1197832 1.0154184
Bolitoglossa synoria 32.10817 34.6589874 0.1193040 1.2633894
Bolitoglossa heiroreias 32.19718 29.8250312 0.1207319 1.0879368
Bolitoglossa cerroensis 32.11797 22.6333843 0.1220499 1.3173677
Bolitoglossa epimela 32.03562 28.8830461 0.1205277 1.2838210
Bolitoglossa marmorea 32.04044 53.7135231 0.1217735 1.9145034
Bolitoglossa chica 32.03550 30.8582243 0.1221039 1.2524587
Bolitoglossa colonnea 32.07314 47.3603206 0.1215314 1.7994711
Bolitoglossa nigrescens 32.28014 29.3189428 0.1210323 1.2989163
Bolitoglossa compacta 32.13067 50.3297674 0.1188913 1.7980182
Bolitoglossa robusta 32.30729 39.9700194 0.1218887 1.5260614
Bolitoglossa schizodactyla 32.08365 42.0565854 0.1212779 1.5867561
Bolitoglossa conanti 32.01187 29.4537065 0.1227822 1.1140799
Bolitoglossa diaphora 32.09277 44.7197598 0.1200772 1.7551524
Bolitoglossa dunni 32.09046 39.6796094 0.1201151 1.5533024
Bolitoglossa copia 32.24707 48.3223050 0.1206438 1.7346439
Bolitoglossa cuchumatana 32.24843 20.8044937 0.1207591 0.8296313
Bolitoglossa helmrichi 32.11767 26.2960455 0.1185172 0.9977071
Bolitoglossa cuna 32.07445 46.7587828 0.1226559 1.6791644
Bolitoglossa suchitanensis 32.03939 29.3970836 0.1198968 1.0697957
Bolitoglossa morio 32.07360 26.4561254 0.1196983 1.0500478
Bolitoglossa flavimembris 32.15005 24.8635025 0.1208872 0.9698189
Bolitoglossa decora 32.06122 51.4824875 0.1193583 1.9418622
Bolitoglossa digitigrada 32.25227 21.2915627 0.1197652 1.3646765
Bolitoglossa diminuta 32.12972 20.6457498 0.1228287 1.2019858
Bolitoglossa engelhardti 32.04964 23.8033281 0.1185010 0.9485045
Bolitoglossa equatoriana 32.00645 36.7137714 0.1202591 1.4310499
Bolitoglossa paraensis 32.07397 43.8861597 0.1193228 1.5722553
Bolitoglossa flaviventris 32.17310 27.5158342 0.1193095 1.0724778
Bolitoglossa franklini 32.05006 24.5087423 0.1237187 0.9557349
Bolitoglossa lincolni 32.06610 24.7988358 0.1220006 0.9567480
Bolitoglossa gomezi 32.05383 35.0451598 0.1197175 1.5464692
Bolitoglossa gracilis 32.06118 33.1718126 0.1175089 1.4723288
Bolitoglossa subpalmata 32.01808 30.7898387 0.1189756 1.2715565
Bolitoglossa tica 32.01405 28.2057049 0.1171088 1.2482575
Bolitoglossa guaramacalensis 32.33234 32.4600877 0.1192014 1.2072452
Bolitoglossa hartwegi 32.25959 31.4533683 0.1199560 1.1421811
Bolitoglossa hermosa 32.15223 26.5502049 0.1175057 1.0875213
Bolitoglossa riletti 32.12881 24.9297818 0.1202011 0.9788674
Bolitoglossa zapoteca 32.27882 27.3254564 0.1176921 0.9881319
Bolitoglossa hiemalis 32.11126 36.2328515 0.1217018 1.4968595
Bolitoglossa hypacra 32.22127 38.3544766 0.1196198 1.4640130
Bolitoglossa indio 32.27507 40.0059101 0.1229459 1.4290655
Bolitoglossa insularis 32.09380 28.8580133 0.1181863 1.0477474
Bolitoglossa jacksoni 32.13891 17.6834644 0.1211707 0.7809337
Bolitoglossa nicefori 32.01067 29.3896748 0.1200502 1.2414103
Bolitoglossa lignicolor 32.04933 39.2139048 0.1213365 1.5291089
Bolitoglossa longissima 32.06494 34.1915513 0.1223273 1.2845589
Bolitoglossa porrasorum 32.09871 42.6741557 0.1184677 1.6174647
Bolitoglossa lozanoi 32.11469 29.5211766 0.1199866 1.2144233
Bolitoglossa macrinii 32.22414 28.2449345 0.1211942 1.0438047
Bolitoglossa oaxacensis 32.20104 25.1854896 0.1200354 0.9587351
Bolitoglossa magnifica 32.28515 51.5786483 0.1205163 1.8367623
Bolitoglossa meliana 32.25600 24.5650980 0.1214352 0.9838953
Bolitoglossa mexicana 32.08156 30.6872882 0.1213421 1.1444185
Bolitoglossa odonnelli 32.11516 32.0449084 0.1191938 1.2217660
Bolitoglossa minutula 32.11225 42.2578105 0.1196592 1.7340058
Bolitoglossa sooyorum 32.05662 22.3985503 0.1215570 1.3035425
Bolitoglossa mombachoensis 32.14530 30.1424558 0.1187399 1.0967248
Bolitoglossa striatula 32.06719 33.2774514 0.1215557 1.2453111
Bolitoglossa mulleri 32.18465 20.7488399 0.1216089 0.8059430
Bolitoglossa yucatana 32.25888 37.5207754 0.1219498 1.3504317
Bolitoglossa orestes 32.27513 30.6428711 0.1194931 1.1569954
Bolitoglossa rufescens 32.02233 24.6468961 0.1219158 0.9300370
Bolitoglossa obscura 32.23925 20.3187523 0.1192775 1.1817765
Bolitoglossa occidentalis 32.13011 28.0831942 0.1191711 1.0449692
Bolitoglossa pandi 32.20819 38.3011852 0.1215807 1.5163903
Bolitoglossa phalarosoma 32.17938 29.6604567 0.1220973 1.2563033
Bolitoglossa platydactyla 32.15362 26.0694345 0.1198346 1.0245041
Bolitoglossa ramosi 32.10174 34.5785689 0.1198468 1.4324049
Bolitoglossa rostrata 32.07739 25.7781144 0.1204008 0.9884973
Bolitoglossa salvinii 32.10399 29.7202505 0.1208936 1.1081603
Bolitoglossa savagei 32.06037 31.4735478 0.1197169 1.1585241
Bolitoglossa silverstonei 32.03907 38.7627477 0.1214802 1.4987863
Bolitoglossa sombra 32.15994 58.6425369 0.1200045 2.0959836
Bolitoglossa stuarti 32.02463 26.7085771 0.1198559 1.0228628
Bolitoglossa tatamae 32.06958 37.9892962 0.1226775 1.5126924
Bolitoglossa taylori 32.06566 41.9931609 0.1203129 1.5368640
Bolitoglossa vallecula 32.16599 28.2975150 0.1204742 1.2182565
Bolitoglossa veracrucis 32.02455 29.0567255 0.1211374 1.0528685
Bolitoglossa walkeri 32.03411 30.1980379 0.1218796 1.2730322
Ixalotriton niger 32.17896 31.3721581 0.1228503 1.1319377
Ixalotriton parvus 32.11128 30.1943565 0.1175581 1.0738695
Parvimolge townsendi 32.23410 23.1314123 0.1188530 0.9190280
Pseudoeurycea ahuitzotl 32.33058 27.9624132 0.1212682 1.1526411
Pseudoeurycea altamontana 32.22911 16.3666529 0.1179063 0.7737358
Pseudoeurycea robertsi 32.26202 14.7091792 0.1208924 0.7241191
Pseudoeurycea longicauda 32.25696 23.7548421 0.1197769 0.9932661
Pseudoeurycea tenchalli 32.26774 23.7369033 0.1189658 0.9298722
Pseudoeurycea cochranae 32.26417 23.0405971 0.1208565 0.9137941
Pseudoeurycea gadovii 32.23552 19.9007019 0.1184760 0.8716138
Pseudoeurycea melanomolga 32.20647 14.1664115 0.1208971 0.6502887
Pseudoeurycea amuzga 32.15132 30.7129064 0.1217824 1.1971375
Pseudoeurycea aquatica 32.38218 16.6735178 0.1196276 0.7330113
Pseudoeurycea aurantia 32.35488 15.9792545 0.1187154 0.7089815
Pseudoeurycea juarezi 32.33810 22.1045205 0.1190861 0.8816108
Pseudoeurycea saltator 32.14108 14.9291224 0.1214892 0.6582604
Pseudoeurycea ruficauda 32.10977 19.9339607 0.1177907 0.8010113
Pseudoeurycea goebeli 32.26153 32.4543346 0.1207166 1.1910862
Pseudoeurycea rex 32.23915 24.1375061 0.1200639 0.9632042
Pseudoeurycea conanti 32.15877 20.9029150 0.1200081 0.8406253
Pseudoeurycea mystax 32.19002 20.7040279 0.1187828 0.8241514
Pseudoeurycea obesa 32.15197 27.1457013 0.1220649 0.9990911
Pseudoeurycea werleri 32.24825 22.9975694 0.1206395 0.8914851
Pseudoeurycea firscheini 32.16178 23.4703680 0.1193466 0.9381259
Pseudoeurycea leprosa 32.23799 21.3951429 0.1188030 0.9100352
Pseudoeurycea nigromaculata 32.08913 26.2747466 0.1204180 1.0113152
Pseudoeurycea lynchi 32.20588 21.9467713 0.1225541 0.8944504
Pseudoeurycea lineola 32.29658 24.5731974 0.1192179 0.9862732
Pseudoeurycea mixcoatl 32.22888 24.9228820 0.1201512 0.9768483
Pseudoeurycea mixteca 32.29283 22.8084263 0.1183499 0.9270970
Pseudoeurycea orchileucos 32.25731 15.4807795 0.1225337 0.6807336
Pseudoeurycea orchimelas 32.23785 26.8429735 0.1196739 0.9824744
Pseudoeurycea papenfussi 32.17175 15.1525992 0.1220428 0.6644830
Pseudoeurycea smithi 32.18657 15.8973615 0.1195709 0.7005734
Pseudoeurycea tlahcuiloh 32.25143 26.9053122 0.1200774 1.1074839
Pseudoeurycea tlilicxitl 32.19692 14.6748636 0.1229203 0.6952976
Bradytriton silus 32.13376 23.1177267 0.1225246 0.9059689
Oedipina alfaroi 32.06490 34.7403160 0.1226273 1.4286744
Oedipina alleni 32.16922 35.8299814 0.1187775 1.4333614
Oedipina savagei 32.12815 41.9789297 0.1201521 1.6407034
Oedipina altura 32.17136 21.4054865 0.1186488 1.2448455
Oedipina carablanca 32.17761 36.8173638 0.1215222 1.3227629
Oedipina elongata 32.11877 34.7620752 0.1199328 1.2879308
Oedipina collaris 32.12827 36.1893399 0.1186419 1.4399414
Oedipina complex 32.11815 37.5925731 0.1216175 1.4572881
Oedipina maritima 32.21167 52.1263495 0.1194556 1.8463005
Oedipina parvipes 32.23822 49.8546970 0.1169975 1.8447339
Oedipina cyclocauda 32.18479 35.4288900 0.1202245 1.3757565
Oedipina pseudouniformis 32.17680 28.0652177 0.1218156 1.2472963
Oedipina gephyra 32.19680 37.4435661 0.1188809 1.4272320
Oedipina tomasi 32.12371 40.2652999 0.1201142 1.5804075
Oedipina gracilis 32.15794 32.7022285 0.1202246 1.3008780
Oedipina pacificensis 32.99953 40.0498979 0.1225503 1.6029702
Oedipina uniformis 32.12445 36.4271772 0.1178328 1.3851516
Oedipina grandis 33.14425 55.3085298 0.1213902 1.9711834
Oedipina poelzi 32.21552 33.7645942 0.1202159 1.3379858
Oedipina ignea 32.14436 26.3727795 0.1220259 1.0178613
Oedipina paucidentata 32.21549 19.8524849 0.1198818 1.1551481
Oedipina stenopodia 32.09441 32.3804448 0.1238241 1.1865906
Oedipina taylori 32.13964 33.9089531 0.1192412 1.2200683
Nototriton abscondens 32.21858 30.3815282 0.1202375 1.2066824
Nototriton gamezi 32.22033 34.2513890 0.1196567 1.2344479
Nototriton picadoi 32.18345 32.6869490 0.1207742 1.3466141
Nototriton guanacaste 32.23518 42.0124640 0.1178152 1.5709391
Nototriton saslaya 32.22262 28.7225459 0.1190831 1.0633557
Nototriton barbouri 32.24496 33.3310102 0.1217336 1.2722996
Nototriton brodiei 32.25514 37.7102997 0.1192471 1.4787764
Nototriton stuarti 32.28868 44.3393274 0.1206057 1.7421364
Nototriton limnospectator 32.21970 22.7614054 0.1193087 0.8993029
Nototriton lignicola 32.21842 31.4280893 0.1198924 1.2218606
Nototriton major 32.19916 21.2198548 0.1208539 1.2324558
Nototriton richardi 32.23270 35.8756833 0.1181778 1.2866855
Nototriton tapanti 32.18646 31.7894386 0.1195529 1.4120174
Dendrotriton bromeliacius 32.03331 24.5174100 0.1205123 0.9835584
Dendrotriton megarhinus 32.03547 27.1413800 0.1214589 0.9920824
Dendrotriton xolocalcae 31.96444 20.7869530 0.1231301 0.8234371
Dendrotriton sanctibarbarus 32.06036 26.0288128 0.1206092 0.9981740
Dendrotriton chujorum 32.01262 18.7078993 0.1226609 0.8253737
Dendrotriton cuchumatanus 31.98094 19.2174818 0.1217220 0.8462579
Dendrotriton kekchiorum 32.03719 21.8912824 0.1204577 0.8658252
Dendrotriton rabbi 32.02662 19.3051620 0.1212368 0.8502090
Nyctanolis pernix 32.11120 20.3139736 0.1219835 0.8111905
Chiropterotriton arboreus 31.52653 15.7912704 0.1212906 0.7044128
Chiropterotriton cracens 31.38139 18.3142630 0.1239478 0.7653606
Chiropterotriton terrestris 31.73957 14.8903560 0.1234633 0.6630485
Chiropterotriton priscus 31.84987 18.1849997 0.1234352 0.7693180
Chiropterotriton chiropterus 31.62023 18.5156856 0.1240128 0.7775073
Chiropterotriton chondrostega 31.84039 17.1307361 0.1211983 0.7458602
Chiropterotriton magnipes 31.81319 22.6404830 0.1206349 0.9133477
Chiropterotriton dimidiatus 31.98974 18.6656573 0.1207247 0.8283702
Chiropterotriton orculus 31.93671 17.2116296 0.1188469 0.7591900
Chiropterotriton lavae 31.82193 17.5010959 0.1193627 0.7442123
Cryptotriton alvarezdeltoroi 32.04704 29.0511496 0.1209782 1.0400850
Cryptotriton monzoni 31.87460 28.1470746 0.1202308 1.0235805
Cryptotriton nasalis 31.78894 38.0243940 0.1218449 1.4935927
Cryptotriton sierraminensis 31.95525 29.1298616 0.1203670 1.0871431
Cryptotriton veraepacis 31.86400 20.1882498 0.1212077 0.7954811
Thorius adelos 31.96366 16.3894126 0.1182449 0.7201184
Thorius arboreus 31.87441 15.3008078 0.1232337 0.6744795
Thorius macdougalli 31.97976 15.4567409 0.1227282 0.6819096
Thorius aureus 32.12893 14.9295990 0.1217012 0.6618887
Thorius boreas 32.08869 14.7908309 0.1221399 0.6509431
Thorius grandis 32.13409 24.5933653 0.1191207 1.0097971
Thorius omiltemi 32.15970 23.1138708 0.1199876 0.9056809
Thorius pulmonaris 32.10635 14.7059923 0.1205667 0.6463042
Thorius minutissimus 32.07844 27.2332227 0.1208142 0.9831097
Thorius narisovalis 32.11297 18.4535988 0.1192105 0.7640313
Thorius papaloae 32.19182 14.4002483 0.1203869 0.6291798
Thorius dubitus 32.13946 21.8206642 0.1205270 0.8703762
Thorius troglodytes 33.09991 17.2026285 0.1194897 0.7397272
Thorius insperatus 32.13739 14.8757347 0.1233152 0.6520869
Thorius minydemus 32.05115 19.5722142 0.1242522 0.8257276
Thorius spilogaster 33.03959 24.1565462 0.1206739 0.9654236
Thorius pennatulus 32.09369 23.2159201 0.1227480 0.9300935
Thorius smithi 32.10360 16.4850762 0.1214831 0.7239705
Thorius infernalis 32.34051 25.0047348 0.1206891 1.0295876
Thorius magnipes 31.95877 23.0255757 0.1205263 0.9148655
Thorius schmidti 32.10991 22.8545983 0.1190127 0.9107680
Thorius narismagnus 33.05132 26.9129477 0.1217673 0.9859692
Thorius lunaris 32.12597 22.5397567 0.1214699 0.8920372
Thorius munificus 32.09601 13.8552563 0.1182131 0.6384118
Ascaphus montanus 28.97264 6.2564332 0.1460927 0.3595713
Leiopelma hochstetteri 32.08346 26.1102547 0.1426869 1.3468694
Leiopelma archeyi 31.76564 27.7784050 0.1439268 1.4337262
Leiopelma pakeka 31.85256 22.9457122 0.1404519 1.3437171
Leiopelma hamiltoni 31.80769 24.3830378 0.1426587 1.3063055
Barbourula kalimantanensis 33.49586 66.4005260 0.1385489 2.2629339
Barbourula busuangensis 33.59937 93.7756207 0.1404869 3.3730500
Bombina orientalis 33.68084 15.6811575 0.1421954 0.7248239
Bombina bombina 33.58513 12.9608479 0.1392382 0.6521283
Bombina variegata 33.58455 14.0301664 0.1417764 0.6876636
Bombina lichuanensis 33.57097 24.3874252 0.1410157 1.0201520
Latonia nigriventer 33.75781 26.2373110 0.1479887 1.1111786
Discoglossus montalentii 32.95831 12.5746486 0.1471813 0.5233624
Discoglossus sardus 34.16632 9.8126711 0.1469425 0.4076984
Rhinophrynus dorsalis 33.41399 50.8728189 0.1380629 1.8934289
Hymenochirus boettgeri 33.54604 50.6853709 0.1377751 1.8354695
Hymenochirus feae 33.48970 51.4216826 0.1411129 1.8280620
Hymenochirus boulengeri 33.52438 53.6553041 0.1428822 1.9587949
Hymenochirus curtipes 33.61323 51.2116920 0.1384247 1.8149355
Pseudhymenochirus merlini 33.54442 43.9332435 0.1401369 1.5941640
Xenopus amieti 33.11071 35.6160357 0.1396567 1.3464257
Xenopus longipes 33.09789 28.3484523 0.1402487 1.0928026
Xenopus boumbaensis 32.28491 38.6090371 0.1431696 1.4161173
Xenopus itombwensis 33.05725 27.5403770 0.1422555 1.1215259
Xenopus wittei 33.02530 27.7761344 0.1397267 1.1808249
Xenopus andrei 33.05702 34.7038358 0.1422925 1.2741324
Xenopus fraseri 33.08040 38.6261580 0.1402284 1.3603352
Xenopus pygmaeus 33.13474 31.2085418 0.1363748 1.1285949
Xenopus gilli 32.86208 13.0502287 0.1408143 0.6256691
Xenopus petersii 33.06516 20.4539630 0.1404488 0.8034244
Xenopus victorianus 33.05835 19.5249848 0.1410226 0.8271642
Xenopus lenduensis 33.03203 28.6326973 0.1409832 1.1136297
Xenopus vestitus 33.04799 31.6223228 0.1403583 1.3590130
Xenopus borealis 33.24072 23.1998378 0.1387575 1.0676909
Xenopus clivii 33.06502 23.4948597 0.1404004 1.0384355
Xenopus largeni 33.11440 22.7224884 0.1412370 1.0829291
Xenopus ruwenzoriensis 33.17345 28.9638934 0.1411940 1.1896956
Xenopus muelleri 33.12956 24.8226433 0.1379490 1.0200748
Xenopus epitropicalis 33.35656 41.6856479 0.1405116 1.5113939
Xenopus tropicalis 33.30357 39.3259342 0.1417505 1.4167156
Pipa arrabali 34.77597 48.7717531 0.1371156 1.7515180
Pipa myersi 34.72659 49.2161348 0.1356413 1.7499478
Pipa parva 34.78109 48.6341878 0.1352697 1.8275400
Pipa pipa 34.81802 46.2821603 0.1351955 1.6753763
Pipa aspera 34.78740 49.8174892 0.1377512 1.8065842
Pipa snethlageae 34.69430 48.4567839 0.1391983 1.6903805
Scaphiopus hurterii 32.43079 15.8333172 0.1529022 0.5891593
Spea multiplicata 33.28488 14.3466669 0.1416889 0.6390097
Spea bombifrons 33.57123 8.0095698 0.1439993 0.3692159
Spea intermontana 33.60420 7.3340454 0.1443775 0.4111268
Pelodytes caucasicus 33.49831 10.0920373 0.1311749 0.5021195
Oreolalax chuanbeiensis 33.94855 13.0426378 0.1367425 0.6914585
Oreolalax nanjiangensis 33.35744 14.7703085 0.1365208 0.7272513
Oreolalax omeimontis 33.88773 21.3312132 0.1375552 0.9895310
Oreolalax popei 33.91594 15.0720821 0.1390546 0.7630783
Oreolalax multipunctatus 33.90356 15.5381068 0.1383045 0.7949623
Oreolalax granulosus 33.30563 27.9020661 0.1358122 1.2159365
Oreolalax jingdongensis 33.38461 26.1892270 0.1367777 1.1700194
Oreolalax liangbeiensis 33.99005 21.1997570 0.1374390 1.0128936
Oreolalax major 34.00884 16.4492895 0.1370385 0.8259878
Oreolalax rugosus 34.19637 23.9715849 0.1371522 1.1583151
Oreolalax xiangchengensis 33.37722 17.6510953 0.1354391 1.0623875
Oreolalax puxiongensis 34.20569 21.5708010 0.1360825 1.0309979
Oreolalax lichuanensis 33.91195 23.0225177 0.1383892 0.9060612
Oreolalax pingii 33.91427 21.4805865 0.1393552 1.0202669
Oreolalax schmidti 33.98458 15.6186481 0.1343791 0.7875141
Oreolalax rhodostigmatus 33.96600 22.4934829 0.1360428 0.8961386
Scutiger adungensis 33.25994 19.5829776 0.1390513 1.1237059
Scutiger boulengeri 33.35358 9.8397146 0.1361228 0.7644444
Scutiger muliensis 33.32935 19.6357731 0.1357327 1.1077072
Scutiger tuberculatus 33.32917 22.7992951 0.1367932 1.0927070
Scutiger mammatus 33.34114 9.6559984 0.1375671 0.7708011
Scutiger brevipes 33.25058 14.1677753 0.1398694 0.9235677
Scutiger chintingensis 33.23115 21.8313880 0.1389682 1.0156155
Scutiger glandulatus 33.91028 12.7952589 0.1388831 0.8272539
Scutiger gongshanensis 34.24497 23.5102568 0.1360869 1.2569825
Scutiger jiulongensis 34.20205 16.0431822 0.1355115 0.8910164
Scutiger liupanensis 33.30062 13.2811955 0.1358048 0.6490044
Scutiger nepalensis 33.36433 12.3316624 0.1383020 0.7352340
Scutiger ningshanensis 33.27653 14.5802683 0.1392034 0.6150369
Scutiger nyingchiensis 33.36554 10.9877754 0.1371612 0.7527914
Scutiger pingwuensis 33.28986 14.2987653 0.1354988 0.7179078
Scutiger sikimmensis 33.20323 15.8170708 0.1400927 0.8938121
Leptobrachella baluensis 33.83633 49.6147950 0.1353487 1.8273484
Leptobrachella brevicrus 33.25644 59.9584053 0.1388087 2.1923704
Leptobrachella mjobergi 33.91896 95.9380056 0.1336444 3.5109824
Leptobrachella natunae 33.27625 93.7483212 0.1360340 3.4025075
Leptobrachella palmata 33.21769 61.2476085 0.1354528 2.1467843
Leptobrachella parva 33.91179 58.2006895 0.1368474 2.1012509
Leptobrachella serasanae 33.93907 55.1736475 0.1336577 1.9737635
Leptobrachium abbotti 33.78129 57.9978801 0.1347966 2.0757830
Leptobrachium gunungense 33.86752 73.9581849 0.1350533 2.7193410
Leptobrachium montanum 33.80983 51.8198461 0.1370109 1.8626866
Leptobrachium hasseltii 33.83185 57.6548166 0.1368392 2.0738559
Leptobrachium smithi 33.83040 39.5128594 0.1385490 1.4130211
Leptobrachium hendricksoni 33.88849 56.7578852 0.1355499 2.0009487
Leptobrachium nigrops 33.89288 59.8788161 0.1349185 2.0913821
Leptobrachium ailaonicum 34.04050 30.5156570 0.1356162 1.2871235
Leptobrachium boringii 33.95529 20.4425183 0.1364726 0.8876903
Leptobrachium leishanense 33.92404 28.8519606 0.1362061 1.1047185
Leptobrachium liui 33.99744 29.9871710 0.1350492 1.0877219
Leptobrachium chapaense 33.96191 31.7628977 0.1361050 1.2834975
Leptobrachium huashen 33.98643 30.5961920 0.1359169 1.3068972
Leptobrachium promustache 33.27716 32.7290309 0.1362921 1.2678175
Leptobrachium banae 33.86302 41.3876218 0.1374291 1.4702561
Leptobrachium buchardi 33.90162 41.5280173 0.1365952 1.4434675
Leptobrachium ngoclinhense 33.87113 38.5447733 0.1362279 1.3799092
Leptobrachium hainanense 33.93797 58.7938190 0.1351618 2.0876170
Leptobrachium mouhoti 33.93905 38.8085882 0.1369114 1.3677652
Leptobrachium pullum 33.91717 40.0130302 0.1354882 1.4137438
Leptobrachium xanthops 33.28147 37.3117368 0.1366901 1.3467077
Leptobrachium xanthospilum 33.37486 38.3564833 0.1352235 1.4056925
Leptobrachium leucops 33.94387 41.1529014 0.1366820 1.4424530
Megophrys kobayashii 33.83937 63.8928434 0.1374753 2.3197847
Megophrys ligayae 33.78802 74.3024761 0.1399633 2.6690659
Megophrys montana 33.74090 58.0902578 0.1384977 2.1127014
Megophrys nasuta 33.72021 51.5741343 0.1387367 1.8204753
Megophrys stejnegeri 33.79993 65.8216805 0.1379905 2.3849119
Pelobates fuscus 34.78530 6.2183795 0.1325109 0.3207071
Pelobates syriacus 35.79125 10.2054024 0.1348433 0.4936942
Pelobates varaldii 35.93296 12.4653301 0.1353471 0.5430791
Hadromophryne natalensis 32.72321 28.9313748 0.1404905 1.2824623
Heleophryne hewitti 33.22472 26.3944353 0.1402630 1.2319351
Heleophryne orientalis 32.67351 22.4039345 0.1384791 1.0332410
Heleophryne purcelli 32.62157 22.6918365 0.1401641 1.0772449
Heleophryne regis 32.59569 24.4249365 0.1391650 1.1401547
Heleophryne rosei 32.60900 21.4461660 0.1375451 1.0311061
Philoria pughi 27.69165 11.9671506 0.1604626 0.5130614
Philoria kundagungan 29.63839 14.6197818 0.1535130 0.6245505
Philoria richmondensis 29.64601 13.3377824 0.1558264 0.5685179
Limnodynastes convexiusculus 32.35353 23.8686671 0.1488531 0.8661003
Limnodynastes lignarius 32.26443 24.4480834 0.1501117 0.8628967
Limnodynastes depressus 31.19459 21.9130147 0.1538065 0.7749052
Limnodynastes terraereginae 32.54637 11.4206330 0.1500380 0.4631590
Limnodynastes dumerilii 32.18741 8.4670315 0.1509716 0.4116415
Limnodynastes interioris 32.42892 8.2324402 0.1524721 0.3791103
Lechriodus aganoposis 34.35927 29.1700112 0.1475754 1.0901542
Lechriodus melanopyga 34.45023 28.8661310 0.1467782 1.0590147
Lechriodus fletcheri 34.04257 15.6393674 0.1473670 0.6932693
Lechriodus platyceps 33.96509 34.0754468 0.1480239 1.2607898
Platyplectrum spenceri 33.40746 14.2093749 0.1515199 0.5807311
Heleioporus albopunctatus 32.37199 12.0040163 0.1493112 0.5661891
Heleioporus barycragus 32.33806 11.9844081 0.1516104 0.5784232
Heleioporus australiacus 32.34015 12.8205797 0.1513701 0.6314620
Heleioporus eyrei 32.25051 12.4352725 0.1527813 0.6025632
Heleioporus inornatus 32.32602 13.8095495 0.1505766 0.6915094
Heleioporus psammophilus 32.26480 12.4259655 0.1516708 0.5972637
Neobatrachus albipes 31.10019 11.2896394 0.1504678 0.5452931
Neobatrachus kunapalari 31.01728 11.7351232 0.1547836 0.5517201
Neobatrachus aquilonius 30.62775 18.5798687 0.1533687 0.6889143
Neobatrachus wilsmorei 30.65494 12.2406336 0.1559234 0.5295943
Neobatrachus sutor 30.53298 11.6495753 0.1538431 0.5098417
Neobatrachus fulvus 30.44474 14.4124799 0.1547219 0.5661810
Neobatrachus pelobatoides 30.52877 10.3205250 0.1535438 0.4951488
Notaden bennettii 31.73549 17.8219837 0.1491792 0.7517379
Notaden melanoscaphus 31.61382 29.0421425 0.1522987 1.0457771
Notaden weigeli 32.60758 40.6288688 0.1535004 1.4444641
Notaden nichollsi 32.63629 18.6008861 0.1505233 0.7427969
Arenophryne rotunda 33.31622 15.5554428 0.1540311 0.6380568
Metacrinia nichollsi 32.29471 14.5255951 0.1517190 0.7565627
Myobatrachus gouldii 33.19628 11.0000518 0.1543084 0.5298496
Pseudophryne australis 33.60166 10.9525805 0.1493136 0.5130128
Pseudophryne occidentalis 33.10970 7.7439600 0.1482636 0.3553619
Pseudophryne coriacea 32.41650 15.0642645 0.1543406 0.6593069
Pseudophryne covacevichae 32.46796 21.6110235 0.1521211 0.8537488
Pseudophryne guentheri 31.69878 8.5264247 0.1539993 0.4036654
Pseudophryne douglasi 32.14984 13.9390251 0.1528061 0.5467278
Pseudophryne pengilleyi 31.85647 8.7296227 0.1490354 0.4459444
Pseudophryne raveni 32.40062 18.1347742 0.1498878 0.7455906
Spicospina flammocaerulea 32.15297 15.1190904 0.1505548 0.8037124
Uperoleia altissima 31.78200 23.1376042 0.1521842 0.8820915
Uperoleia littlejohni 31.79939 16.6765346 0.1525828 0.6450852
Uperoleia orientalis 31.83026 20.8751943 0.1508560 0.7474626
Uperoleia arenicola 31.84630 29.0884952 0.1509933 1.0189409
Uperoleia borealis 31.82772 23.9350211 0.1487893 0.8599475
Uperoleia crassa 32.03650 31.0180905 0.1527525 1.1034444
Uperoleia inundata 31.83355 24.0381417 0.1496428 0.8542408
Uperoleia russelli 31.81683 14.5465654 0.1520055 0.5872373
Uperoleia talpa 31.81097 26.7083696 0.1537724 0.9618824
Uperoleia aspera 31.77498 30.3771610 0.1537533 1.0811835
Uperoleia lithomoda 31.67564 26.2819277 0.1534966 0.9522545
Uperoleia trachyderma 31.74591 19.7776263 0.1537263 0.7329469
Uperoleia minima 31.79944 33.0782808 0.1515336 1.1758473
Uperoleia glandulosa 31.83369 21.6325614 0.1499340 0.8161732
Uperoleia martini 31.77113 10.6982442 0.1521979 0.5549978
Uperoleia daviesae 31.82712 38.9437971 0.1516260 1.3776027
Uperoleia micromeles 31.74953 17.1681738 0.1522202 0.6763622
Uperoleia mjobergii 31.70919 27.0721921 0.1517483 0.9694165
Uperoleia mimula 31.68008 24.2400014 0.1527992 0.9022532
Uperoleia fusca 31.35173 13.4350025 0.1517611 0.5690566
Uperoleia tyleri 31.42461 9.7066516 0.1514492 0.4746902
Geocrinia alba 31.51761 10.8359944 0.1537951 0.5367814
Geocrinia vitellina 31.43975 10.5463470 0.1567875 0.5240363
Geocrinia lutea 31.51082 10.8827361 0.1544337 0.5771489
Geocrinia rosea 31.52655 10.9526634 0.1540623 0.5669283
Geocrinia leai 31.37690 9.4163385 0.1569533 0.4752380
Paracrinia haswelli 31.24775 12.8055676 0.1522302 0.6273890
Crinia bilingua 32.77953 29.6140534 0.1489521 1.0560059
Crinia remota 32.43576 24.1533024 0.1497294 0.8715714
Crinia deserticola 32.56661 17.0087610 0.1488748 0.6567377
Crinia riparia 32.02333 8.3494856 0.1497101 0.3841423
Crinia georgiana 32.58088 9.7204239 0.1497837 0.4788702
Crinia glauerti 32.53605 10.3260107 0.1504754 0.5196363
Crinia insignifera 32.63942 9.8334136 0.1485666 0.4698144
Crinia pseudinsignifera 32.61145 10.5620456 0.1502801 0.5131670
Crinia subinsignifera 32.66954 10.8630909 0.1483391 0.5478036
Crinia sloanei 32.60560 8.9569274 0.1495604 0.4088892
Crinia tinnula 32.71089 15.7561273 0.1493139 0.6805636
Crinia nimbus 32.26508 12.4373688 0.1506357 0.7599121
Crinia tasmaniensis 32.41664 12.2366758 0.1518395 0.7322987
Taudactylus eungellensis 31.19975 23.4810043 0.1510491 0.9144386
Taudactylus liemi 32.00694 25.7240806 0.1499512 1.0011667
Taudactylus pleione 31.86168 26.7184909 0.1529868 1.0910354
Mixophyes balbus 29.35625 13.8348850 0.1518678 0.6444908
Mixophyes carbinensis 29.36536 21.0044950 0.1509324 0.7784203
Mixophyes coggeri 30.04161 22.8207545 0.1488278 0.8786322
Mixophyes schevilli 29.40297 23.4680501 0.1507254 0.8923012
Mixophyes fleayi 30.29478 15.9432889 0.1494814 0.6706036
Mixophyes iteratus 29.10621 12.4540379 0.1497982 0.5493268
Mixophyes hihihorlo 30.17006 28.6242781 0.1491986 1.0335515
Calyptocephalella gayi 32.76931 14.7221429 0.1462785 0.7967895
Telmatobufo bullocki 31.98411 14.1526123 0.1452695 0.7674661
Telmatobufo venustus 31.99194 9.1192573 0.1440762 0.5333209
Telmatobufo australis 31.96365 12.1565166 0.1447255 0.7215533
Adelphobates castaneoticus 32.52613 36.1813040 0.1402239 1.2919694
Adelphobates galactonotus 32.47708 33.7224730 0.1368818 1.1963524
Adelphobates quinquevittatus 32.58536 28.4517348 0.1393846 0.9894034
Dendrobates truncatus 32.42408 26.4903727 0.1378890 1.0142341
Dendrobates leucomelas 32.48789 29.2550526 0.1392458 1.0812849
Dendrobates tinctorius 32.46923 37.2939006 0.1376621 1.3486844
Dendrobates nubeculosus 32.50448 32.9262360 0.1377873 1.2068040
Oophaga vicentei 30.26714 30.6700789 0.1383846 1.1237145
Oophaga sylvatica 30.54779 19.0218053 0.1438852 0.7778117
Oophaga occultator 30.53470 31.9804239 0.1408268 1.2398687
Oophaga granulifera 31.12353 31.8299402 0.1378314 1.2442999
Minyobates steyermarki 32.61545 39.2672480 0.1390488 1.4237931
Andinobates altobueyensis 33.72299 37.4918290 0.1351327 1.3996815
Andinobates bombetes 33.74252 28.5473072 0.1355131 1.2089969
Andinobates tolimensis 33.74935 27.9742724 0.1359374 1.2006972
Andinobates virolinensis 33.77799 27.7756904 0.1338104 1.1522526
Andinobates opisthomelas 33.76416 29.0123210 0.1357596 1.1677202
Andinobates claudiae 33.68838 47.2376309 0.1350841 1.6904020
Andinobates minutus 33.69177 36.7844063 0.1344143 1.3805425
Andinobates daleswansoni 33.62908 31.5632974 0.1353506 1.2999933
Andinobates dorisswansonae 33.66541 26.6303296 0.1378532 1.1379820
Andinobates fulguritus 33.78161 34.7686361 0.1348176 1.3191034
Ranitomeya amazonica 33.78390 39.7270745 0.1354979 1.4153124
Ranitomeya benedicta 33.89813 34.0788905 0.1383006 1.3319340
Ranitomeya fantastica 33.73414 31.0857315 0.1365724 1.2575145
Ranitomeya summersi 33.90463 31.0333776 0.1350343 1.2801409
Ranitomeya reticulata 33.84225 33.0822752 0.1377052 1.2054635
Ranitomeya uakarii 33.87888 34.9870390 0.1376079 1.3755078
Ranitomeya ventrimaculata 33.77968 33.5256195 0.1349195 1.1922524
Ranitomeya variabilis 33.71469 33.1081470 0.1341630 1.3488828
Ranitomeya flavovittata 33.91502 35.8995826 0.1377562 1.2476003
Ranitomeya vanzolinii 33.93441 36.8734658 0.1348969 1.4701167
Ranitomeya imitator 33.89377 31.6275362 0.1359649 1.2526171
Excidobates captivus 32.85541 26.0343979 0.1361899 1.0413917
Excidobates mysteriosus 33.27632 23.9906007 0.1367837 1.0664900
Phyllobates aurotaenia 33.29188 35.3212504 0.1359551 1.3679706
Phyllobates terribilis 33.22713 45.3210922 0.1405636 1.7391777
Phyllobates bicolor 33.24539 34.8568964 0.1362698 1.3891290
Phyllobates lugubris 33.28640 38.5869785 0.1380274 1.4534538
Phyllobates vittatus 32.67858 35.1176553 0.1373579 1.4651826
Hyloxalus aeruginosus 32.88447 17.3208947 0.1355863 0.8341770
Hyloxalus anthracinus 33.44920 13.7972765 0.1344972 0.6632808
Hyloxalus awa 33.73935 18.4578842 0.1348008 0.7657477
Hyloxalus azureiventris 33.51428 39.1737496 0.1368601 1.5926116
Hyloxalus chlorocraspedus 33.36944 45.4999126 0.1347488 1.7416094
Hyloxalus betancuri 32.92791 33.5409047 0.1336273 1.2950190
Hyloxalus sauli 34.26132 27.2638700 0.1346090 1.0921539
Hyloxalus borjai 32.87161 20.7785305 0.1369718 0.9345060
Hyloxalus breviquartus 33.44001 27.0239026 0.1381076 1.1258202
Hyloxalus cevallosi 33.45757 31.3635620 0.1352806 1.2250502
Hyloxalus chocoensis 33.51592 35.7929579 0.1386592 1.3943264
Hyloxalus craspedoceps 32.78090 38.4549169 0.1390802 1.5853893
Hyloxalus delatorreae 32.79924 15.5075229 0.1379498 0.7448741
Hyloxalus eleutherodactylus 32.91183 32.7878873 0.1361076 1.3503679
Hyloxalus exasperatus 33.56451 17.1734054 0.1398111 0.7385697
Hyloxalus excisus 33.72016 19.2168759 0.1394473 0.8651671
Hyloxalus faciopunctulatus 33.58320 32.6792442 0.1354138 1.1135162
Hyloxalus fallax 33.55962 21.1488936 0.1362522 0.8370777
Hyloxalus fascianigrus 33.54709 37.1862424 0.1375833 1.4875269
Hyloxalus fuliginosus 32.92748 26.2851398 0.1361410 1.0989847
Hyloxalus idiomelus 32.97973 22.6459608 0.1353557 1.0449470
Hyloxalus infraguttatus 33.56885 22.1264116 0.1386883 0.8974516
Hyloxalus insulatus 32.86588 28.2024622 0.1391123 1.2586345
Hyloxalus lehmanni 33.50826 24.2647789 0.1358353 1.0137610
Hyloxalus leucophaeus 32.88466 34.9192710 0.1359714 1.5380019
Hyloxalus sordidatus 32.85322 26.8518080 0.1364656 1.1706166
Hyloxalus littoralis 33.69823 22.7715883 0.1341245 1.0674036
Hyloxalus mittermeieri 32.86751 18.3390159 0.1356726 0.8838066
Hyloxalus mystax 32.94556 22.5022294 0.1345663 0.8691843
Hyloxalus parcus 32.94214 25.8092178 0.1362618 1.0306515
Hyloxalus patitae 32.97769 34.7551374 0.1351327 1.5220865
Hyloxalus pinguis 33.49766 19.1406890 0.1368205 0.8330088
Hyloxalus pulcherrimus 32.80928 29.7700687 0.1353310 1.3987920
Hyloxalus pumilus 32.89017 24.0094358 0.1365543 0.9245605
Hyloxalus ramosi 33.57896 26.9553099 0.1353423 1.1245699
Hyloxalus ruizi 33.51852 34.8803119 0.1358944 1.3940887
Hyloxalus saltuarius 33.64360 35.8122904 0.1363967 1.4025206
Hyloxalus shuar 33.54267 21.5212515 0.1374808 0.8951507
Hyloxalus spilotogaster 33.46263 33.3934108 0.1368163 1.3767363
Hyloxalus subpunctatus 33.53203 23.1102447 0.1354184 0.9907767
Hyloxalus sylvaticus 32.90927 26.4503827 0.1349136 1.1546945
Hyloxalus utcubambensis 33.47217 29.4980305 0.1362998 1.3405240
Hyloxalus vergeli 33.72176 25.1586088 0.1341527 1.0928979
Ameerega rubriventris 34.59820 26.3664665 0.1370407 1.1074835
Ameerega macero 34.61553 29.1808011 0.1368733 1.2527233
Ameerega bassleri 34.57498 25.8930758 0.1361887 1.0867761
Ameerega berohoka 34.65675 20.5629344 0.1363197 0.7345843
Ameerega bilinguis 34.53437 27.5580583 0.1399388 1.0307112
Ameerega boliviana 34.65901 24.6615822 0.1356918 1.2201354
Ameerega braccata 34.64154 20.0774675 0.1363617 0.7097286
Ameerega flavopicta 33.96110 20.0249381 0.1394184 0.7398230
Ameerega cainarachi 34.03474 35.0258522 0.1383833 1.4261403
Ameerega smaragdina 34.65465 19.1996550 0.1368532 0.9009666
Ameerega petersi 34.66901 29.7345429 0.1368408 1.2081427
Ameerega picta 34.73957 26.1353157 0.1366663 0.9427087
Ameerega parvula 34.57977 23.4424896 0.1372731 0.8822664
Ameerega pongoensis 33.97379 31.6360501 0.1370110 1.2628236
Ameerega planipaleae 34.00338 21.5670122 0.1380433 1.0112024
Ameerega pulchripecta 34.72921 33.4704257 0.1356517 1.2176432
Ameerega simulans 34.62826 22.1349629 0.1373729 1.0706564
Ameerega yungicola 34.62929 21.6211909 0.1359788 1.0653661
Ameerega silverstonei 34.57702 25.8740114 0.1339299 1.0744732
Colostethus agilis 32.98323 32.2956214 0.1403433 1.3189626
Colostethus furviventris 33.75576 34.5217784 0.1377337 1.3334067
Colostethus imbricolus 33.20036 35.3457327 0.1334167 1.3448445
Colostethus inguinalis 33.09863 40.2171572 0.1358856 1.5337214
Colostethus panamansis 33.14070 42.8937930 0.1372789 1.5726646
Colostethus latinasus 32.96207 36.2261494 0.1391362 1.3725631
Colostethus pratti 33.67024 38.9514393 0.1375539 1.4333078
Colostethus lynchi 33.08869 35.9663968 0.1380635 1.3776673
Colostethus mertensi 33.06853 26.7698547 0.1367887 1.1678677
Colostethus poecilonotus 33.03304 16.4232350 0.1371164 0.7916649
Colostethus ruthveni 33.70730 34.3601505 0.1358534 1.2725743
Colostethus thorntoni 33.02103 24.7185552 0.1402223 1.0408692
Colostethus ucumari 33.00472 24.8346556 0.1379107 1.1622410
Epipedobates narinensis 34.84432 22.4734439 0.1366026 0.8757235
Silverstoneia erasmios 34.38519 29.1215527 0.1370932 1.1585587
Silverstoneia flotator 34.41038 36.1465423 0.1338417 1.3458640
Silverstoneia nubicola 34.39444 34.3638034 0.1373756 1.2938899
Allobates algorei 33.65820 28.7828507 0.1365996 1.1613770
Allobates bromelicola 33.70228 36.2212973 0.1373332 1.3377345
Allobates brunneus 33.67760 37.9391900 0.1382943 1.3368926
Allobates crombiei 33.60929 33.6139521 0.1359963 1.1902323
Allobates caeruleodactylus 33.65102 34.2627246 0.1392536 1.1870453
Allobates caribe 33.67935 36.0741967 0.1371425 1.3275728
Allobates chalcopis 33.74600 61.7018424 0.1387882 2.2585003
Allobates subfolionidificans 33.19891 25.0578808 0.1395969 0.8440346
Allobates fratisenescus 33.59855 25.4231596 0.1381588 1.0366765
Allobates fuscellus 33.70404 39.6486664 0.1372967 1.3617814
Allobates gasconi 33.59142 38.3169771 0.1385248 1.3320341
Allobates marchesianus 33.71287 35.1901202 0.1381992 1.2393532
Allobates goianus 33.68852 22.8414266 0.1367623 0.8592085
Allobates granti 33.72422 32.5636250 0.1348581 1.1788464
Allobates ornatus 33.71208 32.4187514 0.1376664 1.3350540
Allobates humilis 33.62512 30.6596059 0.1359526 1.1387514
Allobates pittieri 33.58396 33.9030047 0.1379413 1.2764535
Allobates juanii 33.66919 23.2146337 0.1363787 0.9895292
Allobates kingsburyi 33.69581 17.3527637 0.1374319 0.7566010
Allobates mandelorum 33.73795 33.5503278 0.1373906 1.2300933
Allobates masniger 33.69967 34.8191948 0.1386886 1.2396106
Allobates nidicola 33.64438 36.6173366 0.1378529 1.2698077
Allobates melanolaemus 33.70482 36.4543937 0.1351298 1.2485196
Allobates myersi 33.70175 34.6849773 0.1383265 1.2183960
Allobates niputidea 33.74472 35.1443041 0.1366388 1.3282701
Allobates olfersioides 33.58313 28.3215737 0.1339898 1.1080785
Allobates paleovarzensis 33.73724 36.8205823 0.1370984 1.2819757
Allobates sumtuosus 33.66843 40.3322501 0.1381805 1.4550645
Allobates sanmartini 33.80081 32.1083281 0.1378941 1.1978523
Allobates talamancae 33.72983 36.9136044 0.1346086 1.4030861
Allobates vanzolinius 33.68322 36.4672444 0.1386580 1.2462144
Allobates wayuu 33.64701 56.1377579 0.1371744 2.0825195
Allobates undulatus 33.62688 46.4785206 0.1364640 1.7226095
Anomaloglossus ayarzaguenai 32.96299 34.9645722 0.1384420 1.3644080
Anomaloglossus baeobatrachus 33.58032 41.9630904 0.1408243 1.5106107
Anomaloglossus beebei 33.45546 36.7356277 0.1379128 1.3650473
Anomaloglossus roraima 33.64667 38.8849901 0.1384749 1.4583680
Anomaloglossus breweri 33.90377 33.2930336 0.1376062 1.2805951
Anomaloglossus degranvillei 33.03986 38.8496724 0.1397113 1.3906826
Anomaloglossus kaiei 33.72206 41.0197805 0.1373245 1.5229920
Anomaloglossus guanayensis 33.07008 47.6581294 0.1378408 1.7654450
Anomaloglossus murisipanensis 33.61705 34.9814360 0.1390968 1.3452970
Anomaloglossus parimae 33.04270 44.3158123 0.1393886 1.6893535
Anomaloglossus parkerae 33.61086 30.1454516 0.1379784 1.1675979
Anomaloglossus praderioi 33.69341 37.9515900 0.1391931 1.4230273
Anomaloglossus rufulus 33.65602 31.1114246 0.1378569 1.2130326
Anomaloglossus shrevei 33.00643 40.6024836 0.1394350 1.5653484
Anomaloglossus stepheni 33.76292 38.4621572 0.1367262 1.3412255
Anomaloglossus tamacuarensis 33.06206 40.3179431 0.1374799 1.4782996
Anomaloglossus tepuyensis 33.05474 34.1356820 0.1372437 1.3012949
Anomaloglossus triunfo 33.04239 32.9709488 0.1369343 1.2517303
Anomaloglossus wothuja 33.06022 48.6278002 0.1365632 1.7418673
Rheobates palmatus 32.93729 31.5921645 0.1358024 1.3116345
Rheobates pseudopalmatus 32.94280 36.6635765 0.1385402 1.4556184
Aromobates saltuensis 33.01299 28.4500143 0.1371021 1.1459923
Aromobates capurinensis 33.07791 38.0171955 0.1400838 1.4809026
Aromobates duranti 33.07278 33.5953860 0.1373818 1.3073589
Aromobates mayorgai 33.05274 33.1650909 0.1374297 1.2568228
Aromobates meridensis 33.11573 32.7026662 0.1379369 1.2735632
Aromobates molinarii 33.00182 35.3778619 0.1385730 1.3746095
Aromobates orostoma 33.09727 33.0470968 0.1372046 1.2845250
Mannophryne caquetio 32.99925 39.0799171 0.1380198 1.4658980
Mannophryne collaris 33.08048 35.9486989 0.1358510 1.3968582
Mannophryne herminae 32.96209 36.8119392 0.1366669 1.3643826
Mannophryne larandina 33.67018 37.3420901 0.1361121 1.3906161
Mannophryne yustizi 32.94941 33.5949455 0.1363210 1.3191484
Mannophryne lamarcai 33.01195 36.1367653 0.1389959 1.3577055
Mannophryne cordilleriana 33.00906 38.4963817 0.1376541 1.4268097
Mannophryne leonardoi 32.98762 34.4632631 0.1357195 1.2724384
Mannophryne trinitatis 33.10309 68.5730452 0.1368626 2.5951802
Mannophryne venezuelensis 33.05261 44.9465678 0.1366131 1.6737233
Mannophryne neblina 32.96258 42.6625980 0.1382336 1.5722287
Mannophryne oblitterata 33.03643 34.5609619 0.1380946 1.3008446
Mannophryne olmonae 33.08333 94.1369510 0.1353728 3.5264366
Mannophryne riveroi 33.10264 47.0149977 0.1365858 1.7623233
Mannophryne speeri 32.97910 30.2461490 0.1387428 1.1852763
Mannophryne trujillensis 32.98150 35.9921985 0.1371511 1.3368640
Cryptobatrachus boulengeri 33.66676 35.1850233 0.1366205 1.2939343
Cryptobatrachus fuhrmanni 33.74201 33.0727893 0.1333313 1.3580929
Hemiphractus bubalus 34.22827 31.9441306 0.1314969 1.3087934
Hemiphractus proboscideus 34.17918 39.4040026 0.1324877 1.4392726
Hemiphractus fasciatus 34.28512 32.9351096 0.1334216 1.3221244
Hemiphractus johnsoni 34.21444 27.1404067 0.1317994 1.1973924
Hemiphractus scutatus 34.16400 38.7997576 0.1318557 1.4503625
Hemiphractus helioi 34.26844 36.2863111 0.1330162 1.6028138
Flectonotus fitzgeraldi 34.10088 57.3206503 0.1306492 2.1409662
Flectonotus pygmaeus 34.08095 40.4822672 0.1339550 1.5550654
Stefania ackawaio 34.08386 41.6758147 0.1331532 1.5532746
Stefania marahuaquensis 34.23736 35.6804466 0.1338820 1.3764149
Stefania ayangannae 34.03543 37.6539858 0.1316300 1.3993803
Stefania coxi 34.12350 39.1022307 0.1325371 1.4546663
Stefania riveroi 34.23898 40.8558366 0.1309428 1.5358726
Stefania riae 34.13665 35.0839663 0.1329381 1.3608106
Stefania oculosa 34.19814 33.4799752 0.1337005 1.3082664
Stefania breweri 34.21609 45.3449456 0.1317543 1.5980490
Stefania goini 34.32170 37.2852913 0.1350790 1.4336905
Stefania evansi 33.61997 40.6906276 0.1333057 1.5000317
Stefania scalae 33.63136 36.1344093 0.1318275 1.3766776
Stefania tamacuarina 33.67274 44.9054728 0.1320995 1.6405485
Stefania roraimae 34.18611 40.0808836 0.1352937 1.5034286
Stefania woodleyi 33.62505 44.1753280 0.1345090 1.6278114
Stefania percristata 34.06346 35.2645697 0.1340645 1.3731597
Stefania schuberti 34.21739 31.8872184 0.1346255 1.2227231
Stefania ginesi 34.17710 32.4808825 0.1332191 1.2676907
Stefania satelles 34.25686 30.7628802 0.1327621 1.1941754
Fritziana fissilis 34.16099 25.4290431 0.1313816 0.9789718
Fritziana ohausi 34.28470 26.4650978 0.1291585 1.0219132
Fritziana goeldii 34.14857 24.7268690 0.1342002 0.9517192
Gastrotheca abdita 34.51552 34.6545764 0.1299871 1.4288581
Gastrotheca andaquiensis 34.56584 23.5809943 0.1281272 0.9898232
Gastrotheca albolineata 34.57962 25.6352730 0.1298539 0.9873758
Gastrotheca ernestoi 34.66122 24.3174161 0.1312579 0.9276907
Gastrotheca fulvorufa 34.49178 29.4431550 0.1312102 1.1429041
Gastrotheca microdiscus 34.60941 25.5402561 0.1309193 0.9953408
Gastrotheca bufona 34.67515 27.0417716 0.1291942 1.1087082
Gastrotheca orophylax 34.67111 17.0220437 0.1321581 0.7419172
Gastrotheca plumbea 34.74530 13.4528106 0.1307451 0.5776861
Gastrotheca monticola 34.61704 21.1744789 0.1300415 0.9649301
Gastrotheca antoniiochoai 34.09274 5.7276409 0.1287888 0.3883122
Gastrotheca excubitor 34.52338 8.7065442 0.1293675 0.4998297
Gastrotheca ochoai 34.55610 6.7128728 0.1276579 0.4095321
Gastrotheca rebeccae 34.57305 10.5338478 0.1300334 0.6137367
Gastrotheca christiani 34.47775 11.6920974 0.1300104 0.5061076
Gastrotheca lauzuricae 34.52446 10.5371604 0.1276594 0.7249293
Gastrotheca chrysosticta 34.50692 13.7222597 0.1285002 0.6038999
Gastrotheca gracilis 34.56504 10.8165197 0.1283245 0.5145499
Gastrotheca griswoldi 34.64950 15.2889359 0.1289115 0.8658442
Gastrotheca marsupiata 34.62355 11.2556627 0.1252733 0.6542410
Gastrotheca peruana 34.65060 12.9704776 0.1309823 0.6725602
Gastrotheca zeugocystis 34.71925 7.7139149 0.1295110 0.4890067
Gastrotheca argenteovirens 34.50982 23.3043458 0.1310027 0.9621841
Gastrotheca trachyceps 35.03534 15.1678023 0.1278924 0.6588496
Gastrotheca aureomaculata 35.03696 20.8021639 0.1300020 0.8638971
Gastrotheca ruizi 34.94694 23.1779787 0.1307120 0.9464769
Gastrotheca dunni 34.97256 15.2805881 0.1294114 0.6839024
Gastrotheca nicefori 34.97905 23.6373251 0.1286049 0.9487338
Gastrotheca ovifera 34.85726 32.2830048 0.1299070 1.2048624
Gastrotheca phalarosa 34.95434 25.6549950 0.1275888 1.1265608
Gastrotheca atympana 34.73194 20.7954446 0.1316460 1.0842008
Gastrotheca testudinea 34.69487 22.7867574 0.1341781 1.0865989
Gastrotheca pacchamama 34.82379 16.1404324 0.1332817 0.9029973
Gastrotheca carinaceps 34.55792 23.9112349 0.1318031 1.1215633
Gastrotheca cornuta 34.58276 29.4483830 0.1319376 1.1470594
Gastrotheca dendronastes 34.60016 32.7404202 0.1303671 1.3235572
Gastrotheca helenae 34.72906 20.7255119 0.1305414 0.9227873
Gastrotheca longipes 34.72895 27.3742739 0.1304180 1.1128383
Gastrotheca guentheri 34.66014 30.7428117 0.1284365 1.2183656
Gastrotheca weinlandii 34.61154 24.2510485 0.1304663 0.9991158
Gastrotheca flamma 34.59701 26.6631112 0.1297532 1.0583976
Gastrotheca walkeri 34.52942 32.5493440 0.1318676 1.2174994
Gastrotheca espeletia 34.62116 28.3031275 0.1294402 1.1932873
Gastrotheca galeata 34.78753 28.2192200 0.1298139 1.2341526
Gastrotheca ossilaginis 34.60371 35.4511880 0.1289539 1.5601059
Gastrotheca piperata 34.62996 22.7151537 0.1314472 1.2239941
Gastrotheca psychrophila 34.76084 20.4800341 0.1296127 0.9040243
Gastrotheca stictopleura 34.55268 20.3249337 0.1314575 1.0048639
Gastrotheca splendens 34.49187 29.5261524 0.1327770 1.3090819
Gastrotheca williamsoni 34.22110 37.1849974 0.1267121 1.3805588
Gastrotheca fissipes 34.59296 30.2933894 0.1305928 1.1902523
Ceuthomantis aracamuni 32.97257 43.1753157 0.1336323 1.5898698
Ceuthomantis cavernibardus 33.38327 45.3885499 0.1373008 1.6606742
Ceuthomantis duellmani 33.40053 38.8911786 0.1381000 1.5143239
Brachycephalus alipioi 33.30038 35.6460847 0.1378796 1.3754189
Brachycephalus hermogenesi 33.33264 21.9299348 0.1369150 0.8396983
Brachycephalus nodoterga 33.32197 21.9903606 0.1366643 0.8398567
Brachycephalus vertebralis 33.30704 26.6640836 0.1382490 1.0291822
Brachycephalus ephippium 33.28044 33.5853700 0.1354015 1.3091142
Brachycephalus brunneus 33.29685 17.9410911 0.1379066 0.7441361
Brachycephalus izecksohni 33.28797 19.0624504 0.1368802 0.7746389
Brachycephalus ferruginus 33.34646 19.0020529 0.1348666 0.7849402
Brachycephalus pernix 33.33639 17.6287230 0.1364256 0.7307519
Brachycephalus pombali 33.35256 18.4599459 0.1364535 0.7654852
Brachycephalus didactylus 33.30648 29.5435096 0.1368015 1.1383836
Ischnocnema bolbodactyla 33.30903 24.1973731 0.1373578 0.9335292
Ischnocnema octavioi 33.29301 28.3181084 0.1358354 1.0834051
Ischnocnema verrucosa 33.21203 29.0420044 0.1385755 1.1257596
Ischnocnema juipoca 33.23612 25.4961078 0.1357755 0.9767278
Ischnocnema spanios 33.26558 23.4379964 0.1386399 0.9334098
Ischnocnema holti 33.25279 25.8471110 0.1378891 0.9674667
Ischnocnema lactea 33.22066 23.7263086 0.1389881 0.9122168
Ischnocnema epipeda 33.26854 38.6397859 0.1369340 1.4982539
Ischnocnema erythromera 33.36710 27.7880672 0.1369651 1.0448100
Ischnocnema guentheri 33.40207 23.3775271 0.1363155 0.9032156
Ischnocnema henselii 33.39599 20.3412054 0.1359400 0.7974926
Ischnocnema izecksohni 33.31401 21.9277052 0.1363505 0.8676826
Ischnocnema nasuta 33.14609 27.7318004 0.1349741 1.0733742
Ischnocnema oea 33.38717 33.7076064 0.1370350 1.3066510
Ischnocnema gehrti 33.33749 19.4576635 0.1361501 0.7551562
Ischnocnema gualteri 33.35102 29.8814599 0.1379621 1.1247292
Ischnocnema hoehnei 33.22889 25.0216474 0.1382141 0.9681161
Ischnocnema venancioi 33.30172 28.7115378 0.1376060 1.0880819
Ischnocnema parva 33.13100 30.8469202 0.1387158 1.1806635
Ischnocnema sambaqui 33.32814 18.4136921 0.1379980 0.7632770
Ischnocnema manezinho 33.32807 18.4417656 0.1380127 0.7467580
Ischnocnema nigriventris 33.23786 19.7955615 0.1384111 0.7674988
Ischnocnema paranaensis 33.24821 17.9959975 0.1353770 0.7476307
Ischnocnema penaxavantinho 33.22492 23.5917040 0.1380943 0.9004356
Ischnocnema pusilla 33.29682 26.1145356 0.1364954 1.0072161
Ischnocnema randorum 33.34734 27.3671130 0.1390678 1.1145228
Adelophryne adiastola 33.51711 41.0170086 0.1394791 1.4183359
Adelophryne gutturosa 33.40044 47.6839116 0.1373160 1.7410893
Adelophryne patamona 33.53229 40.6185118 0.1376247 1.5080327
Adelophryne baturitensis 33.65920 38.6176856 0.1369892 1.4646804
Adelophryne maranguapensis 33.69841 36.8580353 0.1366468 1.3810891
Adelophryne pachydactyla 33.50738 31.1655777 0.1386930 1.2392251
Phyzelaphryne miriamae 33.55165 41.0660959 0.1343612 1.4202560
Diasporus anthrax 33.67504 33.7682123 0.1396770 1.3826545
Diasporus diastema 33.70274 41.6231071 0.1383534 1.5414118
Diasporus hylaeformis 33.74170 36.9207273 0.1370314 1.4151089
Diasporus quidditus 33.72092 45.0857364 0.1390029 1.6991083
Diasporus gularis 33.77150 30.8193147 0.1377158 1.2143280
Diasporus tigrillo 33.77030 22.6838548 0.1375616 1.3273238
Diasporus tinker 33.71304 37.5128454 0.1380057 1.4460792
Diasporus ventrimaculatus 33.78389 32.4957492 0.1372176 1.4420366
Diasporus vocator 33.93977 46.1882315 0.1356614 1.7785940
Eleutherodactylus abbotti 34.19560 76.6903959 0.1365821 2.7889798
Eleutherodactylus audanti 34.16644 77.1753849 0.1375711 2.7867941
Eleutherodactylus parabates 34.09474 88.5348797 0.1393630 3.2397076
Eleutherodactylus haitianus 34.13218 70.9711829 0.1395964 2.6212815
Eleutherodactylus pituinus 34.11873 58.7716689 0.1396248 2.1396545
Eleutherodactylus acmonis 34.19226 68.8355138 0.1374399 2.4966305
Eleutherodactylus bresslerae 34.19291 73.3345262 0.1376827 2.6645703
Eleutherodactylus ricordii 34.20682 84.8754567 0.1375104 3.0639713
Eleutherodactylus grahami 34.17072 65.9577534 0.1337917 2.3367003
Eleutherodactylus rhodesi 34.15481 72.2981788 0.1365707 2.6189534
Eleutherodactylus weinlandi 34.08702 69.0443312 0.1363177 2.5263881
Eleutherodactylus pictissimus 34.14206 79.2793811 0.1376412 2.8696176
Eleutherodactylus lentus 34.05680 53.2739932 0.1401181 1.9690445
Eleutherodactylus monensis 34.04805 66.0321282 0.1378764 2.4457745
Eleutherodactylus probolaeus 34.15993 67.8098791 0.1360203 2.4805456
Eleutherodactylus adelus 35.00125 50.7105258 0.1347276 1.8521599
Eleutherodactylus pezopetrus 35.02178 60.2130758 0.1354191 2.1768813
Eleutherodactylus blairhedgesi 35.12605 45.5610486 0.1332077 1.6694588
Eleutherodactylus thomasi 35.06192 46.3695412 0.1373782 1.6894973
Eleutherodactylus pinarensis 35.05453 46.2616557 0.1378305 1.6854971
Eleutherodactylus casparii 35.25627 42.6612580 0.1365266 1.5426426
Eleutherodactylus guanahacabibes 35.20926 49.3305295 0.1338452 1.7957194
Eleutherodactylus simulans 34.53639 59.9065679 0.1373206 2.1782425
Eleutherodactylus tonyi 35.13255 65.9300254 0.1352619 2.4035457
Eleutherodactylus rogersi 35.17356 41.2410770 0.1365616 1.4960274
Eleutherodactylus goini 35.05567 50.0245958 0.1372652 1.8235221
Eleutherodactylus albipes 34.25515 89.0547297 0.1361641 3.2248712
Eleutherodactylus maestrensis 34.31022 82.0000166 0.1383002 2.9733476
Eleutherodactylus dimidiatus 34.39340 67.7981098 0.1358391 2.4629411
Eleutherodactylus emiliae 34.37713 60.0904067 0.1371572 2.1681272
Eleutherodactylus albolabris 33.97423 26.3211598 0.1388343 1.0210543
Eleutherodactylus alcoae 34.31604 76.2243584 0.1380236 2.7662471
Eleutherodactylus armstrongi 34.09719 82.4847890 0.1384037 2.9951535
Eleutherodactylus leoncei 34.26328 75.4079093 0.1367890 2.7339106
Eleutherodactylus alticola 33.01581 64.1673574 0.1364158 2.3134977
Eleutherodactylus nubicola 32.91943 60.5942750 0.1388863 2.1852605
Eleutherodactylus fuscus 32.93249 65.7719544 0.1369169 2.3927812
Eleutherodactylus junori 32.91370 66.9993406 0.1377689 2.4397747
Eleutherodactylus andrewsi 32.34757 62.3412039 0.1365716 2.2471612
Eleutherodactylus griphus 33.01608 64.4844062 0.1379762 2.3493329
Eleutherodactylus glaucoreius 33.00645 58.0348725 0.1358199 2.1056670
Eleutherodactylus pantoni 33.02377 60.0508929 0.1379543 2.1778367
Eleutherodactylus pentasyringos 32.94606 62.2621595 0.1366010 2.2559140
Eleutherodactylus jamaicensis 32.91497 60.6383508 0.1348369 2.2015530
Eleutherodactylus luteolus 33.05118 71.6617032 0.1362047 2.6061372
Eleutherodactylus cavernicola 33.06467 62.9254586 0.1390614 2.2906738
Eleutherodactylus grabhami 33.11560 71.0286030 0.1396835 2.5823776
Eleutherodactylus sisyphodemus 33.09827 72.8593840 0.1325106 2.6547135
Eleutherodactylus gundlachi 33.17635 62.9231090 0.1375119 2.2795873
Eleutherodactylus amadeus 34.17544 78.7505189 0.1366999 2.8301177
Eleutherodactylus caribe 34.25552 79.9929763 0.1363638 2.9063685
Eleutherodactylus eunaster 34.04570 82.2038964 0.1370432 2.9543053
Eleutherodactylus corona 34.08537 86.1442198 0.1358549 3.1295750
Eleutherodactylus heminota 34.09124 81.7574523 0.1369530 2.9516617
Eleutherodactylus bakeri 34.06073 90.9191653 0.1395704 3.2685873
Eleutherodactylus dolomedes 34.11448 80.9629672 0.1365374 2.9427826
Eleutherodactylus glaphycompus 34.25005 73.1409879 0.1373582 2.6278011
Eleutherodactylus thorectes 34.25213 79.5321115 0.1389329 2.8581871
Eleutherodactylus jugans 34.22544 78.6783529 0.1380853 2.8524280
Eleutherodactylus apostates 34.30705 74.6156796 0.1375506 2.6810590
Eleutherodactylus oxyrhyncus 34.25715 76.5579788 0.1368193 2.7510020
Eleutherodactylus furcyensis 34.23949 72.5807486 0.1358931 2.6338532
Eleutherodactylus rufifemoralis 34.32642 85.1537818 0.1346393 3.1166851
Eleutherodactylus amplinympha 34.76564 52.1956501 0.1338745 1.9738637
Eleutherodactylus martinicensis 34.85868 51.4943363 0.1353800 1.9032658
Eleutherodactylus barlagnei 34.27277 57.0767847 0.1342250 2.1318203
Eleutherodactylus pinchoni 34.79571 53.5232982 0.1369495 1.9968022
Eleutherodactylus angustidigitorum 34.14822 27.0714068 0.1371818 1.1124768
Eleutherodactylus cochranae 35.68667 49.5503530 0.1363806 1.8255627
Eleutherodactylus hedricki 35.66892 51.2594000 0.1364973 1.9062659
Eleutherodactylus schwartzi 35.88839 37.4983447 0.1359282 1.3721762
Eleutherodactylus gryllus 35.80298 45.4362578 0.1353052 1.6898124
Eleutherodactylus cooki 35.66715 50.1059489 0.1383177 1.8607483
Eleutherodactylus locustus 35.72672 48.7952098 0.1369479 1.8107139
Eleutherodactylus atkinsi 34.20496 61.3529731 0.1396300 2.2282589
Eleutherodactylus intermedius 34.14569 76.7429418 0.1364265 2.7683350
Eleutherodactylus varleyi 33.97955 60.5291451 0.1381717 2.1979228
Eleutherodactylus cubanus 34.25196 83.8538130 0.1376569 3.0369511
Eleutherodactylus iberia 34.23556 70.6299507 0.1356487 2.5659451
Eleutherodactylus jaumei 34.23933 81.4395315 0.1372243 2.9454155
Eleutherodactylus limbatus 34.21400 63.5897961 0.1360122 2.3146804
Eleutherodactylus orientalis 34.24879 71.0477500 0.1354361 2.5834101
Eleutherodactylus etheridgei 34.24604 76.1399093 0.1350517 2.7300512
Eleutherodactylus auriculatoides 34.03494 74.2596300 0.1378354 2.7512876
Eleutherodactylus montanus 34.05452 68.5798744 0.1377232 2.5420409
Eleutherodactylus patriciae 34.28123 78.8339374 0.1372248 2.9123482
Eleutherodactylus fowleri 33.99833 73.8635469 0.1384583 2.6766726
Eleutherodactylus lamprotes 33.95746 82.6089315 0.1405603 2.9690275
Eleutherodactylus guantanamera 34.03666 73.1280078 0.1373866 2.6343551
Eleutherodactylus ionthus 34.01713 75.8185078 0.1362259 2.7385903
Eleutherodactylus varians 34.03409 62.2930736 0.1377147 2.2630922
Eleutherodactylus leberi 34.21908 79.1819752 0.1348272 2.8712580
Eleutherodactylus melacara 34.16367 78.4648292 0.1353888 2.8444056
Eleutherodactylus sommeri 34.10231 85.2992348 0.1363152 3.1151709
Eleutherodactylus wetmorei 34.07305 78.0828198 0.1377044 2.8192740
Eleutherodactylus auriculatus 34.05710 60.2108549 0.1356870 2.1878314
Eleutherodactylus principalis 34.04368 73.6854526 0.1355340 2.6718759
Eleutherodactylus glamyrus 34.05442 78.0962873 0.1387500 2.8216037
Eleutherodactylus bartonsmithi 34.07341 66.6496879 0.1384803 2.4157121
Eleutherodactylus mariposa 34.13386 73.2025927 0.1361783 2.6461370
Eleutherodactylus ronaldi 34.07737 84.6018135 0.1362627 3.0618915
Eleutherodactylus eileenae 34.09105 61.9684009 0.1381573 2.2532410
Eleutherodactylus ruthae 34.15409 75.9627480 0.1337257 2.7851547
Eleutherodactylus hypostenor 35.14163 86.7553606 0.1348429 3.1671040
Eleutherodactylus parapelates 35.14228 78.7809204 0.1370150 2.8307548
Eleutherodactylus chlorophenax 34.16898 78.7717883 0.1394919 2.8314935
Eleutherodactylus nortoni 34.06726 93.0397171 0.1356821 3.3592794
Eleutherodactylus inoptatus 34.13071 70.9958686 0.1386482 2.5929060
Eleutherodactylus brevirostris 34.22747 86.9732385 0.1380891 3.1257339
Eleutherodactylus ventrilineatus 34.21584 82.3612534 0.1356437 2.9601442
Eleutherodactylus glandulifer 33.50925 81.6321217 0.1353736 2.9325431
Eleutherodactylus sciagraphus 34.18256 80.6766765 0.1351904 2.9297432
Eleutherodactylus counouspeus 34.23031 79.5408552 0.1358981 2.8583363
Eleutherodactylus cuneatus 34.13848 80.7052337 0.1377659 2.9215853
Eleutherodactylus turquinensis 33.47824 75.3679691 0.1351991 2.7338769
Eleutherodactylus cystignathoides 34.11010 26.2224468 0.1374746 1.0701787
Eleutherodactylus nitidus 34.26001 24.0342524 0.1366349 0.9814810
Eleutherodactylus pipilans 34.16562 28.3393238 0.1373181 1.0603717
Eleutherodactylus marnockii 34.22803 19.7703772 0.1408141 0.7985254
Eleutherodactylus symingtoni 34.14253 56.1196473 0.1379990 2.0450244
Eleutherodactylus zeus 34.11312 58.2242646 0.1357702 2.1230366
Eleutherodactylus dennisi 34.14548 25.7218422 0.1380123 1.0678177
Eleutherodactylus dilatus 34.16681 23.9285533 0.1373832 0.9388503
Eleutherodactylus diplasius 33.87868 78.6098878 0.1391345 2.8252608
Eleutherodactylus flavescens 34.16800 70.6613606 0.1376350 2.6038762
Eleutherodactylus grandis 34.09815 14.3228542 0.1366509 0.7057085
Eleutherodactylus greyi 34.10643 60.6691924 0.1379047 2.2004891
Eleutherodactylus guttilatus 34.27201 20.9816579 0.1358491 0.9137672
Eleutherodactylus interorbitalis 34.25566 17.1918329 0.1376943 0.6891302
Eleutherodactylus juanariveroi 34.04331 71.6911179 0.1373299 2.6545609
Eleutherodactylus klinikowskii 34.04589 63.9685225 0.1364940 2.3323114
Eleutherodactylus zugi 34.18544 55.0671308 0.1377547 2.0071290
Eleutherodactylus paralius 34.25252 73.6385599 0.1374949 2.7080984
Eleutherodactylus leprus 34.13239 25.1702035 0.1351682 0.9452428
Eleutherodactylus longipes 34.24932 20.7187645 0.1351860 0.8674530
Eleutherodactylus maurus 34.06991 20.1831657 0.1388656 0.8498321
Eleutherodactylus michaelschmidi 34.16529 77.8572012 0.1355058 2.8211181
Eleutherodactylus minutus 34.26385 70.3165984 0.1339219 2.6066321
Eleutherodactylus poolei 34.14585 72.8558017 0.1362629 2.6413594
Eleutherodactylus modestus 34.12113 28.6223621 0.1410178 1.0855799
Eleutherodactylus notidodes 34.24065 89.3138355 0.1376222 3.2704390
Eleutherodactylus pallidus 34.28849 24.7443954 0.1357858 0.9686514
Eleutherodactylus paulsoni 34.16458 75.6123631 0.1370396 2.7193591
Eleutherodactylus unicolor 33.45074 57.1274136 0.1383278 2.1231752
Eleutherodactylus verruculatus 33.43880 33.4774865 0.1390113 1.2981615
Eleutherodactylus riparius 34.19333 64.6715284 0.1356640 2.3528637
Eleutherodactylus rivularis 33.49852 82.6897142 0.1392230 2.9968552
Eleutherodactylus rubrimaculatus 34.06339 25.4110221 0.1372637 0.9615723
Eleutherodactylus rufescens 34.19602 31.9847543 0.1367656 1.2834953
Eleutherodactylus saxatilis 34.14346 17.2655143 0.1376637 0.7117833
Eleutherodactylus semipalmatus 33.59104 77.4961810 0.1375850 2.8152207
Eleutherodactylus syristes 34.19424 23.5073865 0.1326690 0.9140743
Eleutherodactylus teretistes 34.29862 27.0413894 0.1337991 1.0350234
Eleutherodactylus tetajulia 34.16412 71.8157804 0.1346562 2.6102357
Eleutherodactylus toa 33.61037 78.4808731 0.1374701 2.8445490
Eleutherodactylus verrucipes 34.19577 22.5662590 0.1385539 0.9647845
Eleutherodactylus warreni 34.26238 72.3930523 0.1374461 2.6281541
Craugastor stadelmani 32.54460 44.8317663 0.1379641 1.7006892
Craugastor alfredi 32.85835 31.3930176 0.1391476 1.1571501
Craugastor amniscola 32.36895 23.5775582 0.1380888 0.9138948
Craugastor batrachylus 33.03946 28.7285461 0.1377177 1.2026252
Craugastor cuaquero 33.04162 37.0803480 0.1385456 1.3381668
Craugastor melanostictus 33.02351 39.4236727 0.1398068 1.4886887
Craugastor emcelae 32.97345 56.6851125 0.1404182 2.0235056
Craugastor angelicus 32.52642 38.2053963 0.1370338 1.3775607
Craugastor rugulosus 32.31670 28.5446470 0.1383769 1.0793734
Craugastor ranoides 32.39132 40.5159959 0.1350330 1.4782330
Craugastor fleischmanni 32.37784 35.9455317 0.1398375 1.2965041
Craugastor rupinius 32.93959 29.2822312 0.1376742 1.0977649
Craugastor obesus 32.44713 52.9833879 0.1377967 1.8905620
Craugastor megacephalus 32.93500 39.5198393 0.1373078 1.4683340
Craugastor aphanus 33.13679 38.6882175 0.1388923 1.5178784
Craugastor augusti 33.04495 20.8096166 0.1350989 0.8618718
Craugastor tarahumaraensis 33.01960 16.3792391 0.1383896 0.6748367
Craugastor polymniae 32.89774 15.7222882 0.1394241 0.6929358
Craugastor aurilegulus 32.40371 48.7612518 0.1370779 1.8535727
Craugastor azueroensis 32.52390 61.4918045 0.1372537 2.3356449
Craugastor vocalis 32.98812 20.9623035 0.1385180 0.8382171
Craugastor berkenbuschii 32.43783 25.6806058 0.1389558 1.0130943
Craugastor vulcani 32.39074 28.4365141 0.1380027 1.0396822
Craugastor bocourti 32.92133 25.3243751 0.1372032 0.9699198
Craugastor spatulatus 33.04887 22.9400257 0.1380450 0.9137511
Craugastor stuarti 32.34121 27.1460077 0.1387208 1.0443087
Craugastor uno 33.02721 29.1827040 0.1395668 1.1249821
Craugastor xucanebi 33.03407 24.4639064 0.1385753 0.9570893
Craugastor bransfordii 33.09500 34.9150158 0.1363967 1.3044643
Craugastor polyptychus 33.09647 34.5327202 0.1370455 1.4202570
Craugastor underwoodi 33.07727 37.6030536 0.1363851 1.4603536
Craugastor lauraster 32.98463 32.4477726 0.1405734 1.2090412
Craugastor stejnegerianus 33.01010 41.5224498 0.1388932 1.7338913
Craugastor persimilis 33.13160 34.0726449 0.1378908 1.3984726
Craugastor brocchi 32.47756 26.1601030 0.1379676 1.0268556
Craugastor gollmeri 33.04251 43.4232567 0.1388766 1.6201393
Craugastor chac 33.00962 33.7352821 0.1382157 1.2739807
Craugastor lineatus 32.97425 25.1022669 0.1423376 0.9548249
Craugastor laticeps 33.01585 32.0847510 0.1387118 1.1922721
Craugastor mimus 33.02388 35.2997130 0.1391593 1.3264720
Craugastor noblei 33.06979 36.4392593 0.1402555 1.3586909
Craugastor campbelli 32.90334 38.7923000 0.1397026 1.5224498
Craugastor decoratus 32.88711 23.5181324 0.1393569 0.9584475
Craugastor charadra 32.43189 29.9327514 0.1360710 1.1348674
Craugastor opimus 32.98083 43.9830088 0.1381550 1.6604917
Craugastor chingopetaca 33.09325 34.9026178 0.1385504 1.2594097
Craugastor hobartsmithi 33.09049 25.1657294 0.1356426 0.9948942
Craugastor pelorus 32.43279 34.3136805 0.1405464 1.2262817
Craugastor coffeus 32.99070 36.8212510 0.1355017 1.4089640
Craugastor pozo 33.01953 26.3277944 0.1374691 0.9618698
Craugastor talamancae 33.68696 33.0203920 0.1373429 1.2264611
Craugastor raniformis 33.86502 27.9913133 0.1374773 1.0694514
Craugastor taurus 32.22367 53.9575559 0.1377025 1.9683146
Craugastor cyanochthebius 32.92284 44.4367521 0.1374627 1.7441489
Craugastor silvicola 33.14492 29.1285717 0.1346024 1.0352862
Craugastor escoces 32.44561 43.4481788 0.1359770 1.5670803
Craugastor nefrens 33.04722 42.3447755 0.1360166 1.6630943
Craugastor podiciferus 33.01987 33.9969288 0.1380213 1.3200426
Craugastor glaucus 33.12726 34.4469264 0.1371570 1.2684859
Craugastor monnichorum 33.05331 50.9654457 0.1393656 1.8818193
Craugastor greggi 32.52343 19.4123964 0.1371735 0.8095799
Craugastor guerreroensis 33.11791 21.8409880 0.1338076 0.8566576
Craugastor montanus 33.03742 24.9624916 0.1363767 0.9282526
Craugastor gulosus 33.01284 37.7253758 0.1405307 1.5472147
Craugastor laevissimus 32.45304 34.6010495 0.1393995 1.2984763
Craugastor inachus 32.48136 32.1334212 0.1383839 1.1813018
Craugastor mexicanus 32.40634 23.3418758 0.1408477 0.9369822
Craugastor omiltemanus 32.48007 25.4847283 0.1392213 0.9967778
Craugastor rugosus 32.55895 34.4811323 0.1385017 1.3788806
Craugastor tabasarae 34.91731 40.4133754 0.1351445 1.5147262
Craugastor rayo 34.46486 18.2233854 0.1362573 1.0584899
Craugastor matudai 33.04772 24.1811164 0.1350177 0.9222646
Craugastor yucatanensis 33.07091 48.7303341 0.1356898 1.7572805
Craugastor megalotympanum 33.08394 27.5424818 0.1401974 1.0085666
Craugastor rivulus 32.57216 24.5437395 0.1348465 0.9834539
Craugastor milesi 32.42644 36.4114977 0.1381337 1.4278034
Craugastor sandersoni 32.45310 41.9619112 0.1363635 1.5846957
Craugastor occidentalis 33.00712 23.2594663 0.1378412 0.9228384
Craugastor palenque 32.45036 25.4639851 0.1383190 0.9617506
Craugastor pygmaeus 33.08485 26.7490052 0.1367078 1.0271019
Craugastor pechorum 32.49705 51.0783966 0.1393804 1.9324618
Craugastor rostralis 33.06383 30.6416837 0.1377206 1.1567857
Craugastor sabrinus 33.04590 38.5898198 0.1375365 1.4434965
Craugastor psephosypharus 32.99635 32.9182797 0.1395676 1.2408720
Craugastor taylori 33.01306 33.1837623 0.1396888 1.1747134
Craugastor emleni 33.06084 24.9537659 0.1377288 0.9757055
Craugastor daryi 32.11286 23.8949959 0.1364409 0.9380682
Haddadus aramunha 32.14352 20.5280869 0.1419641 0.8286955
Haddadus plicifer 32.23821 37.1005038 0.1365546 1.4350708
Haddadus binotatus 32.19703 25.2466605 0.1412767 0.9762676
Atopophrynus syntomopus 30.40407 26.2409352 0.1435007 1.1374410
Lynchius flavomaculatus 31.05335 20.3001025 0.1410373 0.8840710
Lynchius parkeri 31.06531 29.5991143 0.1422289 1.2930717
Lynchius nebulanastes 31.00911 30.5155513 0.1420281 1.3317674
Lynchius simmonsi 31.00131 23.6212170 0.1416692 0.9130420
Oreobates choristolemma 30.63426 20.4929917 0.1435685 1.0252949
Oreobates sanderi 30.49013 18.4007066 0.1445349 0.9651658
Oreobates sanctaecrucis 30.72970 26.0937158 0.1443957 1.1676830
Oreobates discoidalis 31.26671 12.2145187 0.1426223 0.6057706
Oreobates ibischi 31.20331 21.8903035 0.1432378 1.0031578
Oreobates madidi 31.57724 26.0250394 0.1397522 1.2381649
Oreobates crepitans 31.02233 24.3533452 0.1439698 0.8633323
Oreobates heterodactylus 31.00478 24.5159946 0.1419569 0.8648747
Oreobates zongoensis 30.98797 18.1487598 0.1414221 1.0068208
Oreobates ayacucho 30.05873 8.6003057 0.1442044 0.4629368
Oreobates pereger 30.11452 15.9480006 0.1448353 0.9484073
Oreobates lehri 28.86025 12.1998367 0.1480912 0.6823610
Oreobates saxatilis 32.58474 20.7626925 0.1421630 0.9864399
Oreobates lundbergi 30.96600 23.9341056 0.1403660 1.1244708
Phrynopus auriculatus 30.94564 21.7371775 0.1458508 1.0165771
Phrynopus barthlenae 31.02695 20.5312930 0.1417058 1.0664669
Phrynopus horstpauli 30.83386 18.8120775 0.1448950 0.9603277
Phrynopus bracki 30.99864 24.8311009 0.1434229 1.1669239
Phrynopus bufoides 31.00962 27.2046414 0.1430047 1.2775163
Phrynopus dagmarae 31.09069 21.1616454 0.1428701 1.0570421
Phrynopus heimorum 31.11492 13.7647467 0.1435079 0.7864765
Phrynopus juninensis 31.10100 21.1436886 0.1404008 1.2392884
Phrynopus kauneorum 31.12668 17.3581274 0.1425808 0.8806904
Phrynopus kotosh 31.10345 10.1806788 0.1409672 0.6415663
Phrynopus miroslawae 31.08431 24.3708998 0.1438048 1.1481364
Phrynopus montium 31.08734 24.3510930 0.1449391 1.4289828
Phrynopus nicoleae 31.04121 24.2113104 0.1425874 1.1371319
Phrynopus oblivius 31.07902 22.3814578 0.1440299 1.3120083
Phrynopus paucari 30.94626 26.5086479 0.1435683 1.2423607
Phrynopus peruanus 31.05001 24.2558208 0.1410505 1.4208783
Phrynopus pesantesi 30.98881 24.6460823 0.1429989 1.1554234
Phrynopus tautzorum 31.09016 19.6199269 0.1432684 1.0166757
Phrynopus thompsoni 31.05169 26.7655932 0.1422638 1.1888917
Phrynopus tribulosus 30.99638 25.0626384 0.1419077 1.1764501
Pristimantis aaptus 30.95994 37.2030331 0.1428969 1.2672434
Pristimantis acatallelus 31.02705 32.1152779 0.1400274 1.2964490
Pristimantis acerus 31.02550 12.3832311 0.1399670 0.5831368
Pristimantis lymani 33.58544 23.3295034 0.1369500 0.9756402
Pristimantis achuar 31.05306 33.6155247 0.1432525 1.2956451
Pristimantis actinolaimus 30.96865 31.3553826 0.1441149 1.3595317
Pristimantis acuminatus 30.95901 29.5025306 0.1406255 1.1589599
Pristimantis acutirostris 30.93173 24.5787460 0.1410068 1.1036814
Pristimantis adiastolus 31.11892 25.1628478 0.1405954 1.1866906
Pristimantis aemulatus 30.97097 39.9816661 0.1428983 1.5111978
Pristimantis affinis 30.97316 26.7545320 0.1432875 1.1499077
Pristimantis alalocophus 30.87875 24.8399306 0.1422200 1.0967516
Pristimantis albertus 31.10975 21.0345578 0.1432981 1.0955798
Pristimantis altae 31.10450 36.9209426 0.1412287 1.4076376
Pristimantis pardalis 31.11355 49.3030010 0.1411488 1.8671264
Pristimantis altamazonicus 31.16287 35.3392159 0.1417507 1.3012572
Pristimantis altamnis 31.03799 26.2958542 0.1408640 1.0981102
Pristimantis kichwarum 31.19753 24.2103057 0.1424735 0.9810199
Pristimantis amydrotus 31.02993 40.4142411 0.1387836 1.6497648
Pristimantis anemerus 31.03599 28.2176326 0.1424342 1.2369122
Pristimantis angustilineatus 31.05913 35.1433965 0.1413532 1.4390497
Pristimantis brevifrons 31.01253 27.6516291 0.1426514 1.1544845
Pristimantis aniptopalmatus 31.15142 23.7081778 0.1429563 1.1116588
Pristimantis anolirex 31.07175 27.3743792 0.1410377 1.1675032
Pristimantis lutitus 31.09801 28.2869077 0.1404867 1.1990568
Pristimantis merostictus 30.99038 29.5944726 0.1424692 1.2853439
Pristimantis apiculatus 31.04317 19.9597526 0.1425599 0.8760373
Pristimantis appendiculatus 31.06541 19.0155735 0.1428780 0.8409400
Pristimantis aquilonaris 31.17808 30.9646073 0.1435307 1.3229092
Pristimantis ardalonychus 31.06247 24.7398071 0.1417702 1.1003935
Pristimantis atrabracus 31.10902 33.1005603 0.1406093 1.3656788
Pristimantis atratus 31.00365 20.2336312 0.1396026 0.8712450
Pristimantis aurantiguttatus 30.99009 41.5982567 0.1409746 1.5897359
Pristimantis aureolineatus 30.92176 32.7261235 0.1424466 1.2300623
Pristimantis aureoventris 30.87043 32.3252216 0.1442124 1.2086975
Pristimantis jester 30.94281 34.6005518 0.1393975 1.2835393
Pristimantis avicuporum 31.07202 30.6938180 0.1427237 1.2625471
Pristimantis avius 31.02279 36.0548125 0.1390048 1.3170407
Pristimantis bacchus 31.03811 24.9611577 0.1432617 1.1041283
Pristimantis baiotis 31.03474 39.4088515 0.1413999 1.4918856
Pristimantis balionotus 30.81574 21.0365375 0.1424633 0.9274955
Pristimantis bambu 30.92799 13.8593682 0.1410047 0.6659163
Pristimantis simonbolivari 31.14823 15.5351711 0.1409164 0.6925558
Pristimantis baryecuus 30.96588 17.9520077 0.1425589 0.7708194
Pristimantis batrachites 31.03453 24.3496435 0.1411403 1.0884552
Pristimantis bearsei 30.57383 37.5718450 0.1402095 1.5500493
Pristimantis bellator 30.92736 28.4994290 0.1421808 1.2129472
Pristimantis bellona 30.91696 40.2918659 0.1421661 1.5200168
Pristimantis bicumulus 31.10025 37.4609995 0.1409600 1.4060560
Pristimantis bipunctatus 31.19477 29.7655853 0.1399146 1.4733341
Pristimantis boulengeri 30.95917 30.9816412 0.1432564 1.2956178
Pristimantis simoterus 31.18782 26.8643573 0.1414538 1.1897259
Pristimantis chloronotus 30.99825 21.0683397 0.1419105 0.9168338
Pristimantis bromeliaceus 30.86549 23.0566865 0.1414344 1.0024918
Pristimantis buckleyi 29.41748 21.5701118 0.1440273 0.8922839
Pristimantis cabrerai 30.94467 26.6444778 0.1429298 1.0920688
Pristimantis cacao 31.16323 19.5951888 0.1411689 0.8499632
Pristimantis caeruleonotus 31.03145 29.6069015 0.1415763 1.2329962
Pristimantis cajamarcensis 31.00148 28.4707168 0.1426197 1.2252203
Pristimantis calcaratus 31.19696 34.6535559 0.1432507 1.4097169
Pristimantis calcarulatus 30.87311 16.7416286 0.1414114 0.7196606
Pristimantis cantitans 31.08417 37.2044163 0.1398356 1.3770015
Pristimantis capitonis 31.20890 25.3271254 0.1412860 1.0547215
Pristimantis caprifer 31.03352 35.0222419 0.1410470 1.3993003
Pristimantis carlossanchezi 30.98460 30.9783634 0.1397317 1.2808453
Pristimantis carmelitae 31.15569 30.4831321 0.1413436 1.0786346
Pristimantis carranguerorum 31.25381 21.8134727 0.1380979 0.9600976
Pristimantis lynchi 31.15393 25.0259858 0.1405114 1.1141361
Pristimantis caryophyllaceus 31.24009 36.9405566 0.1384617 1.3786685
Pristimantis celator 30.89284 20.6153495 0.1415571 0.8718425
Pristimantis cerasinus 31.06272 38.3138345 0.1421030 1.4245649
Pristimantis ceuthospilus 30.99335 34.5828807 0.1431215 1.4589830
Pristimantis chalceus 31.09815 30.7954614 0.1431853 1.2228797
Pristimantis charlottevillensis 31.15658 79.0619032 0.1430672 2.9625604
Pristimantis chiastonotus 31.11341 40.7042320 0.1420649 1.4782386
Pristimantis chimu 30.93309 45.6842114 0.1437884 1.8647202
Pristimantis chrysops 30.95494 34.9657504 0.1410602 1.4219056
Pristimantis citriogaster 30.62897 25.6361752 0.1393321 1.0759542
Pristimantis malkini 31.22066 34.0979980 0.1418956 1.2427784
Pristimantis colodactylus 31.02357 22.5702050 0.1410491 0.9621669
Pristimantis colomai 32.93913 18.6425875 0.1407217 0.7931583
Pristimantis colonensis 31.00632 28.8610059 0.1431424 1.1933034
Pristimantis colostichos 31.04084 33.5923418 0.1421005 1.3069882
Pristimantis condor 31.01457 21.1184165 0.1388079 0.8965223
Pristimantis paramerus 31.15880 35.0137152 0.1408077 1.3229796
Pristimantis cordovae 31.16194 20.0028159 0.1436338 0.9589794
Pristimantis corniger 31.02328 36.3688192 0.1433105 1.4424695
Pristimantis coronatus 31.03566 31.6592002 0.1422709 1.3499494
Pristimantis corrugatus 30.97727 24.3656389 0.1434329 1.1305623
Pristimantis cosnipatae 30.95193 7.6168291 0.1411423 0.5180947
Pristimantis cremnobates 30.44370 26.7569728 0.1463648 1.1228828
Pristimantis labiosus 31.17826 21.9126590 0.1422062 0.8931156
Pristimantis cristinae 30.88459 29.2485436 0.1414059 1.0757136
Pristimantis croceoinguinis 31.06083 30.8948159 0.1420859 1.1830624
Pristimantis crucifer 31.14937 27.8871191 0.1420879 1.1570619
Pristimantis cruciocularis 31.10232 32.6326170 0.1438612 1.5287425
Pristimantis cruentus 31.08236 43.2159564 0.1412237 1.6058982
Pristimantis cryophilius 31.15515 17.0449637 0.1409967 0.7169602
Pristimantis cryptomelas 31.16007 21.7266719 0.1420954 0.9377878
Pristimantis cuentasi 31.01403 25.8834269 0.1424709 0.9643038
Pristimantis cuneirostris 30.96409 29.8044873 0.1433572 1.2272826
Pristimantis gentryi 31.40691 11.8101416 0.1422761 0.5176634
Pristimantis truebae 31.23313 11.3262511 0.1431146 0.5034856
Pristimantis degener 30.89072 23.0006242 0.1437536 0.9928935
Pristimantis deinops 31.01503 31.8307929 0.1408342 1.2933234
Pristimantis delicatus 30.97379 33.6232031 0.1389803 1.1903973
Pristimantis delius 31.12685 31.7619861 0.1409002 1.1603182
Pristimantis dendrobatoides 30.95337 38.8781100 0.1446995 1.4416745
Pristimantis devillei 30.93010 15.2608702 0.1420018 0.6951410
Pristimantis surdus 31.10737 13.1757987 0.1411520 0.6420217
Pristimantis diadematus 30.87864 33.9074858 0.1454086 1.3609584
Pristimantis diaphonus 30.95767 35.2797427 0.1448384 1.4094873
Pristimantis diogenes 30.59947 31.6922415 0.1387077 1.3001261
Pristimantis dissimulatus 30.96219 10.6822216 0.1393313 0.5288955
Pristimantis divnae 30.89074 21.7218139 0.1425388 1.1306351
Pristimantis dorsopictus 31.01974 22.1717376 0.1406153 1.0261234
Pristimantis duellmani 31.03791 24.0969444 0.1416439 1.0391486
Pristimantis quinquagesimus 31.02702 20.1027963 0.1394137 0.8516707
Pristimantis duende 31.12746 38.2836313 0.1420369 1.5812650
Pristimantis dundeei 30.98373 32.0687946 0.1421031 1.2073473
Pristimantis epacrus 31.13871 34.4603154 0.1430720 1.3692084
Pristimantis eremitus 31.05696 19.8995859 0.1388207 0.8727069
Pristimantis eriphus 30.88579 18.0022558 0.1433050 0.7859408
Pristimantis ernesti 30.96070 27.8789449 0.1428195 1.1666442
Pristimantis erythropleura 30.95855 33.2708610 0.1402391 1.3678111
Pristimantis esmeraldas 31.00188 31.1101486 0.1412322 1.2529121
Pristimantis eugeniae 31.01564 17.3497239 0.1407453 0.7705952
Pristimantis euphronides 31.10420 55.4705066 0.1425644 1.9878044
Pristimantis shrevei 31.03947 62.6456620 0.1388183 2.3031677
Pristimantis eurydactylus 30.89513 37.3792488 0.1412482 1.3321057
Pristimantis exoristus 31.11290 32.5521196 0.1396677 1.3071759
Pristimantis factiosus 31.02638 29.0847804 0.1417635 1.2248051
Pristimantis fasciatus 31.11034 30.9478806 0.1417463 1.1414593
Pristimantis fetosus 30.98010 28.0848159 0.1414207 1.2142406
Pristimantis floridus 30.97654 10.7545091 0.1422311 0.5384819
Pristimantis gaigei 31.11979 39.2503184 0.1396281 1.5303223
Pristimantis galdi 30.89531 23.7534747 0.1421262 1.0024282
Pristimantis ganonotus 31.04577 11.4329810 0.1415401 0.5615751
Pristimantis gladiator 32.09258 19.8547177 0.1407485 0.8669631
Pristimantis glandulosus 31.12857 16.1265285 0.1430663 0.7313217
Pristimantis inusitatus 30.97910 15.8326305 0.1423543 0.7186755
Pristimantis gracilis 31.03441 33.0100886 0.1363854 1.3977053
Pristimantis grandiceps 30.98616 25.0017438 0.1411065 1.1079352
Pristimantis gutturalis 31.03603 43.8059575 0.1434507 1.5865285
Pristimantis hectus 31.03819 19.2007100 0.1431320 0.8401856
Pristimantis helvolus 30.94958 26.9358098 0.1431268 1.1387968
Pristimantis hernandezi 30.90182 25.2623794 0.1432197 1.0338119
Pristimantis huicundo 31.01221 22.8578875 0.1430645 1.0129607
Pristimantis hybotragus 30.96826 35.5914915 0.1409165 1.4197549
Pristimantis ignicolor 30.95864 15.8921168 0.1421994 0.7204050
Pristimantis illotus 31.00542 18.1408776 0.1413864 0.8149204
Pristimantis imitatrix 31.17198 35.8426560 0.1429683 1.5922203
Pristimantis incanus 31.10567 17.7980146 0.1427471 0.8087484
Pristimantis infraguttatus 30.87681 16.8190598 0.1431446 0.8131664
Pristimantis inguinalis 30.97935 33.9561596 0.1428909 1.2313619
Pristimantis insignitus 31.12924 29.2764024 0.1436091 1.0798418
Pristimantis ixalus 30.49587 35.3385936 0.1418652 1.4322975
Pristimantis jaimei 31.00442 27.9871144 0.1403284 1.1458831
Pristimantis johannesdei 31.03024 36.1278311 0.1405464 1.4223960
Pristimantis jorgevelosai 30.41636 27.7473935 0.1429881 1.1724203
Pristimantis juanchoi 31.08469 33.9087260 0.1405530 1.3806122
Pristimantis palmeri 31.08964 29.6292785 0.1427813 1.2298588
Pristimantis jubatus 31.01363 28.4354079 0.1404870 1.1682270
Pristimantis kareliae 30.62263 31.4207196 0.1420042 1.1652421
Pristimantis katoptroides 30.98854 20.6591759 0.1401472 0.8655198
Pristimantis lacrimosus 31.02499 35.2857229 0.1400527 1.4349018
Pristimantis lanthanites 31.15526 36.2419637 0.1413025 1.3310129
Pristimantis thectopternus 30.96342 27.5176553 0.1387615 1.1506663
Pristimantis lasalleorum 30.99091 38.1523427 0.1412322 1.4455790
Pristimantis lemur 30.94577 29.5296102 0.1426418 1.2089632
Pristimantis leoni 31.17578 20.4060313 0.1410074 0.8917304
Pristimantis leptolophus 30.99297 32.8452337 0.1415071 1.3396492
Pristimantis leucopus 30.94169 22.3285497 0.1424323 0.9692936
Pristimantis librarius 29.52542 24.7320189 0.1429483 0.9607851
Pristimantis lichenoides 30.56387 27.7422474 0.1416321 1.2033160
Pristimantis lirellus 30.85436 25.3456675 0.1393980 1.0699250
Pristimantis lividus 30.92449 16.0975712 0.1421044 0.7362307
Pristimantis llojsintuta 31.06710 24.8913510 0.1395217 1.2775557
Pristimantis loustes 31.03870 22.8780460 0.1418456 0.9787711
Pristimantis lucasi 30.95016 22.3386536 0.1431706 1.0447456
Pristimantis luscombei 30.99602 31.9487270 0.1432344 1.2146376
Pristimantis luteolateralis 30.94180 10.9410833 0.1400919 0.5452063
Pristimantis walkeri 31.05436 20.7722034 0.1419659 0.8629004
Pristimantis lythrodes 31.06595 41.5520988 0.1408350 1.4174492
Pristimantis maculosus 30.88284 22.1050325 0.1458932 1.0201969
Pristimantis marahuaka 31.09973 36.0792122 0.1406780 1.3917722
Pristimantis marmoratus 31.15084 37.1581950 0.1431021 1.3582951
Pristimantis pulvinatus 30.99623 32.0297065 0.1408281 1.1998580
Pristimantis mars 31.13492 29.9757437 0.1410705 1.2998724
Pristimantis martiae 31.14181 33.9794823 0.1428153 1.2430232
Pristimantis megalops 31.28653 28.5724611 0.1393332 1.0535391
Pristimantis melanogaster 31.11472 29.9788783 0.1411899 1.3623086
Pristimantis melanoproctus 30.89197 24.7123419 0.1402746 1.0987402
Pristimantis memorans 30.57459 38.7427324 0.1426958 1.4201082
Pristimantis mendax 30.97976 25.3237794 0.1400269 1.2093054
Pristimantis meridionalis 30.97244 15.3689050 0.1430115 0.7427748
Pristimantis metabates 30.50830 27.8598748 0.1416548 1.1114250
Pristimantis minutulus 30.92100 30.5944178 0.1395620 1.3868822
Pristimantis miyatai 30.98044 24.7035167 0.1426732 1.0581394
Pristimantis mnionaetes 30.99009 23.2522444 0.1417250 1.0267805
Pristimantis modipeplus 31.00112 14.5615419 0.1393807 0.6449877
Pristimantis molybrignus 30.92677 31.0381219 0.1409734 1.2670585
Pristimantis mondolfii 30.98396 24.5716902 0.1410532 1.0927788
Pristimantis moro 31.04167 40.6527797 0.1401642 1.4894951
Pristimantis muricatus 30.99879 19.3788663 0.1418374 0.8340209
Pristimantis muscosus 30.47629 27.5694699 0.1393743 1.1638503
Pristimantis museosus 30.85969 47.6611803 0.1424272 1.7378639
Pristimantis myersi 31.10556 26.0797398 0.1419671 1.0869093
Pristimantis myops 31.09031 38.7731987 0.1435862 1.5991370
Pristimantis nephophilus 31.00351 27.5857737 0.1405419 1.1682081
Pristimantis nicefori 30.95316 24.4018390 0.1419596 1.0582320
Pristimantis nigrogriseus 30.56277 18.0240662 0.1405156 0.7865081
Pristimantis nyctophylax 30.99949 15.6362817 0.1427595 0.6716046
Pristimantis subsigillatus 31.04304 28.9475421 0.1397987 1.1571046
Pristimantis obmutescens 30.94886 27.4318754 0.1422884 1.1432767
Pristimantis ocellatus 30.94326 29.2316722 0.1419846 1.2047933
Pristimantis ocreatus 32.16620 24.6420530 0.1418018 1.1112376
Pristimantis thymelensis 31.21232 20.4512962 0.1419016 0.9122795
Pristimantis pyrrhomerus 31.22721 19.9091226 0.1405021 0.8555781
Pristimantis olivaceus 31.03730 26.1817107 0.1396743 1.2909148
Pristimantis orcesi 30.95721 13.1145989 0.1441066 0.6231991
Pristimantis orcus 31.01646 35.0385029 0.1407863 1.3142737
Pristimantis orestes 31.09210 18.4353512 0.1433152 0.7741260
Pristimantis ornatissimus 31.12050 20.0956209 0.1425152 0.8658250
Pristimantis ornatus 31.09393 24.0478056 0.1404676 1.1306961
Pristimantis orpacobates 31.02967 33.3363512 0.1423085 1.3467948
Pristimantis orphnolaimus 30.98756 33.0610276 0.1427460 1.2607054
Pristimantis ortizi 31.05697 21.6701433 0.1421378 0.9749166
Pristimantis padrecarlosi 30.48498 30.8618487 0.1383178 1.2806937
Pristimantis paisa 30.54892 23.5428405 0.1424895 1.0840128
Pristimantis pardalinus 31.13152 24.5383503 0.1427251 1.4377926
Pristimantis parectatus 30.96102 25.7633283 0.1433979 1.1350445
Pristimantis parvillus 31.17982 23.2446669 0.1411135 0.9405880
Pristimantis pastazensis 31.08526 15.0864337 0.1396667 0.6723420
Pristimantis pataikos 30.96814 24.4920676 0.1394702 1.1278775
Pristimantis paulodutrai 31.04842 24.7864975 0.1398485 0.9781370
Pristimantis paululus 31.14335 25.8415530 0.1410945 1.0429326
Pristimantis pecki 30.86925 23.6925658 0.1420322 0.9757362
Pristimantis pedimontanus 31.17358 30.0254388 0.1418013 1.1746082
Pristimantis penelopus 30.98589 31.4197683 0.1433690 1.2376760
Pristimantis peraticus 31.20949 35.4678967 0.1423991 1.4100212
Pristimantis percnopterus 30.95001 29.5502153 0.1414836 1.2552033
Pristimantis percultus 30.94087 21.9192782 0.1400704 0.9623358
Pristimantis permixtus 30.96150 29.9036583 0.1423132 1.2551718
Pristimantis uranobates 30.54872 25.7850434 0.1399484 1.1182820
Pristimantis peruvianus 31.16337 35.1613759 0.1382450 1.2881087
Pristimantis petersi 31.11697 24.7322169 0.1430740 1.0363554
Pristimantis petrobardus 30.99813 34.8430202 0.1423793 1.5259349
Pristimantis phalaroinguinis 31.02674 39.8946293 0.1419069 1.6276096
Pristimantis phalarus 30.93226 40.9695158 0.1413561 1.6929737
Pristimantis philipi 31.03378 27.3652477 0.1418737 1.0141438
Pristimantis piceus 31.07969 27.4780217 0.1426077 1.1613276
Pristimantis pinguis 31.10027 34.6462867 0.1431135 1.5509297
Pristimantis pirrensis 31.02866 36.4143273 0.1411202 1.3784711
Pristimantis platychilus 30.97487 31.3591842 0.1444373 1.2511241
Pristimantis pleurostriatus 30.91447 29.8297626 0.1408134 1.1603466
Pristimantis polemistes 30.61866 40.3445245 0.1412440 1.5262871
Pristimantis polychrus 31.02767 30.0960965 0.1419844 1.2054404
Pristimantis prolatus 31.01668 20.5522148 0.1423454 0.8786745
Pristimantis proserpens 31.03421 20.9047080 0.1388187 0.9012766
Pristimantis pruinatus 31.05500 42.0822268 0.1412989 1.5544402
Pristimantis pseudoacuminatus 31.12590 34.8864740 0.1401397 1.3565517
Pristimantis pteridophilus 30.86879 12.4784324 0.1441286 0.6109418
Pristimantis ptochus 30.99640 34.0689748 0.1388606 1.3936774
Pristimantis zophus 30.94868 27.5019361 0.1397991 1.1073337
Pristimantis pugnax 30.47241 29.9969420 0.1404515 1.2399931
Pristimantis quantus 30.98312 36.2395981 0.1419822 1.5027146
Pristimantis racemus 31.04980 30.0880680 0.1425358 1.2590947
Pristimantis ramagii 31.05375 28.6680858 0.1436519 1.1204309
Pristimantis repens 31.02180 30.2625146 0.1401814 1.2364915
Pristimantis restrepoi 31.14422 33.5623603 0.1399311 1.3463781
Pristimantis reticulatus 30.99040 35.0464910 0.1415182 1.2914588
Pristimantis rhabdocnemus 31.03103 24.7378210 0.1385865 1.1587276
Pristimantis rhabdolaemus 30.92747 18.4053309 0.1430371 1.0340326
Pristimantis rhodoplichus 31.16764 30.5367960 0.1392635 1.3016393
Pristimantis rhodostichus 30.96886 26.3299548 0.1402941 1.0948365
Pristimantis ridens 30.99763 41.5837228 0.1430745 1.5524930
Pristimantis rivasi 31.21831 33.9846475 0.1415384 1.2667887
Pristimantis riveroi 30.92312 34.4652495 0.1414861 1.2781512
Pristimantis versicolor 31.42295 19.5516500 0.1388369 0.8198424
Pristimantis rosadoi 30.99328 22.0879682 0.1427403 0.9157437
Pristimantis roseus 30.52836 36.2713502 0.1437693 1.3911811
Pristimantis rozei 31.01680 39.7664240 0.1373163 1.4634694
Pristimantis rubicundus 30.90412 16.8638550 0.1424053 0.7343336
Pristimantis ruedai 30.54214 33.2981122 0.1409599 1.3368777
Pristimantis rufioculis 30.99144 29.8754013 0.1402570 1.2689262
Pristimantis ruidus 30.87723 28.8857227 0.1425415 1.0710738
Pristimantis ruthveni 31.19762 27.6191251 0.1424867 1.0178320
Pristimantis saltissimus 30.96813 35.7762609 0.1375490 1.3274306
Pristimantis samaipatae 30.97920 31.1765705 0.1407612 1.3964413
Pristimantis sanctaemartae 30.85661 28.2367332 0.1441712 1.0418106
Pristimantis sanguineus 30.98081 33.5913789 0.1436832 1.3372392
Pristimantis satagius 31.08973 39.6979813 0.1420466 1.5012303
Pristimantis schultei 31.04123 26.2972190 0.1399164 1.1798861
Pristimantis scitulus 30.89022 18.5430376 0.1410441 1.1873176
Pristimantis scoloblepharus 30.37945 25.5260604 0.1424168 1.1274270
Pristimantis scolodiscus 31.02411 26.1583929 0.1429243 1.1030193
Pristimantis scopaeus 30.91041 25.7972223 0.1424425 1.1472714
Pristimantis seorsus 30.98178 47.3745814 0.1427000 2.3061583
Pristimantis serendipitus 31.06410 23.2633857 0.1438600 1.0354008
Pristimantis signifer 31.08860 39.0486327 0.1426785 1.6137226
Pristimantis silverstonei 31.06195 36.4513936 0.1419594 1.4542824
Pristimantis simonsii 31.04819 32.0209609 0.1408939 1.4323920
Pristimantis simoteriscus 31.13892 25.4689256 0.1398859 1.1893082
Pristimantis siopelus 30.85026 38.7212530 0.1436912 1.5601065
Pristimantis skydmainos 30.98755 34.4289783 0.1407689 1.4345369
Pristimantis sobetes 30.89730 10.8251927 0.1444545 0.5424297
Pristimantis spectabilis 31.04663 25.1600341 0.1414419 1.1859598
Pristimantis spilogaster 30.94591 32.9770680 0.1436661 1.3381266
Pristimantis spinosus 30.99944 16.2417290 0.1428378 0.6972266
Pristimantis stenodiscus 31.07251 35.2668011 0.1422943 1.2952023
Pristimantis sternothylax 30.95866 32.7328081 0.1418117 1.3534177
Pristimantis stictoboubonus 31.08280 32.4137441 0.1429509 1.4256550
Pristimantis stictogaster 31.26460 24.9480628 0.1416979 1.1703742
Pristimantis suetus 30.97820 25.1537636 0.1415244 1.0492079
Pristimantis sulculus 31.03502 41.2071863 0.1424858 1.6599008
Pristimantis supernatis 30.38250 27.4479094 0.1422440 1.1640589
Pristimantis susaguae 30.88780 30.4476306 0.1436859 1.2856409
Pristimantis taciturnus 30.40151 22.5335381 0.1441158 0.9785597
Pristimantis yukpa 32.55746 24.1231741 0.1385697 0.9112438
Pristimantis tamsitti 31.10146 32.5721074 0.1394898 1.2956865
Pristimantis tantanti 30.94483 42.3491186 0.1435596 1.9075121
Pristimantis tanyrhynchus 31.02337 41.6188034 0.1459125 2.0253399
Pristimantis tayrona 31.06285 31.2994848 0.1418545 1.1549187
Pristimantis telefericus 31.19927 27.9885284 0.1416909 1.0903882
Pristimantis tenebrionis 30.99324 22.7475794 0.1426276 0.9372821
Pristimantis thymalopsoides 30.97237 10.3808888 0.1435540 0.5188797
Pristimantis torrenticola 31.01695 28.8436363 0.1419078 1.2521610
Pristimantis tribulosus 30.97391 31.9106293 0.1414754 1.3833169
Pristimantis tubernasus 31.00483 29.4958275 0.1422894 1.1656341
Pristimantis turik 30.97903 31.0461470 0.1437846 1.1183692
Pristimantis turpinorum 31.05377 91.3204466 0.1407496 3.4215602
Pristimantis turumiquirensis 31.07634 38.6896189 0.1417143 1.4255265
Pristimantis uisae 30.93802 26.3068015 0.1404259 1.1239710
Pristimantis urichi 31.20113 61.4565628 0.1440819 2.3181679
Pristimantis variabilis 30.95869 35.6481018 0.1424229 1.3216277
Pristimantis veletis 30.96942 29.3768716 0.1429881 1.2721732
Pristimantis ventriguttatus 31.05523 44.6782600 0.1422234 1.8216824
Pristimantis ventrimarmoratus 31.03863 29.1816350 0.1432615 1.2175494
Pristimantis verecundus 31.01718 22.7997633 0.1419316 1.0007582
Pristimantis vicarius 31.16592 31.7754836 0.1384869 1.3167770
Pristimantis vidua 31.17648 14.2408757 0.1408012 0.6604716
Pristimantis viejas 31.10940 35.1952321 0.1405209 1.3858712
Pristimantis vilarsi 31.12640 37.2334883 0.1407786 1.3339770
Pristimantis vilcabambae 31.19602 41.4015047 0.1415052 2.0130128
Pristimantis vinhai 31.12242 25.8692048 0.1430886 1.0241214
Pristimantis viridicans 31.17356 28.0927504 0.1431327 1.1428555
Pristimantis viridis 30.88892 38.9709360 0.1419723 1.4875418
Pristimantis wagteri 31.22214 29.5078329 0.1418191 1.3394063
Pristimantis waoranii 30.95652 38.0958077 0.1428619 1.4690242
Pristimantis wiensi 30.88954 28.3655121 0.1409499 1.2401467
Pristimantis xeniolum 31.02246 33.6941104 0.1414176 1.3907970
Pristimantis xestus 31.04127 39.3914174 0.1404471 1.5157500
Pristimantis xylochobates 30.97269 34.6848787 0.1438149 1.4329821
Pristimantis yaviensis 31.13343 33.9921211 0.1388608 1.2550159
Pristimantis yustizi 31.00409 28.0476600 0.1435642 1.1013728
Pristimantis zeuctotylus 31.06773 38.6334764 0.1411715 1.3971515
Pristimantis zimmermanae 31.20215 34.2278168 0.1424212 1.1976894
Pristimantis zoilae 31.07241 25.8954192 0.1413943 1.0743381
Dischidodactylus colonnelloi 29.74155 30.8703075 0.1448719 1.1878822
Dischidodactylus duidensis 29.90281 35.4053376 0.1435711 1.3635790
Geobatrachus walkeri 29.84019 30.3138705 0.1427746 1.1181233
Niceforonia adenobrachia 29.87077 24.9120149 0.1430067 1.1695673
Niceforonia nana 29.93929 27.0819074 0.1445564 1.1521140
Strabomantis anatipes 29.23740 28.9460745 0.1426928 1.1812103
Strabomantis ingeri 29.84504 30.0653342 0.1444690 1.2733725
Strabomantis cheiroplethus 29.23801 40.6758501 0.1455520 1.5894479
Strabomantis anomalus 29.24815 35.9188515 0.1417881 1.4136362
Strabomantis bufoniformis 29.21992 39.8614863 0.1453446 1.5188789
Strabomantis cadenai 29.90465 38.5093787 0.1445026 1.4583771
Strabomantis ruizi 29.89065 37.5370451 0.1434772 1.5286478
Strabomantis helonotus 29.99954 16.0279693 0.1432090 0.7229732
Strabomantis zygodactylus 29.41606 38.2636596 0.1420161 1.4927472
Strabomantis cornutus 29.90696 25.0424044 0.1437065 1.0411542
Strabomantis laticorpus 29.94447 38.7313240 0.1434167 1.3764923
Strabomantis biporcatus 29.96997 37.5653163 0.1435798 1.3910374
Strabomantis cerastes 29.93989 37.0092946 0.1423630 1.5048930
Strabomantis necopinus 29.88907 24.1951147 0.1428273 1.0604300
Strabomantis sulcatus 29.91077 35.3412344 0.1446140 1.3158555
Barycholos pulcher 28.79422 22.8095685 0.1470936 0.9044686
Barycholos ternetzi 28.68012 25.5851096 0.1480911 0.9386009
Noblella heyeri 29.01416 23.5237046 0.1439845 1.0127522
Noblella lochites 28.96411 27.0173966 0.1459307 1.0833723
Noblella lynchi 28.74718 32.1515731 0.1459776 1.3722798
Noblella ritarasquinae 28.82412 20.4614312 0.1450143 1.1038921
Noblella carrascoicola 28.78725 21.0469598 0.1441390 1.1326133
Noblella coloma 28.77911 9.9057673 0.1456369 0.4926721
Noblella duellmani 28.71363 23.4573231 0.1456906 1.0983695
Bryophryne bustamantei 26.60975 13.0464913 0.1521829 0.7013680
Bryophryne zonalis 26.66583 6.5073402 0.1489830 0.4048702
Euparkerella brasiliensis 28.76907 25.4585616 0.1443181 0.9588340
Euparkerella cochranae 28.81875 27.3426448 0.1417638 1.0475478
Euparkerella tridactyla 28.76712 31.9229835 0.1460796 1.2388806
Euparkerella robusta 28.79471 35.5500151 0.1426558 1.4203507
Holoaden bradei 28.75090 23.0015136 0.1459631 0.8644424
Holoaden pholeter 28.73927 23.9808557 0.1449454 0.8919926
Holoaden luederwaldti 28.79675 22.2710348 0.1453019 0.8635545
Psychrophrynella bagrecito 28.47030 7.6683419 0.1477262 0.4710627
Ceratophrys testudo 36.79448 12.5892948 0.1294958 0.5625136
Ceratophrys calcarata 37.71563 29.9213878 0.1306390 1.0997181
Ceratophrys cornuta 36.71653 33.4218218 0.1331219 1.2116541
Ceratophrys stolzmanni 37.70877 20.5614047 0.1301364 0.8397476
Ceratophrys ornata 37.77087 8.0353426 0.1267859 0.3511068
Chacophrys pierottii 38.07281 16.9679853 0.1280263 0.6721132
Lepidobatrachus asper 37.47809 15.0414316 0.1289875 0.5634447
Lepidobatrachus laevis 37.51986 16.1196060 0.1289666 0.5973382
Insuetophrynus acarpicus 33.83549 10.1114811 0.1320892 0.5647997
Rhinoderma darwinii 34.42020 8.4885805 0.1319995 0.5506988
Rhinoderma rufum 34.41090 14.1063158 0.1312037 0.7221340
Telmatobius arequipensis 34.66308 11.7285360 0.1329023 0.7477356
Telmatobius oxycephalus 34.63942 16.3229382 0.1340871 0.8980337
Telmatobius sanborni 34.73773 21.2165792 0.1330462 1.2988733
Telmatobius verrucosus 34.65678 25.9555200 0.1327813 1.3855662
Telmatobius atacamensis 34.55270 10.8900981 0.1319866 0.7496478
Telmatobius ignavus 34.59028 35.0948030 0.1335104 1.5369616
Telmatobius atahualpai 34.70419 26.8943991 0.1319562 1.3173212
Telmatobius rimac 34.75774 24.1389553 0.1283266 1.2681115
Telmatobius yuracare 34.56443 39.0527171 0.1356199 1.7297011
Telmatobius simonsi 34.61906 27.2821549 0.1319229 1.3566826
Telmatobius brevipes 34.71546 22.1351107 0.1293928 1.0999859
Telmatobius colanensis 33.70486 35.1712204 0.1357734 1.4529040
Telmatobius brevirostris 34.70112 23.4735871 0.1340476 1.1730307
Telmatobius carrillae 34.67065 14.1355751 0.1313056 0.8690727
Telmatobius peruvianus 34.64273 10.8204129 0.1337382 0.7361577
Telmatobius hockingi 33.80141 13.3636187 0.1327139 0.7644904
Telmatobius chusmisensis 33.85149 11.7761023 0.1321257 0.7416641
Telmatobius intermedius 34.69791 19.7768738 0.1316179 1.2962607
Telmatobius scrocchii 34.62945 15.6321810 0.1326299 0.7424888
Telmatobius contrerasi 33.89042 10.8989015 0.1320430 0.5140180
Telmatobius philippii 34.69283 6.0106151 0.1307274 0.5767083
Telmatobius culeus 34.54217 16.2800182 0.1320651 0.9988798
Telmatobius gigas 33.79863 13.9437135 0.1333855 0.8863709
Telmatobius hintoni 34.57949 22.9998124 0.1335229 1.2532377
Telmatobius huayra 34.58479 10.4513398 0.1323496 0.7052357
Telmatobius zapahuirensis 34.64117 8.9078332 0.1321290 0.5250326
Telmatobius dankoi 34.58644 13.6696395 0.1326362 0.9306192
Telmatobius vilamensis 34.69893 13.1325514 0.1324396 0.8934568
Telmatobius degener 34.56807 28.8520380 0.1336764 1.2803406
Telmatobius fronteriensis 33.77814 8.1448506 0.1314647 0.6754697
Telmatobius schreiteri 34.51829 13.4149906 0.1338666 0.6573820
Telmatobius halli 34.74289 5.7731376 0.1307878 0.5621666
Telmatobius jelskii 34.66788 13.1387238 0.1319360 0.7879927
Telmatobius hauthali 34.65375 5.9141444 0.1341665 0.4672283
Telmatobius necopinus 33.90055 19.0730176 0.1323916 0.9179413
Telmatobius hypselocephalus 34.62748 11.4581677 0.1309177 0.7895836
Telmatobius mayoloi 34.57327 21.4243544 0.1358135 0.9740227
Telmatobius platycephalus 34.49522 14.1934119 0.1334609 0.9052351
Telmatobius latirostris 34.66668 39.4240321 0.1308527 1.7212200
Telmatobius timens 34.66383 16.0434680 0.1312002 0.9738447
Telmatobius marmoratus 34.65960 12.1862336 0.1326062 0.7712763
Telmatobius stephani 34.59154 16.4196090 0.1309627 0.7813183
Telmatobius niger 34.58312 19.7923450 0.1362756 0.8428839
Telmatobius pefauri 33.67388 8.7938029 0.1338766 0.5259015
Telmatobius punctatus 34.54418 21.0255468 0.1352885 1.0776961
Telmatobius pinguiculus 34.54978 12.2220735 0.1322846 0.6231694
Telmatobius pisanoi 34.56154 6.2354584 0.1312654 0.4216268
Telmatobius thompsoni 34.66865 31.0705354 0.1335804 1.3737733
Telmatobius truebae 34.64204 35.8516899 0.1329205 1.6489196
Cycloramphus acangatan 34.12301 21.6349533 0.1335735 0.8209827
Cycloramphus valae 33.50463 16.9667079 0.1317982 0.6851981
Cycloramphus eleutherodactylus 34.03766 21.2664114 0.1341898 0.8142754
Cycloramphus juimirim 33.46189 21.2050638 0.1339627 0.8002706
Cycloramphus asper 33.57773 17.8178319 0.1349373 0.7245525
Cycloramphus izecksohni 33.53925 18.5282720 0.1354966 0.7473979
Cycloramphus bolitoglossus 34.13196 18.2337843 0.1358806 0.7253940
Cycloramphus granulosus 33.50223 24.3637207 0.1344150 0.9497888
Cycloramphus boraceiensis 33.56138 27.5805190 0.1348102 1.0631708
Cycloramphus brasiliensis 33.56526 27.2649647 0.1347321 1.0266068
Cycloramphus diringshofeni 34.20279 18.7078672 0.1352356 0.7476095
Cycloramphus organensis 34.14389 25.6001728 0.1332857 0.9743229
Zachaenus carvalhoi 34.13853 36.2444704 0.1359304 1.4046595
Zachaenus parvulus 34.09740 31.0236825 0.1338144 1.2019479
Cycloramphus carvalhoi 34.15596 25.3284932 0.1344062 0.9466716
Cycloramphus stejnegeri 34.20689 25.0442978 0.1319044 0.9416714
Cycloramphus catarinensis 34.11660 19.3080578 0.1334979 0.7765676
Cycloramphus faustoi 33.51151 24.6110986 0.1346158 1.0035638
Cycloramphus cedrensis 33.55917 18.4372829 0.1345789 0.7373661
Cycloramphus lutzorum 33.52594 19.4661935 0.1333052 0.7568050
Cycloramphus semipalmatus 33.51292 20.7729623 0.1345247 0.8052103
Cycloramphus dubius 33.48138 19.2039047 0.1342796 0.7366764
Cycloramphus duseni 33.54028 17.2132126 0.1337542 0.7063795
Cycloramphus migueli 34.15050 33.8958246 0.1331605 1.3338345
Cycloramphus rhyakonastes 33.45096 17.0250230 0.1337780 0.6949129
Cycloramphus mirandaribeiroi 33.54921 17.1865192 0.1335203 0.7137500
Cycloramphus ohausi 33.54305 25.0778105 0.1351217 0.9435750
Cycloramphus bandeirensis 33.64941 30.9880660 0.1316952 1.2000347
Cycloramphus fuliginosus 33.55294 34.2914633 0.1307345 1.3343813
Thoropa lutzi 33.65193 33.8151049 0.1325176 1.2990627
Thoropa megatympanum 33.62663 21.4759799 0.1313875 0.8452134
Thoropa miliaris 33.61804 26.8397553 0.1324745 1.0469858
Thoropa petropolitana 33.62222 28.5760550 0.1343982 1.1072662
Thoropa saxatilis 33.66718 17.0913060 0.1302905 0.6842781
Atelognathus ceii 33.79099 4.2604501 0.1324595 0.3419694
Atelognathus solitarius 33.60786 5.4256441 0.1348514 0.3492398
Atelognathus patagonicus 33.90485 6.3085395 0.1325440 0.3564903
Atelognathus nitoi 33.93817 6.2375667 0.1318028 0.3863246
Atelognathus praebasalticus 33.66939 7.0367074 0.1354662 0.3954727
Atelognathus salai 33.90844 4.1258330 0.1331864 0.3237586
Atelognathus reverberii 33.95265 7.2730845 0.1336527 0.4377798
Batrachyla antartandica 33.59883 4.0081742 0.1329361 0.2879331
Batrachyla nibaldoi 33.54891 2.7578507 0.1327929 0.2678902
Batrachyla fitzroya 33.56875 4.6930384 0.1349649 0.2961448
Batrachyla leptopus 33.49616 5.9522479 0.1370922 0.4019248
Chaltenobatrachus grandisonae 33.08801 3.2564232 0.1334558 0.3311840
Crossodactylus aeneus 33.03931 19.3980863 0.1325571 0.7471191
Crossodactylus dantei 33.07561 36.5151546 0.1312715 1.4185454
Crossodactylus gaudichaudii 33.00234 21.2012612 0.1345407 0.8187714
Crossodactylus grandis 32.99339 21.1473391 0.1344911 0.7887769
Crossodactylus bokermanni 32.99551 16.1472118 0.1328247 0.6539075
Crossodactylus lutzorum 33.00105 25.1715950 0.1326672 1.0119094
Crossodactylus caramaschii 32.96558 16.2066705 0.1327531 0.6169999
Crossodactylus cyclospinus 33.63075 23.5619804 0.1344478 0.9239673
Crossodactylus trachystomus 32.99812 17.1069889 0.1355959 0.6795105
Crossodactylus dispar 33.07296 19.8449613 0.1348048 0.7693472
Hylodes amnicola 33.26054 25.1951568 0.1329818 0.9596823
Hylodes mertensi 33.13434 20.8070055 0.1341468 0.8060029
Hylodes asper 33.18229 21.3591567 0.1353130 0.8292778
Hylodes meridionalis 33.21663 16.1572754 0.1341140 0.6618359
Hylodes babax 33.23440 31.5711243 0.1379123 1.2213458
Hylodes vanzolinii 33.25446 32.0644809 0.1332977 1.2414066
Hylodes cardosoi 33.22776 17.8819083 0.1346555 0.6991830
Hylodes charadranaetes 33.24967 26.4071192 0.1346674 0.9903258
Hylodes dactylocinus 33.12486 19.8216317 0.1332626 0.7406102
Hylodes perplicatus 33.15274 17.6525428 0.1322037 0.7161140
Hylodes fredi 33.30878 24.5281065 0.1304366 0.9774280
Hylodes pipilans 33.25016 26.5077883 0.1345352 0.9893390
Hylodes glaber 33.17275 24.2238513 0.1341457 0.9065383
Hylodes lateristrigatus 33.19856 26.0610939 0.1360003 1.0116100
Hylodes heyeri 33.15231 18.5530664 0.1356004 0.7223787
Hylodes regius 33.13088 20.9581048 0.1356388 0.7912548
Hylodes magalhaesi 33.20012 21.2253273 0.1362685 0.8110364
Hylodes ornatus 33.16573 22.4364833 0.1342891 0.8663419
Hylodes sazimai 33.16375 23.0436813 0.1325119 0.8863607
Hylodes uai 33.10539 18.5518362 0.1346628 0.7322748
Hylodes otavioi 33.25009 19.0276260 0.1362875 0.7758962
Hylodes phyllodes 33.23579 22.4995719 0.1339317 0.8661196
Hylodes nasus 33.30200 24.3117269 0.1332004 0.9420113
Megaelosia apuana 33.23314 35.5487469 0.1325719 1.3726256
Megaelosia boticariana 33.19707 18.5348761 0.1356496 0.7200281
Megaelosia bocainensis 33.21438 25.0557720 0.1343462 0.9370434
Megaelosia lutzae 33.25773 23.5638712 0.1327781 0.8818992
Megaelosia goeldii 33.18083 27.4775029 0.1338668 1.0539028
Megaelosia jordanensis 33.79370 21.5187628 0.1332010 0.8224678
Megaelosia massarti 33.22356 21.5867717 0.1350110 0.8568488
Alsodes australis 31.39514 4.2016182 0.1355631 0.3762410
Alsodes verrucosus 32.19784 5.6692131 0.1358589 0.3426585
Alsodes monticola 31.36293 5.8989446 0.1357136 0.5092634
Alsodes valdiviensis 32.19046 6.8029304 0.1378034 0.3905143
Alsodes barrioi 31.10564 6.1060052 0.1353818 0.3382625
Alsodes norae 31.92911 5.9453398 0.1371442 0.3293470
Alsodes kaweshkari 31.97485 2.6963586 0.1369013 0.3407571
Alsodes igneus 31.12352 5.5897085 0.1366191 0.3182264
Alsodes pehuenche 31.07655 2.8902746 0.1343183 0.2114210
Alsodes hugoi 31.23788 3.3154068 0.1369974 0.2188243
Alsodes tumultuosus 31.24015 7.1153953 0.1367095 0.3769423
Alsodes montanus 31.23196 6.1115248 0.1379114 0.3516474
Alsodes vittatus 31.35911 4.8671479 0.1365626 0.2900594
Alsodes nodosus 31.76241 8.5791622 0.1329496 0.4468066
Alsodes vanzolinii 31.74138 9.9543427 0.1360826 0.5550421
Eupsophus insularis 32.79304 7.7904031 0.1360533 0.4376135
Eupsophus roseus 32.71224 7.6123335 0.1348966 0.4286785
Eupsophus calcaratus 32.74084 5.4939991 0.1328178 0.4247834
Eupsophus emiliopugini 32.13768 5.9912373 0.1325728 0.4194907
Eupsophus vertebralis 32.11695 7.0178534 0.1360022 0.4072087
Agalychnis annae 35.47595 21.7307647 0.1377952 0.8552259
Agalychnis moreletii 35.49295 18.6119169 0.1390192 0.7043014
Agalychnis callidryas 35.46635 24.6658990 0.1378682 0.9136052
Agalychnis saltator 35.53590 24.9487564 0.1392233 0.9612892
Agalychnis lemur 35.42286 36.0530176 0.1381264 1.3621485
Hylomantis granulosa 35.51649 21.7888801 0.1338314 0.8543579
Phasmahyla cochranae 35.26789 16.2494800 0.1400592 0.6240021
Phasmahyla exilis 35.25150 25.6349160 0.1376125 0.9991345
Phasmahyla timbo 34.85490 20.4312450 0.1387339 0.8216759
Phasmahyla guttata 35.24952 16.8384604 0.1378225 0.6523626
Phasmahyla jandaia 34.79290 15.1642315 0.1348960 0.5942568
Phyllomedusa araguari 36.78356 16.3478947 0.1345944 0.6264157
Phyllomedusa venusta 36.67512 24.0391666 0.1328591 0.9051186
Phyllomedusa bahiana 37.46621 15.6093130 0.1323714 0.6202348
Phyllomedusa distincta 37.45942 11.0313647 0.1351765 0.4342228
Phyllomedusa boliviana 37.24130 21.3919988 0.1351453 0.7998789
Phyllomedusa neildi 37.33844 36.9711490 0.1354774 1.3970832
Phyllomedusa trinitatis 37.39728 23.1154661 0.1341718 0.8651376
Phyllomedusa tarsius 37.37684 25.3369124 0.1366957 0.9159539
Phyllomedusa bicolor 36.79756 27.4327153 0.1360620 0.9839575
Cruziohyla craspedopus 36.04068 26.1267109 0.1331726 0.9381570
Phrynomedusa appendiculata 35.77274 15.0669657 0.1374314 0.6082185
Phrynomedusa bokermanni 35.23619 16.6763554 0.1349133 0.6405881
Phrynomedusa marginata 35.81030 26.7517034 0.1331679 1.0349627
Phrynomedusa vanzolinii 35.25220 21.6983404 0.1371892 0.8355787
Cyclorana novaehollandiae 36.62636 11.6760214 0.1363513 0.4630402
Cyclorana cryptotis 36.40147 18.0697052 0.1375290 0.6527935
Cyclorana cultripes 36.51184 12.2815609 0.1374808 0.4870637
Cyclorana vagitus 35.52266 20.4505835 0.1373674 0.7350059
Cyclorana longipes 36.36642 19.5243469 0.1387786 0.7044470
Cyclorana maculosa 36.46326 16.0148025 0.1350608 0.5934515
Cyclorana maini 36.46833 11.5163360 0.1346441 0.4785642
Cyclorana manya 35.50570 19.8376449 0.1368140 0.7206911
Cyclorana verrucosa 35.50926 12.3910915 0.1333482 0.5159383
Cyclorana platycephala 36.45699 11.7447001 0.1328896 0.4871091
Litoria dahlii 35.63756 21.9273141 0.1372429 0.7838874
Litoria adelaidensis 34.56871 12.9613984 0.1341716 0.6278135
Litoria chloronota 34.88285 46.0113504 0.1382960 1.6553817
Litoria albolabris 35.87275 30.7547785 0.1382209 1.1857489
Litoria amboinensis 34.28117 25.3710899 0.1396543 0.9324738
Litoria darlingtoni 34.33866 19.0481028 0.1397804 0.7324970
Litoria tyleri 34.44840 11.5604450 0.1397056 0.5225625
Litoria andiirrmalin 33.06679 24.1191675 0.1414683 0.8771848
Litoria booroolongensis 32.54526 9.5025834 0.1413699 0.4348241
Litoria jungguy 32.52507 17.2176598 0.1389910 0.6530966
Litoria wilcoxii 32.41874 12.4185176 0.1408122 0.5177384
Litoria angiana 33.89547 30.7483950 0.1354555 1.1516082
Litoria modica 33.91796 32.2630302 0.1386312 1.2003862
Litoria micromembrana 33.92882 32.9276142 0.1355646 1.2331947
Litoria arfakiana 34.33398 33.5531152 0.1384407 1.2463831
Litoria wollastoni 34.41827 32.2387701 0.1364934 1.2080966
Litoria aruensis 34.41840 53.0065734 0.1374050 1.9761438
Litoria auae 34.42847 28.5941703 0.1390678 1.0456826
Litoria cyclorhyncha 33.92190 8.7270222 0.1359640 0.4328572
Litoria moorei 33.90328 9.7643759 0.1386557 0.4737825
Litoria raniformis 33.97392 8.2958497 0.1363918 0.4483297
Litoria nudidigita 31.94183 7.7004185 0.1429406 0.3930123
Litoria daviesae 31.91986 10.8165756 0.1398442 0.4879416
Litoria subglandulosa 31.80385 11.4648456 0.1407635 0.5002891
Litoria spenceri 31.70601 6.4917917 0.1402190 0.3314426
Litoria becki 33.78152 36.0183304 0.1369968 1.3585991
Litoria biakensis 34.31695 36.5353790 0.1358574 1.3348660
Litoria bibonius 34.27108 50.1959080 0.1387285 1.8328126
Litoria brevipalmata 34.57752 18.4237001 0.1343379 0.8018960
Nyctimystes avocalis 33.85325 45.9892241 0.1379688 1.6800082
Nyctimystes montanus 33.88460 41.4931738 0.1356912 1.4894596
Nyctimystes granti 33.98304 38.7761886 0.1361292 1.4339137
Nyctimystes oktediensis 34.35186 32.2549028 0.1366004 1.1786519
Nyctimystes cheesmani 33.91736 29.8069769 0.1356161 1.1343102
Nyctimystes disruptus 33.88131 32.1929471 0.1386057 1.2366929
Nyctimystes daymani 33.80714 37.5985390 0.1393249 1.3568406
Nyctimystes obsoletus 33.79340 34.1908306 0.1380862 1.3017244
Nyctimystes gularis 33.89493 29.1709682 0.1351875 1.0584922
Nyctimystes fluviatilis 33.90823 37.9991063 0.1365274 1.4148124
Nyctimystes foricula 33.86420 29.9356382 0.1389367 1.1272608
Nyctimystes semipalmatus 33.89322 31.1146108 0.1376987 1.1678932
Nyctimystes kuduki 33.91309 27.3844895 0.1357435 1.0262793
Nyctimystes humeralis 33.94722 31.5532902 0.1344753 1.1829709
Nyctimystes zweifeli 33.89966 33.4669902 0.1375929 1.2448100
Nyctimystes trachydermis 33.96424 32.9371019 0.1349677 1.2117463
Nyctimystes kubori 33.85603 33.0439511 0.1362131 1.2392769
Nyctimystes narinosus 33.82928 28.3817989 0.1394475 1.0955891
Nyctimystes papua 33.91715 33.8437386 0.1380027 1.2427070
Nyctimystes pulcher 33.96124 31.7299571 0.1370853 1.1897238
Nyctimystes perimetri 33.88310 51.1329156 0.1376957 1.8650627
Nyctimystes persimilis 33.86861 40.2270704 0.1387029 1.4556658
Litoria vocivincens 34.54076 30.4691024 0.1373203 1.1116980
Litoria brongersmai 33.91654 34.7519021 0.1370514 1.3485671
Litoria bulmeri 33.97262 31.9206708 0.1364831 1.1716787
Litoria burrowsi 34.40313 10.4576515 0.1371166 0.6423641
Litoria rivicola 33.99323 40.7957838 0.1363307 1.4920107
Litoria gilleni 35.29913 8.2436143 0.1375664 0.3463059
Litoria splendida 35.32556 18.3940177 0.1363003 0.6570168
Litoria cavernicola 35.33586 19.3313320 0.1344013 0.6989115
Litoria xanthomera 35.74034 14.3805445 0.1339717 0.5513774
Litoria kumae 35.50268 22.2849718 0.1335262 0.8605660
Litoria capitula 34.38833 49.4674988 0.1374311 1.7997341
Litoria chrisdahli 34.40004 53.5842201 0.1381011 2.0561371
Litoria christianbergmanni 34.46719 43.1693380 0.1384740 1.5769720
Litoria congenita 35.40031 27.6691851 0.1372389 1.0126055
Litoria dentata 35.40423 13.9174755 0.1393712 0.6176792
Litoria electrica 35.61147 13.7327723 0.1373122 0.5291707
Litoria contrastens 34.64045 31.0332057 0.1380672 1.1656807
Litoria cooloolensis 34.43370 20.0091681 0.1376102 0.8358511
Litoria coplandi 34.49964 21.4511751 0.1405612 0.7759248
Litoria watjulumensis 34.66101 23.0631251 0.1376811 0.8318037
Litoria dayi 33.95445 23.5317299 0.1387405 0.8995317
Litoria nannotis 34.01955 23.8994366 0.1358748 0.9123804
Litoria rheocola 34.46527 25.2886636 0.1367399 0.9594076
Litoria dorsalis 34.43132 29.3182761 0.1350157 1.0724705
Litoria microbelos 34.60495 27.2932412 0.1375245 0.9788371
Litoria longirostris 34.38518 26.6484283 0.1361397 0.9603987
Litoria meiriana 34.80546 27.9504552 0.1367451 0.9925733
Litoria dorsivena 33.96933 37.2269162 0.1354863 1.3989288
Litoria dux 34.34950 34.0099804 0.1383026 1.3207053
Litoria infrafrenata 34.25473 38.2743269 0.1408580 1.3995550
Litoria elkeae 34.28429 40.0043951 0.1372282 1.4923684
Litoria exophthalmia 33.83282 31.2394706 0.1358261 1.1810704
Litoria genimaculata 33.69161 36.5967994 0.1400485 1.3574537
Litoria everetti 34.42237 43.0347525 0.1355075 1.5634242
Litoria littlejohni 32.03423 9.9147732 0.1366586 0.4714633
Litoria paraewingi 31.80644 6.8696885 0.1392745 0.3419022
Litoria revelata 31.95735 10.9141180 0.1378464 0.4779377
Litoria jervisiensis 32.24358 9.7053279 0.1408213 0.4707773
Litoria olongburensis 35.64970 15.0922804 0.1314272 0.6405639
Litoria flavescens 34.27629 46.5780852 0.1371099 1.6807672
Litoria latopalmata 33.32841 11.9282491 0.1430788 0.4899689
Litoria tornieri 33.42798 20.9821733 0.1421217 0.7456327
Litoria inermis 33.45651 18.7539399 0.1401776 0.6989206
Litoria pallida 33.44624 19.4673420 0.1390279 0.7134374
Litoria fuscula 33.93755 25.7570502 0.1400799 1.0725603
Litoria graminea 34.37358 28.8906251 0.1352862 1.0641404
Litoria havina 34.28958 37.9247290 0.1376408 1.3697513
Litoria multiplica 33.90346 30.1344680 0.1383382 1.1580794
Litoria hilli 34.50591 52.3961127 0.1373465 1.9118585
Litoria humboldtorum 34.43073 55.0213647 0.1369179 2.0487354
Litoria hunti 34.26085 42.8781883 0.1379234 1.5902385
Litoria impura 34.36548 36.0175244 0.1386799 1.3170243
Litoria thesaurensis 34.35765 40.0562098 0.1374701 1.4641767
Litoria iris 34.39136 30.8227994 0.1366960 1.1630343
Litoria majikthise 34.35603 36.1587230 0.1359901 1.3002362
Litoria pronimia 34.46236 28.7833054 0.1355963 1.1003130
Litoria spartacus 34.50042 28.2560440 0.1351854 1.0379625
Litoria leucova 33.95164 32.7222252 0.1351515 1.1786638
Litoria longicrus 34.33817 49.4808081 0.1363212 1.7972594
Litoria lorica 33.76113 21.0218235 0.1411879 0.7870691
Litoria louisiadensis 33.86261 59.2685304 0.1370633 2.1519637
Litoria lutea 34.38152 53.7744025 0.1378593 1.9329296
Litoria macki 33.98095 25.4410098 0.1368840 1.0597930
Litoria mareku 34.33430 41.2857838 0.1386902 1.4727284
Litoria megalops 33.95849 25.8038685 0.1380934 1.0730146
Litoria mucro 34.38009 40.5241305 0.1369829 1.4999837
Litoria multicolor 34.43905 42.9149028 0.1360904 1.5351112
Litoria myola 33.84474 20.7563156 0.1356030 0.7774444
Litoria mystax 34.47550 33.1045349 0.1377497 1.3110890
Litoria napaea 33.99120 31.6134145 0.1368258 1.2230782
Litoria nigropunctata 34.47245 35.9168761 0.1367859 1.3344141
Litoria prora 34.43259 32.5798781 0.1370245 1.1720574
Litoria obtusirostris 34.35535 56.9416670 0.1389100 2.1172412
Litoria oenicolen 33.90378 31.6607464 0.1354217 1.1883628
Litoria ollauro 34.48269 39.1036916 0.1352771 1.4128959
Litoria personata 34.52800 23.9717226 0.1389277 0.8381001
Litoria pratti 34.02126 40.8346460 0.1370433 1.4656320
Litoria purpureolata 34.48590 36.5252845 0.1345970 1.3943708
Litoria pygmaea 34.37449 34.7643120 0.1356451 1.2791899
Litoria quadrilineata 34.46674 41.2564129 0.1379536 1.5031164
Litoria rara 34.42414 47.3062222 0.1383436 1.7785869
Litoria richardsi 34.40021 29.0652929 0.1340893 1.1095474
Litoria rubrops 34.47745 52.8612424 0.1359437 1.9123655
Litoria sanguinolenta 34.34622 36.6838166 0.1373189 1.3251363
Litoria scabra 33.93824 27.3811981 0.1377052 1.1417792
Litoria singadanae 34.35055 36.5439047 0.1364680 1.4207738
Litoria spinifera 33.99348 29.0820642 0.1392352 1.1245569
Litoria staccato 34.62259 29.2903588 0.1361268 1.0424061
Litoria timida 34.45432 31.6376686 0.1376413 1.1327788
Litoria umarensis 34.20532 44.0800556 0.1403844 1.5751367
Litoria umbonata 34.46287 32.1501885 0.1337076 1.2444563
Litoria vagabunda 34.32877 52.6112532 0.1385369 1.9248896
Litoria verae 34.37421 37.4788258 0.1388088 1.3378527
Litoria wapogaensis 33.95359 26.9601978 0.1357371 1.1204543
Litoria wisselensis 34.82594 33.1411966 0.1373963 1.2866762
Aplastodiscus albofrenatus 35.33240 20.3250798 0.1307744 0.7795935
Aplastodiscus arildae 35.18881 16.3001585 0.1302993 0.6301407
Aplastodiscus eugenioi 35.27582 17.9723730 0.1338066 0.7000611
Aplastodiscus albosignatus 35.78877 18.6115691 0.1298782 0.7304514
Aplastodiscus callipygius 35.67863 18.2155470 0.1320354 0.7049619
Aplastodiscus cavicola 35.76235 23.1318426 0.1297349 0.8972836
Aplastodiscus leucopygius 35.77449 19.8871301 0.1272130 0.7619592
Aplastodiscus cochranae 35.62193 15.0797830 0.1331663 0.6107997
Aplastodiscus perviridis 35.71998 18.0896407 0.1289706 0.6902654
Aplastodiscus flumineus 35.67362 24.6001390 0.1287063 0.9261954
Aplastodiscus ehrhardti 35.67202 15.0550427 0.1309081 0.6122547
Aplastodiscus musicus 35.68463 20.2298984 0.1282314 0.7620841
Bokermannohyla ahenea 36.07138 22.3887675 0.1253062 0.8387458
Bokermannohyla alvarengai 35.51556 19.6206311 0.1308643 0.7670183
Bokermannohyla astartea 35.94180 20.4598305 0.1288613 0.7864081
Bokermannohyla circumdata 35.90272 20.4954888 0.1285404 0.7957107
Bokermannohyla hylax 35.40984 19.8133410 0.1313214 0.7855217
Bokermannohyla caramaschii 36.06320 23.7575152 0.1288822 0.9212416
Bokermannohyla carvalhoi 35.59383 25.9286051 0.1304673 1.0019757
Bokermannohyla diamantina 35.56467 18.6156746 0.1276306 0.7303353
Bokermannohyla feioi 36.06267 22.8319546 0.1287303 0.8806784
Bokermannohyla gouveai 36.03101 24.1414306 0.1289058 0.9046368
Bokermannohyla ibitiguara 35.61096 20.0721323 0.1278937 0.7750212
Bokermannohyla ibitipoca 36.13045 23.8379573 0.1283928 0.9140955
Bokermannohyla itapoty 35.64710 20.0857575 0.1280698 0.7962547
Bokermannohyla izecksohni 35.57566 21.5395889 0.1294244 0.8079637
Bokermannohyla langei 35.55492 14.8146572 0.1298984 0.6116591
Bokermannohyla lucianae 35.99929 32.8489254 0.1302390 1.2841420
Bokermannohyla luctuosa 35.61299 18.2444494 0.1284547 0.6945208
Bokermannohyla martinsi 35.64902 19.7081358 0.1280637 0.7750122
Bokermannohyla nanuzae 35.47203 18.6930612 0.1283204 0.7439832
Bokermannohyla oxente 35.59029 19.9776932 0.1283076 0.7959585
Bokermannohyla pseudopseudis 35.60257 23.4504348 0.1270604 0.8674198
Bokermannohyla ravida 35.57673 21.8507392 0.1265930 0.8450101
Bokermannohyla sagarana 35.46541 20.2508751 0.1285067 0.7971357
Bokermannohyla saxicola 35.52226 18.5452902 0.1310319 0.7171447
Bokermannohyla sazimai 35.56909 21.8580124 0.1290888 0.8386992
Bokermannohyla vulcaniae 35.60033 19.0340956 0.1282447 0.7257257
Hyloscirtus albopunctulatus 35.12230 29.7363726 0.1292869 1.1072201
Hyloscirtus simmonsi 33.99949 25.5839380 0.1305199 1.0407144
Hyloscirtus armatus 34.64187 25.2381312 0.1324225 1.3094483
Hyloscirtus charazani 34.70742 16.7384078 0.1293086 0.9712474
Hyloscirtus bogotensis 34.70741 29.4720155 0.1311527 1.2384526
Hyloscirtus callipeza 34.81613 25.4691696 0.1308195 1.0479139
Hyloscirtus caucanus 34.74606 25.9672947 0.1314196 1.0727838
Hyloscirtus colymba 34.77521 44.6069812 0.1310816 1.6312194
Hyloscirtus pacha 34.69278 17.6373318 0.1307139 0.7535529
Hyloscirtus staufferorum 34.60247 21.6908443 0.1297649 0.9026940
Hyloscirtus psarolaimus 34.65811 14.9433319 0.1331065 0.6851455
Hyloscirtus ptychodactylus 34.70486 15.0665752 0.1305090 0.6493997
Hyloscirtus larinopygion 35.15042 22.0085923 0.1285779 0.9737390
Hyloscirtus denticulentus 34.75396 23.8254929 0.1311317 1.0369854
Hyloscirtus jahni 34.70482 30.2780590 0.1328984 1.1422981
Hyloscirtus lascinius 35.28913 27.3940692 0.1276584 1.0634048
Hyloscirtus palmeri 34.73932 30.5531491 0.1284372 1.2060454
Hyloscirtus lynchi 34.61581 24.0277616 0.1295506 1.0868809
Hyloscirtus pantostictus 34.70244 18.7244558 0.1323430 0.8405147
Hyloscirtus piceigularis 34.63632 34.2525242 0.1304538 1.3761607
Hyloscirtus platydactylus 34.69989 30.9067338 0.1303817 1.1720610
Hyloscirtus sarampiona 34.62299 18.9659027 0.1302610 0.8262349
Hyloscirtus tapichalaca 34.65990 30.7870405 0.1315416 1.2780611
Hyloscirtus torrenticola 34.77631 24.6636654 0.1319696 1.0146415
Myersiohyla inparquesi 35.86779 37.8353963 0.1285346 1.4542093
Myersiohyla loveridgei 35.92467 36.2201647 0.1289176 1.3916432
Myersiohyla aromatica 35.85684 34.4519857 0.1275184 1.3274508
Dendropsophus acreanus 36.18855 32.0866876 0.1242998 1.1736457
Dendropsophus amicorum 36.07928 27.3603620 0.1230869 1.0324181
Dendropsophus anataliasiasi 36.11750 24.4693837 0.1238478 0.8702360
Dendropsophus aperomeus 36.01973 20.3014066 0.1254132 0.9137795
Dendropsophus haraldschultzi 36.05439 32.5699599 0.1245656 1.1538842
Dendropsophus araguaya 36.15145 20.3380103 0.1238158 0.7240167
Dendropsophus battersbyi 36.11607 33.2612121 0.1234282 1.2774821
Dendropsophus berthalutzae 36.07595 21.3302249 0.1223425 0.8272814
Dendropsophus bipunctatus 36.03257 28.4391004 0.1231013 1.1126774
Dendropsophus bogerti 36.05560 23.6519502 0.1231974 0.9596930
Dendropsophus timbeba 36.13977 33.4837718 0.1226164 1.1923797
Dendropsophus yaracuyanus 36.13586 26.3141496 0.1216315 0.9886954
Dendropsophus cachimbo 36.01816 28.6745568 0.1237980 1.0372220
Dendropsophus meridensis 35.97408 19.1978523 0.1238004 0.7289553
Dendropsophus cerradensis 36.02560 21.7879492 0.1254101 0.7672028
Dendropsophus columbianus 35.98783 23.8575497 0.1235225 1.0177715
Dendropsophus gaucheri 36.03876 37.7857130 0.1246711 1.3827138
Dendropsophus cruzi 36.02306 21.6343626 0.1228821 0.7868631
Dendropsophus miyatai 36.08560 31.4709480 0.1239774 1.1163378
Dendropsophus delarivai 36.08994 27.9153749 0.1247030 1.3014303
Dendropsophus robertmertensi 36.02487 26.7353389 0.1266181 0.9782746
Dendropsophus sartori 36.07689 24.1668918 0.1252171 0.9286314
Dendropsophus dutrai 36.06977 28.8124607 0.1232015 1.1256798
Dendropsophus elianeae 36.04104 20.8794898 0.1238974 0.7557221
Dendropsophus garagoensis 36.09001 16.3057829 0.1260465 0.7542740
Dendropsophus giesleri 36.11374 23.1493018 0.1251230 0.8932843
Dendropsophus oliveirai 36.03967 22.8038557 0.1260836 0.8952594
Dendropsophus gryllatus 36.06762 24.9380309 0.1250600 0.9405408
Dendropsophus jimi 36.10953 16.5012451 0.1214886 0.6267661
Dendropsophus joannae 36.10004 29.2219141 0.1242635 1.1195722
Dendropsophus juliani 35.66632 25.9732748 0.1277859 0.9171136
Dendropsophus minusculus 35.73028 26.0590521 0.1225644 0.9710849
Dendropsophus rubicundulus 35.70116 19.7915509 0.1238339 0.7167989
Dendropsophus tritaeniatus 35.64413 25.4814765 0.1258088 0.9253715
Dendropsophus leali 36.04682 31.6739856 0.1239677 1.1437316
Dendropsophus minimus 36.08628 35.3134371 0.1259283 1.2734360
Dendropsophus meridianus 36.85214 19.9202910 0.1225206 0.7615189
Dendropsophus limai 36.08216 15.6166906 0.1229719 0.5991290
Dendropsophus luteoocellatus 36.03197 25.9179713 0.1251967 0.9694633
Dendropsophus melanargyreus 36.89654 23.1584752 0.1228259 0.8267914
Dendropsophus seniculus 36.71052 18.9293016 0.1228402 0.7338620
Dendropsophus mathiassoni 36.07086 26.6123490 0.1217639 1.0281608
Dendropsophus microcephalus 36.01692 32.7127516 0.1261844 1.1780278
Dendropsophus phlebodes 36.04030 35.9961770 0.1230212 1.3363461
Dendropsophus rhodopeplus 35.95224 30.8370318 0.1272645 1.1599976
Dendropsophus microps 36.09094 21.7920173 0.1237755 0.8561194
Dendropsophus nahdereri 36.04618 13.7793390 0.1227479 0.5564025
Dendropsophus nanus 36.07027 23.7810963 0.1256010 0.8689221
Dendropsophus walfordi 36.12327 30.5552987 0.1241167 1.0748362
Dendropsophus riveroi 36.08500 29.0111371 0.1252634 1.0507804
Dendropsophus reichlei 36.18218 29.7206588 0.1234288 1.2296603
Dendropsophus padreluna 36.15527 31.8598550 0.1233229 1.2592411
Dendropsophus pauiniensis 36.01703 31.3680963 0.1240364 1.0758182
Dendropsophus praestans 36.01742 18.5435692 0.1231229 0.7878785
Dendropsophus pseudomeridianus 36.04716 22.3805163 0.1237927 0.8515267
Dendropsophus rhea 36.15376 18.7787081 0.1215142 0.7118680
Dendropsophus rossalleni 35.99282 33.8524670 0.1264913 1.2294194
Dendropsophus ruschii 35.57986 27.3552364 0.1251641 1.0530949
Dendropsophus soaresi 35.96477 24.0961566 0.1248126 0.9018840
Dendropsophus stingi 35.98018 20.6431575 0.1238243 0.9090066
Dendropsophus studerae 36.07498 25.8776510 0.1251041 1.0113299
Dendropsophus subocularis 36.07090 32.3280049 0.1238494 1.2373128
Dendropsophus tintinnabulum 36.05999 29.7469538 0.1216924 1.0365114
Dendropsophus virolinensis 36.06626 20.7034061 0.1233165 0.9276185
Dendropsophus werneri 36.04193 15.0839799 0.1239788 0.5934441
Dendropsophus xapuriensis 36.00131 34.0019069 0.1243003 1.2107159
Xenohyla eugenioi 36.09163 20.6659664 0.1225269 0.8151871
Xenohyla truncata 36.15373 27.1266433 0.1242621 1.0508772
Lysapsus caraya 37.49673 20.3035152 0.1230542 0.7209548
Lysapsus laevis 37.13526 28.4058534 0.1275284 1.0967342
Pseudis bolbodactyla 37.39067 17.8542790 0.1245552 0.6758156
Pseudis fusca 37.31971 15.9711309 0.1268182 0.6240809
Pseudis tocantins 37.39707 18.4122779 0.1251603 0.6600416
Pseudis cardosoi 36.48704 10.3617898 0.1263417 0.4149430
Scarthyla vigilans 35.55531 26.9025742 0.1289407 1.0056342
Scinax altae 37.28313 50.5623916 0.1270889 1.8321075
Scinax auratus 37.23595 31.0215705 0.1240500 1.2153146
Scinax baumgardneri 37.27187 35.1553125 0.1252595 1.3004644
Scinax blairi 37.48959 30.6291268 0.1236650 1.1556848
Scinax boesemani 37.31603 38.5292075 0.1269832 1.3736310
Scinax parkeri 37.52481 29.5266844 0.1246339 1.0801206
Scinax boulengeri 37.41123 32.8445099 0.1234203 1.2149956
Scinax sugillatus 37.40679 25.8506468 0.1236863 1.0348867
Scinax cabralensis 37.19207 17.3360187 0.1261003 0.6790775
Scinax caldarum 37.38856 20.7164910 0.1254622 0.7938904
Scinax crospedospilus 37.29257 23.5907806 0.1255119 0.9111811
Scinax camposseabrai 37.28560 19.6986231 0.1280473 0.7840392
Scinax cardosoi 37.32709 25.6406240 0.1246497 0.9846302
Scinax castroviejoi 36.54622 14.7800341 0.1267195 0.6976126
Scinax chiquitanus 37.19378 26.3552140 0.1259775 1.0265368
Scinax funereus 37.25128 29.6162447 0.1264295 1.1188718
Scinax oreites 37.24678 19.0291850 0.1257351 0.8715794
Scinax constrictus 37.38135 21.5978410 0.1267617 0.7895648
Scinax cretatus 37.16772 28.4346473 0.1289224 1.1100186
Scinax cruentommus 37.22195 35.5060340 0.1251393 1.2779144
Scinax staufferi 37.34679 27.6861099 0.1261632 1.0393495
Scinax curicica 37.21406 18.2588272 0.1283218 0.7249243
Scinax cuspidatus 37.17583 29.5625744 0.1260405 1.1531715
Scinax danae 37.27958 26.5602944 0.1263593 1.0218728
Scinax duartei 37.43625 19.8900755 0.1232691 0.7652289
Scinax similis 37.28576 25.8687770 0.1274680 1.0101367
Scinax hayii 37.40840 22.1912528 0.1242489 0.8610538
Scinax exiguus 37.29382 29.2602401 0.1243173 1.1141432
Scinax karenanneae 37.25809 36.0481751 0.1271123 1.2761368
Scinax lindsayi 37.27116 37.6805825 0.1266800 1.3057933
Scinax fuscomarginatus 37.32667 24.4716997 0.1250333 0.9001568
Scinax proboscideus 36.68456 27.7348603 0.1303256 1.0046744
Scinax jolyi 36.69636 38.2847223 0.1277195 1.4128154
Scinax rostratus 36.75887 29.3169669 0.1307867 1.0932253
Scinax iquitorum 37.26045 36.0899120 0.1236808 1.3089043
Scinax kennedyi 37.30217 34.4545673 0.1258850 1.2378596
Scinax manriquei 37.20795 27.8534860 0.1275088 1.1006340
Scinax maracaya 37.25614 21.4169608 0.1272055 0.8267333
Scinax nebulosus 37.78960 32.5666208 0.1237381 1.1617482
Scinax pedromedinae 37.30524 34.6419012 0.1260900 1.4511128
Scinax perereca 37.32696 17.3168449 0.1256568 0.6748810
Scinax tigrinus 37.65315 20.3067300 0.1289706 0.7562200
Scinax trilineatus 37.28839 33.8754443 0.1262280 1.2665054
Scinax wandae 37.39095 28.5568998 0.1251582 1.0593828
Sphaenorhynchus bromelicola 37.20375 14.5084768 0.1264238 0.5807061
Sphaenorhynchus caramaschii 37.51727 14.9804380 0.1250851 0.5863574
Sphaenorhynchus palustris 37.31475 27.1899417 0.1277738 1.0674073
Sphaenorhynchus carneus 37.46770 32.9084772 0.1282533 1.1880383
Sphaenorhynchus dorisae 37.42989 36.3072307 0.1283073 1.3005768
Sphaenorhynchus planicola 37.66935 24.7059018 0.1260851 0.9633148
Sphaenorhynchus mirim 37.15788 23.5592492 0.1242493 0.9163662
Sphaenorhynchus surdus 37.17566 14.0151114 0.1263878 0.5619788
Sphaenorhynchus orophilus 37.23194 17.9288543 0.1245663 0.6946707
Nyctimantis rugiceps 36.56708 23.8816052 0.1281675 0.9203655
Corythomantis greeningi 36.71461 21.9741545 0.1299461 0.8423136
Trachycephalus coriaceus 37.06664 28.5234286 0.1255911 1.0274072
Trachycephalus dibernardoi 37.05328 14.3678013 0.1284856 0.5587666
Trachycephalus hadroceps 37.01270 29.4769606 0.1265791 1.0708623
Trachycephalus resinifictrix 37.03802 28.1098403 0.1257001 1.0078257
Trachycephalus imitatrix 36.97395 13.4192481 0.1290884 0.5217342
Trachycephalus nigromaculatus 37.04663 17.6059170 0.1263934 0.6776350
Trachycephalus lepidus 37.07888 14.3184283 0.1269164 0.5341874
Trachycephalus jordani 36.98972 20.0952268 0.1247778 0.8105600
Dryaderces pearsoni 36.70667 31.3523912 0.1254760 1.2823154
Itapotihyla langsdorffii 36.52514 20.1479478 0.1276448 0.7779178
Osteocephalus alboguttatus 36.34898 23.6811824 0.1267887 0.9588912
Osteocephalus heyeri 36.32726 29.4954475 0.1283991 1.0053536
Osteocephalus subtilis 36.43382 31.1986274 0.1289442 1.0862022
Osteocephalus verruciger 35.93347 20.4371571 0.1250937 0.8204113
Osteocephalus cabrerai 36.35760 26.0996037 0.1255321 0.9489319
Osteocephalus castaneicola 36.30612 28.0867745 0.1268045 1.2520978
Osteocephalus deridens 36.27057 25.7379383 0.1284203 0.9503331
Osteocephalus fuscifacies 36.27606 27.4665861 0.1270348 1.0284745
Osteocephalus leoniae 36.29917 19.4885616 0.1272156 0.8861471
Osteocephalus planiceps 36.25402 25.7523356 0.1304283 0.9698427
Osteocephalus leprieurii 36.27085 27.4637851 0.1294768 0.9864510
Osteocephalus yasuni 36.32279 31.0683869 0.1283486 1.0981215
Osteocephalus oophagus 36.36374 28.7410206 0.1267177 1.0175931
Osteocephalus taurinus 36.39764 28.1716296 0.1259697 1.0145041
Tepuihyla aecii 36.40476 29.5267147 0.1274721 1.1355523
Tepuihyla edelcae 36.30893 24.3441698 0.1282128 0.9473377
Tepuihyla rodriguezi 36.38435 28.3811830 0.1255790 1.0744206
Tepuihyla exophthalma 36.40093 27.9519061 0.1259160 1.0605680
Tepuihyla luteolabris 36.36707 27.7172174 0.1279345 1.0675046
Osteopilus crucialis 36.30672 70.6986334 0.1282017 2.5697962
Osteopilus marianae 36.35382 74.1706688 0.1275226 2.7036141
Osteopilus wilderi 36.29378 64.5726666 0.1284708 2.3434735
Osteopilus ocellatus 36.31627 71.6339618 0.1280216 2.6006254
Osteopilus dominicensis 36.38663 58.9026546 0.1277055 2.1424083
Osteopilus pulchrilineatus 36.38508 63.0070722 0.1291889 2.3050757
Osteopilus vastus 35.88509 55.4024447 0.1307992 2.0326437
Phyllodytes acuminatus 36.56279 26.5010442 0.1273006 1.0398870
Phyllodytes brevirostris 36.59005 32.0567351 0.1267425 1.2408872
Phyllodytes edelmoi 36.56512 27.4258950 0.1293519 1.0652777
Phyllodytes gyrinaethes 36.64828 28.7537445 0.1263215 1.1153790
Phyllodytes kautskyi 36.58838 29.3774726 0.1246911 1.1487833
Phyllodytes maculosus 36.57212 24.5349681 0.1276410 0.9598108
Phyllodytes punctatus 36.59047 37.8642029 0.1260196 1.4805931
Phyllodytes tuberculosus 36.52061 16.1464899 0.1291743 0.6460697
Phyllodytes wuchereri 36.58344 27.3104935 0.1266546 1.0749943
Phytotriades auratus 36.43872 41.1594202 0.1298135 1.5423305
Pseudacris brachyphona 35.38471 9.3375931 0.1265851 0.3730978
Pseudacris brimleyi 35.35055 6.4440702 0.1262738 0.2550310
Pseudacris clarkii 35.43851 10.9579696 0.1251977 0.4340129
Pseudacris maculata 35.68126 4.4653375 0.1245638 0.2306718
Pseudacris kalmi 35.37562 4.6662589 0.1258860 0.1983079
Pseudacris nigrita 35.42830 10.0487058 0.1250397 0.3734595
Pseudacris fouquettei 35.42805 11.7611822 0.1267439 0.4318869
Pseudacris streckeri 35.34790 11.8360462 0.1290029 0.4550012
Pseudacris ornata 35.39345 13.0503144 0.1276962 0.4794677
Pseudacris ocularis 35.19177 11.3650206 0.1276570 0.4265106
Triprion petasatus 36.30095 30.8547377 0.1293621 1.1134153
Smilisca cyanosticta 36.38276 18.5759239 0.1323309 0.6881534
Smilisca puma 36.64592 21.2157475 0.1374102 0.8151012
Smilisca dentata 36.29829 14.2692840 0.1338812 0.6025948
Smilisca sila 36.27392 30.8767394 0.1332556 1.1509169
Smilisca sordida 35.74569 25.6978768 0.1334889 0.9652028
Isthmohyla angustilineata 36.39756 39.2847741 0.1307875 1.4092991
Isthmohyla debilis 36.30098 36.9850137 0.1337652 1.3510577
Isthmohyla graceae 36.46532 31.3714046 0.1333846 1.2027008
Isthmohyla infucata 36.35565 44.3700196 0.1295075 1.5876761
Isthmohyla insolita 35.93677 32.8302358 0.1314407 1.2461114
Isthmohyla lancasteri 36.48293 31.1823892 0.1298117 1.2348731
Isthmohyla picadoi 36.39547 29.7831161 0.1327408 1.1553551
Isthmohyla pictipes 35.82071 31.9910882 0.1337814 1.2432834
Isthmohyla pseudopuma 36.44968 31.5192734 0.1286519 1.2222338
Isthmohyla rivularis 35.95807 37.1468162 0.1313743 1.3325080
Isthmohyla tica 35.83487 40.0523797 0.1305406 1.4364009
Isthmohyla xanthosticta 36.44082 30.6917375 0.1288788 1.1067991
Isthmohyla zeteki 36.35976 32.5454775 0.1309296 1.2640934
Tlalocohyla godmani 36.11358 18.4678507 0.1304522 0.7318871
Tlalocohyla loquax 36.92453 27.1827848 0.1304950 1.0019723
Tlalocohyla picta 36.65109 23.9145866 0.1324528 0.8989314
Hyla annectans 36.30189 16.7338288 0.1307993 0.6989753
Hyla tsinlingensis 36.27943 8.9267444 0.1310659 0.3830658
Hyla chinensis 36.42974 16.0876824 0.1336184 0.5911377
Hyla savignyi 36.34427 11.0752858 0.1285036 0.4995423
Hyla hallowellii 36.35567 41.5412719 0.1321892 1.5162549
Hyla intermedia 36.35491 9.7858207 0.1321228 0.4130477
Hyla sanchiangensis 36.39020 17.0147920 0.1292033 0.6158972
Hyla sarda 36.34809 12.2671101 0.1329907 0.5115061
Hyla simplex 36.31108 23.6456891 0.1302864 0.8450204
Hyla zhaopingensis 36.35195 20.0475156 0.1312882 0.7100984
Charadrahyla altipotens 35.88012 25.6333377 0.1287761 0.9572468
Charadrahyla chaneque 35.88984 26.6889970 0.1304316 0.9550003
Charadrahyla nephila 35.86304 17.2816670 0.1308017 0.6925581
Charadrahyla taeniopus 35.79620 18.7658759 0.1295825 0.7704689
Charadrahyla trux 35.98842 23.6808045 0.1292333 0.9505629
Megastomatohyla mixe 35.79827 14.0970907 0.1301363 0.6225722
Megastomatohyla mixomaculata 35.79643 21.7498069 0.1277705 0.8739939
Megastomatohyla nubicola 35.75959 35.9078335 0.1315057 1.3929500
Megastomatohyla pellita 35.79703 29.6363042 0.1301177 1.1001625
Bromeliohyla bromeliacia 36.25882 25.5220330 0.1298923 0.9905229
Bromeliohyla dendroscarta 36.35686 20.2534334 0.1304015 0.8156058
Duellmanohyla chamulae 35.72670 29.1434740 0.1289529 1.0441584
Duellmanohyla ignicolor 35.73936 14.2483314 0.1301460 0.6287999
Duellmanohyla lythrodes 35.75116 29.2279807 0.1294935 1.2903439
Duellmanohyla rufioculis 35.77619 36.6789243 0.1305319 1.3880428
Duellmanohyla salvavida 35.80672 43.0686206 0.1309868 1.6353137
Duellmanohyla schmidtorum 36.24058 26.4939885 0.1293373 0.9705055
Duellmanohyla soralia 35.74044 32.9708365 0.1322100 1.2937716
Duellmanohyla uranochroa 35.75090 38.4199115 0.1309023 1.4922178
Ptychohyla dendrophasma 35.74018 25.3100428 0.1305101 0.9348130
Ptychohyla euthysanota 35.78012 23.2429833 0.1301791 0.8797630
Ptychohyla hypomykter 36.27286 25.7439834 0.1294949 0.9854358
Ptychohyla legleri 35.83081 33.5684138 0.1292556 1.3431014
Ptychohyla leonhardschultzei 35.69761 24.9066349 0.1312504 0.9675596
Ptychohyla zophodes 35.75869 23.4063254 0.1294377 0.9176485
Ptychohyla macrotympanum 35.80959 25.0118332 0.1283930 0.9364599
Ptychohyla salvadorensis 36.20431 23.4041821 0.1273174 0.8870587
Ecnomiohyla fimbrimembra 36.28329 33.6246822 0.1304625 1.2064000
Ecnomiohyla miliaria 36.25588 34.6787448 0.1302707 1.3125983
Ecnomiohyla minera 36.21461 21.4742376 0.1306053 0.8422098
Ecnomiohyla phantasmagoria 36.11689 27.7000628 0.1302793 1.0211321
Ecnomiohyla salvaje 36.22711 30.8280397 0.1275333 1.1677039
Ecnomiohyla thysanota 36.23362 31.7022036 0.1289401 1.1289280
Ecnomiohyla valancifer 36.29746 25.2061227 0.1278830 0.9246893
Exerodonta abdivita 36.16902 19.0944716 0.1297714 0.7645945
Exerodonta perkinsi 35.70656 22.8085523 0.1295126 0.9155717
Exerodonta bivocata 35.79278 28.8059400 0.1300936 1.0289608
Exerodonta catracha 36.23689 20.5160392 0.1294441 0.8097971
Exerodonta chimalapa 35.80917 26.8118844 0.1280912 0.9676089
Exerodonta smaragdina 36.27409 21.6251683 0.1300978 0.8678886
Exerodonta xera 36.22949 20.8334730 0.1310199 0.8499939
Exerodonta melanomma 36.18757 26.4148975 0.1327651 1.0007692
Exerodonta sumichrasti 36.25448 25.1262501 0.1299272 0.9412093
Plectrohyla acanthodes 35.74814 22.2742608 0.1271328 0.8411552
Plectrohyla avia 36.33623 25.2976613 0.1263734 0.9620606
Plectrohyla chrysopleura 35.79293 32.3035436 0.1306272 1.2317754
Plectrohyla dasypus 36.31160 37.5068249 0.1285260 1.4735509
Plectrohyla exquisita 36.21985 35.9698205 0.1300386 1.4123350
Plectrohyla glandulosa 35.87680 16.5127757 0.1272233 0.7258745
Plectrohyla guatemalensis 35.83873 26.1513088 0.1282470 1.0036151
Plectrohyla hartwegi 35.66568 23.4440821 0.1302450 0.8984077
Plectrohyla ixil 35.79679 24.4111357 0.1277748 0.9290309
Plectrohyla lacertosa 35.79025 25.3556320 0.1277927 0.9658139
Plectrohyla matudai 36.42826 24.8582674 0.1291381 0.9495347
Plectrohyla pokomchi 35.78591 19.5008893 0.1313972 0.7670001
Plectrohyla psiloderma 35.82578 26.5620015 0.1290014 0.9926284
Plectrohyla quecchi 35.76981 23.5396556 0.1299098 0.9030847
Plectrohyla sagorum 35.88773 22.9207972 0.1271048 0.8950539
Plectrohyla tecunumani 35.82252 15.7832729 0.1281341 0.6986712
Plectrohyla teuchestes 35.79805 28.0297476 0.1294877 1.0445040
Macrogenioglottus alipioi 34.44562 22.0377546 0.1362890 0.8563499
Odontophrynus achalensis 33.52875 7.6299610 0.1369397 0.3286903
Odontophrynus cultripes 34.94441 16.4934296 0.1377662 0.6276932
Odontophrynus cordobae 33.34824 9.0808516 0.1385828 0.3769552
Odontophrynus lavillai 34.92755 12.6825034 0.1385553 0.5035816
Odontophrynus carvalhoi 34.09205 19.9299517 0.1399994 0.7693879
Proceratophrys appendiculata 34.71142 21.0698292 0.1344052 0.8147374
Proceratophrys melanopogon 34.75770 19.6566663 0.1345028 0.7591571
Proceratophrys phyllostomus 34.64535 26.3346165 0.1388588 1.0185003
Proceratophrys moehringi 34.09244 27.8651749 0.1367349 1.0754932
Proceratophrys boiei 34.70858 20.0427994 0.1370544 0.7818353
Proceratophrys laticeps 34.69035 27.0542486 0.1345743 1.0609415
Proceratophrys cururu 34.72845 16.8869013 0.1374471 0.6865940
Proceratophrys concavitympanum 34.08240 27.5527400 0.1360164 0.9745240
Proceratophrys moratoi 34.92411 18.4263401 0.1343595 0.6906081
Proceratophrys goyana 34.67940 19.7328865 0.1364530 0.7329793
Proceratophrys brauni 34.74574 14.6821439 0.1328168 0.5894116
Proceratophrys cristiceps 34.81870 24.3074429 0.1328736 0.9412419
Proceratophrys paviotii 34.30599 25.0228660 0.1336683 0.9697462
Proceratophrys subguttata 34.72842 15.7428270 0.1334230 0.6412752
Proceratophrys palustris 34.68781 18.5682717 0.1366288 0.7042751
Proceratophrys vielliardi 34.75149 19.7936817 0.1341758 0.7488271
Proceratophrys bigibbosa 34.70944 15.0033454 0.1357548 0.5818948
Proceratophrys avelinoi 34.91764 16.7093291 0.1352624 0.6360931
Adenomus kandianus 34.83116 26.1842095 0.1337408 0.9476342
Adenomus kelaartii 35.44174 24.4031983 0.1299752 0.8749833
Duttaphrynus atukoralei 35.49324 24.5606931 0.1313116 0.8694519
Duttaphrynus scaber 35.47492 20.5888928 0.1316486 0.7440006
Duttaphrynus beddomii 35.45664 28.6915754 0.1328672 1.0453207
Duttaphrynus brevirostris 35.40791 20.9651121 0.1321670 0.7784718
Duttaphrynus crocus 35.44068 41.7205463 0.1321471 1.4872305
Duttaphrynus dhufarensis 35.52021 23.1427248 0.1312352 0.8753369
Duttaphrynus himalayanus 35.49113 9.0108450 0.1302522 0.5197369
Duttaphrynus hololius 35.44901 20.2704884 0.1328466 0.7383462
Duttaphrynus kotagamai 34.83293 27.4632775 0.1334500 0.9912224
Duttaphrynus microtympanum 35.39216 23.5055180 0.1326525 0.8485894
Duttaphrynus noellerti 35.41764 27.1365255 0.1340493 0.9829927
Duttaphrynus olivaceus 35.47707 16.2699191 0.1321593 0.6341331
Duttaphrynus parietalis 35.45754 23.0788995 0.1289141 0.8369255
Duttaphrynus scorteccii 35.40414 21.8322749 0.1309286 0.8770401
Duttaphrynus silentvalleyensis 34.86731 18.5387310 0.1339422 0.6781613
Duttaphrynus stomaticus 35.50623 15.7353099 0.1315224 0.6156946
Duttaphrynus stuarti 35.45289 9.5167431 0.1318204 0.5808769
Duttaphrynus sumatranus 34.80952 37.8935658 0.1315079 1.3097801
Duttaphrynus valhallae 35.47308 40.0893193 0.1301658 1.4463941
Xanthophryne koynayensis 35.44790 21.9372423 0.1296164 0.8096123
Xanthophryne tigerina 35.45819 21.6271405 0.1319866 0.7988646
Pedostibes tuberculosus 34.90501 24.2477407 0.1314003 0.8779811
Churamiti maridadi 35.36998 17.6719482 0.1330606 0.7590519
Nectophrynoides cryptus 35.55099 28.7700417 0.1324099 1.1812039
Nectophrynoides frontierei 35.48748 33.5450891 0.1320883 1.3371220
Nectophrynoides laevis 35.52930 27.7279626 0.1337202 1.1295344
Nectophrynoides laticeps 35.44879 19.3933666 0.1354803 0.8380736
Nectophrynoides minutus 35.55512 29.2285633 0.1311665 1.2004596
Nectophrynoides paulae 35.32712 18.5679913 0.1330366 0.8007157
Nectophrynoides poyntoni 35.50548 19.7349453 0.1325848 0.9093152
Nectophrynoides pseudotornieri 35.52724 25.7424721 0.1312193 1.0633890
Nectophrynoides tornieri 35.51649 26.3465992 0.1310407 1.1025268
Nectophrynoides vestergaardi 35.56446 35.1902039 0.1305145 1.4037319
Nectophrynoides viviparus 35.50325 23.7370450 0.1309774 1.0324758
Nectophrynoides wendyae 35.53465 20.2788087 0.1305281 0.9367257
Schismaderma carens 35.47861 18.3585386 0.1306169 0.7726606
Bufotes balearicus 35.92672 8.9156582 0.1322525 0.3848462
Bufotes latastii 35.86421 4.3472691 0.1332363 0.3577085
Bufotes luristanicus 35.87598 13.5829088 0.1318907 0.5669184
Bufotes oblongus 35.88093 12.3247348 0.1312245 0.6050177
Bufotes pseudoraddei 35.86388 6.2134026 0.1315311 0.3707296
Bufotes surdus 35.81908 12.9674056 0.1313877 0.5331983
Bufotes turanensis 35.84372 11.8703914 0.1309352 0.5707624
Bufotes variabilis 35.88808 7.3455794 0.1330371 0.3549572
Bufotes zamdaensis 35.85896 4.2025584 0.1320657 0.4070099
Bufotes zugmayeri 35.83644 9.6141509 0.1317252 0.4752614
Ansonia albomaculata 35.45973 32.9388709 0.1288913 1.1916879
Ansonia torrentis 34.83762 34.7191770 0.1290963 1.2747820
Ansonia longidigita 35.42961 38.0945815 0.1305750 1.3637423
Ansonia endauensis 34.79720 34.2530289 0.1348732 1.1902274
Ansonia inthanon 34.75501 24.9263460 0.1343161 0.9033635
Ansonia kraensis 34.73042 28.5629390 0.1309107 1.0048334
Ansonia thinthinae 34.71803 29.0896010 0.1341639 1.0456740
Ansonia siamensis 34.77164 33.7082682 0.1298668 1.2171627
Ansonia fuliginea 35.44563 53.0207873 0.1301011 1.9498358
Ansonia mcgregori 34.83211 44.9449377 0.1331824 1.6325199
Ansonia muelleri 34.82216 42.1637505 0.1316447 1.5234089
Ansonia glandulosa 34.81630 43.5587892 0.1306315 1.5233275
Ansonia hanitschi 35.39329 35.9988732 0.1291911 1.3041720
Ansonia platysoma 34.70233 37.6593015 0.1328630 1.3874372
Ansonia minuta 34.82512 35.0660163 0.1303776 1.2408649
Ansonia spinulifer 35.25841 37.0728633 0.1332720 1.3187325
Ansonia jeetsukumarani 34.75835 35.5892108 0.1324118 1.2839052
Ansonia latidisca 35.22528 46.6036052 0.1310725 1.6642784
Ansonia latiffi 34.83990 36.6627491 0.1300009 1.2857743
Ansonia latirostra 35.28152 33.8208869 0.1330092 1.1778800
Ansonia tiomanica 34.81097 32.4750177 0.1293184 1.1301003
Ansonia malayana 34.86449 30.8246420 0.1331900 1.0973843
Pelophryne albotaeniata 35.27559 52.8827503 0.1348140 1.9016986
Pelophryne api 35.45578 38.0781631 0.1306146 1.3943337
Pelophryne brevipes 35.26789 39.1598379 0.1321559 1.4111199
Pelophryne guentheri 35.50379 36.3692664 0.1316714 1.3226200
Pelophryne lighti 35.37515 44.7198579 0.1317720 1.6243426
Pelophryne linanitensis 35.50204 25.5019904 0.1316496 0.9753959
Pelophryne misera 35.43199 39.5522271 0.1318021 1.4677972
Pelophryne murudensis 35.47933 27.6235428 0.1342736 1.0594310
Pelophryne rhopophilia 35.43954 33.5759111 0.1328983 1.2165770
Pelophryne signata 35.46660 40.4323489 0.1295018 1.4585897
Ghatophryne ornata 34.79937 27.8241103 0.1307217 1.0288273
Ghatophryne rubigina 34.79559 21.1485505 0.1294982 0.7583687
Ingerophrynus biporcatus 35.43267 39.4730892 0.1331929 1.4102894
Ingerophrynus claviger 35.39554 50.3036397 0.1284326 1.8322506
Ingerophrynus divergens 35.40473 37.2803835 0.1317261 1.3236362
Ingerophrynus galeatus 35.37127 26.7547701 0.1345437 0.9664523
Ingerophrynus philippinicus 35.44300 49.0407572 0.1314224 1.7556065
Ingerophrynus gollum 34.73786 38.5508883 0.1332794 1.3614489
Ingerophrynus kumquat 35.42490 37.0724759 0.1304510 1.3005243
Ingerophrynus macrotis 35.42031 25.1849275 0.1323409 0.9224505
Ingerophrynus parvus 34.79179 28.5698542 0.1312255 0.9992073
Ingerophrynus quadriporcatus 35.43527 38.6672668 0.1294823 1.3621191
Ingerophrynus celebensis 35.32215 43.1281065 0.1341643 1.5940275
Bufo ailaoanus 35.11008 16.2315680 0.1331076 0.7121010
Bufo aspinius 34.99632 12.6750566 0.1324399 0.6429680
Bufo cryptotympanicus 35.07303 16.3741942 0.1332996 0.6012758
Bufo tuberculatus 35.14395 5.9428029 0.1332374 0.3912064
Bufo eichwaldi 35.11257 10.9620459 0.1314125 0.5551417
Bufo japonicus 35.02680 9.8121464 0.1331707 0.3995011
Bufo torrenticola 34.99901 10.1603136 0.1329419 0.4078581
Bufo pageoti 35.01504 15.7046443 0.1334151 0.6538492
Bufo stejnegeri 35.03142 5.3514813 0.1334447 0.2446396
Bufo verrucosissimus 35.09905 7.3669016 0.1299747 0.3661210
Strauchbufo raddei 35.33320 6.4613252 0.1307411 0.3407825
Didynamipus sjostedti 35.36204 36.2415991 0.1317457 1.3345330
Nimbaphrynoides occidentalis 35.33423 34.5548060 0.1317484 1.2489595
Nectophryne afra 35.29632 30.2568469 0.1314945 1.1056800
Nectophryne batesii 35.21549 27.3610370 0.1313974 0.9999211
Werneria bambutensis 34.79556 29.8629285 0.1307255 1.1380191
Werneria iboundji 34.71272 24.4815701 0.1322958 0.8734771
Werneria mertensiana 34.68638 30.1247915 0.1330718 1.1216648
Werneria tandyi 34.72225 38.1690669 0.1293262 1.4080948
Werneria preussi 34.76748 42.8263233 0.1326891 1.5749690
Werneria submontana 34.72081 36.1757093 0.1281752 1.3305559
Wolterstorffina chirioi 35.35492 26.5678603 0.1323167 1.0284082
Wolterstorffina mirei 35.34803 26.0428791 0.1317892 1.0099529
Wolterstorffina parvipalmata 34.69579 34.8673425 0.1297824 1.3007498
Leptophryne borbonica 35.31562 31.0109553 0.1313269 1.0984341
Leptophryne cruentata 34.66755 25.1875364 0.1323389 0.8801180
Pedostibes kempi 35.22684 23.5270451 0.1318985 0.9212173
Altiphrynoides malcolmi 35.12554 26.1305976 0.1323037 1.3224118
Amazophrynella bokermanni 35.26772 38.6463966 0.1315749 1.3762122
Amazophrynella minuta 35.11771 36.4867157 0.1335164 1.3203282
Dendrophryniscus berthalutzae 35.25474 17.1300094 0.1301212 0.6877008
Dendrophryniscus krausae 35.28414 14.6391078 0.1307613 0.5969076
Dendrophryniscus leucomystax 35.21689 21.1483054 0.1306496 0.8147212
Dendrophryniscus brevipollicatus 35.22112 27.0801940 0.1329571 1.0497258
Dendrophryniscus carvalhoi 35.30652 33.4581266 0.1291717 1.2977836
Dendrophryniscus proboscideus 35.30108 27.9994706 0.1313786 1.0947255
Dendrophryniscus stawiarskyi 35.20643 17.1561836 0.1329137 0.6808884
Vandijkophrynus amatolicus 35.13563 14.6690928 0.1329065 0.7104059
Vandijkophrynus inyangae 35.17968 18.7344848 0.1321497 0.7827564
Vandijkophrynus angusticeps 35.25651 14.5603680 0.1316464 0.6887052
Vandijkophrynus gariepensis 35.19048 13.1927653 0.1329832 0.6251869
Vandijkophrynus robinsoni 35.18982 16.1237826 0.1328317 0.7881477
Anaxyrus hemiophrys 36.03568 3.5127715 0.1266966 0.1864475
Anaxyrus houstonensis 36.06607 12.9177991 0.1250382 0.4753305
Anaxyrus microscaphus 35.91994 5.9666803 0.1233382 0.2893595
Anaxyrus californicus 35.97774 9.2482868 0.1236505 0.4343909
Anaxyrus debilis 37.34067 10.4459130 0.1241215 0.4451499
Anaxyrus kelloggi 35.94267 12.9084480 0.1258540 0.5089264
Anaxyrus mexicanus 35.97549 10.3105342 0.1253500 0.4285197
Anaxyrus quercicus 35.99303 11.0426034 0.1242137 0.4093134
Anaxyrus speciosus 36.95540 13.5656368 0.1249515 0.5542702
Incilius occidentalis 36.56727 14.9322438 0.1249271 0.6147031
Incilius aucoinae 36.42283 25.2077376 0.1285786 0.9850586
Incilius melanochlorus 36.39641 26.5945011 0.1261243 1.0047342
Incilius campbelli 35.81029 23.4543529 0.1250094 0.8864794
Incilius leucomyos 36.45645 22.6175565 0.1254232 0.8634570
Incilius macrocristatus 36.39801 21.9684919 0.1274942 0.7892096
Incilius tutelarius 35.79579 17.4063241 0.1266969 0.6580238
Incilius cristatus 36.41486 16.5809990 0.1253855 0.6740380
Incilius perplexus 36.42000 19.2652799 0.1281327 0.7622893
Incilius cavifrons 35.72291 19.3603137 0.1274821 0.7080481
Incilius spiculatus 35.78535 12.3396634 0.1279790 0.5495362
Incilius chompipe 36.45748 22.6075211 0.1256610 0.9347218
Incilius coniferus 36.47094 25.7656633 0.1258667 0.9811312
Incilius coccifer 36.47462 23.0188273 0.1264908 0.8608147
Incilius cycladen 36.46317 19.2111144 0.1280446 0.7615384
Incilius signifer 36.49145 36.3191163 0.1251882 1.3413723
Incilius porteri 36.41310 19.0897241 0.1281373 0.7316909
Incilius ibarrai 36.46950 15.2924597 0.1260149 0.5955546
Incilius pisinnus 36.45051 21.1882556 0.1264693 0.8646359
Incilius epioticus 36.37982 28.8997244 0.1272831 1.1859751
Incilius gemmifer 36.34127 18.2918366 0.1275401 0.6998054
Incilius guanacaste 36.49205 30.7865999 0.1239423 1.1505372
Incilius holdridgei 36.42661 27.4510376 0.1248283 0.9895505
Incilius luetkenii 36.54825 20.5933574 0.1261011 0.7659573
Incilius nebulifer 36.47617 16.4420008 0.1234030 0.6336554
Incilius valliceps 36.41210 22.1386149 0.1267956 0.8167254
Incilius tacanensis 35.82957 20.5965002 0.1263616 0.8026630
Incilius bocourti 36.25522 19.7438448 0.1274121 0.7677863
Rhinella abei 36.74118 10.9006551 0.1250059 0.4422981
Rhinella pombali 36.73158 12.6038887 0.1258480 0.4868344
Rhinella achalensis 36.56378 9.2358866 0.1254394 0.4037417
Rhinella achavali 36.33822 9.2366831 0.1257520 0.3775466
Rhinella rubescens 36.30004 15.6322267 0.1270945 0.5804241
Rhinella acrolopha 36.58573 29.6183883 0.1279110 1.0863324
Rhinella acutirostris 36.55210 27.0238589 0.1253891 0.9912560
Rhinella alata 36.55634 28.6108924 0.1281364 1.0656376
Rhinella amabilis 36.77235 16.0817288 0.1227261 0.7061256
Rhinella amboroensis 35.92321 25.7658186 0.1260679 1.1382094
Rhinella veraguensis 36.38182 19.9748464 0.1245394 1.0017442
Rhinella arborescandens 36.44619 19.9164431 0.1252602 0.8842629
Rhinella arunco 36.58646 6.5553694 0.1243358 0.3597176
Rhinella atacamensis 36.73836 7.9825023 0.1273904 0.4647936
Rhinella bergi 36.61275 14.1256223 0.1251814 0.5131944
Rhinella castaneotica 36.50196 29.3272895 0.1274228 1.0339638
Rhinella cerradensis 36.88074 16.2019138 0.1300585 0.5961285
Rhinella jimi 36.92436 20.6675136 0.1279403 0.7976637
Rhinella chavin 36.26387 14.7937596 0.1277133 0.7500062
Rhinella cristinae 36.59081 23.8683145 0.1240037 0.9543205
Rhinella dapsilis 36.52199 30.7889875 0.1261454 1.1367972
Rhinella martyi 36.48259 30.6358918 0.1265049 1.1133777
Rhinella lescurei 36.46705 26.1032499 0.1284349 0.9416199
Rhinella fernandezae 36.62106 10.1486347 0.1274424 0.4042829
Rhinella festae 36.54807 18.4408916 0.1263924 0.7672607
Rhinella fissipes 36.55785 27.0848024 0.1242610 1.3145953
Rhinella gallardoi 36.53532 14.7574086 0.1255248 0.6378595
Rhinella gnustae 35.90304 10.5053631 0.1255695 0.6733245
Rhinella henseli 36.56727 12.5891118 0.1236895 0.5032778
Rhinella inca 36.59360 14.4939129 0.1254214 0.7679543
Rhinella iserni 36.58299 33.7080666 0.1254464 1.5206741
Rhinella justinianoi 36.61049 21.7624209 0.1243031 1.0379407
Rhinella limensis 36.62087 16.5562114 0.1267166 0.7978144
Rhinella lindae 36.51077 32.4465646 0.1262431 1.2265709
Rhinella macrorhina 36.57904 16.9897702 0.1245416 0.7508256
Rhinella magnussoni 36.54605 29.7752626 0.1272717 1.0721354
Rhinella manu 36.41346 13.9183784 0.1239475 0.7987639
Rhinella nesiotes 36.41072 28.0665866 0.1249733 1.2301770
Rhinella multiverrucosa 36.67430 16.1909410 0.1240422 0.7992260
Rhinella nicefori 36.62631 19.6204974 0.1246888 0.8145986
Rhinella ocellata 36.53135 18.9153753 0.1290079 0.6911417
Rhinella poeppigii 35.97371 22.1110522 0.1254827 1.0079103
Rhinella proboscidea 36.56427 30.7713671 0.1263980 1.0756777
Rhinella pygmaea 37.60213 21.3453837 0.1261858 0.8261741
Rhinella quechua 36.59143 19.1981559 0.1242515 0.9725297
Rhinella roqueana 36.59808 25.8749781 0.1262069 0.9670665
Rhinella rubropunctata 36.49576 6.5069626 0.1247295 0.3759096
Rhinella ruizi 36.54606 18.4635004 0.1276507 0.8216101
Rhinella rumbolli 36.52757 12.3867523 0.1247267 0.6037890
Rhinella scitula 35.93582 19.4902777 0.1276981 0.6786503
Rhinella sclerocephala 36.50792 30.0610050 0.1249136 1.1233049
Rhinella stanlaii 36.55036 22.0940579 0.1258570 1.0952267
Rhinella sternosignata 36.53616 26.7701103 0.1254493 1.0423964
Rhinella tacana 36.39047 19.3228360 0.1261228 0.9903784
Rhinella tenrec 36.63820 31.9649818 0.1278191 1.2105331
Rhinella vellardi 36.60368 18.9458447 0.1265229 0.9124408
Rhinella veredas 36.51014 21.4275160 0.1275405 0.8099315
Rhinella yanachaga 36.35901 19.6494314 0.1278061 0.9217852
Atelopus andinus 34.06506 31.0179838 0.1292850 1.2652389
Atelopus arsyecue 34.03874 24.8585896 0.1319212 0.9719388
Atelopus balios 34.11297 25.3318181 0.1317062 0.9366497
Atelopus bomolochos 34.03672 24.3493433 0.1318013 0.9404351
Atelopus carauta 34.06963 34.1492387 0.1311225 1.2908873
Atelopus carrikeri 34.06437 22.6337810 0.1312048 0.8848571
Atelopus certus 34.00020 40.6724222 0.1342495 1.5065238
Atelopus chirripoensis 34.60864 20.5143212 0.1332328 1.1926495
Atelopus chrysocorallus 34.00709 32.5008370 0.1315493 1.2141573
Atelopus coynei 34.02234 14.1365382 0.1341127 0.6785297
Atelopus cruciger 33.98903 35.8526972 0.1328973 1.3223540
Atelopus dimorphus 33.94101 30.7028714 0.1331727 1.2986456
Atelopus epikeisthos 34.00278 30.5688673 0.1328530 1.3019853
Atelopus exiguus 34.11752 16.6565610 0.1321631 0.6873446
Atelopus nanay 34.03939 24.0409860 0.1320415 0.8916065
Atelopus famelicus 34.00060 38.6532743 0.1323010 1.5007234
Atelopus flavescens 33.97791 42.1774196 0.1302802 1.5557586
Atelopus franciscus 33.93599 38.1371634 0.1318867 1.3978159
Atelopus galactogaster 33.99630 39.2769887 0.1320713 1.5006033
Atelopus glyphus 34.09901 37.8502923 0.1333644 1.3879053
Atelopus guitarraensis 34.06035 27.0039560 0.1317352 1.1298309
Atelopus podocarpus 34.00932 22.6235005 0.1336568 0.9753269
Atelopus ignescens 34.00267 14.3235103 0.1323225 0.6624398
Atelopus laetissimus 34.01285 24.9460089 0.1332165 0.9196353
Atelopus varius 34.03504 30.4175552 0.1322922 1.1641835
Atelopus longibrachius 33.97460 39.9737087 0.1330707 1.5494301
Atelopus longirostris 34.05749 14.9405009 0.1310903 0.7164462
Atelopus lozanoi 34.06518 22.9352889 0.1329542 1.0080147
Atelopus mandingues 34.03856 21.7852784 0.1325289 0.9566417
Atelopus mittermeieri 34.01800 22.2853383 0.1328151 0.9997384
Atelopus mucubajiensis 34.03360 32.9783224 0.1310608 1.2276675
Atelopus muisca 33.94503 22.3668116 0.1336363 0.9802376
Atelopus nahumae 34.06169 26.7210462 0.1294103 0.9951222
Atelopus nepiozomus 34.03237 18.0309055 0.1318183 0.7819804
Atelopus oxapampae 34.09185 24.4569945 0.1311606 1.1461191
Atelopus palmatus 33.98059 13.4533184 0.1323026 0.6061020
Atelopus pulcher 34.05379 30.6512219 0.1321735 1.3051953
Atelopus pyrodactylus 34.02039 30.1750495 0.1313364 1.3290152
Atelopus reticulatus 33.93513 32.8544393 0.1342825 1.3820456
Atelopus sanjosei 34.03727 35.9306282 0.1326413 1.3873888
Atelopus seminiferus 34.03931 25.3804922 0.1336049 1.0993165
Atelopus simulatus 34.59110 19.5458522 0.1320218 0.8784981
Atelopus siranus 33.98550 29.4302308 0.1300840 1.2888447
Atelopus spurrelli 33.99211 36.0476699 0.1316730 1.3901254
Atelopus tricolor 34.20716 28.2780888 0.1309765 1.3237664
Atelopus walkeri 34.10185 23.9435394 0.1295980 0.9176342
Bufoides meghalayanus 34.53861 20.8875595 0.1303711 0.9024287
Capensibufo rosei 35.36222 15.0531153 0.1299875 0.6953415
Capensibufo tradouwi 35.24606 14.5823029 0.1324625 0.6970616
Mertensophryne anotis 35.40258 30.2090552 0.1299873 1.1390197
Mertensophryne loveridgei 35.37932 29.2078640 0.1311046 1.1328756
Mertensophryne howelli 35.38804 35.8273827 0.1312162 1.3681549
Mertensophryne lindneri 35.37464 28.4242457 0.1302679 1.1156163
Mertensophryne lonnbergi 35.42195 24.3886497 0.1310555 1.1275070
Mertensophryne melanopleura 35.35607 23.9283755 0.1294696 0.9796604
Mertensophryne micranotis 35.39079 36.2062661 0.1318627 1.4405390
Mertensophryne mocquardi 35.36637 22.9446172 0.1312119 1.0788321
Mertensophryne nairobiensis 35.32911 20.2577120 0.1331775 0.9368216
Mertensophryne nyikae 35.31917 29.6097408 0.1328933 1.3331982
Mertensophryne schmidti 35.34364 27.5050661 0.1312202 1.0690126
Mertensophryne taitana 35.35328 23.8059777 0.1328414 1.0079207
Mertensophryne usambarae 35.37390 42.6742199 0.1326641 1.7002332
Mertensophryne uzunguensis 35.35692 27.8758475 0.1305444 1.2590174
Poyntonophrynus beiranus 35.34691 25.6031542 0.1305638 1.0007942
Poyntonophrynus damaranus 36.28962 14.5353404 0.1323482 0.6281741
Poyntonophrynus dombensis 35.26536 15.0459453 0.1315523 0.6445383
Poyntonophrynus fenoulheti 35.40372 19.5790174 0.1314857 0.8118549
Poyntonophrynus grandisonae 35.12522 15.1499942 0.1290208 0.6161834
Poyntonophrynus hoeschi 35.33731 15.6976632 0.1302224 0.7065102
Poyntonophrynus kavangensis 35.30309 20.2473354 0.1317571 0.8375877
Poyntonophrynus lughensis 35.35574 35.9273091 0.1306500 1.4674106
Poyntonophrynus parkeri 35.28589 23.0327126 0.1301360 1.0333644
Poyntonophrynus vertebralis 35.34119 15.2917074 0.1299599 0.7189934
Laurentophryne parkeri 35.35262 24.9690131 0.1276237 1.0166798
Metaphryniscus sosai 35.19916 33.3965564 0.1329798 1.2781440
Nannophryne apolobambica 35.22024 19.8485574 0.1325793 1.2144922
Nannophryne corynetes 35.31629 15.8997972 0.1281268 0.8539352
Nannophryne variegata 35.23681 5.9891532 0.1328576 0.5111197
Oreophrynella cryptica 35.35178 35.5940544 0.1289411 1.3583891
Oreophrynella dendronastes 35.15019 41.2420761 0.1324181 1.5332423
Oreophrynella huberi 35.31137 32.3328036 0.1300325 1.2300338
Oreophrynella macconnelli 35.17633 36.6938071 0.1295490 1.3623021
Oreophrynella nigra 35.31341 37.9192576 0.1309872 1.4252345
Oreophrynella quelchii 35.32884 36.5569119 0.1309520 1.3691920
Oreophrynella vasquezi 35.36308 31.0314516 0.1304765 1.1930045
Oreophrynella weiassipuensis 35.10860 34.4702840 0.1294893 1.2920565
Osornophryne bufoniformis 35.18577 20.9226885 0.1309626 0.9222589
Osornophryne antisana 35.19835 14.0327177 0.1291933 0.6346783
Osornophryne percrassa 35.19785 27.9778520 0.1316896 1.2337678
Osornophryne puruanta 35.14500 21.6381936 0.1324441 0.9730545
Osornophryne cofanorum 35.03366 22.8309617 0.1317262 1.0237140
Osornophryne guacamayo 35.23698 17.1980768 0.1292414 0.7813464
Osornophryne sumacoensis 35.25214 25.2131921 0.1317810 1.0549256
Osornophryne talipes 35.20451 23.2108239 0.1325689 1.0102005
Parapelophryne scalpta 35.35914 49.5028869 0.1344618 1.7582776
Peltophryne cataulaciceps 35.24405 62.3058731 0.1311330 2.2699611
Peltophryne longinasus 35.27440 69.8530066 0.1311419 2.5321490
Peltophryne gundlachi 35.16998 56.5105847 0.1306993 2.0512004
Peltophryne empusa 35.22459 67.4290361 0.1323866 2.4438947
Peltophryne florentinoi 35.24879 57.5275787 0.1304691 2.0916729
Peltophryne peltocephala 35.15934 63.1083825 0.1318917 2.2895180
Peltophryne fustiger 35.19928 54.5700891 0.1317842 1.9878861
Peltophryne taladai 35.23140 61.7744614 0.1306144 2.2342201
Peltophryne guentheri 35.17545 71.4539488 0.1315157 2.5995771
Peltophryne lemur 35.24856 64.0283991 0.1324287 2.3658546
Pseudobufo subasper 35.25779 44.5693186 0.1300819 1.5371435
Rhaebo blombergi 35.02381 33.1122153 0.1342978 1.3133197
Rhaebo caeruleostictus 35.08212 19.5248911 0.1323861 0.8149009
Rhaebo glaberrimus 34.52886 32.9897688 0.1310494 1.3025697
Rhaebo guttatus 35.04955 32.1869704 0.1319600 1.1606890
Rhaebo hypomelas 35.15661 32.0599884 0.1293464 1.2829509
Rhaebo lynchi 35.14797 35.8580456 0.1289433 1.3573454
Rhaebo nasicus 34.54102 31.7859953 0.1301990 1.1968849
Truebella skoptes 35.21988 23.5191369 0.1288299 1.3761998
Truebella tothastes 35.29795 13.1134919 0.1300858 0.7611042
Frostius erythrophthalmus 35.23968 23.3056253 0.1316565 0.9325698
Frostius pernambucensis 35.33719 32.2575386 0.1313048 1.2702542
Melanophryniscus admirabilis 34.47497 18.5628400 0.1305944 0.7323096
Melanophryniscus alipioi 34.96327 14.3530842 0.1332953 0.5930302
Melanophryniscus atroluteus 35.06521 14.8178376 0.1304168 0.5909739
Melanophryniscus cambaraensis 34.54404 15.0002144 0.1317050 0.6090524
Melanophryniscus cupreuscapularis 34.99878 18.1978181 0.1339878 0.6688359
Melanophryniscus dorsalis 35.09563 16.4661500 0.1347633 0.6751854
Melanophryniscus fulvoguttatus 34.96883 23.1011827 0.1335668 0.8248919
Melanophryniscus klappenbachi 35.03516 19.2080286 0.1317283 0.6907243
Melanophryniscus stelzneri 35.06464 13.1682181 0.1309114 0.6048878
Melanophryniscus langonei 34.31513 12.7911251 0.1325819 0.5129390
Melanophryniscus macrogranulosus 34.92130 13.9372789 0.1336346 0.5579309
Melanophryniscus montevidensis 34.94778 14.6986493 0.1333500 0.6602740
Melanophryniscus moreirae 35.02925 22.6717783 0.1317277 0.8489025
Melanophryniscus orejasmirandai 35.07922 16.2706869 0.1345130 0.7446443
Melanophryniscus pachyrhynus 35.06597 13.6447880 0.1332251 0.5620936
Melanophryniscus peritus 35.05050 20.0662530 0.1315102 0.7580169
Melanophryniscus sanmartini 35.02358 15.3394157 0.1341816 0.6615833
Melanophryniscus simplex 35.07852 15.7040571 0.1337984 0.6273214
Melanophryniscus spectabilis 35.08245 16.5594161 0.1306124 0.6565784
Melanophryniscus tumifrons 35.09568 16.1232335 0.1335948 0.6433429
Edalorhina nasuta 36.27354 18.7073421 0.1336140 0.8775205
Engystomops montubio 36.75920 20.9416756 0.1318696 0.8433883
Engystomops pustulatus 36.52844 20.7153230 0.1311398 0.8279026
Physalaemus caete 36.60964 23.8326373 0.1346209 0.9297250
Physalaemus aguirrei 36.42675 27.1870611 0.1326818 1.0610349
Physalaemus irroratus 36.45277 23.3728622 0.1289947 0.9104527
Physalaemus maculiventris 36.65234 20.1923446 0.1320654 0.7842384
Physalaemus moreirae 36.40766 18.6662134 0.1306764 0.7170901
Physalaemus albifrons 36.44264 18.6270143 0.1344178 0.7165931
Physalaemus centralis 35.71338 17.3289629 0.1347089 0.6323514
Physalaemus ephippifer 35.51333 27.8340813 0.1345210 0.9960033
Physalaemus erythros 35.75214 14.5871336 0.1352921 0.5664967
Physalaemus maximus 35.80934 13.9773065 0.1315266 0.5465853
Physalaemus angrensis 36.34619 20.2441362 0.1332388 0.7540133
Physalaemus rupestris 36.36991 22.3137614 0.1311286 0.8548396
Physalaemus atlanticus 37.23987 18.9222066 0.1304566 0.7567729
Physalaemus santafecinus 37.35823 12.5667334 0.1312305 0.4703211
Physalaemus spiniger 37.12182 16.3974819 0.1288403 0.6387528
Physalaemus barrioi 36.00508 16.3526960 0.1321302 0.6147210
Physalaemus biligonigerus 35.99251 14.9144893 0.1333020 0.5753734
Physalaemus jordanensis 36.18298 13.8948056 0.1312580 0.5376260
Physalaemus bokermanni 36.51876 15.5032536 0.1324882 0.6069186
Physalaemus cuqui 36.88809 13.7514444 0.1307270 0.5746019
Physalaemus kroyeri 36.57926 19.8800535 0.1304654 0.7815604
Physalaemus fernandezae 35.63700 10.0327272 0.1343204 0.4576415
Physalaemus deimaticus 36.37199 16.7975844 0.1325630 0.6825474
Physalaemus insperatus 36.40970 15.2627911 0.1308695 0.6223080
Physalaemus evangelistai 36.33540 18.9471721 0.1325540 0.7509364
Physalaemus nanus 36.34017 15.4228533 0.1319849 0.6235099
Physalaemus fischeri 36.31729 30.6358561 0.1319181 1.1435621
Physalaemus olfersii 36.34164 18.7908411 0.1310271 0.7323787
Physalaemus lisei 36.29943 13.3395395 0.1327246 0.5407885
Physalaemus marmoratus 37.67312 18.4800678 0.1318215 0.6833972
Physalaemus obtectus 36.39366 20.4123343 0.1307354 0.7901597
Physalaemus soaresi 36.38070 23.3504734 0.1312349 0.8921354
Pleurodema borellii 37.19611 9.4766966 0.1304718 0.4497366
Pleurodema cinereum 37.18823 10.1241881 0.1319652 0.5951182
Pleurodema fuscomaculatum 37.11748 24.3630327 0.1322985 0.8558101
Pleurodema bibroni 35.81643 9.4333641 0.1355485 0.3851898
Pleurodema kriegi 35.82267 8.3331792 0.1342764 0.3586660
Pleurodema guayapae 36.75042 9.4540861 0.1301690 0.3999375
Pseudopaludicola mystacalis 36.48101 22.5266996 0.1314382 0.8436858
Pseudopaludicola boliviana 36.52567 27.0261197 0.1286960 0.9712619
Pseudopaludicola pusilla 36.54700 29.0485252 0.1307580 1.0836532
Pseudopaludicola saltica 36.59960 23.9164955 0.1311752 0.8913482
Pseudopaludicola canga 36.45520 33.4551916 0.1303129 1.1916364
Pseudopaludicola mineira 36.50494 16.1948245 0.1275396 0.6513831
Pseudopaludicola llanera 36.53589 29.7731036 0.1260592 1.1084553
Pseudopaludicola ternetzi 36.74930 18.2225275 0.1291552 0.6874762
Crossodactylodes bokermanni 35.93615 31.2561428 0.1300625 1.2095514
Crossodactylodes izecksohni 36.02075 30.8111683 0.1311206 1.1942098
Crossodactylodes pintoi 36.02339 24.6480102 0.1322302 0.9178945
Paratelmatobius mantiqueira 35.97587 21.0712641 0.1322453 0.8060755
Paratelmatobius cardosoi 36.00188 20.6151656 0.1296190 0.8191506
Paratelmatobius gaigeae 36.03135 20.1367167 0.1306995 0.7539061
Paratelmatobius poecilogaster 36.01358 20.5583116 0.1333081 0.8183076
Paratelmatobius lutzii 36.08054 21.5212628 0.1281960 0.8069389
Scythrophrys sawayae 36.03073 18.3497075 0.1326686 0.7458269
Rupirana cardosoi 35.47791 21.4557465 0.1317179 0.8537356
Adenomera ajurauna 34.86067 14.6966572 0.1342320 0.5730912
Adenomera araucaria 35.34419 14.3138952 0.1296895 0.5740153
Adenomera thomei 35.33126 30.6957497 0.1331121 1.2008729
Adenomera nana 35.45841 15.8875116 0.1324253 0.6393327
Adenomera bokermanni 35.38564 17.4913737 0.1320983 0.6773274
Adenomera coca 35.36697 13.6877537 0.1311980 0.9425057
Adenomera diptyx 35.41116 18.9506071 0.1323430 0.6927039
Adenomera hylaedactyla 35.39350 28.5709900 0.1318151 1.0388234
Adenomera martinezi 35.35206 29.3326675 0.1323411 1.0562728
Adenomera marmorata 35.44286 19.1578594 0.1302786 0.7402232
Adenomera heyeri 35.52512 35.0187468 0.1319803 1.2725990
Adenomera lutzi 35.39185 32.1575265 0.1337709 1.1919543
Hydrolaetare caparu 37.47125 23.5290065 0.1312401 0.8200392
Hydrolaetare schmidti 36.41392 34.7324765 0.1317690 1.2220515
Hydrolaetare dantasi 36.43028 33.5043130 0.1301014 1.1899950
Leptodactylus poecilochilus 35.44867 27.8375641 0.1311916 1.0329955
Leptodactylus chaquensis 36.46040 15.8663046 0.1312637 0.6006834
Leptodactylus fragilis 38.12338 23.2250674 0.1281574 0.8738531
Leptodactylus longirostris 37.86599 27.3308171 0.1301427 1.0053962
Leptodactylus caatingae 36.52327 19.7394692 0.1291798 0.7641990
Leptodactylus camaquara 37.51463 17.3861291 0.1317728 0.6857897
Leptodactylus colombiensis 36.52463 27.2707592 0.1315883 1.0973239
Leptodactylus cunicularius 36.56946 15.7825899 0.1331705 0.6086664
Leptodactylus cupreus 37.47964 17.9185419 0.1293163 0.6931035
Leptodactylus notoaktites 35.69695 13.4284133 0.1345796 0.5205640
Leptodactylus mystaceus 35.65891 28.0110860 0.1329157 1.0121382
Leptodactylus spixi 35.77497 21.1334840 0.1321075 0.8250210
Leptodactylus elenae 35.93795 16.6512071 0.1303876 0.6068650
Leptodactylus diedrus 36.85951 28.8186537 0.1297745 1.0026669
Leptodactylus discodactylus 37.05933 25.9589457 0.1300614 0.9414296
Leptodactylus griseigularis 37.08923 17.8783008 0.1285516 0.9103298
Leptodactylus validus 36.61205 46.8360418 0.1304273 1.7394302
Leptodactylus fallax 36.54158 50.0406161 0.1276546 1.8428222
Leptodactylus labyrinthicus 36.70459 23.0400565 0.1291108 0.8373426
Leptodactylus myersi 36.54907 35.3933862 0.1293879 1.2894410
Leptodactylus knudseni 36.45353 29.5357300 0.1303475 1.0706648
Leptodactylus pentadactylus 36.52621 32.0494970 0.1272322 1.1593204
Leptodactylus flavopictus 36.55520 18.5246859 0.1318682 0.7228278
Leptodactylus furnarius 36.01523 16.9262046 0.1327488 0.6346320
Leptodactylus plaumanni 37.00816 12.8390123 0.1295658 0.4976682
Leptodactylus stenodema 36.58751 31.7404305 0.1322606 1.1325103
Leptodactylus hylodes 36.52889 29.1891845 0.1305304 1.1552490
Leptodactylus jolyi 36.95606 15.5142791 0.1303924 0.5889605
Leptodactylus magistris 35.72640 25.2738961 0.1316250 0.9538428
Leptodactylus laticeps 36.52204 17.1724795 0.1300341 0.6440944
Leptodactylus lauramiriamae 36.51318 26.3310022 0.1313425 0.9354005
Leptodactylus nesiotus 36.15059 33.2402846 0.1322601 1.2262868
Leptodactylus marambaiae 36.59740 26.6407296 0.1317241 1.0451368
Leptodactylus natalensis 36.56315 26.0646455 0.1291910 1.0003491
Leptodactylus paraensis 36.56970 29.7467355 0.1276516 1.0603802
Leptodactylus rhodonotus 36.56169 31.1960747 0.1293562 1.3259194
Leptodactylus peritoaktites 36.60434 25.5879783 0.1308053 0.9949166
Leptodactylus pustulatus 36.54849 26.9850301 0.1308207 0.9652710
Leptodactylus rhodomerus 36.52562 26.4311472 0.1330671 1.0487722
Leptodactylus riveroi 36.66225 35.2499035 0.1332207 1.2396965
Leptodactylus silvanimbus 36.53498 20.1309761 0.1307332 0.7513414
Leptodactylus rugosus 36.46688 29.9879909 0.1319459 1.1369092
Leptodactylus sabanensis 36.53384 25.4411414 0.1307931 0.9718616
Leptodactylus savagei 36.53853 29.9965660 0.1326507 1.1094368
Leptodactylus sertanejo 36.46835 19.4521157 0.1308334 0.7249981
Leptodactylus tapiti 36.57346 20.3920147 0.1300997 0.7666681
Leptodactylus turimiquensis 36.55808 32.6062338 0.1338481 1.2156383
Leptodactylus vastus 36.56575 29.4784507 0.1303024 1.0949815
Leptodactylus viridis 36.59207 28.5884327 0.1315597 1.1228650
Leptodactylus syphax 36.32011 23.8139313 0.1302545 0.8818460
Celsiella revocata 33.59445 30.2473216 0.1319174 1.1203549
Celsiella vozmedianoi 33.57724 34.0007747 0.1340820 1.2507006
Hyalinobatrachium aureoguttatum 33.75471 34.9245864 0.1314458 1.3696993
Hyalinobatrachium valerioi 33.70486 28.4329683 0.1316411 1.1305481
Hyalinobatrachium talamancae 33.76946 22.7034810 0.1312049 1.0083848
Hyalinobatrachium chirripoi 33.74315 34.0922573 0.1298248 1.3184243
Hyalinobatrachium colymbiphyllum 33.66930 38.3861401 0.1356566 1.4758901
Hyalinobatrachium pellucidum 33.71843 24.2402472 0.1323760 1.0559132
Hyalinobatrachium cappellei 33.70430 32.5999234 0.1331762 1.1679981
Hyalinobatrachium taylori 33.71546 32.8023305 0.1315167 1.2125471
Hyalinobatrachium iaspidiense 33.82644 35.3569542 0.1300873 1.2610273
Hyalinobatrachium fleischmanni 33.67869 27.8809743 0.1334762 1.0533266
Hyalinobatrachium tatayoi 33.71788 31.2067637 0.1314051 1.1992357
Hyalinobatrachium duranti 33.75107 29.5262997 0.1312392 1.1216104
Hyalinobatrachium ibama 33.74308 25.3915557 0.1305276 1.0573921
Hyalinobatrachium pallidum 33.70107 29.8096139 0.1313788 1.1082223
Hyalinobatrachium fragile 33.72649 31.6683085 0.1326616 1.1715144
Hyalinobatrachium orientale 33.65906 42.3936855 0.1332026 1.5763922
Hyalinobatrachium esmeralda 33.70004 21.9109343 0.1329656 0.9659856
Hyalinobatrachium guairarepanense 33.76369 33.2854090 0.1296200 1.2497908
Hyalinobatrachium vireovittatum 33.67809 39.1076646 0.1335969 1.4941840
Centrolene acanthidiocephalum 33.56235 31.0213760 0.1289939 1.2577944
Centrolene antioquiense 33.52348 24.0636861 0.1292905 1.0163093
Centrolene azulae 33.48108 33.0360028 0.1333791 1.3986593
Centrolene ballux 33.51296 11.5281489 0.1291011 0.5603604
Centrolene buckleyi 34.04653 14.4738132 0.1296972 0.6655512
Centrolene condor 33.53394 25.4278217 0.1315202 1.0185657
Centrolene heloderma 33.56788 17.8731470 0.1299826 0.7749041
Centrolene hybrida 33.51465 26.3560149 0.1333397 1.0941952
Centrolene lemniscatum 33.53547 16.0569976 0.1311840 0.7781381
Centrolene lynchi 33.55699 8.8729783 0.1333436 0.4422597
Centrolene medemi 33.57195 31.5485991 0.1335595 1.2830998
Centrolene muelleri 33.52655 20.8804870 0.1345394 0.9617397
Centrolene paezorum 34.04636 19.0990298 0.1301078 0.8295609
Centrolene petrophilum 33.39959 18.7257594 0.1327058 0.8255692
Centrolene quindianum 33.45856 18.5789911 0.1321669 0.8454177
Centrolene robledoi 33.50243 25.5310536 0.1332775 1.0741351
Centrolene sanchezi 33.51600 24.1393106 0.1324069 0.9965511
Centrolene savagei 33.55084 25.6710013 0.1334923 1.0850944
Centrolene solitaria 33.53706 23.9737663 0.1335561 0.9586484
Centrolene venezuelense 34.01799 24.9621253 0.1303068 0.9532852
Cochranella duidaeana 33.95681 31.8392833 0.1319011 1.2242865
Cochranella euhystrix 33.46035 40.0444288 0.1345661 1.6349650
Cochranella euknemos 33.43706 32.9860585 0.1352981 1.2155807
Cochranella geijskesi 33.53152 28.4736682 0.1312317 1.0220581
Cochranella granulosa 33.52127 33.8827171 0.1333937 1.2654572
Cochranella litoralis 33.98621 26.9844058 0.1331085 1.1158439
Cochranella mache 33.54007 30.9934531 0.1342575 1.2394563
Cochranella nola 33.57136 24.1292901 0.1305334 1.1756881
Cochranella phryxa 33.99242 29.0584477 0.1316217 1.3598975
Cochranella ramirezi 33.53914 32.4230110 0.1281267 1.2058125
Cochranella resplendens 34.00929 27.5751301 0.1313065 1.1215230
Cochranella riveroi 33.96465 34.4720388 0.1313320 1.2707465
Cochranella xanthocheridia 33.51965 31.0082225 0.1304633 1.1766791
Espadarana andina 32.93952 22.1287174 0.1337244 0.8789090
Nymphargus anomalus 33.57746 14.7545104 0.1301123 0.6368559
Nymphargus armatus 33.56525 33.9568255 0.1311198 1.4068493
Nymphargus bejaranoi 34.00337 18.8823229 0.1302266 1.0158312
Nymphargus buenaventura 33.58370 16.6931279 0.1290615 0.6889654
Nymphargus cariticommatus 33.56190 22.5395739 0.1315369 0.9446151
Nymphargus chami 34.15276 29.7998923 0.1291957 1.1325691
Nymphargus chancas 33.64313 30.9300213 0.1294515 1.2701655
Nymphargus cochranae 33.59961 18.4562212 0.1295591 0.8016269
Nymphargus cristinae 34.03662 32.8586582 0.1295367 1.2437920
Nymphargus garciae 33.99754 22.7226207 0.1303345 0.9667561
Nymphargus grandisonae 34.09310 23.0020416 0.1316130 0.9606836
Nymphargus griffithsi 34.02555 22.3764741 0.1337472 0.9360996
Nymphargus ignotus 34.02742 34.0692113 0.1306729 1.3400367
Nymphargus laurae 34.08030 20.2859901 0.1307589 0.8494245
Nymphargus luminosus 34.04031 35.8204327 0.1311932 1.3546895
Nymphargus luteopunctatus 34.06061 25.0695188 0.1302325 1.0287332
Nymphargus mariae 34.03570 21.8423626 0.1294726 0.9187595
Nymphargus mixomaculatus 33.63044 8.3937700 0.1296293 0.5285483
Nymphargus nephelophila 33.57627 32.2929450 0.1335325 1.2512676
Nymphargus ocellatus 34.01167 21.6039355 0.1313471 1.0104324
Nymphargus oreonympha 33.94544 31.4195653 0.1329938 1.2122743
Nymphargus phenax 33.98207 16.6999489 0.1348004 1.0697550
Nymphargus pluvialis 33.58883 13.5383549 0.1304636 0.7525625
Nymphargus posadae 33.96597 22.3316210 0.1312346 0.9521315
Nymphargus prasinus 34.10865 28.3088928 0.1314722 1.1354919
Nymphargus rosada 34.05368 23.6030944 0.1322461 1.0146644
Nymphargus ruizi 34.06113 28.1315625 0.1293330 1.1463311
Nymphargus siren 34.07226 23.0414835 0.1329945 0.9853339
Nymphargus spilotus 34.04584 26.8981304 0.1309198 1.1637275
Nymphargus vicenteruedai 33.63274 21.6648934 0.1297451 0.9580684
Nymphargus wileyi 33.61895 21.2219849 0.1307580 0.8858312
Rulyrana adiazeta 33.54789 27.1227342 0.1323136 1.1106908
Rulyrana flavopunctata 33.57823 24.5788701 0.1327662 0.9984697
Rulyrana mcdiarmidi 33.58246 24.1208738 0.1325285 1.0172382
Rulyrana saxiscandens 33.55754 34.5779275 0.1316568 1.4227051
Rulyrana spiculata 33.55302 20.3113832 0.1316330 1.0587415
Rulyrana susatamai 33.52427 23.9128699 0.1318612 0.9951632
Sachatamia albomaculata 33.59582 32.8936200 0.1313854 1.2408345
Sachatamia punctulata 33.53492 26.1877340 0.1298624 1.0786850
Sachatamia ilex 33.54502 34.0039896 0.1337593 1.2889473
Sachatamia orejuela 33.52034 23.2957129 0.1316319 0.9675690
Teratohyla adenocheira 33.52901 30.4338026 0.1318884 1.0677716
Teratohyla midas 34.03799 33.4719206 0.1304343 1.2000599
Teratohyla spinosa 33.48893 29.0493603 0.1316793 1.1163530
Teratohyla amelie 33.99686 26.0830798 0.1322524 1.1530136
Teratohyla pulverata 34.05080 33.4100301 0.1313171 1.2614253
Vitreorana antisthenesi 33.97020 29.7596738 0.1321794 1.0929259
Vitreorana castroviejoi 34.00469 40.3900527 0.1322055 1.5149458
Vitreorana eurygnatha 34.05657 18.6423756 0.1313641 0.7241542
Vitreorana gorzulae 33.95219 27.5287611 0.1305876 1.0498714
Vitreorana helenae 33.95521 27.3819766 0.1316355 1.0506371
Vitreorana parvula 33.60416 14.4410698 0.1298535 0.5826125
Vitreorana uranoscopa 33.97157 17.8931107 0.1318042 0.6940331
Ikakogi tayrona 33.68114 25.2362574 0.1319845 0.9270119
Allophryne ruthveni 34.86452 39.3270059 0.1313495 1.4095369
Nasikabatrachus sahyadrensis 34.82301 54.9376927 0.1378779 1.9800722
Sooglossus thomasseti 33.04035 83.6734624 0.1439995 3.1109872
Sooglossus sechellensis 33.67137 68.0749385 0.1399717 2.5311973
Sechellophryne pipilodryas 33.71747 82.2796604 0.1368449 3.0595760
Sechellophryne gardineri 33.72120 81.5350018 0.1395661 3.0334675
Hemisus barotseensis 35.79353 28.1055685 0.1359514 1.1211405
Hemisus microscaphus 35.73402 38.1810443 0.1380210 1.7537569
Hemisus marmoratus 35.71051 35.0837494 0.1371161 1.3614321
Hemisus perreti 35.72752 39.5264331 0.1361005 1.4033935
Hemisus guineensis 35.79207 34.9421450 0.1358858 1.3594011
Hemisus guttatus 35.67424 27.2605956 0.1354178 1.1876249
Hemisus olivaceus 35.65563 43.1094499 0.1397306 1.6219021
Hemisus wittei 35.75737 33.9785588 0.1348518 1.3988209
Hemisus brachydactylus 35.73151 33.6910987 0.1370942 1.4733160
Balebreviceps hillmani 34.70304 34.9789873 0.1380883 1.7282497
Callulina dawida 34.75004 50.5295266 0.1380835 2.0607378
Callulina kanga 34.66336 35.5990381 0.1371881 1.5299259
Callulina laphami 34.64254 39.4392598 0.1374285 1.7119877
Callulina shengena 34.57035 39.3099916 0.1381138 1.6642275
Callulina hanseni 34.60071 44.1097703 0.1380014 1.8193115
Callulina meteora 34.70775 45.3761590 0.1362309 1.8713381
Callulina kisiwamsitu 34.67543 62.3819675 0.1370054 2.4871144
Callulina kreffti 34.84795 41.4880151 0.1345883 1.7146473
Callulina stanleyi 34.71140 37.7826305 0.1362243 1.6049301
Spelaeophryne methneri 35.73386 39.5177068 0.1367333 1.6320828
Probreviceps durirostris 34.83201 33.7202110 0.1360786 1.4322101
Probreviceps rungwensis 34.73775 36.3813624 0.1371007 1.5966054
Probreviceps loveridgei 34.78774 34.6554621 0.1353526 1.4713924
Probreviceps macrodactylus 34.76842 45.7511136 0.1382357 1.8719997
Probreviceps uluguruensis 34.80866 48.4917600 0.1367397 1.9903792
Probreviceps rhodesianus 34.78480 28.7997779 0.1345239 1.1779153
Breviceps acutirostris 35.67384 21.9471107 0.1355879 1.0569648
Breviceps adspersus 35.71574 24.5137172 0.1407068 1.0392960
Breviceps gibbosus 35.86239 18.1486407 0.1347297 0.8642603
Breviceps fichus 35.85923 36.7440927 0.1369120 1.6152186
Breviceps mossambicus 35.81952 34.7057860 0.1361835 1.4061223
Breviceps rosei 35.78204 21.7085581 0.1393421 1.0448792
Breviceps bagginsi 35.81801 28.1614249 0.1357996 1.2416005
Breviceps sopranus 35.80348 28.7132304 0.1367409 1.1947798
Breviceps macrops 35.85938 28.2495325 0.1358909 1.4231804
Breviceps namaquensis 35.84358 23.9618268 0.1344599 1.1664561
Breviceps fuscus 35.83721 19.6559430 0.1373618 0.9183382
Breviceps montanus 35.85552 21.4474881 0.1350397 1.0206009
Breviceps verrucosus 35.80662 24.8357444 0.1374861 1.1216026
Breviceps poweri 35.76370 34.0141292 0.1368826 1.3754296
Breviceps sylvestris 35.76447 26.3794311 0.1358075 1.1154490
Acanthixalus sonjae 36.59167 51.6181482 0.1332141 1.8607160
Acanthixalus spinosus 36.63873 42.8472917 0.1326268 1.5507902
Kassina arboricola 36.92329 51.2763592 0.1330270 1.8497572
Kassina cassinoides 36.93828 33.6974302 0.1336074 1.2163902
Kassina cochranae 36.55626 40.4177593 0.1342822 1.4582999
Kassina decorata 37.01313 39.4138639 0.1332270 1.4822666
Kassina fusca 36.66873 34.0030871 0.1323139 1.2166450
Kassina jozani 36.60006 57.3365910 0.1338105 2.2146759
Kassina kuvangensis 36.85133 24.2587229 0.1359604 1.0037801
Kassina lamottei 36.63582 43.6421448 0.1327194 1.5751488
Kassina maculata 36.66236 31.1939014 0.1332083 1.2159382
Kassina maculifer 36.77888 36.5449612 0.1314430 1.4889781
Kassina maculosa 36.75993 37.0685627 0.1317801 1.3728386
Kassina senegalensis 36.64983 28.4550247 0.1344795 1.1121046
Kassina mertensi 36.71940 35.9751835 0.1358149 1.3523890
Kassina schioetzi 36.66120 42.9768777 0.1323849 1.5420220
Kassina somalica 36.65806 38.0314115 0.1356341 1.5627796
Kassina wazae 36.88812 30.5817810 0.1338199 1.0977716
Phlyctimantis boulengeri 36.57775 52.1815435 0.1307973 1.8987014
Phlyctimantis keithae 36.52227 30.0272046 0.1329033 1.3811358
Phlyctimantis leonardi 36.46806 40.3148878 0.1323268 1.4370516
Phlyctimantis verrucosus 36.42668 42.2882514 0.1339175 1.6170789
Semnodactylus wealii 36.67494 20.4800166 0.1342323 0.9417606
Afrixalus aureus 36.87966 26.0274986 0.1337013 1.0531562
Afrixalus clarkei 36.97334 26.4535463 0.1316232 1.1509294
Afrixalus delicatus 36.92683 30.8919211 0.1327453 1.2225539
Afrixalus stuhlmanni 36.88507 34.0315162 0.1373384 1.3592707
Afrixalus dorsalis 36.95161 46.4584725 0.1329001 1.6791809
Afrixalus paradorsalis 36.87952 43.4832250 0.1336730 1.5974380
Afrixalus dorsimaculatus 36.81169 50.0531289 0.1335487 1.9974560
Afrixalus enseticola 36.87780 28.8333460 0.1344113 1.3906403
Afrixalus equatorialis 36.89360 38.2090696 0.1344354 1.3533810
Afrixalus fornasini 36.84030 31.4144325 0.1335014 1.2394150
Afrixalus fulvovittatus 36.87776 40.9448976 0.1362940 1.4791173
Afrixalus knysnae 36.87086 16.9037395 0.1345712 0.7834226
Afrixalus lacteus 36.75401 42.3237598 0.1344446 1.5876983
Afrixalus laevis 36.87310 39.7353481 0.1344759 1.4561906
Afrixalus leucostictus 36.98109 36.2132589 0.1323208 1.3586509
Afrixalus lindholmi 36.77158 43.7091365 0.1331304 1.5765322
Afrixalus morerei 36.88745 30.4586180 0.1294019 1.3169145
Afrixalus nigeriensis 36.93278 46.8940709 0.1325526 1.6853257
Afrixalus orophilus 36.97633 35.3719266 0.1310591 1.5270030
Afrixalus osorioi 36.96926 33.7594059 0.1329192 1.2395072
Afrixalus quadrivittatus 36.97393 36.8536233 0.1313655 1.3939420
Afrixalus schneideri 37.00360 54.7395402 0.1321463 2.0118218
Afrixalus septentrionalis 36.98934 34.5778330 0.1341833 1.4624006
Afrixalus spinifrons 36.86668 24.6355575 0.1325143 1.1063868
Afrixalus sylvaticus 36.91101 48.1453431 0.1327800 1.8936222
Afrixalus uluguruensis 36.89942 26.5868095 0.1323810 1.1729433
Afrixalus upembae 36.81538 30.3006397 0.1328588 1.2064739
Afrixalus vibekensis 36.97691 51.3753933 0.1315131 1.8489759
Afrixalus vittiger 36.92826 39.8456384 0.1333688 1.4292342
Afrixalus weidholzi 36.87074 33.6502442 0.1309985 1.2160403
Afrixalus wittei 36.97494 27.0587155 0.1315661 1.1025384
Heterixalus alboguttatus 36.89993 36.5530817 0.1308601 1.4289955
Heterixalus boettgeri 36.91633 35.7400913 0.1310560 1.3945025
Heterixalus madagascariensis 36.84144 33.2464547 0.1328767 1.2798283
Heterixalus punctatus 36.82754 33.0636293 0.1338707 1.2732622
Heterixalus andrakata 36.83661 32.5684942 0.1334174 1.2376404
Heterixalus tricolor 36.82486 29.7015053 0.1312809 1.0795702
Heterixalus variabilis 36.82993 38.9416906 0.1324176 1.4394919
Heterixalus betsileo 36.78709 38.7217657 0.1318456 1.5055508
Heterixalus carbonei 36.79538 46.9468559 0.1361661 1.7325497
Heterixalus luteostriatus 36.78368 37.4047677 0.1364461 1.3961464
Heterixalus rutenbergi 36.85479 36.7847091 0.1343548 1.4286546
Tachycnemis seychellensis 36.82922 69.6320926 0.1341037 2.5901278
Alexteroon hypsiphonus 36.51623 36.6826332 0.1372875 1.3306723
Alexteroon jynx 36.48939 48.3296902 0.1361137 1.7774334
Alexteroon obstetricans 36.66812 36.8782542 0.1340075 1.3494611
Hyperolius acuticeps 37.20839 26.7615240 0.1302870 1.1306801
Hyperolius howelli 37.17460 25.1406250 0.1326657 1.1545143
Hyperolius friedemanni 37.09227 25.5797656 0.1336246 1.1029649
Hyperolius adspersus 37.11112 36.2757874 0.1335238 1.3092144
Hyperolius dartevellei 37.15889 33.5203643 0.1325556 1.2431798
Hyperolius acutirostris 37.04827 41.4797791 0.1336428 1.5451002
Hyperolius ademetzi 37.08702 39.9750483 0.1356038 1.4992230
Hyperolius discodactylus 37.06743 30.6180643 0.1325390 1.3050701
Hyperolius lateralis 37.09088 32.9684231 0.1322550 1.3957749
Hyperolius nitidulus 37.12084 31.5760113 0.1347930 1.1468582
Hyperolius tuberculatus 37.15207 38.6811566 0.1324808 1.4074033
Hyperolius argus 37.09790 28.5866001 0.1317531 1.1119825
Hyperolius atrigularis 37.14824 30.0146661 0.1320260 1.2825263
Hyperolius balfouri 37.12298 30.9961706 0.1315891 1.1786176
Hyperolius baumanni 37.16273 50.4793880 0.1359916 1.7686657
Hyperolius sylvaticus 37.24995 46.4208469 0.1334469 1.6677847
Hyperolius bobirensis 37.23257 50.3195501 0.1326316 1.8167042
Hyperolius picturatus 37.14442 44.9103898 0.1329717 1.6192554
Hyperolius benguellensis 37.13080 21.6765669 0.1329131 0.8796280
Hyperolius nasutus 37.16213 19.0618130 0.1331124 0.7718556
Hyperolius inyangae 37.15150 21.8313699 0.1338025 0.9119184
Hyperolius bicolor 37.04217 24.4663071 0.1330079 0.9045241
Hyperolius bolifambae 37.14400 41.4498288 0.1338595 1.5394893
Hyperolius bopeleti 37.23821 42.6233535 0.1320311 1.5794913
Hyperolius brachiofasciatus 37.11994 36.1390433 0.1337665 1.3302401
Hyperolius camerunensis 37.10153 40.8064678 0.1348237 1.5394260
Hyperolius castaneus 37.21255 35.6747452 0.1331962 1.5257446
Hyperolius frontalis 37.20947 29.7881459 0.1307263 1.2509582
Hyperolius cystocandicans 37.11323 25.8480382 0.1332789 1.2022076
Hyperolius cinereus 37.07079 21.2551491 0.1334424 0.8866154
Hyperolius chlorosteus 37.13837 45.0978504 0.1309040 1.6302424
Hyperolius laurenti 37.14118 49.3463233 0.1298524 1.7657596
Hyperolius torrentis 37.05693 38.7627412 0.1322748 1.3684802
Hyperolius chrysogaster 36.99037 35.2199681 0.1342530 1.4781501
Hyperolius cinnamomeoventris 37.01104 35.8652476 0.1361989 1.3478353
Hyperolius veithi 37.02626 38.3697817 0.1339644 1.3513444
Hyperolius molleri 37.04655 55.1433132 0.1347808 2.0275973
Hyperolius thomensis 37.04479 59.7003757 0.1339741 2.2011949
Hyperolius concolor 37.05386 38.2448373 0.1336048 1.3753955
Hyperolius zonatus 37.42831 49.1566544 0.1336381 1.7730883
Hyperolius constellatus 37.19017 32.2382159 0.1299481 1.3523748
Hyperolius diaphanus 37.16198 28.0784389 0.1348398 1.1212139
Hyperolius dintelmanni 37.22202 47.7595794 0.1318838 1.7552411
Hyperolius endjami 37.08282 38.8596878 0.1321272 1.4589627
Hyperolius fasciatus 37.10187 22.9221690 0.1347153 0.8563173
Hyperolius ferreirai 37.22861 22.7555719 0.1313046 0.8510682
Hyperolius ferrugineus 37.12408 32.3423936 0.1327786 1.2806211
Hyperolius fuscigula 37.13353 23.9311252 0.1337892 0.9104172
Hyperolius fusciventris 37.04878 42.3574443 0.1348227 1.5271737
Hyperolius guttulatus 37.04218 45.6707179 0.1332727 1.6472699
Hyperolius ghesquieri 37.07555 35.8831805 0.1327243 1.2653708
Hyperolius glandicolor 37.09721 28.6897062 0.1317361 1.2190091
Hyperolius phantasticus 37.05302 40.1539645 0.1342843 1.4372641
Hyperolius gularis 37.10746 25.0165020 0.1333334 0.9153504
Hyperolius horstockii 36.95791 18.4117432 0.1338018 0.8701121
Hyperolius hutsebauti 37.19428 36.1338365 0.1335588 1.3697089
Hyperolius igbettensis 37.02939 37.8218924 0.1320159 1.3660902
Hyperolius jacobseni 37.00830 36.5365899 0.1332200 1.3197883
Hyperolius poweri 36.98934 25.9749326 0.1341923 1.1241137
Hyperolius inornatus 37.10337 27.4322545 0.1342523 0.9669384
Hyperolius jackie 37.18467 38.8903984 0.1308117 1.7741277
Hyperolius kachalolae 37.11521 22.8710500 0.1308082 0.9408278
Hyperolius kibarae 37.21616 27.1329821 0.1333360 1.0801941
Hyperolius kihangensis 37.09734 25.7794961 0.1335530 1.1868824
Hyperolius kivuensis 37.11825 26.7064848 0.1322865 1.1003553
Hyperolius quinquevittatus 37.14174 24.6900194 0.1337519 1.0053623
Hyperolius kuligae 37.04199 34.0136622 0.1357450 1.2868506
Hyperolius lamottei 37.06951 35.5469343 0.1330998 1.2889961
Hyperolius langi 37.09406 33.1234364 0.1316785 1.3068738
Hyperolius leleupi 37.14278 30.6418754 0.1325603 1.2797770
Hyperolius leucotaenius 37.11100 31.5327635 0.1349557 1.2899584
Hyperolius lupiroensis 37.11219 31.2359963 0.1303869 1.3130102
Hyperolius major 37.20603 23.1980220 0.1324220 0.9365792
Hyperolius marginatus 37.06968 23.8452650 0.1322992 0.9644378
Hyperolius mariae 37.04839 38.3615497 0.1327230 1.5359404
Hyperolius minutissimus 37.12965 25.5269025 0.1329595 1.1265217
Hyperolius spinigularis 37.07535 25.5826312 0.1349440 0.9902846
Hyperolius tanneri 37.21578 51.1266794 0.1331288 2.0361249
Hyperolius mitchelli 37.19978 28.5248607 0.1371942 1.1262108
Hyperolius puncticulatus 37.14804 48.4951518 0.1349791 1.8937846
Hyperolius substriatus 37.18365 28.3740023 0.1339130 1.1424449
Hyperolius montanus 37.08714 24.7072587 0.1345370 1.1646426
Hyperolius mosaicus 37.14728 38.0688182 0.1336485 1.4060675
Hyperolius ocellatus 37.22244 34.8070411 0.1338864 1.2685641
Hyperolius nasicus 37.07904 23.9717635 0.1331329 0.9884722
Hyperolius nienokouensis 37.10543 57.5502939 0.1342489 2.0803883
Hyperolius nimbae 37.08105 41.9799488 0.1340824 1.5193183
Hyperolius obscurus 37.16807 27.5998814 0.1353737 1.0760335
Hyperolius occidentalis 37.11388 33.9909732 0.1327641 1.2390530
Hyperolius parallelus 37.09793 26.3611564 0.1318480 1.0267848
Hyperolius pardalis 37.08399 37.1306491 0.1309046 1.3574560
Hyperolius parkeri 36.99542 34.7423600 0.1356012 1.3321870
Hyperolius pickersgilli 37.04100 24.9530483 0.1330992 1.0859663
Hyperolius pictus 37.15723 29.8731464 0.1337286 1.3287661
Hyperolius platyceps 37.07444 37.6256578 0.1351567 1.3585695
Hyperolius polli 37.12413 34.6891859 0.1346818 1.2416524
Hyperolius polystictus 37.13361 24.1817852 0.1344665 0.9885255
Hyperolius pseudargus 37.04068 27.9907804 0.1320108 1.2321190
Hyperolius pusillus 37.00136 29.8554637 0.1335966 1.1848987
Hyperolius pustulifer 37.09632 38.4558151 0.1337551 1.7541904
Hyperolius pyrrhodictyon 37.07787 22.4168520 0.1317420 0.9144053
Hyperolius quadratomaculatus 37.12622 31.7643569 0.1334512 1.1996302
Hyperolius rhizophilus 37.14197 28.1973481 0.1316782 0.9741723
Hyperolius rhodesianus 37.01844 23.9714812 0.1332680 0.9850147
Hyperolius riggenbachi 37.08023 34.6109296 0.1325592 1.3061640
Hyperolius robustus 37.20032 35.0136120 0.1330028 1.2345266
Hyperolius rubrovermiculatus 37.04952 46.4456919 0.1321302 1.8229297
Hyperolius rwandae 37.14905 32.2732942 0.1332528 1.4440311
Hyperolius sankuruensis 37.18702 30.6700271 0.1328842 1.0899661
Hyperolius schoutedeni 37.16605 39.5515944 0.1340367 1.4334885
Hyperolius semidiscus 37.11475 19.1482232 0.1344652 0.8522129
Hyperolius sheldricki 37.11562 46.9758262 0.1329719 1.8930729
Hyperolius soror 37.11635 36.9509027 0.1308565 1.3334898
Hyperolius steindachneri 37.09007 24.9440468 0.1340476 0.9886350
Hyperolius stenodactylus 37.16103 41.4375658 0.1325815 1.5416645
Hyperolius swynnertoni 37.21241 24.3473246 0.1341434 0.9608220
Hyperolius vilhenai 37.19931 28.0334711 0.1363334 1.0869691
Hyperolius viridigulosus 37.15034 57.9730729 0.1321200 2.1030127
Hyperolius viridis 37.16559 25.5809335 0.1331469 1.1342291
Hyperolius watsonae 37.13228 57.2129916 0.1354533 2.2465329
Hyperolius xenorhinus 37.16636 31.3080580 0.1329212 1.2396781
Kassinula wittei 37.03875 24.1916716 0.1335150 0.9954662
Morerella cyanophthalma 36.53373 68.2890338 0.1340592 2.4969336
Arlequinus krebsi 36.86743 44.5161434 0.1348209 1.6842174
Callixalus pictus 36.89619 34.2582818 0.1325987 1.4141995
Chrysobatrachus cupreonitens 37.03148 30.3785095 0.1328967 1.2302892
Opisthothylax immaculatus 36.84972 36.8736589 0.1348565 1.3354770
Paracassina kounhiensis 36.86362 29.0154492 0.1307108 1.4213177
Paracassina obscura 36.84252 26.1485867 0.1351887 1.1929484
Cryptothylax greshoffii 35.97842 42.2161510 0.1362011 1.5062205
Cryptothylax minutus 36.05622 47.4308070 0.1345187 1.6729987
Arthroleptis adelphus 35.44509 43.6712739 0.1353371 1.5986619
Arthroleptis bioko 35.50142 66.8759475 0.1327832 2.5317331
Arthroleptis brevipes 35.42441 58.6844775 0.1348888 2.0574517
Arthroleptis poecilonotus 35.44303 51.4447934 0.1346504 1.8673845
Arthroleptis crusculum 35.35360 38.7178173 0.1345585 1.3963767
Arthroleptis nimbaensis 35.37514 49.4693622 0.1348608 1.7903410
Arthroleptis langeri 35.36851 57.6664391 0.1352291 2.0935717
Arthroleptis adolfifriederici 35.45880 39.8070681 0.1328052 1.7601885
Arthroleptis krokosua 35.41069 53.3101296 0.1347926 1.9176950
Arthroleptis palava 35.47704 45.0675651 0.1337666 1.6968296
Arthroleptis variabilis 35.41354 47.0911673 0.1343272 1.7140183
Arthroleptis perreti 35.41894 62.8287039 0.1359034 2.3164573
Arthroleptis affinis 35.58132 41.9487389 0.1323463 1.7767102
Arthroleptis nikeae 35.45062 29.9811961 0.1352302 1.2929058
Arthroleptis reichei 35.46057 33.4097969 0.1317544 1.4618724
Arthroleptis anotis 35.41907 42.0368611 0.1365440 1.7848029
Arthroleptis aureoli 34.61850 38.5634027 0.1368513 1.3961423
Arthroleptis formosus 35.21415 32.0619002 0.1346854 1.1446549
Arthroleptis sylvaticus 35.41208 46.4684848 0.1375806 1.6855270
Arthroleptis taeniatus 35.38621 47.1515065 0.1321313 1.7139675
Arthroleptis bivittatus 35.47882 49.2662984 0.1341733 1.7862302
Arthroleptis carquejai 35.31685 32.3425615 0.1372072 1.2710286
Arthroleptis stenodactylus 35.44277 33.4836101 0.1341497 1.3559660
Arthroleptis fichika 35.43384 54.3346514 0.1344582 2.1642669
Arthroleptis kidogo 35.45445 45.8928626 0.1368365 1.8931530
Arthroleptis xenochirus 35.60829 29.7207050 0.1318225 1.2160053
Arthroleptis francei 35.45409 33.8662338 0.1344485 1.2978256
Arthroleptis wahlbergii 35.31783 30.6407343 0.1371571 1.3365790
Arthroleptis hematogaster 35.34148 41.8488401 0.1354049 1.7246176
Arthroleptis kutogundua 35.39726 37.0435684 0.1373625 1.7106303
Arthroleptis lameerei 35.47645 30.4605973 0.1340168 1.2033221
Arthroleptis lonnbergi 35.45212 52.6671987 0.1336510 2.1229409
Arthroleptis tanneri 35.44242 60.1893114 0.1334142 2.3997313
Arthroleptis loveridgei 35.33380 47.1018388 0.1387237 1.7958469
Arthroleptis mossoensis 35.42962 50.6616787 0.1349511 2.1637481
Arthroleptis nguruensis 35.54869 43.2581117 0.1350916 1.7843481
Arthroleptis nlonakoensis 35.34690 49.7179677 0.1360804 1.8828371
Arthroleptis phrynoides 35.39094 41.1410074 0.1338236 1.4725384
Arthroleptis pyrrhoscelis 35.41522 39.8516716 0.1341749 1.6664317
Arthroleptis schubotzi 35.45087 43.8260803 0.1341352 1.8925030
Arthroleptis xenodactyloides 35.49078 32.6466562 0.1360625 1.3127458
Arthroleptis xenodactylus 35.42790 58.2748801 0.1356460 2.3224174
Arthroleptis spinalis 35.47819 56.0243514 0.1358391 2.3879873
Arthroleptis stridens 35.37645 62.8625785 0.1348653 2.5082058
Arthroleptis troglodytes 35.39370 29.5932915 0.1339139 1.1555920
Arthroleptis tuberosus 35.27564 50.1102237 0.1376250 1.8262309
Arthroleptis vercammeni 35.35276 36.0094898 0.1350865 1.4654786
Arthroleptis zimmeri 35.34958 74.7589094 0.1356053 2.7452890
Cardioglossa alsco 34.83491 41.5196838 0.1348409 1.5855757
Cardioglossa nigromaculata 35.47592 53.5616641 0.1352480 1.9847200
Cardioglossa cyaneospila 34.77455 38.5675579 0.1376159 1.7030297
Cardioglossa gratiosa 34.81474 44.8539841 0.1350119 1.6211896
Cardioglossa elegans 34.83243 49.9842402 0.1353782 1.8323498
Cardioglossa leucomystax 34.87616 42.3037531 0.1346551 1.5352075
Cardioglossa trifasciata 34.81293 55.9375011 0.1360942 2.0640396
Cardioglossa escalerae 35.39084 48.0559523 0.1370707 1.7758605
Cardioglossa manengouba 34.86353 58.0268738 0.1319735 2.1391097
Cardioglossa oreas 34.74090 48.8500178 0.1350017 1.8638499
Cardioglossa pulchra 34.81289 48.9714422 0.1336167 1.8242696
Cardioglossa venusta 34.82891 54.6651784 0.1381922 2.0503487
Cardioglossa gracilis 34.76170 45.0312904 0.1341311 1.6372529
Cardioglossa melanogaster 34.73286 48.0583483 0.1316667 1.7905296
Cardioglossa schioetzi 35.32152 46.6348053 0.1342617 1.7289018
Astylosternus batesi 35.41696 42.7133211 0.1345081 1.5433531
Astylosternus schioetzi 34.87757 50.3310687 0.1317373 1.8714233
Astylosternus diadematus 34.77234 51.7016981 0.1349952 1.9324435
Astylosternus perreti 34.83057 51.2498588 0.1344841 1.9150933
Astylosternus rheophilus 34.78408 44.0995075 0.1345976 1.6584236
Astylosternus nganhanus 35.35185 42.6731303 0.1369280 1.6169060
Trichobatrachus robustus 34.76022 41.8068420 0.1348104 1.5230549
Astylosternus fallax 34.89950 54.5269762 0.1328839 2.0164494
Astylosternus laurenti 34.91213 60.7981082 0.1333397 2.2595122
Astylosternus montanus 34.80023 47.4606270 0.1337770 1.7977603
Astylosternus ranoides 35.35537 42.0872786 0.1358309 1.6074816
Astylosternus laticephalus 35.41386 63.2166875 0.1331742 2.2919013
Astylosternus occidentalis 35.38251 56.9697149 0.1348139 2.0600365
Nyctibates corrugatus 35.34812 55.4099510 0.1339744 2.0599851
Scotobleps gabonicus 34.63941 44.6696101 0.1338934 1.6155646
Leptodactylodon albiventris 34.73324 51.2113777 0.1360018 1.9112737
Leptodactylodon boulengeri 34.74019 54.0014680 0.1342259 2.0280771
Leptodactylodon erythrogaster 34.72139 61.0466991 0.1343134 2.2497241
Leptodactylodon stevarti 34.69303 45.5076221 0.1346618 1.6710015
Leptodactylodon axillaris 35.34713 47.7846643 0.1351260 1.8595532
Leptodactylodon perreti 34.77058 43.1199877 0.1319666 1.6443265
Leptodactylodon bueanus 34.77235 50.6638821 0.1350595 1.8616579
Leptodactylodon bicolor 34.70906 44.9349795 0.1371978 1.6858790
Leptodactylodon ornatus 34.75138 49.0389204 0.1346625 1.8425693
Leptodactylodon mertensi 34.79674 51.4047474 0.1343089 1.9311745
Leptodactylodon polyacanthus 34.73695 45.2340851 0.1356841 1.7077960
Leptodactylodon ovatus 34.77798 53.0121334 0.1355692 1.9771559
Leptodactylodon wildi 34.81806 58.3719268 0.1356830 2.1502111
Leptodactylodon blanci 34.80709 48.0698705 0.1345760 1.6934031
Leptodactylodon ventrimarmoratus 35.39303 50.7955064 0.1360034 1.8855970
Leptopelis anchietae 35.33692 26.0970784 0.1339190 1.0519754
Leptopelis lebeaui 35.20733 37.4180383 0.1337201 1.4457643
Leptopelis argenteus 35.36796 41.1194074 0.1348992 1.6137958
Leptopelis cynnamomeus 35.19029 31.1928692 0.1353020 1.2674787
Leptopelis ocellatus 35.34202 44.7326355 0.1354051 1.6036965
Leptopelis spiritusnoctis 35.25623 54.8154835 0.1342984 1.9723581
Leptopelis aubryi 35.23641 41.7507235 0.1348448 1.5049915
Leptopelis marginatus 35.12915 28.3185274 0.1356792 1.1708763
Leptopelis aubryioides 35.18851 49.4621260 0.1371899 1.8027921
Leptopelis susanae 34.74945 33.1423050 0.1347791 1.5471701
Leptopelis bequaerti 35.30443 49.5478670 0.1328800 1.7952586
Leptopelis uluguruensis 35.29125 39.7509814 0.1347431 1.6595445
Leptopelis bocagii 36.29791 28.9437515 0.1375596 1.2028930
Leptopelis concolor 35.18509 56.0239670 0.1371070 2.2312725
Leptopelis vermiculatus 35.21525 44.0110224 0.1347844 1.8638320
Leptopelis boulengeri 35.21635 45.3037840 0.1352856 1.6355120
Leptopelis brevipes 35.16872 61.9514295 0.1371247 2.3471631
Leptopelis notatus 35.15884 37.5015505 0.1341017 1.3607264
Leptopelis brevirostris 35.15957 45.4404293 0.1353211 1.6607520
Leptopelis palmatus 34.64935 78.1914566 0.1356026 2.8679039
Leptopelis mossambicus 35.17405 31.7063301 0.1345674 1.2591395
Leptopelis parvus 35.25764 32.6902303 0.1340289 1.3016617
Leptopelis rufus 35.23188 47.5318885 0.1341437 1.7222526
Leptopelis bufonides 36.46827 34.9138024 0.1307695 1.2562831
Leptopelis nordequatorialis 35.23494 40.1269088 0.1338758 1.5266810
Leptopelis christyi 35.18790 43.3785002 0.1344181 1.7648961
Leptopelis flavomaculatus 35.27317 36.7644281 0.1358658 1.4597566
Leptopelis calcaratus 35.24396 43.2271302 0.1364498 1.5724526
Leptopelis yaldeni 35.25580 28.1521411 0.1350419 1.2150077
Leptopelis crystallinoron 35.14362 42.7701573 0.1350355 1.5703362
Leptopelis parkeri 35.17442 43.1574371 0.1367748 1.7983179
Leptopelis fiziensis 35.08515 41.7390281 0.1349985 1.7089279
Leptopelis karissimbensis 35.10423 38.2903551 0.1363078 1.6929354
Leptopelis kivuensis 35.07224 44.3294631 0.1361227 1.9045315
Leptopelis millsoni 35.16738 48.7933937 0.1326765 1.7651200
Leptopelis fenestratus 35.21476 35.8616544 0.1351930 1.4208478
Leptopelis mackayi 35.21528 38.3828582 0.1367115 1.5540645
Leptopelis gramineus 36.38146 31.9276933 0.1356314 1.5561849
Leptopelis natalensis 35.27063 27.0454880 0.1329986 1.1960350
Leptopelis jordani 35.15965 34.7005486 0.1342382 1.3523121
Leptopelis occidentalis 35.13866 59.5489548 0.1329759 2.1486398
Leptopelis macrotis 34.73208 58.3336363 0.1365483 2.1050120
Leptopelis ragazzii 34.78849 33.9590528 0.1370239 1.6662951
Leptopelis modestus 34.76736 47.2415363 0.1367145 1.7781550
Leptopelis xenodactylus 35.17911 23.6620484 0.1369113 1.0770848
Leptopelis parbocagii 36.22020 32.6615331 0.1368041 1.3327823
Leptopelis viridis 35.09904 41.0938391 0.1364177 1.4888277
Leptopelis vannutellii 35.13280 34.8239581 0.1344651 1.5719258
Leptopelis zebra 35.16346 48.4944753 0.1360101 1.8088003
Leptopelis oryi 35.16424 38.7488035 0.1338467 1.4868343
Phrynomantis affinis 34.13351 26.6131851 0.1394993 1.0959718
Phrynomantis annectens 34.10403 20.4703732 0.1384481 0.9137037
Phrynomantis bifasciatus 34.09161 28.8523704 0.1419318 1.1905813
Phrynomantis microps 34.15308 35.2517758 0.1407385 1.2734795
Phrynomantis somalicus 34.13479 44.7301009 0.1411336 1.7377854
Hoplophryne rogersi 34.61374 46.2765196 0.1376124 1.8904587
Hoplophryne uluguruensis 34.65228 37.1060444 0.1389930 1.5415260
Parhoplophryne usambarica 34.88426 49.5893642 0.1370555 1.9790978
Adelastes hylonomos 36.10297 39.2847261 0.1377924 1.4084867
Arcovomer passarellii 36.22562 28.7459645 0.1346833 1.1151482
Elachistocleis ovalis 36.63905 22.2941958 0.1332599 0.8154826
Elachistocleis surinamensis 36.65243 27.4135324 0.1340948 1.0200209
Elachistocleis bumbameuboi 36.38913 35.2587509 0.1360326 1.2519301
Elachistocleis erythrogaster 37.31863 14.4438872 0.1359066 0.5804027
Elachistocleis carvalhoi 36.37817 33.0310856 0.1330727 1.1750865
Elachistocleis piauiensis 37.35115 27.8400148 0.1358138 1.0319189
Elachistocleis helianneae 36.36812 29.7595193 0.1333209 1.0438990
Elachistocleis pearsei 36.40749 34.5251777 0.1332881 1.2999779
Elachistocleis matogrosso 36.36281 23.7513823 0.1354273 0.8386752
Elachistocleis skotogaster 36.40853 14.5130728 0.1345493 0.6844652
Elachistocleis panamensis 36.37106 31.6862942 0.1332960 1.1791274
Elachistocleis surumu 36.37498 26.7021721 0.1345492 0.9887196
Gastrophryne olivacea 36.24391 11.8789410 0.1364330 0.4816355
Gastrophryne elegans 36.26468 21.6220531 0.1353152 0.8145452
Hypopachus barberi 36.20669 23.0881811 0.1350815 0.8851707
Hypopachus variolosus 36.27605 23.3299284 0.1374070 0.8868556
Hypopachus pictiventris 36.28144 29.2757396 0.1360199 1.1079126
Hamptophryne alios 36.27497 28.6462912 0.1354807 1.1508375
Stereocyclops histrio 36.21366 29.9751137 0.1363778 1.1786455
Stereocyclops parkeri 36.42693 20.2757840 0.1342884 0.7791642
Dasypops schirchi 35.78579 38.2476392 0.1354380 1.5051413
Myersiella microps 35.81668 27.8094659 0.1352932 1.0770361
Chiasmocleis cordeiroi 35.44969 27.6880722 0.1355253 1.0943920
Chiasmocleis crucis 35.42064 29.2248716 0.1366478 1.1525062
Chiasmocleis schubarti 35.41271 27.3568317 0.1367868 1.0665315
Chiasmocleis capixaba 35.40284 29.5757451 0.1353241 1.1604706
Chiasmocleis carvalhoi 35.32893 36.6592366 0.1374456 1.2708580
Chiasmocleis mehelyi 35.32001 24.6425743 0.1385155 0.8668989
Chiasmocleis albopunctata 35.38668 23.6245895 0.1364636 0.8545727
Chiasmocleis leucosticta 35.30664 17.4900391 0.1369009 0.6788107
Chiasmocleis mantiqueira 35.36454 18.0853389 0.1368406 0.7124682
Chiasmocleis centralis 36.39830 24.9103237 0.1383082 0.9049684
Chiasmocleis gnoma 35.40312 31.0378138 0.1399731 1.2167682
Chiasmocleis anatipes 35.38656 32.1626727 0.1378422 1.2495967
Chiasmocleis devriesi 35.40239 32.6090119 0.1371097 1.1144085
Chiasmocleis sapiranga 35.36375 28.6171432 0.1370152 1.1308372
Chiasmocleis atlantica 35.27940 20.8241722 0.1391891 0.8064832
Chiasmocleis avilapiresae 35.40653 35.1720427 0.1358403 1.2296575
Chiasmocleis shudikarensis 35.30627 36.3582983 0.1364380 1.2839830
Ctenophryne aequatorialis 35.25964 16.1765194 0.1388052 0.7018206
Ctenophryne carpish 35.36454 30.0858932 0.1347060 1.3253573
Ctenophryne aterrima 35.19703 34.1441397 0.1391114 1.3365610
Ctenophryne minor 35.19699 42.7893241 0.1393567 1.6606936
Ctenophryne barbatula 35.32390 20.3158678 0.1386453 0.9553269
Paradoxophyla palmata 35.29666 41.0287822 0.1399237 1.5937607
Paradoxophyla tiarano 34.33984 36.6103283 0.1394592 1.3605616
Scaphiophryne boribory 34.32502 28.6536912 0.1406592 1.1075828
Scaphiophryne madagascariensis 35.25543 34.7826030 0.1418875 1.3450212
Scaphiophryne menabensis 34.53743 41.6055877 0.1423899 1.5495280
Scaphiophryne marmorata 34.29899 35.9720318 0.1403543 1.4257548
Scaphiophryne gottlebei 35.29939 33.3574373 0.1398984 1.2736364
Scaphiophryne spinosa 34.29622 38.5136991 0.1405176 1.4931059
Scaphiophryne calcarata 34.41123 39.4282469 0.1386824 1.4839563
Scaphiophryne brevis 34.35354 36.1918298 0.1399173 1.3768605
Anodonthyla boulengerii 34.28335 34.4348646 0.1409215 1.3286724
Anodonthyla vallani 34.24426 37.5353419 0.1390983 1.4503303
Anodonthyla hutchisoni 34.24954 36.3078207 0.1389831 1.3520340
Anodonthyla moramora 34.28511 28.0168128 0.1391493 1.0808742
Anodonthyla nigrigularis 34.29802 38.4632165 0.1385915 1.4996147
Anodonthyla pollicaris 34.36713 35.5087435 0.1356396 1.4224756
Anodonthyla theoi 34.29026 38.0976429 0.1381298 1.4328998
Anodonthyla jeanbai 34.26787 41.4493393 0.1382044 1.6027590
Anodonthyla emilei 34.39653 32.8081054 0.1373680 1.2682875
Anodonthyla montana 34.31641 36.2178789 0.1402798 1.3742065
Anodonthyla rouxae 34.36214 39.4803407 0.1389056 1.5177742
Cophyla berara 34.21660 48.7574504 0.1387455 1.8098823
Cophyla occultans 34.15788 35.6644772 0.1402276 1.3349754
Cophyla phyllodactyla 34.22043 38.8720311 0.1400607 1.4486149
Rhombophryne minuta 35.35812 32.4289102 0.1387983 1.2273604
Plethodontohyla fonetana 34.30479 39.4300520 0.1399030 1.4418528
Plethodontohyla guentheri 34.38116 35.3969190 0.1419844 1.3339045
Plethodontohyla notosticta 34.18025 39.7140211 0.1420828 1.5217102
Plethodontohyla bipunctata 35.42609 42.9857626 0.1365352 1.6819134
Plethodontohyla tuberata 34.39289 33.5660931 0.1402885 1.3115953
Plethodontohyla brevipes 34.34467 35.4746950 0.1406144 1.3607687
Plethodontohyla ocellata 34.37605 37.5074540 0.1398365 1.4499865
Plethodontohyla inguinalis 34.14395 35.2123768 0.1420183 1.3566608
Plethodontohyla mihanika 34.33885 37.9065144 0.1375529 1.4802165
Rhombophryne laevipes 35.43492 34.4159494 0.1395258 1.3044559
Rhombophryne coudreaui 35.44866 34.1990564 0.1387013 1.2856744
Rhombophryne testudo 34.50153 34.7658519 0.1395498 1.2630148
Rhombophryne coronata 35.39954 37.9924997 0.1374460 1.4847747
Rhombophryne serratopalpebrosa 34.43301 36.6540548 0.1391830 1.3812968
Rhombophryne guentherpetersi 34.39779 32.8365144 0.1408160 1.2268019
Rhombophryne mangabensis 35.33623 30.1903939 0.1410622 1.1095828
Rhombophryne matavy 34.38392 50.3432108 0.1378488 1.8932153
Stumpffia analamaina 34.35181 30.2443705 0.1399739 1.1104830
Stumpffia be 34.32863 41.2747980 0.1403470 1.5281456
Stumpffia hara 34.43267 52.3442065 0.1386798 1.9648005
Stumpffia megsoni 34.32989 58.6050607 0.1405778 2.1992739
Stumpffia staffordi 34.35743 47.8540668 0.1389321 1.7947364
Stumpffia gimmeli 34.29132 35.0937290 0.1400087 1.3105731
Stumpffia psologlossa 34.23199 30.0003666 0.1400295 1.1296293
Stumpffia madagascariensis 34.41780 56.3201164 0.1368325 2.1145802
Stumpffia pygmaea 34.31829 35.4653276 0.1412816 1.2866861
Stumpffia grandis 34.39826 38.6301357 0.1386395 1.4820583
Stumpffia roseifemoralis 34.41914 31.6314943 0.1406395 1.1930096
Stumpffia tetradactyla 34.32417 33.1866919 0.1420185 1.2676903
Stumpffia miery 34.37511 31.5877497 0.1416859 1.2191371
Stumpffia tridactyla 34.34681 40.0680773 0.1408173 1.5672738
Madecassophryne truebae 34.31743 39.0380794 0.1424803 1.5149442
Melanobatrachus indicus 33.92412 43.7891387 0.1380146 1.5683498
Otophryne pyburni 33.74014 40.1669527 0.1403386 1.4582106
Otophryne robusta 33.79596 37.4127536 0.1404056 1.4259233
Otophryne steyermarki 33.85214 34.8465532 0.1382144 1.3352130
Synapturanus mirandaribeiroi 33.86087 47.1403061 0.1354057 1.6869606
Synapturanus salseri 33.80237 47.5871258 0.1395724 1.6662851
Synapturanus rabus 34.79044 42.5518893 0.1389849 1.5351738
Kalophrynus baluensis 33.15001 48.8735297 0.1392074 1.8127693
Kalophrynus intermedius 33.09635 39.2337879 0.1429450 1.3778278
Kalophrynus subterrestris 33.12900 40.9319977 0.1402047 1.4546748
Kalophrynus heterochirus 33.10163 41.4701093 0.1428299 1.4832854
Kalophrynus palmatissimus 33.02490 36.3274963 0.1425832 1.2879557
Kalophrynus bunguranus 33.21721 69.8185299 0.1426661 2.5346032
Kalophrynus orangensis 33.23990 35.9937282 0.1408618 1.3179996
Kalophrynus nubicola 33.19617 39.1403367 0.1403970 1.4374320
Kalophrynus eok 33.17114 31.3307694 0.1428788 1.1980225
Kalophrynus interlineatus 33.15182 29.6543749 0.1418527 1.0754930
Kalophrynus punctatus 33.20645 53.2840614 0.1397237 1.9186066
Kalophrynus minusculus 33.24594 45.1789054 0.1428596 1.5977562
Kalophrynus robinsoni 33.23255 48.5041528 0.1428330 1.6960443
Kalophrynus pleurostigma 33.40101 46.6826336 0.1401591 1.6411839
Choerophryne allisoni 31.42857 29.7086676 0.1445558 1.0683566
Choerophryne burtoni 31.53731 31.6305860 0.1425616 1.1867104
Choerophryne longirostris 31.49185 46.7440166 0.1477251 1.7507428
Choerophryne proboscidea 31.44849 37.1858529 0.1440739 1.3868028
Choerophryne rostellifer 31.55942 42.9320010 0.1458863 1.5859349
Aphantophryne minuta 31.44847 28.6778476 0.1450950 1.0651116
Aphantophryne sabini 31.47264 29.9388308 0.1440747 1.0674233
Aphantophryne pansa 31.40979 38.7493892 0.1470964 1.4696364
Asterophrys leucopus 31.53603 34.8754011 0.1437192 1.2747020
Asterophrys turpicola 31.52008 37.9183562 0.1460157 1.3888682
Xenorhina adisca 31.52857 38.9578595 0.1422696 1.4327745
Xenorhina anorbis 31.54126 33.3640330 0.1412189 1.2658281
Xenorhina arboricola 31.32316 41.0100400 0.1444935 1.5176237
Xenorhina arfakiana 31.56758 53.2000207 0.1469989 1.9140149
Xenorhina bidens 31.53964 33.4754772 0.1443199 1.2028872
Xenorhina bouwensi 31.45077 39.0338312 0.1451639 1.4394624
Xenorhina eiponis 31.37106 33.7653216 0.1472845 1.3152171
Xenorhina fuscigula 32.47355 35.3789832 0.1435701 1.3510223
Xenorhina gigantea 31.49060 35.6495039 0.1425712 1.3582037
Xenorhina huon 31.39578 32.2859910 0.1446089 1.2293352
Xenorhina lanthanites 31.39696 70.2897410 0.1436707 2.6652127
Xenorhina macrodisca 31.50695 28.5323596 0.1452598 1.1903677
Xenorhina macrops 31.55226 38.4691226 0.1414434 1.4477885
Xenorhina mehelyi 31.52860 32.2789788 0.1445829 1.2073574
Xenorhina minima 31.49127 38.9487255 0.1426918 1.4724475
Xenorhina multisica 31.47723 30.0216329 0.1425843 1.2082065
Xenorhina obesa 31.48522 37.8454625 0.1450005 1.4072921
Xenorhina ocellata 31.44946 38.5666956 0.1482900 1.4592920
Xenorhina ophiodon 31.46776 50.3482163 0.1442356 1.8062403
Xenorhina oxycephala 31.44983 42.0518570 0.1471554 1.5543458
Xenorhina parkerorum 31.51868 33.0516554 0.1423084 1.2405323
Xenorhina rostrata 31.48351 36.6501122 0.1436908 1.3670052
Xenorhina scheepstrai 31.48177 36.8570499 0.1446639 1.3991008
Xenorhina schiefenhoeveli 31.55202 36.1056593 0.1450989 1.4097450
Xenorhina similis 31.42989 36.1920424 0.1477656 1.3274247
Xenorhina subcrocea 31.38787 33.6916246 0.1426807 1.2562966
Xenorhina tumulus 32.49871 38.4178078 0.1447076 1.4345430
Xenorhina varia 31.55541 83.2890085 0.1441274 3.1566062
Xenorhina zweifeli 31.49103 42.2470952 0.1435812 1.5340709
Austrochaperina adamantina 31.52177 42.6757525 0.1438428 1.5995625
Austrochaperina adelphe 31.46002 31.4801134 0.1444541 1.1028638
Austrochaperina aquilonia 31.52513 43.9999599 0.1459638 1.6494328
Austrochaperina archboldi 31.54071 31.7504332 0.1435945 1.1603387
Austrochaperina basipalmata 30.89936 47.1057688 0.1457973 1.7602207
Austrochaperina blumi 31.59039 34.1460275 0.1426773 1.3331852
Austrochaperina brevipes 31.57449 30.1314464 0.1442401 1.1165581
Austrochaperina derongo 31.37923 35.2774805 0.1425568 1.3256471
Austrochaperina fryi 31.50280 24.7779723 0.1445022 0.9307821
Austrochaperina gracilipes 31.47781 31.5710335 0.1438343 1.1320266
Austrochaperina hooglandi 31.54703 37.1253948 0.1437708 1.3709492
Austrochaperina kosarek 31.53965 40.0919511 0.1433067 1.5217180
Austrochaperina macrorhyncha 30.84358 37.9768480 0.1437988 1.4137417
Austrochaperina mehelyi 31.46260 35.7708079 0.1435975 1.3473438
Austrochaperina minutissima 31.51766 44.4175183 0.1465363 1.5861601
Austrochaperina novaebritanniae 31.45760 47.2915559 0.1447115 1.6800421
Austrochaperina palmipes 30.83750 44.1866268 0.1437677 1.6260831
Austrochaperina parkeri 31.47133 36.8922230 0.1460500 1.3636504
Austrochaperina pluvialis 31.46543 27.4494048 0.1451126 1.0478267
Austrochaperina polysticta 31.40498 36.9221406 0.1447782 1.4062653
Austrochaperina rivularis 31.67985 35.5441935 0.1471025 1.2948445
Austrochaperina robusta 31.50751 24.3943404 0.1406233 0.9589234
Austrochaperina septentrionalis 31.57799 44.0864281 0.1426421 1.6644176
Austrochaperina yelaensis 31.57864 60.5556139 0.1452234 2.1974335
Barygenys atra 31.54228 36.8736218 0.1424263 1.3557257
Barygenys cheesmanae 31.45260 23.4733898 0.1462694 0.9098055
Barygenys exsul 31.39611 57.7321587 0.1480174 2.0955228
Barygenys flavigularis 31.53790 37.4348337 0.1441401 1.3806595
Barygenys maculata 31.51015 40.8795703 0.1472740 1.4818701
Barygenys nana 31.47197 37.8375563 0.1456746 1.4489271
Barygenys parvula 31.49779 34.1059774 0.1445192 1.2679881
Callulops boettgeri 31.43637 45.9942563 0.1443199 1.6514719
Callulops comptus 31.47199 31.7398324 0.1453606 1.2384217
Callulops doriae 32.44182 42.4603216 0.1422923 1.5518660
Callulops dubius 31.56435 46.2760257 0.1431930 1.6704439
Callulops fuscus 31.43041 52.1690114 0.1432365 1.8967550
Callulops glandulosus 31.46722 31.9555621 0.1431143 1.2666898
Callulops humicola 31.32318 31.6562494 0.1478319 1.2123459
Callulops kopsteini 31.46917 61.6507305 0.1463771 2.2495394
Callulops marmoratus 31.33584 32.4234632 0.1461105 1.2544321
Callulops personatus 31.42031 43.2850836 0.1430884 1.6266841
Callulops robustus 31.45055 49.0615608 0.1451887 1.7502096
Callulops sagittatus 31.42530 37.7313875 0.1439256 1.3560807
Callulops stictogaster 31.46707 37.0387651 0.1443836 1.4159524
Callulops wilhelmanus 31.36225 33.5432702 0.1447448 1.2966818
Cophixalus ateles 31.45423 34.9126943 0.1450849 1.2334794
Cophixalus balbus 31.61504 42.9108814 0.1440659 1.5997801
Cophixalus bewaniensis 31.52874 44.1744595 0.1430706 1.6083261
Cophixalus biroi 31.30278 41.5955075 0.1441531 1.5457049
Cophixalus cheesmanae 31.33819 34.4527497 0.1458730 1.2793585
Cophixalus crepitans 31.43987 30.8911945 0.1462439 1.1117582
Cophixalus cryptotympanum 31.30216 41.8290824 0.1452251 1.5083284
Cophixalus daymani 31.59013 41.3789695 0.1429301 1.4934431
Cophixalus humicola 31.52569 49.5998890 0.1443003 1.8079078
Cophixalus kaindiensis 31.57949 36.6660650 0.1415466 1.3521367
Cophixalus misimae 31.49021 49.3771749 0.1458559 1.7617815
Cophixalus montanus 31.46389 42.1646042 0.1446234 1.5148210
Cophixalus nubicola 31.63740 34.6358917 0.1440155 1.3685851
Cophixalus parkeri 31.42820 33.9144478 0.1449466 1.2767317
Cophixalus peninsularis 31.46315 31.5306532 0.1418661 1.1364150
Cophixalus pipilans 31.59718 42.3461637 0.1395511 1.6020185
Cophixalus pulchellus 31.42912 38.3284424 0.1466110 1.3865849
Cophixalus riparius 31.47128 32.1612444 0.1428800 1.2101550
Cophixalus shellyi 31.34679 34.8734610 0.1442290 1.3119823
Cophixalus sphagnicola 31.39612 31.3128754 0.1454748 1.1556557
Cophixalus tagulensis 30.87435 60.0800506 0.1430648 2.1918100
Cophixalus tetzlaffi 31.31037 65.2982914 0.1435823 2.4144510
Cophixalus timidus 31.32523 43.9634214 0.1448354 1.5955451
Cophixalus tridactylus 31.47920 46.3582964 0.1428823 1.6521702
Cophixalus variabilis 31.45940 48.7607793 0.1429633 1.7557562
Cophixalus verecundus 31.40441 29.6355307 0.1440143 1.0566657
Cophixalus verrucosus 31.43217 41.3460220 0.1452742 1.5078487
Cophixalus zweifeli 31.46106 32.8188575 0.1450997 1.1787970
Copiula exspectata 31.50219 69.8503842 0.1439819 2.6485887
Copiula fistulans 31.55234 36.9918052 0.1449070 1.3698067
Copiula major 31.44036 42.5934635 0.1449135 1.5193018
Copiula minor 31.63352 55.7403646 0.1408642 2.0355797
Copiula obsti 31.49846 41.9962969 0.1428708 1.4975308
Copiula oxyrhina 31.58767 49.4097889 0.1440741 1.7538058
Copiula pipiens 31.51164 43.8408024 0.1451935 1.6221857
Copiula tyleri 31.65140 40.8539408 0.1437746 1.5208904
Hylophorbus picoides 31.50086 56.0622791 0.1474798 2.0404816
Hylophorbus tetraphonus 31.53175 55.3475220 0.1453231 1.9970230
Hylophorbus sextus 31.48934 52.9457845 0.1467539 1.9089442
Hylophorbus rainerguentheri 31.57252 32.8976062 0.1438551 1.2368143
Hylophorbus richardsi 31.58562 33.8483176 0.1433513 1.2713280
Hylophorbus wondiwoi 31.60003 41.9931279 0.1452670 1.4981043
Hylophorbus rufescens 31.63592 31.5092673 0.1440181 1.1345434
Hylophorbus nigrinus 31.57711 42.6753731 0.1426618 1.7146969
Mantophryne louisiadensis 31.46049 62.2843736 0.1434801 2.2603167
Mantophryne lateralis 31.45534 37.5086317 0.1451445 1.3785718
Oreophryne albopunctata 31.33845 42.5429493 0.1450618 1.5535040
Oreophryne alticola 31.56606 33.4308117 0.1435795 1.3052731
Oreophryne anthonyi 31.38881 33.8692371 0.1433707 1.2311253
Oreophryne anulata 31.45271 49.2541217 0.1430503 1.7781645
Oreophryne asplenicola 31.30327 66.5045399 0.1445012 2.5215113
Oreophryne pseudasplenicola 31.28329 76.5766185 0.1456252 2.9042387
Oreophryne atrigularis 31.49835 43.7021335 0.1438838 1.6200673
Oreophryne biroi 31.31094 35.6187346 0.1441785 1.3316757
Oreophryne brachypus 31.26216 44.7086281 0.1440878 1.6216231
Oreophryne brevicrus 31.33832 37.1534155 0.1459689 1.4160215
Oreophryne brevirostris 31.62540 34.3085333 0.1448027 1.3390104
Oreophryne celebensis 31.26794 57.8021932 0.1455319 2.1058360
Oreophryne clamata 31.36345 44.4692265 0.1469432 1.5861210
Oreophryne crucifer 31.38515 41.2641267 0.1452418 1.5232139
Oreophryne flava 31.35103 34.0498438 0.1423549 1.3101069
Oreophryne frontifasciata 31.38185 61.7005246 0.1435547 2.2708093
Oreophryne geislerorum 31.36849 33.4094191 0.1428946 1.2317310
Oreophryne geminus 31.45611 34.0146276 0.1449099 1.2224417
Oreophryne habbemensis 31.37077 44.6863001 0.1435517 1.6272477
Oreophryne hypsiops 31.40381 37.2024138 0.1449140 1.3756911
Oreophryne idenburgensis 31.29067 50.3886603 0.1452339 1.7747809
Oreophryne inornata 31.25730 58.3261766 0.1458377 2.1305910
Oreophryne insulana 31.35804 52.3154154 0.1449642 1.9076513
Oreophryne jeffersoniana 31.28742 46.4396012 0.1445091 1.6894428
Oreophryne kampeni 31.31377 33.0291898 0.1441258 1.1781026
Oreophryne kapisa 31.24820 56.6529750 0.1466964 2.1048813
Oreophryne loriae 31.36167 32.5033685 0.1450744 1.1597552
Oreophryne minuta 31.27951 29.3501556 0.1436887 1.2247821
Oreophryne moluccensis 31.45978 57.8264484 0.1439794 2.0969053
Oreophryne monticola 31.37129 50.9007000 0.1458107 1.8366306
Oreophryne notata 31.38859 32.5836767 0.1456658 1.2408017
Oreophryne rookmaakeri 31.46035 55.0870668 0.1413766 2.0450889
Oreophryne sibilans 31.29745 49.8243759 0.1464590 1.7816628
Oreophryne terrestris 31.41994 41.2056895 0.1435241 1.4828212
Oreophryne unicolor 31.27945 55.6450618 0.1449580 2.0254048
Oreophryne variabilis 31.41023 54.5035500 0.1453649 2.0065418
Oreophryne waira 31.34143 69.3086306 0.1471936 2.6276977
Oreophryne wapoga 31.31891 47.9910324 0.1446059 1.8631736
Sphenophryne cornuta 31.48107 40.4228897 0.1447414 1.4875396
Gastrophrynoides borneensis 33.54990 44.7153966 0.1416813 1.5927881
Glyphoglossus molossus 35.41039 32.8539643 0.1393871 1.1543116
Microhyla achatina 34.11878 40.3050338 0.1419448 1.4615475
Microhyla borneensis 34.18975 37.6551146 0.1388445 1.3145615
Microhyla berdmorei 34.73556 28.4866664 0.1396299 1.0367755
Microhyla pulchra 34.70529 27.1429613 0.1396997 0.9887275
Microhyla rubra 34.63915 23.5947787 0.1405643 0.8629311
Microhyla maculifera 34.71924 33.7670363 0.1397449 1.1944547
Microhyla chakrapanii 34.67672 36.9975025 0.1386860 1.2901080
Microhyla karunaratnei 34.75358 29.9963796 0.1403607 1.0897901
Microhyla palmipes 34.77981 41.0632690 0.1383021 1.4577030
Microhyla mixtura 34.64310 12.8776242 0.1393478 0.5245570
Microhyla okinavensis 34.67116 45.9770808 0.1410245 1.6746815
Microhyla superciliaris 34.66862 41.2251256 0.1428557 1.4521951
Microhyla picta 34.80536 30.8705602 0.1394597 1.1062737
Microhyla pulverata 34.66977 30.1833264 0.1412639 1.1076868
Microhyla sholigari 34.58847 20.3475942 0.1412893 0.7379431
Microhyla zeylanica 34.86178 29.7191929 0.1394084 1.0786052
Micryletta inornata 34.04029 50.6518136 0.1414811 1.7806164
Micryletta steinegeri 34.09604 49.0608493 0.1408159 1.7497632
Chaperina fusca 33.87773 45.2145262 0.1456986 1.6053328
Kaloula assamensis 34.54892 29.8132354 0.1396028 1.1349785
Kaloula aureata 34.35252 31.5787044 0.1417123 1.1035409
Kaloula baleata 34.29719 34.4168247 0.1456301 1.2531531
Kaloula mediolineata 34.42634 25.5855790 0.1437211 0.8902809
Kaloula conjuncta 34.33421 41.7495089 0.1425138 1.5106543
Kaloula rigida 34.23789 42.5530409 0.1407510 1.5209516
Kaloula kokacii 33.88272 42.2681944 0.1413494 1.5153457
Kaloula picta 34.33331 43.0779750 0.1414160 1.5526764
Kaloula borealis 34.68825 9.1803141 0.1397242 0.3954540
Kaloula rugifera 34.60171 11.3464789 0.1443856 0.5276955
Kaloula verrucosa 34.70987 17.6060275 0.1411184 0.8112818
Uperodon globulosus 35.36601 26.5223341 0.1428534 0.9692793
Uperodon systoma 35.37920 25.2206096 0.1392109 0.9383407
Metaphrynella pollicaris 34.07621 43.2505223 0.1412248 1.5235831
Metaphrynella sundana 33.99698 44.3691898 0.1436834 1.5816560
Phrynella pulchra 34.17476 45.9222159 0.1423197 1.6143390
Dyscophus insularis 33.90136 35.9036211 0.1410256 1.3432572
Dyscophus antongilii 33.74328 37.5274206 0.1432157 1.4431594
Dyscophus guineti 33.74005 39.4547693 0.1419993 1.5229277
Hildebrandtia macrotympanum 35.12332 45.8539520 0.1356085 1.8157680
Hildebrandtia ornatissima 35.15858 29.4523866 0.1354883 1.1990081
Hildebrandtia ornata 35.25022 29.2659767 0.1367635 1.1473379
Lanzarana largeni 34.32664 41.2909699 0.1338031 1.6034896
Ptychadena aequiplicata 34.51013 50.2731527 0.1358422 1.8242025
Ptychadena obscura 34.24577 33.3299579 0.1346635 1.3863214
Ptychadena mahnerti 34.54463 29.1063760 0.1369122 1.3564248
Ptychadena uzungwensis 34.56566 32.9466014 0.1354140 1.3440274
Ptychadena porosissima 34.35059 30.7034338 0.1342288 1.2854285
Ptychadena perreti 34.20796 47.7007467 0.1352801 1.7265756
Ptychadena anchietae 34.41599 30.7087572 0.1371922 1.2621208
Ptychadena oxyrhynchus 34.30453 35.9795818 0.1340022 1.4009835
Ptychadena tellinii 34.29064 35.0729805 0.1357888 1.2821619
Ptychadena longirostris 34.12407 53.6117389 0.1386989 1.9313092
Ptychadena bunoderma 34.26234 30.9597100 0.1364392 1.2333718
Ptychadena upembae 34.58833 32.7609578 0.1348723 1.3414934
Ptychadena ansorgii 34.62683 33.0290769 0.1342158 1.3450539
Ptychadena arnei 34.33260 51.6637591 0.1330813 1.8715246
Ptychadena pumilio 34.45743 41.4822145 0.1357350 1.5134181
Ptychadena retropunctata 34.45188 37.7480761 0.1368602 1.3640585
Ptychadena bibroni 34.18541 43.7987100 0.1356981 1.5883899
Ptychadena christyi 34.18287 46.4199023 0.1340218 1.8776250
Ptychadena stenocephala 34.13407 44.3796978 0.1351132 1.7034210
Ptychadena broadleyi 34.17774 32.6808604 0.1343348 1.2592392
Ptychadena keilingi 34.12788 32.8820741 0.1350488 1.3178058
Ptychadena chrysogaster 34.07876 43.2070671 0.1370446 1.9486551
Ptychadena harenna 34.14297 37.5856072 0.1356911 1.8616188
Ptychadena cooperi 34.52393 32.9403782 0.1366553 1.6488029
Ptychadena erlangeri 34.30785 33.9447841 0.1351183 1.5811355
Ptychadena nana 34.28650 31.6450689 0.1362041 1.6502863
Ptychadena wadei 34.39133 29.0667459 0.1324439 1.2379214
Ptychadena filwoha 34.39244 33.3665870 0.1363476 1.6445811
Ptychadena subpunctata 34.31268 33.5374443 0.1366012 1.3652181
Ptychadena gansi 34.22042 57.3045671 0.1350798 2.1743459
Ptychadena grandisonae 34.19510 33.4833555 0.1357304 1.3724005
Ptychadena guibei 34.17967 30.7528521 0.1377485 1.2275603
Ptychadena neumanni 34.47589 34.5045217 0.1369694 1.5921999
Ptychadena ingeri 34.44032 42.0491959 0.1345563 1.5729967
Ptychadena submascareniensis 34.19531 44.4192161 0.1356811 1.6080379
Ptychadena mapacha 34.18963 29.0163695 0.1360337 1.1604276
Ptychadena straeleni 34.13279 37.7634307 0.1385246 1.3908702
Ptychadena mascareniensis 34.44350 35.8642954 0.1361977 1.3826998
Ptychadena newtoni 34.42073 68.6269244 0.1390415 2.5317953
Ptychadena nilotica 34.43075 36.2385547 0.1360738 1.4945216
Ptychadena taenioscelis 34.10469 32.9099015 0.1360064 1.3218140
Ptychadena trinodis 34.16060 38.5469428 0.1352686 1.3950151
Ptychadena mossambica 34.11509 32.7866635 0.1364944 1.3479541
Ptychadena tournieri 34.37629 43.6882735 0.1360967 1.5729977
Ptychadena perplicata 34.14250 30.6738120 0.1389880 1.2370911
Ptychadena schillukorum 34.12936 35.6889468 0.1383778 1.3806037
Ptychadena pujoli 34.13759 40.1109001 0.1369247 1.4415594
Ptychadena superciliaris 34.20858 56.3516066 0.1361110 2.0346590
Odontobatrachus natator 33.35491 43.6153557 0.1384920 1.5763228
Phrynobatrachus latifrons 34.12659 40.9039556 0.1347678 1.4679129
Phrynobatrachus asper 34.40365 34.0644413 0.1374922 1.4060368
Phrynobatrachus acridoides 34.40285 34.6421240 0.1339562 1.4127760
Phrynobatrachus pakenhami 34.44659 56.9478262 0.1347458 2.2399780
Phrynobatrachus bullans 34.34010 30.0884612 0.1371434 1.3612173
Phrynobatrachus francisci 34.02063 41.3987802 0.1349921 1.4921553
Phrynobatrachus natalensis 34.13362 31.7553134 0.1367491 1.2615441
Phrynobatrachus bequaerti 34.28499 38.1756398 0.1365249 1.6517268
Phrynobatrachus africanus 34.36054 47.4107762 0.1380031 1.7267261
Phrynobatrachus elberti 34.19922 37.9360219 0.1342591 1.3938459
Phrynobatrachus brevipalmatus 34.15825 34.8289172 0.1346156 1.3104699
Phrynobatrachus albomarginatus 34.10522 43.4204712 0.1371429 1.6143780
Phrynobatrachus mababiensis 34.28429 30.3121194 0.1378338 1.2576095
Phrynobatrachus alleni 34.19658 59.6490279 0.1393333 2.1564541
Phrynobatrachus phyllophilus 34.06799 55.6911132 0.1351814 2.0137539
Phrynobatrachus ghanensis 34.06750 63.6501882 0.1329366 2.3076371
Phrynobatrachus guineensis 33.87805 50.9295338 0.1368139 1.8421043
Phrynobatrachus annulatus 34.37724 54.9350435 0.1352215 1.9872169
Phrynobatrachus calcaratus 34.28502 46.8870268 0.1371833 1.7021712
Phrynobatrachus villiersi 34.12632 61.0213661 0.1368073 2.2076739
Phrynobatrachus cornutus 34.14066 42.7336905 0.1347038 1.5523922
Phrynobatrachus anotis 33.99312 35.6077155 0.1352364 1.4120200
Phrynobatrachus nanus 33.98225 46.4965890 0.1352925 1.7090345
Phrynobatrachus auritus 34.02804 40.3368299 0.1352004 1.4697983
Phrynobatrachus plicatus 34.32558 58.8450710 0.1357758 2.1148221
Phrynobatrachus gastoni 34.09697 50.3868607 0.1354139 1.8134110
Phrynobatrachus batesii 34.06346 45.5010607 0.1346390 1.6739078
Phrynobatrachus werneri 33.48294 49.4114026 0.1332490 1.8514563
Phrynobatrachus cricogaster 34.30016 55.8899347 0.1353784 2.0703618
Phrynobatrachus steindachneri 34.34474 39.7731649 0.1347676 1.5220064
Phrynobatrachus chukuchuku 34.21231 38.7298599 0.1384828 1.5023784
Phrynobatrachus breviceps 34.02771 31.5004284 0.1341242 1.4484241
Phrynobatrachus hylaios 34.28624 45.5001714 0.1359389 1.6632009
Phrynobatrachus graueri 34.49886 39.6128498 0.1361448 1.7346878
Phrynobatrachus kinangopensis 34.45527 32.6889796 0.1349918 1.5314706
Phrynobatrachus cryptotis 34.18320 34.2350650 0.1332178 1.3511684
Phrynobatrachus irangi 34.09930 27.4151842 0.1360126 1.2513703
Phrynobatrachus dalcqi 34.01251 34.3576094 0.1374166 1.3533759
Phrynobatrachus intermedius 34.37871 79.1472842 0.1353511 2.8690836
Phrynobatrachus liberiensis 34.28112 57.2153868 0.1365893 2.0780066
Phrynobatrachus tokba 34.06317 49.6070178 0.1371728 1.7924068
Phrynobatrachus dispar 34.32351 74.7507588 0.1339797 2.7403813
Phrynobatrachus leveleve 34.31233 71.4087300 0.1345111 2.6341905
Phrynobatrachus inexpectatus 34.02583 33.3254557 0.1378371 1.6815939
Phrynobatrachus minutus 34.29046 32.8015570 0.1390414 1.5450022
Phrynobatrachus scheffleri 34.28045 33.9214845 0.1390162 1.4639367
Phrynobatrachus rungwensis 34.25707 30.1150825 0.1366595 1.2744464
Phrynobatrachus uzungwensis 33.42862 36.3455260 0.1364463 1.5710306
Phrynobatrachus parvulus 34.05103 31.2215891 0.1371204 1.2843086
Phrynobatrachus keniensis 34.31648 28.8461975 0.1377458 1.3506711
Phrynobatrachus fraterculus 34.25902 48.4895326 0.1351435 1.7524974
Phrynobatrachus gutturosus 34.28823 49.9918446 0.1359689 1.7933322
Phrynobatrachus pintoi 33.95382 33.5961575 0.1374982 1.1986232
Phrynobatrachus kakamikro 33.97179 28.6956023 0.1372650 1.2562565
Phrynobatrachus taiensis 34.11620 63.7653371 0.1367258 2.3114594
Phrynobatrachus giorgii 34.03563 41.6553444 0.1372642 1.4676635
Phrynobatrachus scapularis 34.24865 45.3981763 0.1357113 1.6815594
Phrynobatrachus ogoensis 34.14309 41.6701227 0.1364115 1.4477210
Phrynobatrachus perpalmatus 34.29422 33.4595628 0.1351265 1.3010064
Phrynobatrachus pallidus 34.37978 60.0408490 0.1365370 2.3531526
Phrynobatrachus rouxi 34.17976 43.1977053 0.1339384 2.0517233
Phrynobatrachus parkeri 34.10655 44.0105413 0.1337862 1.5836497
Phrynobatrachus sternfeldi 34.02050 39.3670229 0.1349916 1.4307976
Phrynobatrachus pygmaeus 33.99578 39.5930401 0.1348249 1.4568488
Phrynobatrachus sulfureogularis 34.06998 45.9769920 0.1334260 1.9929721
Phrynobatrachus stewartae 34.21832 31.1405704 0.1349107 1.3456232
Phrynobatrachus ukingensis 34.27768 38.1238026 0.1350735 1.6576982
Phrynobatrachus ungujae 34.03877 56.6652720 0.1355771 2.2342485
Phrynobatrachus acutirostris 33.51066 38.7784651 0.1361306 1.6779777
Phrynobatrachus dendrobates 34.08270 42.5485698 0.1344518 1.7030948
Phrynobatrachus petropedetoides 34.10609 37.2758949 0.1348853 1.5039353
Phrynobatrachus versicolor 34.15861 42.6159078 0.1354856 1.9129899
Phrynobatrachus krefftii 34.08610 60.0734843 0.1375360 2.3961861
Phrynobatrachus sandersoni 34.26580 57.3629340 0.1375449 2.1346664
Conraua alleni 33.39344 49.7806786 0.1359365 1.7962485
Conraua robusta 33.47538 57.6570525 0.1368379 2.1535655
Conraua derooi 33.46948 57.9150428 0.1365373 2.0310324
Conraua beccarii 34.19674 27.8011971 0.1357926 1.2233781
Conraua crassipes 33.42519 47.0548566 0.1362573 1.7120396
Conraua goliath 33.40466 52.4409113 0.1351742 1.9453345
Micrixalus elegans 33.48744 32.8118682 0.1350687 1.2201041
Micrixalus nudis 34.31438 37.2979109 0.1345866 1.3421065
Micrixalus fuscus 33.37829 35.9191232 0.1370533 1.3016405
Micrixalus kottigeharensis 34.30138 35.4144876 0.1363030 1.3193445
Micrixalus saxicola 33.42494 30.9494938 0.1388976 1.1474530
Micrixalus phyllophilus 33.40551 34.5428860 0.1348498 1.2490760
Micrixalus swamianus 34.04723 30.7538397 0.1351242 1.1436448
Micrixalus silvaticus 33.45805 38.7141425 0.1363653 1.3977850
Micrixalus thampii 33.42677 27.7727653 0.1365916 1.0150051
Micrixalus gadgili 33.44447 45.3248303 0.1364512 1.6448377
Micrixalus narainensis 33.49511 33.7317431 0.1347999 1.2534167
Arthroleptides martiensseni 33.37953 53.0629266 0.1347459 2.1131117
Arthroleptides yakusini 33.43919 35.2567099 0.1342516 1.4922359
Petropedetes cameronensis 33.29735 52.3231649 0.1359186 1.9365547
Petropedetes parkeri 34.16068 47.9266658 0.1368210 1.7796575
Petropedetes perreti 33.27119 46.8508804 0.1392700 1.7586516
Petropedetes johnstoni 33.96312 54.4211449 0.1361962 2.0147939
Petropedetes palmipes 34.18371 48.8588461 0.1393948 1.8039886
Ericabatrachus baleensis 33.30504 35.0565464 0.1375822 1.7317577
Aubria masako 34.35765 43.6881006 0.1341188 1.5683095
Aubria occidentalis 34.39129 53.9618882 0.1342332 1.9469832
Aubria subsigillata 34.37881 42.3424795 0.1370176 1.5311714
Pyxicephalus adspersus 35.11601 23.8780098 0.1343861 1.0274677
Pyxicephalus edulis 34.95854 31.2777004 0.1378963 1.2379313
Pyxicephalus angusticeps 34.34674 35.5024949 0.1362021 1.3683620
Pyxicephalus obbianus 35.03760 38.3869729 0.1377434 1.5051965
Amietia tenuoplicata 33.45135 38.0049031 0.1359969 1.6125052
Amietia angolensis 34.29228 25.8139852 0.1352157 1.0446312
Amietia desaegeri 34.28500 34.9400299 0.1375508 1.4481439
Amietia inyangae 33.41188 25.5398388 0.1376740 1.0444134
Amietia johnstoni 33.44028 28.7875467 0.1344562 1.1125411
Amietia vertebralis 34.16374 22.3554251 0.1377993 1.0620521
Amietia ruwenzorica 33.37046 43.0524678 0.1356381 1.7779528
Amietia wittei 33.35622 30.3898921 0.1373278 1.3972975
Amietia fuscigula 34.43164 20.6296147 0.1337904 0.9783156
Amietia vandijki 33.58481 17.8516660 0.1328858 0.8299731
Strongylopus bonaespei 34.40294 20.2740969 0.1339964 0.9713654
Strongylopus fuelleborni 34.40114 32.8093107 0.1373934 1.4167363
Strongylopus kilimanjaro 33.44635 39.5167742 0.1334243 1.7427764
Strongylopus fasciatus 34.33593 25.4491278 0.1357069 1.0992561
Strongylopus springbokensis 34.33834 20.8540270 0.1351556 1.0160654
Strongylopus rhodesianus 33.51390 28.8021640 0.1339422 1.1581941
Strongylopus kitumbeine 34.38173 24.0575917 0.1343695 1.1374046
Strongylopus wageri 34.41544 24.4744749 0.1346591 1.1001983
Strongylopus merumontanus 33.49870 26.2618751 0.1355786 1.1945499
Strongylopus grayii 34.37534 20.8866231 0.1341118 0.9617047
Arthroleptella bicolor 34.25090 18.2093026 0.1318380 0.8917577
Arthroleptella subvoce 34.11975 19.0111306 0.1369268 0.9130022
Arthroleptella drewesii 33.62898 21.4272928 0.1362208 1.0647422
Arthroleptella landdrosia 34.18618 19.2252861 0.1368808 0.9266355
Arthroleptella lightfooti 34.22507 19.3312238 0.1365418 0.9088354
Arthroleptella villiersi 34.27388 20.3121670 0.1313506 0.9729909
Arthroleptella rugosa 34.23703 24.3028594 0.1347815 1.2075042
Natalobatrachus bonebergi 33.53030 27.2141634 0.1357380 1.2171325
Nothophryne broadleyi 33.61491 30.3615809 0.1371495 1.1707027
Cacosternum leleupi 34.11454 31.3235393 0.1354544 1.2719753
Cacosternum boettgeri 34.16867 22.9713900 0.1358708 1.0184075
Cacosternum kinangopensis 34.15118 28.8117207 0.1363883 1.4461586
Cacosternum plimptoni 34.08835 31.2937704 0.1394555 1.4617981
Cacosternum striatum 34.07393 27.7795993 0.1365365 1.2180283
Cacosternum parvum 34.11397 26.0285531 0.1385302 1.1607369
Cacosternum nanum 34.11088 24.2111344 0.1368893 1.1099696
Cacosternum capense 35.10027 19.3311869 0.1358415 0.9217407
Cacosternum namaquense 34.06226 18.5077661 0.1355596 0.9103051
Cacosternum karooicum 34.05224 16.7832757 0.1372535 0.8094466
Cacosternum platys 34.09928 20.8175025 0.1347344 0.9793799
Microbatrachella capensis 34.42249 21.8143853 0.1340197 1.0435054
Poyntonia paludicola 33.62631 20.1989917 0.1344109 0.9698318
Anhydrophryne hewitti 34.04609 26.9063729 0.1337215 1.2024679
Anhydrophryne ngongoniensis 34.07517 26.0260314 0.1355856 1.1931215
Anhydrophryne rattrayi 34.04633 19.9500130 0.1348657 0.9736964
Tomopterna cryptotis 33.97739 25.9038471 0.1371976 1.0210312
Tomopterna tandyi 34.01049 20.3580175 0.1339464 0.9064900
Tomopterna damarensis 35.02620 19.7263866 0.1355686 0.8383672
Tomopterna delalandii 34.29160 17.8084239 0.1373458 0.8574217
Tomopterna gallmanni 34.09943 29.4628026 0.1347839 1.3348449
Tomopterna tuberculosa 34.33107 28.8082955 0.1345512 1.2105001
Tomopterna elegans 34.03412 34.2800066 0.1361414 1.3196785
Tomopterna wambensis 34.31302 37.9029697 0.1333458 1.6728265
Tomopterna kachowskii 34.09091 26.9468785 0.1368839 1.2341690
Tomopterna krugerensis 34.06616 23.2158149 0.1350281 0.9753391
Tomopterna luganga 34.19561 27.0969805 0.1382727 1.2151130
Tomopterna marmorata 34.03222 25.9373949 0.1361907 1.0788291
Tomopterna milletihorsini 34.09921 31.2682106 0.1323098 1.1226135
Tomopterna natalensis 34.07637 22.4909648 0.1366263 1.0012662
Platymantis levigatus 32.49000 64.2156808 0.1386834 2.3270955
Platymantis mimulus 31.19574 50.8023880 0.1375590 1.8221222
Platymantis naomii 31.13705 58.6281680 0.1391270 2.1343940
Platymantis panayensis 31.95491 51.6517162 0.1395452 1.8827949
Platymantis rabori 32.29815 57.9067285 0.1352910 2.0937246
Platymantis isarog 32.20459 59.2659013 0.1393669 2.1284204
Platymantis cornutus 32.24133 62.6924104 0.1397108 2.2351576
Platymantis cagayanensis 32.40326 64.2567178 0.1372403 2.3062093
Platymantis diesmosi 32.41051 61.2997425 0.1362882 2.2012827
Platymantis lawtoni 32.29263 70.1405636 0.1366256 2.5412813
Platymantis guentheri 32.20571 47.4084257 0.1376539 1.7129896
Platymantis subterrestris 32.16013 58.5738147 0.1394075 2.0841596
Platymantis hazelae 31.68087 36.7352119 0.1377532 1.3436300
Platymantis pygmaeus 31.78836 43.8313865 0.1395946 1.5645022
Platymantis indeprensus 32.25571 72.3073111 0.1402421 2.6350431
Platymantis paengi 32.25421 66.9584438 0.1399407 2.4360320
Platymantis insulatus 32.22886 52.3068128 0.1374243 1.9082688
Platymantis taylori 32.34143 67.2561365 0.1365442 2.4077103
Platymantis negrosensis 32.33301 63.2262457 0.1392691 2.3058752
Platymantis pseudodorsalis 32.32437 71.7357768 0.1375975 2.6145745
Platymantis polillensis 32.22787 63.2038140 0.1363746 2.2667281
Platymantis sierramadrensis 32.27245 68.5290334 0.1378534 2.4366492
Platymantis spelaeus 32.45737 73.3797571 0.1373798 2.6360579
Lankanectes corrugatus 33.45824 37.7526869 0.1369577 1.3450510
Nyctibatrachus sylvaticus 32.91046 43.1922244 0.1348500 1.5941856
Nyctibatrachus major 32.86054 36.2476877 0.1368283 1.3228206
Nyctibatrachus dattatreyaensis 32.85307 30.3266047 0.1365032 1.1330925
Nyctibatrachus karnatakaensis 32.79677 28.1254197 0.1365983 1.0456971
Nyctibatrachus sanctipalustris 33.67398 36.9455816 0.1358358 1.3751247
Nyctibatrachus kempholeyensis 32.83313 37.8503993 0.1385259 1.4001205
Nyctibatrachus humayuni 32.95900 34.8496728 0.1368973 1.2944740
Nyctibatrachus petraeus 32.92886 31.9082733 0.1366137 1.1715529
Nyctibatrachus aliciae 33.74247 38.6959195 0.1336159 1.4156174
Nyctibatrachus vasanthi 32.82412 46.2580852 0.1387027 1.6634327
Nyctibatrachus deccanensis 33.68978 33.6648735 0.1351962 1.2252789
Nyctibatrachus minor 33.72791 30.7280790 0.1351213 1.1158207
Nyctibatrachus beddomii 33.72757 34.1962686 0.1363631 1.2297687
Nyctibatrachus minimus 33.50434 43.0199321 0.1347260 1.5607476
Indirana beddomii 34.70178 35.6756257 0.1320385 1.3024483
Indirana brachytarsus 34.03380 32.7483408 0.1342447 1.1867229
Indirana leithii 34.74526 35.6861318 0.1323513 1.3129141
Indirana semipalmata 34.05621 37.2658682 0.1333498 1.3549693
Indirana gundia 34.08508 40.9310975 0.1315131 1.5128096
Indirana longicrus 34.02124 35.6992366 0.1321526 1.3272403
Indirana diplosticta 33.91454 43.2315783 0.1330741 1.5430480
Indirana leptodactyla 34.58953 37.0531686 0.1309783 1.3356239
Indirana phrynoderma 34.49028 32.2078070 0.1328029 1.1376044
Ingerana borealis 35.02161 30.1115658 0.1321959 1.2132064
Ingerana tenasserimensis 34.80948 39.7470783 0.1330537 1.4215323
Ingerana charlesdarwini 34.63531 42.8084502 0.1308568 1.4908037
Ingerana reticulata 34.10374 12.9483144 0.1317647 0.7833483
Occidozyga baluensis 34.68477 44.8004348 0.1311474 1.5997167
Occidozyga celebensis 34.50370 49.6520095 0.1380648 1.8366578
Occidozyga lima 34.57823 34.5010184 0.1337142 1.2459697
Occidozyga magnapustulosa 34.36191 32.8969354 0.1342109 1.1817891
Occidozyga martensii 34.30022 29.4147490 0.1352992 1.0657763
Occidozyga semipalmata 34.46961 53.3847917 0.1319218 1.9693544
Occidozyga sumatrana 34.55165 48.0340453 0.1323231 1.7273137
Occidozyga floresiana 33.76592 38.7497278 0.1378544 1.4229301
Occidozyga diminutiva 33.62624 70.6251411 0.1335460 2.5934102
Allopaa hazarensis 36.15805 8.0308111 0.1317630 0.5390387
Chrysopaa sternosignata 35.99743 14.5742383 0.1315267 0.6680340
Ombrana sikimensis 35.30282 21.3415366 0.1328674 1.0461706
Euphlyctis hexadactylus 37.25920 26.8930182 0.1265245 0.9605230
Euphlyctis cyanophlyctis 37.29928 20.6055432 0.1295874 0.7815540
Euphlyctis ehrenbergii 37.20970 26.5049417 0.1320721 1.0673109
Euphlyctis ghoshi 37.32430 36.2422143 0.1305215 1.2377183
Hoplobatrachus crassus 38.70098 25.0543542 0.1287983 0.9078453
Hoplobatrachus tigerinus 38.14047 19.5993064 0.1285650 0.7324167
Hoplobatrachus occipitalis 37.29963 24.9587237 0.1280308 0.9315330
Nannophrys ceylonensis 37.00743 34.9566510 0.1302394 1.2627574
Nannophrys marmorata 37.11432 32.0122983 0.1279112 1.1545068
Nannophrys naeyakai 36.21617 34.5655676 0.1325771 1.2161116
Fejervarya iskandari 36.55580 33.9712129 0.1297710 1.1969067
Fejervarya orissaensis 36.61933 25.9183864 0.1304905 0.9197083
Fejervarya moodiei 36.88813 44.6599842 0.1307736 1.5828174
Fejervarya multistriata 36.81537 37.4927863 0.1299125 1.3585629
Fejervarya triora 36.54477 28.1120171 0.1304501 0.9658406
Fejervarya verruculosa 36.53754 46.0123487 0.1300220 1.6738751
Fejervarya vittigera 36.57534 58.0512162 0.1301323 2.0923317
Sphaerotheca breviceps 36.53970 21.8497554 0.1297897 0.7990234
Sphaerotheca dobsonii 37.61181 28.4813684 0.1279225 1.0279084
Sphaerotheca leucorhynchus 37.57133 28.2175995 0.1286579 1.0390981
Sphaerotheca maskeyi 37.53500 23.7307846 0.1282568 1.0645302
Sphaerotheca rolandae 37.57086 29.6659137 0.1291156 1.0419848
Sphaerotheca swani 37.49241 29.3647618 0.1302325 1.1322224
Limnonectes acanthi 34.44401 55.6630538 0.1338317 1.9943316
Limnonectes arathooni 35.11627 52.2113846 0.1306163 1.9201727
Limnonectes microtympanum 34.44107 55.0133429 0.1312404 2.0478908
Limnonectes asperatus 35.16511 34.5447996 0.1311728 1.2040242
Limnonectes kuhlii 34.47027 39.4174466 0.1297016 1.4346676
Limnonectes fujianensis 35.38096 22.8255888 0.1325458 0.8220447
Limnonectes namiyei 34.38404 42.6603034 0.1332658 1.5418342
Limnonectes poilani 33.66618 23.6156966 0.1348330 0.8296146
Limnonectes dabanus 35.37863 28.4703074 0.1334018 0.9950351
Limnonectes gyldenstolpei 35.16379 29.2669736 0.1299188 1.0390572
Limnonectes dammermani 34.49331 48.0850726 0.1327683 1.7538915
Limnonectes diuatus 34.58059 38.7031689 0.1294570 1.3918886
Limnonectes doriae 35.13648 31.7199951 0.1306393 1.1307667
Limnonectes hascheanus 35.09663 30.1139396 0.1293106 1.0885989
Limnonectes limborgi 35.03804 28.5896592 0.1325599 1.0489193
Limnonectes plicatellus 34.41098 39.2894812 0.1329640 1.3785826
Limnonectes kohchangae 35.12461 32.1030839 0.1312360 1.1015934
Limnonectes finchi 34.67839 33.9911165 0.1334289 1.2165516
Limnonectes ingeri 34.05377 35.6451176 0.1346465 1.2823785
Limnonectes fragilis 34.41589 44.1930039 0.1316866 1.5682648
Limnonectes grunniens 35.33754 43.1207372 0.1335321 1.5851052
Limnonectes ibanorum 35.26941 38.5313945 0.1328489 1.3680019
Limnonectes heinrichi 33.76309 48.8059733 0.1351175 1.7815615
Limnonectes modestus 34.71537 45.2907328 0.1329494 1.6634801
Limnonectes macrocephalus 34.47581 41.9777377 0.1329869 1.5006307
Limnonectes visayanus 33.63521 46.6364251 0.1333593 1.7020624
Limnonectes magnus 33.71071 46.4844881 0.1351523 1.6881487
Limnonectes kadarsani 34.45193 45.9444302 0.1328861 1.6637835
Limnonectes microdiscus 35.03233 41.4203732 0.1302215 1.4943610
Limnonectes kenepaiensis 35.19292 53.4031672 0.1361679 1.9138477
Limnonectes khammonensis 35.23892 25.4834122 0.1327094 0.8863826
Limnonectes khasianus 35.07850 29.7632624 0.1309254 1.1509533
Limnonectes leporinus 35.18808 36.6054542 0.1319113 1.3022261
Limnonectes leytensis 34.46943 48.7484639 0.1338404 1.7695419
Limnonectes macrodon 35.30781 36.0185261 0.1326843 1.2956634
Limnonectes shompenorum 35.04021 47.8784479 0.1327002 1.7311020
Limnonectes paramacrodon 35.29052 42.0443652 0.1321673 1.4876662
Limnonectes macrognathus 35.16612 30.2022167 0.1305009 1.0783926
Limnonectes mawlyndipi 35.15350 18.2756559 0.1325025 0.7884142
Limnonectes micrixalus 34.50135 65.8155149 0.1348462 2.4446146
Limnonectes nitidus 34.53354 36.6612099 0.1315586 1.3186284
Limnonectes palavanensis 34.54376 42.8569963 0.1316625 1.5361607
Limnonectes parvus 34.55071 48.9127860 0.1302589 1.7730775
Limnonectes tweediei 35.09340 38.3581428 0.1315665 1.3533739
Nanorana aenea 38.30122 22.5923405 0.1266960 0.8905850
Nanorana unculuanus 37.73238 18.9848412 0.1262629 0.8094385
Nanorana annandalii 37.77073 18.2242826 0.1260667 0.9204034
Nanorana arnoldi 37.66528 11.1721405 0.1288648 0.6490755
Nanorana maculosa 37.70801 21.4449328 0.1258660 0.9389666
Nanorana medogensis 37.70224 11.8912729 0.1292209 0.7226686
Nanorana blanfordii 37.63530 14.1877133 0.1275141 0.7469903
Nanorana conaensis 37.54010 16.5356630 0.1299967 0.8937617
Nanorana ercepeae 37.68616 14.4120764 0.1279254 0.6941810
Nanorana taihangnica 37.67919 10.6194119 0.1269075 0.4642796
Nanorana liebigii 37.70313 10.8571474 0.1273497 0.6391476
Nanorana minica 37.65472 10.7043254 0.1287109 0.5902483
Nanorana mokokchungensis 37.63107 29.1160221 0.1262916 1.0873220
Nanorana parkeri 38.28232 6.4722284 0.1291963 0.5658316
Nanorana pleskei 38.34453 7.0121322 0.1295869 0.5078671
Nanorana ventripunctata 38.50914 13.1122005 0.1270620 0.7928125
Nanorana polunini 37.75378 12.1118927 0.1270595 0.6801575
Nanorana quadranus 37.72184 11.7460693 0.1258683 0.4914523
Nanorana rarica 38.54830 6.6668713 0.1287705 0.5230524
Nanorana rostandi 37.66914 9.6025447 0.1273421 0.5772400
Nanorana vicina 37.68358 8.4120234 0.1252208 0.5365041
Nanorana yunnanensis 37.68984 18.1172162 0.1274181 0.7834525
Quasipaa boulengeri 38.86486 14.0472303 0.1277544 0.5730122
Quasipaa verrucospinosa 38.87653 24.3724097 0.1256713 0.9395367
Quasipaa jiulongensis 38.80290 15.3137436 0.1277208 0.5638494
Quasipaa shini 38.88512 20.3390285 0.1266756 0.7513675
Quasipaa exilispinosa 39.34434 17.2478674 0.1231967 0.6229766
Quasipaa yei 38.69298 13.0545008 0.1268549 0.4703952
Quasipaa delacouri 38.20034 22.9954239 0.1257979 0.8686169
Quasipaa fasciculispina 38.25535 25.1284889 0.1256282 0.8565287
Amolops archotaphus 33.07479 26.0451714 0.1343301 1.0051289
Amolops aniqiaoensis 33.17955 13.4790490 0.1319989 0.8170666
Amolops assamensis 33.18172 36.6570338 0.1345106 1.3840981
Amolops bellulus 33.13002 20.9923716 0.1351592 1.0541397
Amolops chakrataensis 33.11484 19.4655196 0.1344752 0.9117390
Amolops chunganensis 33.87965 16.4236573 0.1309472 0.6790184
Amolops compotrix 33.07249 32.3982041 0.1376847 1.1462722
Amolops cucae 33.07143 24.4868244 0.1343076 0.9398164
Amolops vitreus 33.16521 25.7935049 0.1316995 1.0364661
Amolops cremnobatus 33.32288 29.9003321 0.1289623 1.0850643
Amolops daiyunensis 33.05568 24.0106627 0.1341384 0.8738968
Amolops iriodes 33.92502 29.0342717 0.1329873 1.0936796
Amolops formosus 33.18429 16.7207543 0.1335122 0.8485461
Amolops gerbillus 33.18895 20.3652108 0.1325792 0.9753305
Amolops granulosus 33.74674 11.5421489 0.1316467 0.5290846
Amolops lifanensis 33.04941 10.2333069 0.1374920 0.5320435
Amolops hainanensis 33.14426 49.0627889 0.1320012 1.7410919
Amolops hongkongensis 33.09714 40.9462832 0.1360458 1.4800370
Amolops jaunsari 33.14461 17.2128486 0.1341782 0.8029931
Amolops jinjiangensis 33.12608 14.7236644 0.1336047 0.8744822
Amolops tuberodepressus 33.14968 24.5858093 0.1325232 1.0735413
Amolops loloensis 33.09788 17.6094523 0.1343013 0.8500152
Amolops mantzorum 33.12913 12.2131612 0.1341193 0.6624975
Amolops kaulbacki 33.04899 17.4332208 0.1371004 0.9095366
Amolops larutensis 33.11471 44.8531343 0.1365602 1.5865765
Amolops longimanus 33.72273 25.8073179 0.1365734 1.1436013
Amolops marmoratus 33.20643 23.4696824 0.1341763 1.0112268
Amolops medogensis 33.21921 13.3786966 0.1341189 0.8121172
Amolops mengyangensis 33.02641 23.8186119 0.1364861 1.0209959
Amolops minutus 33.19330 28.7126511 0.1335837 1.1162751
Amolops monticola 33.03901 13.7608384 0.1361774 0.7896819
Amolops panhai 33.22372 33.5909936 0.1302906 1.1787383
Amolops ricketti 33.15176 22.5995992 0.1351319 0.8216175
Amolops wuyiensis 33.25416 22.2176829 0.1316525 0.8203297
Amolops spinapectoralis 33.15246 31.2106695 0.1344849 1.1119492
Amolops splendissimus 33.23531 26.0387289 0.1325000 1.0245921
Amolops torrentis 33.07230 52.3421529 0.1348497 1.8582779
Amolops viridimaculatus 33.14203 21.2838301 0.1367685 1.0126647
Babina holsti 33.42207 44.9970826 0.1350286 1.6325056
Babina subaspera 33.13875 41.8340602 0.1362651 1.5364482
Odorrana absita 32.57304 29.8235633 0.1330908 1.0633775
Odorrana khalam 32.57789 26.8160651 0.1333100 0.9458925
Odorrana amamiensis 32.66202 40.0118410 0.1328575 1.4676651
Odorrana narina 32.58249 47.0774461 0.1353837 1.7030618
Odorrana supranarina 32.57679 41.5222249 0.1334412 1.4794741
Odorrana jingdongensis 32.60008 21.4208297 0.1351254 0.9194860
Odorrana grahami 32.63454 18.0768137 0.1324823 0.8383472
Odorrana junlianensis 32.64752 19.4468490 0.1339170 0.8016456
Odorrana anlungensis 32.64521 19.4867443 0.1325801 0.7954388
Odorrana aureola 32.61765 27.0670084 0.1345619 0.9797208
Odorrana livida 32.59824 29.3198362 0.1369741 1.0321092
Odorrana chloronota 32.57719 23.8318769 0.1363539 0.8809783
Odorrana leporipes 32.50690 27.0667424 0.1352392 0.9511375
Odorrana graminea 32.60172 32.9823782 0.1347148 1.1686813
Odorrana bacboensis 32.59256 23.3479389 0.1348466 0.8807860
Odorrana hainanensis 32.65427 50.7123178 0.1338131 1.8015070
Odorrana banaorum 32.56605 25.8259550 0.1324327 0.9038989
Odorrana morafkai 32.60684 29.2396120 0.1329602 1.0295655
Odorrana bolavensis 32.57741 28.8966072 0.1339446 1.0065076
Odorrana chapaensis 32.59398 21.9248746 0.1360166 0.8441888
Odorrana geminata 32.55539 24.6162680 0.1338928 0.9516788
Odorrana exiliversabilis 32.72082 16.4137263 0.1336788 0.6000984
Odorrana nasuta 32.68486 45.9310077 0.1334406 1.6346439
Odorrana versabilis 32.72928 20.4742590 0.1344829 0.7544039
Odorrana gigatympana 32.59192 30.1221354 0.1352696 1.0652620
Odorrana hejiangensis 32.57692 14.1698372 0.1344244 0.5702983
Odorrana hosii 32.56841 41.2821509 0.1335087 1.4604710
Odorrana schmackeri 32.59093 14.9017318 0.1353297 0.5721473
Odorrana indeprensa 32.65667 31.1677668 0.1330867 1.0666658
Odorrana ishikawae 32.56161 42.3212467 0.1358735 1.5315015
Odorrana kuangwuensis 32.60661 10.8042194 0.1331159 0.4518653
Odorrana margaretae 32.61945 14.6376738 0.1364481 0.5997134
Odorrana lungshengensis 32.59254 20.4169065 0.1339699 0.7686470
Odorrana mawphlangensis 32.52967 25.9830096 0.1364090 1.0499308
Odorrana monjerai 32.53542 40.2578116 0.1334687 1.3977162
Odorrana nasica 32.69270 26.8312802 0.1316796 0.9680645
Odorrana orba 32.55738 28.2458097 0.1348538 1.0014831
Odorrana splendida 32.54850 41.0444391 0.1359049 1.5077505
Odorrana utsunomiyaorum 32.51471 33.1015976 0.1356877 1.1812941
Odorrana tiannanensis 32.57726 27.5651492 0.1343450 1.0407415
Odorrana tormota 32.60910 14.5706917 0.1369549 0.5300616
Odorrana trankieni 32.55970 27.2969817 0.1358834 0.9951674
Odorrana wuchuanensis 32.64199 17.4305450 0.1327089 0.6712679
Odorrana yentuensis 32.61404 27.0193922 0.1342587 0.9734683
Rana amurensis 33.00096 4.2394106 0.1318924 0.2464539
Rana coreana 33.02578 10.0496838 0.1336311 0.4260121
Rana sakuraii 32.09859 10.6889121 0.1371526 0.4326171
Rana tagoi 32.80907 11.6617416 0.1336728 0.4692583
Rana pyrenaica 31.82601 5.9804209 0.1329434 0.2903853
Rana italica 31.73597 7.1800944 0.1340469 0.3138864
Rana asiatica 32.66387 5.5201404 0.1340863 0.3488347
Rana macrocnemis 32.63539 7.3767640 0.1339631 0.3644144
Rana tavasensis 31.88346 9.9276168 0.1311046 0.4582389
Rana pseudodalmatina 32.72514 9.5893504 0.1332046 0.4771051
Rana aurora 32.38134 5.6018105 0.1324466 0.3312136
Rana muscosa 31.51051 8.5783049 0.1344169 0.4246923
Rana sierrae 32.39104 7.5541213 0.1358650 0.4192967
Rana draytonii 32.37649 8.4820316 0.1386862 0.4304917
Rana chaochiaoensis 32.97634 13.0649104 0.1329623 0.6106310
Rana zhenhaiensis 33.17701 13.3911016 0.1331765 0.4890543
Rana omeimontis 32.91606 10.0770380 0.1318776 0.4310531
Rana hanluica 33.13891 13.5768357 0.1334667 0.5048711
Rana japonica 33.20863 9.9594583 0.1315259 0.4015722
Rana kukunoris 30.52672 3.6827245 0.1397259 0.2654785
Rana huanrensis 29.54801 6.8367098 0.1368803 0.3059040
Rana pirica 29.36064 4.8586117 0.1402077 0.2746369
Rana ornativentris 29.91526 8.5711169 0.1399334 0.3498978
Rana dalmatina 33.02775 7.6503805 0.1344551 0.3780462
Rana latastei 32.83497 8.9256854 0.1339196 0.4166030
Rana graeca 32.91905 10.6812868 0.1354888 0.5107871
Rana johnsi 32.80924 18.8277604 0.1344104 0.7217826
Rana tsushimensis 32.94718 12.5451933 0.1351112 0.4937246
Rana sangzhiensis 32.14614 18.3420526 0.1326363 0.6874427
Rana shuchinae 32.08207 11.2516102 0.1345247 0.6434477
Glandirana minima 33.67199 23.3289536 0.1335388 0.8580812
Pterorana khare 33.65817 28.7939915 0.1343344 1.1133573
Sanguirana everetti 32.69940 45.3944045 0.1336807 1.6447996
Sanguirana igorota 32.72852 48.9131068 0.1320049 1.7460662
Sanguirana sanguinea 32.72760 46.4155884 0.1328430 1.6643249
Sanguirana tipanan 33.51510 53.6608063 0.1346740 1.9065739
Hylarana chitwanensis 33.53630 23.6614627 0.1313977 1.0775179
Hylarana garoensis 33.52155 22.8546308 0.1356110 1.0033888
Hylarana macrodactyla 33.46014 32.4126321 0.1329293 1.1555581
Hylarana margariana 32.84083 25.3822606 0.1337270 0.9581327
Hylarana montivaga 32.91624 33.7271775 0.1347548 1.2154664
Hylarana persimilis 33.64623 33.6910382 0.1306178 1.1491573
Hylarana taipehensis 33.52070 28.3584151 0.1337640 1.0169368
Hylarana tytleri 33.61876 28.3796188 0.1331199 1.0440570
Pelophylax bedriagae 34.61256 15.0951917 0.1322584 0.6540504
Pelophylax caralitanus 34.69599 11.2044652 0.1321087 0.5150636
Pelophylax cerigensis 34.71231 22.5849008 0.1305984 0.9189920
Pelophylax kurtmuelleri 34.66453 12.1823997 0.1299983 0.5415747
Pelophylax ridibundus 34.68801 7.7036209 0.1317450 0.3833080
Pelophylax bergeri 34.65935 9.3080097 0.1321746 0.3925843
Pelophylax shqipericus 34.56027 9.1337703 0.1314194 0.4068579
Pelophylax chosenicus 34.64755 9.7332115 0.1332570 0.4288022
Pelophylax plancyi 34.68506 10.5971311 0.1304076 0.4233562
Pelophylax nigromaculatus 34.61127 10.4226533 0.1295350 0.4563814
Pelophylax hubeiensis 34.61296 14.1484946 0.1355375 0.5250549
Pelophylax cretensis 34.63876 21.0623690 0.1332766 0.8458434
Pelophylax epeiroticus 34.56774 13.2097610 0.1339338 0.6366595
Pelophylax fukienensis 34.59532 17.8147584 0.1329365 0.6514172
Pelophylax porosus 34.69703 11.9042867 0.1297662 0.4803182
Pelophylax tenggerensis 34.57188 9.2949087 0.1315838 0.4913381
Pelophylax terentievi 34.61304 9.7079506 0.1313005 0.6572904
Clinotarsus alticola 33.22293 31.5811226 0.1360188 1.1983108
Clinotarsus curtipes 33.86592 29.8464878 0.1338127 1.0866341
Huia cavitympanum 33.90005 49.2057770 0.1326085 1.7607586
Meristogenys amoropalamus 33.18998 44.3222762 0.1369138 1.6153975
Meristogenys orphnocnemis 33.24455 48.5226699 0.1346864 1.7428979
Meristogenys whiteheadi 33.25898 50.4395525 0.1312296 1.8063013
Meristogenys poecilus 33.28508 41.8108780 0.1331460 1.4713918
Meristogenys macrophthalmus 33.30939 50.4592370 0.1314740 1.7886923
Meristogenys jerboa 33.25331 51.1942699 0.1338703 1.7973844
Meristogenys phaeomerus 33.25006 44.0716977 0.1339396 1.5614177
Meristogenys kinabaluensis 33.24449 48.4273587 0.1311321 1.7595068
Staurois parvus 33.52683 55.5664515 0.1343101 2.0298614
Staurois tuberilinguis 33.50374 48.1562514 0.1355964 1.7198447
Staurois latopalmatus 33.45530 49.9996804 0.1345455 1.7831465
Buergeria buergeri 35.53063 13.2187867 0.1310527 0.5283378
Buergeria oxycephala 35.51347 48.5880696 0.1311981 1.7254816
Buergeria robusta 35.45206 45.1765667 0.1334165 1.6357832
Chiromantis kelleri 34.34138 26.1610641 0.1342566 1.0812862
Chiromantis petersii 34.28138 23.5261330 0.1332454 1.0403425
Chiromantis xerampelina 34.27738 22.7577252 0.1302941 0.9252885
Chiromantis rufescens 34.24738 36.7560763 0.1329333 1.3397171
Feihyla kajau 34.23177 39.1486093 0.1340809 1.3949759
Feihyla palpebralis 34.24272 28.1783855 0.1334098 1.0497809
Ghatixalus asterops 34.28458 29.6735875 0.1343876 1.0577111
Ghatixalus variabilis 34.20414 20.7813556 0.1373084 0.7619503
Polypedates chlorophthalmus 34.48901 38.9850892 0.1327587 1.3880337
Polypedates colletti 35.02408 37.2350438 0.1343483 1.3241167
Polypedates cruciger 34.95848 30.4012616 0.1329198 1.0782838
Polypedates insularis 35.01122 47.1666120 0.1308848 1.6873475
Polypedates macrotis 34.94310 40.8463746 0.1325272 1.4480928
Polypedates maculatus 34.99914 21.0567314 0.1335008 0.7791250
Polypedates megacephalus 35.05278 22.9054732 0.1336873 0.8414945
Polypedates mutus 35.01386 22.9082478 0.1326270 0.8514266
Polypedates occidentalis 34.91986 24.7931042 0.1340832 0.8665060
Polypedates otilophus 35.00593 43.3527401 0.1314744 1.5535475
Polypedates pseudocruciger 35.06188 26.6378681 0.1306674 0.9616056
Polypedates taeniatus 35.06703 20.9256390 0.1299878 0.8542592
Polypedates zed 34.97955 23.5289908 0.1331363 1.0708110
Taruga eques 34.87960 30.9534438 0.1337377 1.1170447
Taruga fastigo 34.94060 27.8826277 0.1314375 1.0117671
Taruga longinasus 34.88801 33.1563582 0.1328128 1.1971205
Gracixalus ananjevae 34.18389 31.4186660 0.1311553 1.1291754
Gracixalus jinxiuensis 34.22680 25.7041817 0.1323061 0.9347917
Gracixalus medogensis 34.23031 12.9567041 0.1304974 0.7859256
Gracixalus gracilipes 34.12446 28.4634327 0.1373368 1.0906111
Gracixalus quangi 34.15759 32.0604396 0.1333532 1.2188761
Gracixalus supercornutus 34.20360 31.5019639 0.1328328 1.1219696
Rhacophorus vampyrus 34.26833 30.4880075 0.1350440 1.0723643
Kurixalus appendiculatus 33.62933 48.7688137 0.1355145 1.7689886
Kurixalus baliogaster 33.45191 27.7273637 0.1309766 0.9768165
Kurixalus banaensis 33.49511 29.0667894 0.1311191 1.0349718
Kurixalus bisacculus 33.56770 31.8585202 0.1323910 1.1181280
Kurixalus odontotarsus 33.51163 22.4818070 0.1320775 0.8930485
Kurixalus verrucosus 33.43671 26.5657733 0.1318992 0.9764279
Kurixalus naso 33.42328 18.9194816 0.1364593 0.9078617
Kurixalus idiootocus 32.97881 33.0368928 0.1357364 1.1948722
Pseudophilautus abundus 34.25310 30.1980291 0.1336262 1.0889111
Pseudophilautus alto 34.18249 33.4910045 0.1340856 1.2090538
Pseudophilautus amboli 34.26727 19.9114120 0.1335834 0.7469849
Pseudophilautus wynaadensis 34.30476 32.2989270 0.1356874 1.1743121
Pseudophilautus asankai 34.26951 32.1618591 0.1363632 1.1608209
Pseudophilautus auratus 34.26863 32.6656861 0.1355667 1.1852392
Pseudophilautus caeruleus 34.25403 28.0954084 0.1368206 1.0199254
Pseudophilautus cavirostris 34.34421 30.5461669 0.1326215 1.1032235
Pseudophilautus cuspis 34.43293 31.9212738 0.1346475 1.1526645
Pseudophilautus decoris 34.27354 29.2194346 0.1344528 1.0627913
Pseudophilautus mittermeieri 34.32208 32.8577026 0.1340431 1.1840891
Pseudophilautus femoralis 34.36389 30.2126967 0.1352023 1.0910137
Pseudophilautus poppiae 34.39935 29.9913492 0.1313006 1.0881275
Pseudophilautus mooreorum 34.30495 35.1876284 0.1325986 1.2653367
Pseudophilautus fergusonianus 34.25549 30.1877331 0.1340485 1.0717810
Pseudophilautus folicola 34.27601 32.8112075 0.1322098 1.1850514
Pseudophilautus frankenbergi 34.25750 30.6765462 0.1306174 1.0971043
Pseudophilautus fulvus 34.16010 30.1707649 0.1351568 1.0862951
Pseudophilautus schmarda 34.29825 32.6048120 0.1335525 1.1781872
Pseudophilautus kani 34.21064 44.8468944 0.1329923 1.6151481
Pseudophilautus limbus 34.29267 33.4422061 0.1348423 1.2077911
Pseudophilautus lunatus 34.28278 30.0171342 0.1342868 1.0857800
Pseudophilautus macropus 33.76313 31.8521691 0.1343414 1.1479329
Pseudophilautus microtympanum 34.35567 29.4925346 0.1339203 1.0666129
Pseudophilautus steineri 34.25480 33.4867649 0.1339260 1.2042118
Pseudophilautus nemus 34.33321 31.7540911 0.1340080 1.1496005
Pseudophilautus ocularis 34.31650 27.7206503 0.1324595 1.0056702
Pseudophilautus reticulatus 34.27698 32.6738768 0.1331543 1.1824134
Pseudophilautus pleurotaenia 34.29362 33.8006262 0.1333342 1.2126163
Pseudophilautus popularis 34.29252 29.8661115 0.1341081 1.0635059
Pseudophilautus regius 34.24579 30.9862663 0.1352956 1.1074024
Pseudophilautus rus 34.27489 31.4038627 0.1319665 1.1306975
Pseudophilautus sarasinorum 33.80154 31.8914351 0.1330379 1.1399887
Pseudophilautus semiruber 34.48474 31.3821533 0.1335145 1.1310128
Pseudophilautus simba 34.39360 29.9716299 0.1349421 1.0875275
Pseudophilautus singu 34.34080 32.3879094 0.1329781 1.1691694
Pseudophilautus sordidus 34.31275 29.9130318 0.1346543 1.0807674
Pseudophilautus stellatus 34.35611 30.9200396 0.1321691 1.1240310
Pseudophilautus stictomerus 34.22797 33.9138275 0.1344049 1.2078419
Pseudophilautus stuarti 34.26899 29.4516889 0.1338642 1.0571128
Pseudophilautus tanu 34.29012 28.6644322 0.1332671 1.0395377
Pseudophilautus viridis 34.33474 31.3679822 0.1332078 1.1368796
Pseudophilautus zorro 34.47227 31.0119183 0.1348226 1.1200387
Raorchestes akroparallagi 34.28904 30.4172663 0.1322251 1.1082105
Raorchestes bobingeri 34.19220 39.1007654 0.1333842 1.4096064
Raorchestes glandulosus 34.14888 30.7768668 0.1360912 1.1240610
Raorchestes anili 34.41560 34.4946708 0.1338031 1.2474013
Raorchestes kaikatti 34.28907 29.0763346 0.1324870 1.0201374
Raorchestes sushili 34.24295 28.7785882 0.1341557 1.0050397
Raorchestes beddomii 34.33428 32.3873150 0.1333225 1.1579987
Raorchestes munnarensis 34.41927 32.8394718 0.1340069 1.1694862
Raorchestes resplendens 34.48363 27.5319984 0.1336291 0.9840720
Raorchestes dubois 34.24146 31.3442262 0.1344996 1.1170372
Raorchestes bombayensis 34.31682 26.1674111 0.1284632 0.9688925
Raorchestes tuberohumerus 34.28785 24.1306239 0.1315863 0.8850969
Raorchestes charius 34.28398 33.7616691 0.1310064 1.2569264
Raorchestes griet 34.27462 27.1200340 0.1329062 0.9668984
Raorchestes coonoorensis 34.35610 19.9393726 0.1327912 0.7335199
Raorchestes chlorosomma 34.27637 31.2039627 0.1344517 1.1237528
Raorchestes luteolus 34.29101 23.0531019 0.1313639 0.8476617
Raorchestes travancoricus 34.28469 43.0788144 0.1315133 1.5632392
Raorchestes chotta 34.20215 40.0222138 0.1348330 1.4365240
Raorchestes chromasynchysi 34.28074 29.9076402 0.1302659 1.1007476
Raorchestes signatus 34.36663 22.9901152 0.1321500 0.8303023
Raorchestes tinniens 34.36823 23.0401163 0.1358839 0.8472012
Raorchestes graminirupes 34.42840 40.9733399 0.1358570 1.4744403
Raorchestes gryllus 34.25946 31.5105348 0.1330607 1.1180049
Raorchestes menglaensis 33.67226 25.8341394 0.1332146 1.0471452
Raorchestes longchuanensis 34.23274 24.0018132 0.1316562 0.9778726
Raorchestes marki 34.24917 28.9378452 0.1321800 1.0123274
Raorchestes nerostagona 34.19729 21.2009078 0.1351085 0.7796698
Raorchestes ochlandrae 34.30312 30.0058043 0.1335718 1.0877171
Raorchestes parvulus 34.28412 31.3970794 0.1347159 1.1442962
Raorchestes ponmudi 34.24369 32.6061583 0.1355034 1.1792607
Nyctixalus margaritifer 33.96612 32.7674855 0.1334370 1.1785866
Nyctixalus spinosus 34.08559 49.3313274 0.1351343 1.7904617
Philautus abditus 33.08146 26.8708730 0.1328078 0.9510400
Philautus acutirostris 32.27012 36.1578249 0.1361468 1.3104637
Philautus acutus 33.50546 42.0587075 0.1340149 1.5427405
Philautus aurantium 33.49888 48.4938794 0.1374585 1.7613234
Philautus amoenus 33.56342 54.5597952 0.1347763 2.0044806
Philautus mjobergi 33.53594 50.3045151 0.1372959 1.8434940
Philautus aurifasciatus 33.47546 41.7225055 0.1361537 1.4949362
Philautus bunitus 33.63437 44.3226821 0.1342997 1.6020782
Philautus kerangae 33.59180 40.9480741 0.1357995 1.5162208
Philautus cardamonus 33.56965 30.6275375 0.1353598 1.0456830
Philautus cornutus 33.56883 42.4874141 0.1356628 1.4589507
Philautus davidlabangi 33.55836 38.8261442 0.1325805 1.3781809
Philautus disgregus 33.57289 50.6179386 0.1341868 1.7928139
Philautus erythrophthalmus 33.49827 44.5322800 0.1361097 1.5985048
Philautus everetti 33.46413 55.7098764 0.1340567 2.0008963
Philautus garo 33.48596 28.5457645 0.1312356 1.1151553
Philautus gunungensis 33.46584 56.1725888 0.1376262 2.0682973
Philautus hosii 33.45371 39.6693542 0.1360454 1.4235797
Philautus ingeri 33.57186 42.2114237 0.1347566 1.5474563
Philautus kempiae 33.49445 28.5019185 0.1355009 1.1130475
Philautus kempii 33.51911 12.4601912 0.1352888 0.6987453
Philautus leitensis 33.57469 47.2218274 0.1325023 1.7124781
Philautus longicrus 33.49009 61.0206571 0.1359094 2.2066619
Philautus maosonensis 33.44663 29.0234107 0.1353771 1.0678661
Philautus microdiscus 33.51359 21.8556822 0.1327521 1.0414129
Philautus namdaphaensis 33.48893 26.3953524 0.1351760 1.1798584
Philautus pallidipes 33.56452 28.1236791 0.1351250 0.9823343
Philautus petersi 33.69632 62.1534248 0.1327375 2.2544019
Philautus poecilius 33.54884 35.3226529 0.1345371 1.2746567
Philautus refugii 33.52199 47.5268615 0.1350634 1.6871277
Philautus saueri 33.58897 58.3663617 0.1359725 2.1467695
Philautus schmackeri 33.52931 48.5492307 0.1343325 1.7453368
Philautus similipalensis 33.70881 27.7287218 0.1344276 0.9194723
Philautus surrufus 33.35210 43.0827088 0.1372878 1.5614544
Philautus tectus 33.51703 42.5047621 0.1357995 1.5136641
Philautus tytthus 33.54514 27.0965083 0.1329037 1.1209666
Philautus umbra 33.61853 42.9312718 0.1341892 1.5696680
Philautus vermiculatus 33.48937 39.3626831 0.1356311 1.3913814
Philautus vittiger 33.53057 34.7732031 0.1346622 1.2351075
Philautus worcesteri 33.67986 47.9581764 0.1359593 1.7296716
Rhacophorus angulirostris 34.21538 46.5301808 0.1347259 1.7263865
Rhacophorus annamensis 33.73781 29.3746198 0.1359779 1.0251321
Rhacophorus exechopygus 34.20079 28.5283785 0.1349877 1.0111370
Rhacophorus baluensis 34.31363 40.2214663 0.1339015 1.4631954
Rhacophorus barisani 33.79648 46.9312302 0.1329860 1.6523611
Rhacophorus gauni 34.28807 43.7150709 0.1352133 1.5545693
Rhacophorus gadingensis 34.26541 52.2521692 0.1340214 1.8672722
Rhacophorus bifasciatus 33.74028 49.7472039 0.1323424 1.7744960
Rhacophorus bimaculatus 34.22539 52.3500046 0.1353855 1.8913175
Rhacophorus bipunctatus 34.18711 28.9020166 0.1345694 1.1152326
Rhacophorus rhodopus 34.19711 25.8419551 0.1346370 1.0096799
Rhacophorus reinwardtii 34.20950 42.3511962 0.1350358 1.5416306
Rhacophorus calcadensis 34.29437 30.7263597 0.1337252 1.0917939
Rhacophorus calcaneus 34.15291 35.0887982 0.1329451 1.2660191
Rhacophorus catamitus 33.78570 43.4451977 0.1325237 1.5332590
Rhacophorus translineatus 34.30934 14.3463192 0.1318332 0.7827558
Rhacophorus pardalis 34.23761 43.5602210 0.1328676 1.5634456
Rhacophorus fasciatus 34.15076 50.7193236 0.1329237 1.8249644
Rhacophorus harrissoni 34.24655 42.6567105 0.1322725 1.5169530
Rhacophorus rufipes 34.22895 42.8755721 0.1313595 1.5134232
Rhacophorus georgii 34.31250 46.8593344 0.1340060 1.7273817
Rhacophorus helenae 34.29469 26.1352044 0.1334346 0.8898189
Rhacophorus kio 34.25836 27.0833690 0.1335241 1.0388316
Rhacophorus hoanglienensis 34.35968 27.3055371 0.1343087 1.0630306
Rhacophorus lateralis 34.29864 25.8537975 0.1337109 0.9500845
Rhacophorus malabaricus 34.25791 28.2036569 0.1345907 1.0280316
Rhacophorus pseudomalabaricus 34.31042 32.5703932 0.1330654 1.1621785
Rhacophorus margaritifer 33.72706 37.8540545 0.1346667 1.3586963
Rhacophorus marmoridorsum 34.25166 35.9397960 0.1303003 1.2860451
Rhacophorus modestus 33.69630 49.0610570 0.1363611 1.7039393
Rhacophorus monticola 33.79878 58.6567400 0.1341880 2.1933935
Rhacophorus nigropalmatus 34.16209 40.7907944 0.1354595 1.4367601
Rhacophorus orlovi 33.81781 32.5561589 0.1317460 1.1529287
Rhacophorus verrucopus 34.33080 13.0317001 0.1318897 0.7894793
Rhacophorus poecilonotus 34.28803 43.2178927 0.1332314 1.5622328
Rhacophorus robertingeri 33.78444 33.4458313 0.1320646 1.1851400
Rhacophorus robinsonii 34.29187 40.0922422 0.1327725 1.4168280
Rhacophorus spelaeus 34.16999 30.5257348 0.1356809 1.0698763
Rhacophorus tuberculatus 34.19721 17.2979458 0.1347610 0.8474985
Rhacophorus turpes 34.24761 27.7063315 0.1328231 1.1444056
Theloderma asperum 34.36683 37.9820408 0.1364111 1.3523752
Theloderma rhododiscus 34.25124 22.0733284 0.1352557 0.8249338
Theloderma bicolor 34.50427 22.4749187 0.1353173 0.9397243
Theloderma corticale 34.39695 25.3003852 0.1331091 0.9164720
Theloderma gordoni 34.47766 32.2603370 0.1324899 1.1950127
Theloderma leporosum 34.24921 38.2935419 0.1353218 1.3462841
Theloderma horridum 34.27303 41.6439930 0.1346373 1.4841784
Theloderma laeve 34.29306 29.9164081 0.1319626 1.0544573
Theloderma lateriticum 34.23879 27.4200061 0.1330211 1.0240944
Theloderma licin 34.25980 41.6557903 0.1344783 1.4797533
Theloderma moloch 34.30166 14.7865597 0.1341532 0.8029772
Theloderma nagalandense 34.20684 26.2502075 0.1330357 1.0309790
Theloderma nebulosum 34.06100 32.5014440 0.1341250 1.1561129
Theloderma truongsonense 33.68407 31.0461196 0.1349781 1.0951407
Theloderma phrynoderma 34.27567 29.5363079 0.1340946 1.0558458
Theloderma ryabovi 34.28939 32.6979523 0.1355901 1.1834989
Theloderma stellatum 34.15408 34.9758181 0.1337790 1.2126933
Liuixalus hainanus 34.57256 48.9988299 0.1329657 1.7472446
Liuixalus ocellatus 34.58056 49.8857885 0.1347608 1.7705730
Liuixalus romeri 34.56632 37.9318605 0.1317228 1.3703468
Boophis albilabris 34.06437 38.9554940 0.1338597 1.4885053
Boophis occidentalis 33.67070 37.1508958 0.1311617 1.3938193
Boophis albipunctatus 33.72313 39.0904497 0.1324941 1.5239013
Boophis tampoka 34.16652 41.8103370 0.1334125 1.5184275
Boophis jaegeri 34.17109 40.8562277 0.1349567 1.5044736
Boophis anjanaharibeensis 34.18583 29.7782832 0.1360104 1.1101449
Boophis septentrionalis 33.68424 36.0138983 0.1356782 1.3496565
Boophis englaenderi 33.64994 34.7881677 0.1369490 1.3005209
Boophis ankaratra 33.67656 34.4800195 0.1345590 1.3410974
Boophis schuboeae 33.64515 35.2884911 0.1372963 1.3624588
Boophis andreonei 34.09384 32.2603144 0.1340973 1.2026965
Boophis sibilans 33.69541 35.4499497 0.1333474 1.3606438
Boophis blommersae 34.11188 38.8762896 0.1353567 1.4589149
Boophis andohahela 34.21935 35.6031592 0.1301002 1.3701271
Boophis elenae 34.11134 34.7150799 0.1351387 1.3692929
Boophis axelmeyeri 33.62996 34.0543554 0.1361582 1.2730890
Boophis burgeri 34.09968 38.2517764 0.1354536 1.5365388
Boophis reticulatus 33.66026 36.5767871 0.1344820 1.4028022
Boophis rufioculis 33.61280 36.6301004 0.1343463 1.4424695
Boophis boehmei 33.68131 37.0553398 0.1336642 1.4459310
Boophis quasiboehmei 33.63817 35.6705036 0.1348702 1.3721913
Boophis popi 33.61279 32.1633218 0.1357799 1.2399767
Boophis fayi 34.07399 37.4406178 0.1367128 1.4020448
Boophis brachychir 33.73740 41.1841114 0.1321448 1.5396988
Boophis entingae 33.75033 37.6843553 0.1335486 1.4294428
Boophis goudotii 34.11725 36.2411670 0.1350650 1.3915042
Boophis obscurus 34.10277 35.2090538 0.1329744 1.3561371
Boophis luciae 33.71429 38.9369364 0.1334978 1.5344392
Boophis luteus 33.60363 38.8003663 0.1337557 1.5012660
Boophis madagascariensis 34.08954 39.4038484 0.1342462 1.5146443
Boophis roseipalmatus 33.59170 35.1516803 0.1372713 1.3126439
Boophis liami 33.78635 31.8098389 0.1329460 1.2785338
Boophis sambirano 33.69325 31.9103594 0.1350377 1.1973406
Boophis mandraka 33.79446 41.2425777 0.1321183 1.5958477
Boophis andrangoloaka 34.06832 37.7594008 0.1343904 1.4589295
Boophis rhodoscelis 34.08922 36.4168672 0.1330470 1.4284374
Boophis laurenti 33.74421 36.7093774 0.1342507 1.3950964
Boophis lilianae 33.68272 29.8478706 0.1326108 1.1520277
Boophis arcanus 34.19453 38.4792269 0.1359567 1.5098720
Boophis feonnyala 34.17979 41.1879760 0.1334815 1.6500919
Boophis haematopus 34.23794 40.8525549 0.1339867 1.5928057
Boophis pyrrhus 33.84013 36.2357293 0.1301170 1.4107740
Boophis miniatus 33.75028 34.9717947 0.1327482 1.3442918
Boophis baetkei 34.16742 53.4121383 0.1337327 2.0042278
Boophis ulftunni 33.79853 35.1595309 0.1320958 1.3167583
Boophis majori 33.68672 33.0197520 0.1356375 1.2673485
Boophis narinsi 33.69647 30.0414017 0.1351719 1.1606470
Boophis picturatus 33.68199 36.6046261 0.1361604 1.4295148
Boophis microtympanum 33.63778 32.9544343 0.1349497 1.2717185
Boophis williamsi 33.66518 30.9365195 0.1342654 1.2322619
Boophis marojezensis 33.76504 30.0626098 0.1334899 1.1560176
Boophis vittatus 33.75071 33.9834500 0.1311072 1.2697035
Boophis bottae 33.78434 36.8025712 0.1327857 1.4392038
Boophis erythrodactylus 34.12429 32.9632432 0.1359858 1.2902973
Boophis rappiodes 33.67440 36.6384831 0.1338380 1.4304516
Boophis tasymena 33.69537 37.8841106 0.1327288 1.4694289
Boophis viridis 33.67003 34.1668393 0.1328601 1.3178431
Boophis periegetes 33.67379 34.8227070 0.1349447 1.3391560
Boophis solomaso 34.10433 41.4496339 0.1362846 1.6266619
Boophis haingana 33.74841 38.2940902 0.1340857 1.4824043
Boophis miadana 33.71870 39.8451102 0.1306540 1.5398452
Boophis piperatus 34.17757 31.6565999 0.1328687 1.2203205
Boophis sandrae 33.82765 30.1851884 0.1305287 1.1645161
Boophis spinophis 34.19421 34.4608425 0.1322576 1.3261784
Boophis tsilomaro 33.73504 57.8668049 0.1352057 2.1530137
Boophis opisthodon 34.14313 37.8788858 0.1332763 1.4648096
Boophis calcaratus 33.65685 35.9931077 0.1341058 1.4058575
Boophis guibei 34.14298 34.9191057 0.1334765 1.3577247
Boophis lichenoides 34.11431 37.2128291 0.1351705 1.4322248
Boophis doulioti 34.12625 35.4959227 0.1338699 1.3391923
Boophis tephraeomystax 34.13946 37.7725089 0.1312206 1.4412637
Boophis xerophilus 34.14841 38.4444079 0.1336789 1.4560324
Boophis idae 34.08289 36.6155387 0.1361890 1.4305991
Boophis pauliani 34.14750 37.1088922 0.1359723 1.4501845
Blommersia angolafa 34.14743 37.9024626 0.1346279 1.4320384
Blommersia grandisonae 34.20587 39.6795913 0.1353647 1.5299468
Blommersia kely 34.33049 37.4355846 0.1379339 1.4620689
Blommersia sarotra 34.35878 35.2472346 0.1341046 1.3964496
Blommersia blommersae 34.08131 36.6364861 0.1357203 1.4486589
Blommersia dejongi 34.27211 37.4299970 0.1338896 1.4126265
Blommersia galani 34.23268 29.8483964 0.1352150 1.1267219
Blommersia domerguei 34.24222 32.7337852 0.1358007 1.2734232
Blommersia variabilis 34.08967 37.0838899 0.1360047 1.3698919
Blommersia wittei 34.04916 43.0392219 0.1313395 1.6038493
Guibemantis albolineatus 34.13170 36.2847924 0.1323553 1.4121303
Guibemantis bicalcaratus 34.10449 37.9020362 0.1343464 1.4627794
Guibemantis methueni 34.10817 37.6956880 0.1344766 1.4656979
Guibemantis annulatus 34.13967 41.5122676 0.1327365 1.6175596
Guibemantis flavobrunneus 34.04706 35.6776623 0.1351191 1.3741055
Guibemantis pulcher 34.07965 37.5099974 0.1330232 1.4425973
Guibemantis tasifotsy 34.08494 35.4420066 0.1354543 1.3511566
Guibemantis punctatus 34.11883 42.7559830 0.1366924 1.6540575
Guibemantis wattersoni 34.10903 42.3740010 0.1353871 1.6510022
Guibemantis liber 34.12419 37.6438550 0.1323148 1.4437087
Guibemantis timidus 34.11925 35.6695311 0.1315710 1.3839937
Guibemantis depressiceps 34.08095 37.4167172 0.1329741 1.4444187
Guibemantis kathrinae 34.11303 33.6383729 0.1369639 1.3064926
Guibemantis tornieri 34.11147 39.6400987 0.1351273 1.5423541
Mantella crocea 34.56518 38.5275457 0.1332642 1.4957375
Mantella milotympanum 34.29375 36.2390093 0.1338406 1.4523111
Mantella pulchra 34.29880 35.2245238 0.1330841 1.3543522
Mantella madagascariensis 33.64387 35.8604304 0.1348189 1.4053537
Mantella betsileo 34.21755 40.5493298 0.1335361 1.5224461
Mantella ebenaui 34.26994 35.0762348 0.1325249 1.3064694
Mantella viridis 33.64132 53.4413621 0.1351426 2.0023389
Mantella expectata 33.64466 37.4414194 0.1346029 1.4271150
Mantella laevigata 34.20989 37.0130123 0.1337572 1.4066421
Mantella manery 34.23192 31.8089731 0.1335527 1.1729046
Mantella baroni 34.29344 33.3278419 0.1359808 1.3056258
Mantella haraldmeieri 33.68039 37.2617535 0.1349767 1.4341173
Mantella nigricans 33.68705 34.0767397 0.1333467 1.2800040
Mantella cowanii 33.72641 36.4550923 0.1340966 1.4269322
Mantella bernhardi 34.28862 37.5965059 0.1336858 1.4428693
Wakea madinika 34.22710 34.9638227 0.1351968 1.2699450
Boehmantis microtympanum 33.58289 39.4722532 0.1364827 1.5286143
Gephyromantis ambohitra 33.54949 38.1544158 0.1358140 1.4247573
Gephyromantis asper 34.23005 34.5245328 0.1350531 1.3410421
Gephyromantis tahotra 33.68942 29.8189369 0.1358867 1.1146836
Gephyromantis horridus 34.31959 37.1265958 0.1336272 1.3942004
Gephyromantis malagasius 34.04047 38.5288434 0.1363550 1.4944752
Gephyromantis striatus 34.15220 36.6378008 0.1361099 1.3898223
Gephyromantis ventrimaculatus 34.30115 41.3434576 0.1345964 1.6137372
Gephyromantis klemmeri 34.31366 32.1829501 0.1344881 1.2102013
Gephyromantis rivicola 33.65692 40.1579343 0.1339820 1.5125511
Gephyromantis silvanus 33.67959 33.0310121 0.1350812 1.2309118
Gephyromantis webbi 33.63809 35.0415782 0.1358031 1.3035448
Gephyromantis atsingy 34.10730 37.6406590 0.1364643 1.3758593
Gephyromantis azzurrae 33.69919 36.9543227 0.1315305 1.4093634
Gephyromantis corvus 34.22860 37.8599530 0.1371713 1.4309832
Gephyromantis pseudoasper 34.07166 38.0997375 0.1348831 1.4276450
Gephyromantis blanci 34.22089 34.5501231 0.1345743 1.3331056
Gephyromantis runewsweeki 34.17763 32.9895992 0.1357077 1.2765962
Gephyromantis enki 34.18756 35.9806166 0.1355563 1.3868298
Gephyromantis boulengeri 34.15368 35.6513114 0.1332648 1.3770796
Gephyromantis eiselti 34.07231 35.4928269 0.1353647 1.4157856
Gephyromantis mafy 33.98416 41.8352760 0.1357996 1.6489214
Gephyromantis thelenae 34.08517 39.8846099 0.1320861 1.5992640
Gephyromantis decaryi 33.98624 36.5601859 0.1371059 1.4097783
Gephyromantis hintelmannae 34.01144 38.8920330 0.1364066 1.5269919
Gephyromantis verrucosus 34.04441 33.6588640 0.1351796 1.2777173
Gephyromantis leucocephalus 34.24599 42.7014476 0.1338787 1.6557973
Gephyromantis ranjomavo 33.66289 31.3014835 0.1346679 1.1825109
Gephyromantis spiniferus 34.30883 42.1018165 0.1337423 1.6182287
Gephyromantis cornutus 33.50278 39.1076784 0.1342327 1.5515885
Gephyromantis tschenki 34.02949 37.6510606 0.1347823 1.4597015
Gephyromantis redimitus 33.99142 40.0604852 0.1359301 1.5382619
Gephyromantis granulatus 34.19031 37.1653185 0.1365775 1.3925261
Gephyromantis moseri 34.03625 35.3342509 0.1341706 1.3532881
Gephyromantis leucomaculatus 34.14442 35.5544092 0.1357843 1.3391123
Gephyromantis zavona 33.58406 32.4633388 0.1335833 1.2100552
Gephyromantis salegy 34.09330 35.0445412 0.1338625 1.3152886
Gephyromantis schilfi 34.00196 34.6257679 0.1350030 1.2895591
Gephyromantis tandroka 33.58216 33.1136373 0.1340923 1.2413554
Gephyromantis luteus 34.27442 37.1948302 0.1344481 1.4325199
Gephyromantis sculpturatus 34.32264 36.3899797 0.1330565 1.4225320
Gephyromantis plicifer 34.00912 34.9796505 0.1356264 1.3470014
Mantidactylus aerumnalis 34.20646 36.2351846 0.1351758 1.4062689
Mantidactylus albofrenatus 33.56801 35.1420010 0.1357779 1.4108255
Mantidactylus brevipalmatus 33.56565 38.5534333 0.1350136 1.4878144
Mantidactylus delormei 33.65246 36.0594471 0.1331606 1.3748473
Mantidactylus paidroa 33.62583 33.2821313 0.1309444 1.2851184
Mantidactylus alutus 34.33717 37.4036551 0.1367543 1.4484701
Mantidactylus curtus 33.55380 40.0025550 0.1338267 1.5201414
Mantidactylus madecassus 33.62834 39.3632699 0.1352063 1.5113206
Mantidactylus pauliani 33.58380 35.0716629 0.1361633 1.3991732
Mantidactylus bellyi 33.56414 42.2556622 0.1332361 1.5815824
Mantidactylus ulcerosus 33.53829 36.4278942 0.1347924 1.3729053
Mantidactylus betsileanus 33.55022 41.1804098 0.1339119 1.5709119
Mantidactylus noralottae 34.02794 36.0873812 0.1360314 1.3781139
Mantidactylus ambohimitombi 33.67438 32.6715781 0.1345807 1.2739447
Mantidactylus ambreensis 33.61719 39.0962875 0.1350499 1.4639378
Mantidactylus femoralis 33.50601 36.5425589 0.1367609 1.3953814
Mantidactylus zolitschka 33.56451 40.1238617 0.1359249 1.6095425
Mantidactylus mocquardi 33.51014 39.6624523 0.1388057 1.5220648
Mantidactylus biporus 33.64820 37.1399010 0.1323105 1.4249316
Mantidactylus bourgati 33.59725 37.0357471 0.1365414 1.4248153
Mantidactylus charlotteae 33.63082 38.4699491 0.1337205 1.4863225
Mantidactylus opiparis 33.55528 38.6968745 0.1358116 1.4791247
Mantidactylus melanopleura 33.52597 39.7596543 0.1354068 1.5309768
Mantidactylus zipperi 33.62946 40.1211153 0.1350144 1.5648265
Mantidactylus lugubris 33.60169 34.7079673 0.1349328 1.3370649
Mantidactylus tricinctus 33.57395 40.9118440 0.1346862 1.5814150
Mantidactylus majori 33.59785 38.3543017 0.1353503 1.4875496
Mantidactylus argenteus 34.08681 32.2897188 0.1319842 1.2486756
Mantidactylus cowanii 33.63801 39.0745812 0.1325754 1.5295839
Mantidactylus grandidieri 33.55878 36.3214311 0.1343737 1.4022044
Mantidactylus guttulatus 33.57074 35.1740986 0.1363710 1.3454306
Spinomantis aglavei 33.68267 36.5159729 0.1323347 1.4065561
Spinomantis fimbriatus 34.12157 35.7744988 0.1333992 1.3722590
Spinomantis tavaratra 34.08525 31.0912842 0.1332289 1.1556551
Spinomantis phantasticus 33.69033 37.9419334 0.1360104 1.4474296
Spinomantis bertini 33.72554 35.4064425 0.1343952 1.3657610
Spinomantis guibei 33.67211 43.3145221 0.1361180 1.6868688
Spinomantis microtis 33.66020 39.5837116 0.1339489 1.5354941
Spinomantis brunae 33.65240 43.7996976 0.1339881 1.7076971
Spinomantis elegans 33.74601 39.7176563 0.1336128 1.5282744
Spinomantis peraccae 34.02520 35.9703421 0.1357367 1.3769420
Spinomantis massi 34.14283 31.9997567 0.1361332 1.1968339
Tsingymantis antitra 34.32781 39.6708299 0.1348581 1.4707729
Laliostoma labrosum 34.29460 36.0655586 0.1347566 1.3591491
Aglyptodactylus securifer 34.26081 40.7942148 0.1346237 1.5174793
Aglyptodactylus laticeps 34.23987 43.2735997 0.1335303 1.6098148
Aglyptodactylus madagascariensis 34.26118 41.0900700 0.1336204 1.5891644
Oreobates gemcare 27.18024 2.9400451 0.1326552 0.2002437
Oreobates granulosus 30.08670 5.8639713 0.1394010 0.3568929
Pristimantis pharangobates 26.77105 9.0765376 0.1370976 0.4712096
Dryophytes walkeri 36.25684 11.0801553 0.1290336 0.4251331
Dendropsophus molitor 35.94550 6.5445313 0.1114455 0.2843902
Paramesotriton labiatus 33.29464 13.7005921 0.1384989 0.4894372
Hyloxalus italoi 33.54766 15.1925930 0.1376286 0.6148015
Polypedates braueri 35.69335 4.4672186 0.1396728 0.1748780
Hynobius fucus 29.53878 16.7055366 0.1387388 0.6095587
Cynops orientalis 34.43684 5.4331496 0.1463195 0.1994169
Cophixalus australis 32.31767 19.6651206 0.1467242 0.7645302
Chalcorana labialis 32.96300 21.5367799 0.1317188 0.7552998
Kalophrynus limbooliati 32.94849 27.0779766 0.1411581 0.9369931
Pristimantis matidiktyo 33.79371 15.3999838 0.1477094 0.6131096
Pristimantis festae 30.38937 5.4975168 0.1405368 0.2732094
# Summary statistics
summary(species_ARR$slope)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.04859 0.13112 0.13464 0.13440 0.13813 0.21569
species_ARR %>%
    summarise(ARR = mean(slope), sd = sd(slope))
##         ARR          sd
## 1 0.1344049 0.008228308
# Figure
ggplot(species_ARR) + geom_density(aes(slope), fill = "#CE5B97", alpha = 1) + xlab("Acclimation Response Ratio (ARR)") +
    ylab("Number of species") + theme_classic() + theme(text = element_text(color = "black"),
    axis.title.x = element_text(size = 50, margin = margin(t = 40, r = 0, b = 0,
        l = 0)), axis.title.y = element_text(size = 50, margin = margin(t = 0, r = 40,
        b = 0, l = 0)), axis.text.x = element_text(size = 40, margin = margin(t = 20,
        r = 0, b = 0, l = 0)), axis.text.y = element_text(size = 40, margin = margin(t = 0,
        r = 20, b = 0, l = 0)), panel.border = element_rect(fill = NA, size = 2))

ggsave(file = "fig/Figure_S3.png", width = 20, height = 15, dpi = 500)

Fig. A3 | Variation in plastic responses across species. The acclimation response ratio (ARR) represents the magnitude change in heat tolerance limits for each degree change in environmental temperature. The variation in ARR was low (mean ± standard deviation = 0.134 ± 0.008; range = 0.049 – 0.216; n = 5203).

Fig. S4 - Community-level patterns in TSM

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_pond_current)


# Find limits for colours of the plot
tsm_min <- min(min(community_sub_current$community_TSM, na.rm = TRUE), min(community_sub_future4C$community_TSM,
    na.rm = TRUE), min(community_arb_current$community_TSM, na.rm = TRUE), min(community_arb_future4C$community_TSM,
    na.rm = TRUE), min(community_pond_current$community_TSM, na.rm = TRUE), min(community_pond_future4C$community_TSM,
    na.rm = TRUE))

tsm_max <- max(max(community_sub_current$community_TSM, na.rm = TRUE), max(community_sub_future4C$community_TSM,
    na.rm = TRUE), max(community_arb_current$community_TSM, na.rm = TRUE), max(community_arb_future4C$community_TSM,
    na.rm = TRUE), max(community_pond_current$community_TSM, na.rm = TRUE), max(community_pond_future4C$community_TSM,
    na.rm = TRUE))
Vegetated substrate
# Current
map_sub_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_sub_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_sub_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_sub_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_current.rds")
pred_community_sub_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future2C.rds")
pred_community_sub_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future4C.rds")

lat_sub_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_sub_future4C, aes(x = lat, y = community_TSM,
    size = 1/community_TSM_se), alpha = 0.7, fill = "#EF4187", col = "transparent",
    shape = 22, stroke = 0.1) + geom_point(data = community_sub_future2C, aes(x = lat,
    y = community_TSM, size = 1/community_TSM_se), alpha = 0.7, fill = "#FAA43A",
    col = "transparent", shape = 22, stroke = 0.1) + geom_point(data = community_sub_current,
    aes(x = lat, y = community_TSM, size = 1/community_TSM_se), alpha = 0.75, fill = "#5DC8D9",
    col = "transparent", shape = 22, stroke = 0.1) + geom_ribbon(data = pred_community_sub_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_sub_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_sub_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + scale_size_continuous(range = c(0.001, 1.75), guide = "none") +
    xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.title.x = element_text(size = 12),
    axis.text.x = element_text(color = "black", size = 11), axis.line = element_line(color = "black"),
    panel.border = element_rect(fill = NA, size = 2))

substrate_plot <- (map_sub_TSM_current + map_sub_TSM_future2C + map_sub_TSM_future4C +
    lat_sub_all + plot_layout(ncol = 4))
Pond or wetland
# Current
map_pond_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))



# Future +2C
map_pond_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_pond_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_pond_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_current.rds")
pred_community_pond_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future2C.rds")
pred_community_pond_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_substrate_future4C.rds")

lat_pond_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_pond_future4C, aes(x = lat, y = community_TSM,
    size = 1/community_TSM_se), alpha = 0.7, fill = "#EF4187", col = "transparent",
    shape = 22, stroke = 0.1) + geom_point(data = community_pond_future2C, aes(x = lat,
    y = community_TSM, size = 1/community_TSM_se), alpha = 0.7, fill = "#FAA43A",
    col = "transparent", shape = 22, stroke = 0.1) + geom_point(data = community_pond_current,
    aes(x = lat, y = community_TSM, size = 1/community_TSM_se), alpha = 0.7, fill = "#5DC8D9",
    col = "transparent", shape = 22, stroke = 0.1) + geom_ribbon(data = pred_community_pond_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_pond_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_pond_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + scale_size_continuous(range = c(0.001, 1.75), guide = "none") +
    xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.title.x = element_text(size = 12),
    axis.text.x = element_text(color = "black", size = 11), axis.line = element_line(color = "black"),
    panel.border = element_rect(fill = NA, size = 2))

pond_plot <- (map_pond_TSM_current + map_pond_TSM_future2C + map_pond_TSM_future4C +
    lat_pond_all + plot_layout(ncol = 4))
Above-ground vegetation
# Current
map_arb_TSM_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    name = "TSM", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(legend.position = "none",
    plot.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA, size = 2, colour = "#5DC8D9"))

# Future +2C
map_arb_TSM_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future2C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(option = "plasma",
    na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 5), limits = c(tsm_min,
        tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none",
    panel.border = element_rect(fill = NA, size = 2, colour = "#FAA43A"))

# Future +4C
map_arb_TSM_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = community_TSM), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_viridis(name = "TSM",
    option = "plasma", na.value = "gray1", direction = -1, breaks = seq(0, 40, by = 10),
    limits = c(tsm_min, tsm_max), begin = 0, end = 1) + theme_void() + theme(plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "bottom",
    panel.border = element_rect(fill = NA, size = 2, colour = "#EF4187"))

# Latitudinal patterns
pred_community_arb_current <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_current.rds")
pred_community_arb_future2C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future2C.rds")
pred_community_arb_future4C <- readRDS("RData/Models/TSM/predictions_community_lat_TSM_arboreal_future4C.rds")

lat_arb_all <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = community_arb_future4C, aes(x = lat, y = community_TSM,
    size = 1/community_TSM_se), alpha = 0.7, fill = "#EF4187", col = "transparent",
    shape = 22, stroke = 0.1) + geom_point(data = community_arb_future2C, aes(x = lat,
    y = community_TSM, size = 1/community_TSM_se), alpha = 0.7, fill = "#FAA43A",
    col = "transparent", shape = 22, stroke = 0.1) + geom_point(data = community_arb_current,
    aes(x = lat, y = community_TSM, size = 1/community_TSM_se), alpha = 0.7, fill = "#5DC8D9",
    col = "transparent", shape = 22, stroke = 0.1) + geom_ribbon(data = pred_community_arb_current,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#5DC8D9", colour = "black",
    size = 0.1) + geom_ribbon(data = pred_community_arb_future2C, aes(x = lat, ymin = lower,
    ymax = upper), fill = "#FAA43A", colour = "black", size = 0.1) + geom_ribbon(data = pred_community_arb_future4C,
    aes(x = lat, ymin = lower, ymax = upper), fill = "#EF4187", colour = "black",
    size = 0.1) + scale_size_continuous(range = c(0.001, 1.75), guide = "none") +
    xlim(-55.00099, 72.00064) + ylim(0, 40) + xlab("") + ylab("TSM") + coord_flip() +
    theme_classic() + theme(axis.text.y = element_text(color = "black", size = 11),
    aspect.ratio = 1, plot.background = element_rect(fill = "transparent", colour = NA),
    panel.background = element_rect(fill = "transparent", colour = NA), plot.margin = unit(c(0,
        0, 0, 0), "cm"), text = element_text(color = "black"), axis.title.x = element_text(size = 15),
    axis.text.x = element_text(color = "black", size = 11), axis.line = element_line(color = "black"),
    panel.border = element_rect(fill = NA, size = 2))

arboreal_plot <- (map_arb_TSM_current + map_arb_TSM_future2C + map_arb_TSM_future4C +
    lat_arb_all + plot_layout(ncol = 4))
All habitats
fig_S4 <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

fig_S4

ggsave(fig_S4, file = "fig/Figure_A4.png", width = 15, height = 7, dpi = 500)

Fig. S4 | Community-level patterns in thermal safety margin for amphibians on terrestrial (top row), aquatic (middle row), or arboreal (bottom row) microhabitats. Thermal safety margins (TSM) were calculated as the mean difference between CTmax and the predicted operative body temperature in full shade during the warmest quarters of 2006-2015 in each community (1-degree grid cell). Black color depicts areas with no data. The right panel depicts latitudinal patterns in TSM in current climates (blue) or assuming 2°C (orange) or 4°C of global warming above pre-industrial levels (pink), as predicted from generalized additive mixed models. Dashed lines represent the equator and tropics.

Fig. S5 - Number of species overheating

Load data

# Substrate data
community_sub_current <- readRDS("RData/Climate_vulnerability/Substrate/current/community_vulnerability_substrate_mean_acc_current_clipped_cells.rds")
community_sub_future2C <- readRDS("RData/Climate_vulnerability/Substrate/future2C/community_vulnerability_substrate_mean_acc_future2C_clipped_cells.rds")
community_sub_future4C <- readRDS("RData/Climate_vulnerability/Substrate/future4C/community_vulnerability_substrate_mean_acc_future4C_clipped_cells.rds")

# Pond data
community_pond_current <- readRDS("RData/Climate_vulnerability/Pond/current/community_vulnerability_pond_mean_acc_current_clipped_cells.rds")
community_pond_future2C <- readRDS("RData/Climate_vulnerability/Pond/future2C/community_vulnerability_pond_mean_acc_future2C_clipped_cells.rds")
community_pond_future4C <- readRDS("RData/Climate_vulnerability/Pond/future4C/community_vulnerability_pond_mean_acc_future4C_clipped_cells.rds")

# Above-ground vegetation
community_arb_current <- readRDS("RData/Climate_vulnerability/Arboreal/current/community_vulnerability_arboreal_mean_acc_current_clipped_cells.rds")
community_arb_future2C <- readRDS("RData/Climate_vulnerability/Arboreal/future2C/community_vulnerability_arboreal_mean_acc_future2C_clipped_cells.rds")
community_arb_future4C <- readRDS("RData/Climate_vulnerability/Arboreal/future4C/community_vulnerability_arboreal_mean_acc_future4C_clipped_cells.rds")


# Upload high resolution Earth data
world <- ne_countries(scale = "large", returnclass = "sf")
world <- world %>%
    filter(!grepl("Antarctica", name))
st_crs(world) <- st_crs(community_sub_current)

Vegetated Substrate

# Set colours
color_palette <- colorRampPalette(colors = c("#FAF218", "#EF4187", "#d90429"))
colors <- color_palette(100)
color_func <- colorRampPalette(c("gray65", colors))
color_palette <- color_func(100)

sp_min <- min(min(community_sub_current$n_species_overheating, na.rm = TRUE), min(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), min(community_pond_current$n_species_overheating, na.rm = TRUE),
    min(community_pond_future4C$n_species_overheating, na.rm = TRUE), min(community_arb_current$n_species_overheating,
        na.rm = TRUE), min(community_arb_future4C$n_species_overheating, na.rm = TRUE))

sp_max <- max(max(community_sub_current$n_species_overheating, na.rm = TRUE), max(community_sub_future4C$n_species_overheating,
    na.rm = TRUE), max(community_pond_current$n_species_overheating, na.rm = TRUE),
    max(community_pond_future4C$n_species_overheating, na.rm = TRUE), max(community_arb_current$n_species_overheating,
        na.rm = TRUE), max(community_arb_future4C$n_species_overheating, na.rm = TRUE))

# Substrate (current)
map_sub_sp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))

# Substrate (Future +2C)
map_sub_sp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future2C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Substrate (Future +4C)
map_sub_sp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_sub_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_sub <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_sub_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_sub_future2C,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#FAA43A", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    geom_point(data = filter(community_sub_current, n_species_overheating > 0), aes(x = lat,
        y = n_species_overheating), alpha = 0.85, fill = "#5DC8D9", col = "transparent",
        shape = 22, size = 1, stroke = 0.1) + xlim(-55.00099, 72.00064) + ylim(0,
    38) + xlab("") + ylab("") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

substrate_plot <- map_sub_sp_current + map_sub_sp_future2C + map_sub_sp_future4C +
    lat_sub + plot_layout(ncol = 4)

Pond or wetland

# Pond (current)
map_pond_sp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))

# Substrate (Future +2C)
map_pond_sp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future2C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0.1, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))

# Substrate (Future +4C)
map_pond_sp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_pond_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(plot.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), legend.position = "none", panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_pond <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_pond_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + xlim(-55.00099, 72.00064) +
    ylim(0, 38) + xlab("") + ylab("") + coord_flip() + theme_classic() + theme(axis.text.y = element_text(color = "black",
    size = 11), aspect.ratio = 1, plot.background = element_rect(fill = "transparent",
    colour = NA), panel.background = element_rect(fill = "transparent", colour = NA),
    plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
    axis.title.x = element_blank(), axis.text.x = element_text(color = "black", size = 11),
    axis.line = element_line(color = "black"), panel.border = element_rect(fill = NA,
        size = 2))

pond_plot <- map_pond_sp_current + map_pond_sp_future2C + map_pond_sp_future4C +
    lat_pond + plot_layout(ncol = 4)

Above-ground vegetation

# Current
map_arb_sp_current <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_current,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "none", plot.background = element_rect(fill = "transparent",
    colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
    size = 2, colour = "#5DC8D9"))

# Future +2C
map_arb_sp_future2C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future2C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "bottom", legend.text = element_text(size = 11),
    legend.title = element_text(size = 14), legend.key.height = unit(0.5, "cm"),
    legend.key.width = unit(1, "cm"), plot.background = element_rect(fill = "transparent",
        colour = NA), plot.margin = unit(c(0, 0.1, 0, 0), "cm"), panel.border = element_rect(fill = NA,
        size = 2, colour = "#FAA43A"))


# Future +4C
map_arb_sp_future4C <- ggplot() + geom_hline(yintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_hline(yintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_sf(data = world, fill = "black", col = "black") + geom_sf(data = community_arb_future4C,
    aes(fill = n_species_overheating), color = NA, alpha = 1) + coord_sf(ylim = c(-55.00099,
    72.00064), xlim = c(-166.82905, 178.56617)) + scale_fill_gradientn(colours = color_palette,
    na.value = "gray1", name = "Species overheating", limits = c(sp_min, sp_max)) +
    theme_void() + theme(legend.position = "bottom", legend.text = element_text(size = 11),
    legend.title = element_text(size = 14), legend.key.height = unit(0.5, "cm"),
    legend.key.width = unit(1, "cm"), plot.background = element_rect(fill = "transparent",
        colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), panel.border = element_rect(fill = NA,
        size = 2, colour = "#EF4187"))

# Latitudinal patterns
lat_arb <- ggplot() + geom_vline(xintercept = 0, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = 23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_vline(xintercept = -23.43663, colour = "gray", linetype = "dashed",
    size = 0.5) + geom_point(data = filter(community_arb_future4C, n_species_overheating >
    0), aes(x = lat, y = n_species_overheating), alpha = 0.85, fill = "#EF4187",
    col = "transparent", shape = 22, size = 1, stroke = 0.1) + geom_point(data = filter(community_arb_future2C,
    n_species_overheating > 0), aes(x = lat, y = n_species_overheating), alpha = 0.85,
    fill = "#FAA43A", col = "transparent", shape = 22, size = 1, stroke = 0.1) +
    geom_point(data = filter(community_arb_current, n_species_overheating > 0), aes(x = lat,
        y = n_species_overheating), alpha = 0.85, fill = "#5DC8D9", col = "transparent",
        shape = 22, size = 1, stroke = 0.1) + xlim(-55.00099, 72.00064) + ylim(0,
    38) + xlab("") + ylab("Species overheating") + coord_flip() + theme_classic() +
    theme(axis.text.y = element_text(color = "black", size = 11), aspect.ratio = 1,
        plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent",
            colour = NA), plot.margin = unit(c(0, 0, 0, 0), "cm"), text = element_text(color = "black"),
        axis.title.x = element_text(size = 13), axis.text.x = element_text(color = "black",
            size = 11), axis.line = element_line(color = "black"), legend.text = element_text(size = 15),
        legend.title = element_text(size = 18), legend.key.height = unit(0.6, "cm"),
        legend.key.width = unit(0.5, "cm"), panel.border = element_rect(fill = NA,
            size = 2))

arboreal_plot <- map_arb_sp_current + map_arb_sp_future2C + map_arb_sp_future4C +
    lat_arb + plot_layout(ncol = 4)

Final plot

fig_S5 <- (substrate_plot/pond_plot/arboreal_plot/plot_layout(ncol = 1))

fig_S5

ggsave(fig_S5, file = "fig/Figure_S5.png", width = 14, height = 7, dpi = 500)

Fig. S5 | Number of species predicted to experience overheating events in terrestrial (top row), aquatic (middle row) and arboreal (bottom row) microhabitats. The number of species overheating was assessed as the sum of species overheating at least once in the period surveyed (warmest quarters of 2006-2015) in each community (1-degree grid cell). Black color depicts areas with no data, and gray color communities without species at risk. The right panel depicts latitudinal patterns in the number of species predicted to overheat in current climates (blue) or assuming 2°C (orange) or 4°C of global warming above pre-industrial levels (pink). Dashed lines represent the equator and tropics. No species were predicted to experience overheating events in water bodies, and hence are not displayed.

Package versions

sessionInfo()
## R version 4.2.0 (2022-04-22 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 22631)
## 
## Matrix products: default
## 
## locale:
## [1] English_Australia.utf8
## 
## attached base packages:
## [1] parallel  stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] ncdf4_1.22               RNCEP_1.0.10             terra_1.7-46            
##  [4] emmeans_1.7.3            optimx_2023-10.21        ggeffects_1.2.2         
##  [7] cowplot_1.1.1            lwgeom_0.2-13            ggspatial_1.1.8         
## [10] metafor_4.2-0            numDeriv_2016.8-1.1      metadat_1.2-0           
## [13] rnaturalearthhires_0.2.1 rnaturalearthdata_0.1.0  rnaturalearth_0.3.3     
## [16] futile.logger_1.4.3      future.apply_1.10.0      furrr_0.3.1             
## [19] future_1.33.0            rlang_1.1.1              gamm4_0.2-6             
## [22] lme4_1.1-33              mgcv_1.8-40              nlme_3.1-157            
## [25] MCMCglmm_2.34            coda_0.19-4              Matrix_1.5-4            
## [28] microclima_0.1.0         NicheMapR_3.3.2          RNetCDF_2.6-2           
## [31] data.table_1.14.8        sf_1.0-14                zoo_1.8-12              
## [34] curl_5.0.0               abind_1.4-5              doParallel_1.0.17       
## [37] iterators_1.0.14         foreach_1.5.2            rgdal_1.6-7             
## [40] taxize_0.9.100           rredlist_0.7.1           letsR_4.0               
## [43] rgeos_0.6-2              rasterSp_0.0.1           raster_3.6-23           
## [46] sp_2.0-0                 ggbeeswarm_0.7.2         ggExtra_0.10.0          
## [49] here_1.0.1               ggstatsplot_0.11.1       ggdist_3.2.1            
## [52] RColorBrewer_1.1-3       ggnewscale_0.4.10.9000   tidytree_0.4.2          
## [55] phytools_1.5-1           ggtreeExtra_1.7.0        ggtree_3.5.0.901        
## [58] R.utils_2.12.2           R.oo_1.25.0              R.methodsS3_1.8.2       
## [61] patchwork_1.2.0.9000     naniar_1.0.0             ape_5.7-1               
## [64] maps_3.4.1               viridis_0.6.4            viridisLite_0.4.2       
## [67] kableExtra_1.3.4         lubridate_1.9.2          forcats_1.0.0           
## [70] stringr_1.5.0            dplyr_1.1.2              purrr_1.0.1             
## [73] readr_2.1.4              tidyr_1.3.0              tibble_3.2.1            
## [76] ggplot2_3.5.1            tidyverse_2.0.0         
## 
## loaded via a namespace (and not attached):
##   [1] estimability_1.3        rappdirs_0.3.3          ragg_1.2.5             
##   [4] visdat_0.6.0            clusterGeneration_1.3.7 knitr_1.44             
##   [7] multcomp_1.4-26         rpart_4.1.16            generics_0.1.3         
##  [10] lambda.r_1.2.4          tgp_2.4-21              TH.data_1.1-2          
##  [13] combinat_0.0-8          proxy_0.4-27            slippymath_0.3.1       
##  [16] correlation_0.8.4       tzdb_0.4.0              webshot_0.5.4          
##  [19] xml2_1.3.6              httpuv_1.6.9            bold_1.3.0             
##  [22] xfun_0.39               hms_1.1.3               elevatr_0.99.0         
##  [25] jquerylib_0.1.4         evaluate_0.21           promises_1.2.0.1       
##  [28] progress_1.2.2          fansi_1.0.4             igraph_1.4.2           
##  [31] DBI_1.1.3               tensorA_0.36.2          paletteer_1.5.0        
##  [34] ellipsis_0.3.2          bookdown_0.34           insight_0.19.1         
##  [37] vctrs_0.6.2             geosphere_1.5-18        cachem_1.0.8           
##  [40] withr_2.5.0             progressr_0.14.0        treeio_1.21.0          
##  [43] prettyunits_1.1.1       mnormt_2.1.1            svglite_2.1.1          
##  [46] cluster_2.1.3           dotCall64_1.0-2         lazyeval_0.2.2         
##  [49] crayon_1.5.2            crul_1.4.0              labeling_0.4.3         
##  [52] pkgconfig_2.0.3         units_0.8-4             vipor_0.4.5            
##  [55] statsExpressions_1.5.0  globals_0.16.2          lifecycle_1.0.3        
##  [58] miniUI_0.1.1.1          sandwich_3.1-1          httpcode_0.3.0         
##  [61] mathjaxr_1.6-0          distributional_0.3.2    tcltk_4.2.0            
##  [64] rprojroot_2.0.3         datawizard_0.7.1        aplot_0.1.10           
##  [67] phangorn_2.11.1         boot_1.3-28             beeswarm_0.4.0         
##  [70] rnoaa_1.4.0             parameters_0.21.0       KernSmooth_2.23-20     
##  [73] spam_2.9-1              classInt_0.4-10         conditionz_0.1.0       
##  [76] maptools_1.1-6          parallelly_1.36.0       gridGraphics_0.5-1     
##  [79] scales_1.3.0            magrittr_2.0.3          compiler_4.2.0         
##  [82] plotrix_3.8-2           cli_3.6.1               listenv_0.9.0          
##  [85] hoardr_0.5.3            formatR_1.14            MASS_7.3-56            
##  [88] tidyselect_1.2.1        stringi_1.7.12          textshaping_0.3.6      
##  [91] highr_0.10              yaml_2.3.7              grid_4.2.0             
##  [94] maptree_1.4-8           sass_0.4.9              fastmatch_1.1-3        
##  [97] tools_4.2.0             timechange_0.2.0        rstudioapi_0.15.0      
## [100] uuid_1.1-0              foreign_0.8-82          gridExtra_2.3          
## [103] cubature_2.0.4.6        scatterplot3d_0.3-44    rmdformats_1.0.4       
## [106] farver_2.1.1            digest_0.6.31           pracma_2.4.2           
## [109] shiny_1.7.5             quadprog_1.5-8          Rcpp_1.0.10            
## [112] later_1.3.1             httr_1.4.7              colorspace_2.1-0       
## [115] rvest_1.0.3             XML_3.99-0.14           splines_4.2.0          
## [118] fields_15.2             yulab.utils_0.0.6       rematch2_2.1.2         
## [121] expm_0.999-7            ggplotify_0.1.0         systemfonts_1.0.4      
## [124] xtable_1.8-4            futile.options_1.0.1    jsonlite_1.8.7         
## [127] nloptr_2.0.3            corpcor_1.6.10          zeallot_0.1.0          
## [130] ggfun_0.0.9             R6_2.5.1                pillar_1.9.0           
## [133] htmltools_0.5.5         mime_0.12               glue_1.6.2             
## [136] fastmap_1.1.1           minqa_1.2.5             class_7.3-20           
## [139] codetools_0.2-18        optimParallel_1.0-2     mvtnorm_1.1-3          
## [142] utf8_1.2.3              lattice_0.20-45         bslib_0.5.1            
## [145] survival_3.7-0          rmarkdown_2.25.1        munsell_0.5.0          
## [148] e1071_1.7-13            gtable_0.3.4            bayestestR_0.13.1
LS0tDQp0aXRsZTogIioqVnVsbmVyYWJpbGl0eSBvZiBhbXBoaWJpYW5zIHRvIGdsb2JhbCB3YXJtaW5nKioiDQphdXRob3I6IFBhdHJpY2UgUG90dGllciwgTWljaGFlbCBSLiBLZWFybmV5LCBOaWNob2xhcyBDLiBXdSwgSnVsaWUgRS4gUmVqLCBBbGV4YW5kZXIgUi4gR3VuZGVyc29uLCBBLiBOYXllbGxpIFJpdmVyYS1WaWxsYW51ZXZhLCBQaWV0cm8gUG9sbG8sIFNhbWFudGhhIEJ1cmtlLCBTenltb24gTS4gRHJvYm5pYWssIFNoaW5pY2hpIE5ha2FnYXdhDQpkYXRlOiAibGF0ZXN0IHVwZGF0ZTogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCINCm91dHB1dDogDQogIHJtZGZvcm1hdHM6OmRvd25jdXRlOg0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDYNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICB0aHVtYm5haWxzOiBmYWxzZQ0KICAgIGRvd25jdXRlX3RoZW1lOiAiY2hhb3MiDQogICAgY29kZV9vdmVyZmxvdzogd3JhcA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCg0KPHN0eWxlPg0KI3RvYyB1bC5uYXYgbGkgdWwgbGkgew0KICAgIGRpc3BsYXk6IG5vbmU7DQogICAgbWF4LWhlaWdodDogbm9uZTsNCn0NCg0KI3RvYyB1bC5uYXYgbGkuYWN0aXZlIHVsIGxpICB7DQogICAgZGlzcGxheTogYmxvY2s7DQogICAgbWF4LWhlaWdodDogbm9uZTsNCn0NCg0KI3RvYyB1bC5uYXYgbGkgdWwgbGkgdWwgbGkgew0KICAgIG1heC1oZWlnaHQ6IG5vbmU7DQogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KfQ0KDQojdG9jIHVsLm5hdiBsaSB1bCBsaS5hY3RpdmUgdWwgbGkgew0KICAgIG1heC1oZWlnaHQ6IG5vbmU7DQogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsNCiAgICANCn0NCg0KaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7DQogICAgY29sb3I6IGRlZXBwaW5rICFpbXBvcnRhbnQ7DQoNCjwvc3R5bGU+DQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KIyBrbml0ciBzZXR0aW5nDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLCANCiAgdGlkeSA9IFRSVUUsDQogIGNhY2hlID0gVFJVRSwNCiAgZWNobz1UUlVFDQopDQpgYGANCg0KIyAqKkludHJvZHVjdGlvbioqDQoNClRoaXMgaXMgdGhlIG1hc3RlciBmaWxlIGZvciB0aGUgZGF0YSBwcm9jZXNzaW5nLCBhbmFseXNpcyBhbmQgdmlzdWFsaXphdGlvbiBmb3IgKlBvdHRpZXIgZXQgYWwuIDIwMjQuIFZ1bG5lcmFiaWxpdHkgb2YgYW1waGliaWFucyB0byBnbG9iYWwgd2FybWluZyoNCg0KVGhpcyBjb2RlIGdvZXMgdGhyb3VnaCBldmVyeSBzdGVwIG9mIHRoZSBwaXBlbGluZSB1c2VkIHRvIGFzc2VzcyB0aGUgdnVsbmVyYWJpbGl0eSBvZiBhbXBoaWJpYW5zIHRvIGdsb2JhbCB3YXJtaW5nLg0KKipIb3dldmVyKiosIGl0IGlzIG5vdCBlbnRpcmVseSByZXByb2R1Y2libGUuIFRoaXMgY29kZSByZXF1aXJlcyBleHRlbnNpdmUgY29tcHV0YXRpb25hbCBwb3dlciBhbmQgbW9zdCBjb21wdXRhdGlvbnMgdXNlZCB0aGUgY29tcHV0YXRpb25hbCBjbHVzdGVyIEthdGFuYSBzdXBwb3J0ZWQgYnkgUmVzZWFyY2ggVGVjaG5vbG9neSBTZXJ2aWNlcyBhdCBVTlNXIFN5ZG5leSAoaHR0cHM6Ly9yZXNlYXJjaC51bnN3LmVkdS5hdS9rYXRhbmEpLiBBbGwgY29kZSByYW4gb24gS2F0YW5hIGFyZSBpbmRpY2F0ZWQgdW5kZXIgZWFjaCBoZWFkZXIsIGFsb25nIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpYyBmaWxlcyBvbmUgY2FuIHVzZSB0byByZXByb2R1Y2UgdGhlIHJlc3VsdHMuDQoNClRoZXJlZm9yZSwgdGhlIHByZXNlbnQgZmlsZSBpcyBtb3N0bHkgaGVyZSB0byB3YWxrIHRoZSByZWFkZXIgdGhyb3VnaCB0aGUgYW5hbHlzZXMuIFdoZXJlIG9uZSB3YW50cyB0byByZXByb2R1Y2UgdGhlIGFuYWx5c2lzLCBwbGVhc2Ugc2VlIHRoZSBmb2xkZXIgKiovUioqLCB3aGVyZSB0aGUgZmlsZXMgdXNlZCB0byBwcm9kdWNlIHRoZXNlIHJlc3VsdHMgaW4gYW4gSFBDIGVudmlyb25tZW50IGFyZSBwcm92aWRlZC4gVGhlICoqL3BicyoqIGZvbGRlciBhbHNvIGRlc2NyaWJlcyB0aGUgcmVzb3VyY2VzIHJlcXVlc3RlZCB0byBydW4gZWFjaCBpbmRpdmlkdWFsIFIgZmlsZSwgYW5kIHRoZXNlIGNhbiBiZSBhZGFwdGVkIHRvIGRpZmZlcmVudCBzdXBlcmNvbXB1dGVycy4NCg0KVGhpcyBmaWxlIGNvbnRhaW5zIG5lYXJseSA0MCwwMDAgbGluZXMgb2YgY29kZSwgYW5kIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBuYXZpZ2F0ZSB0aGUga25pdHRlZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIChodG1sIGZpbGU7IG9yIGh0dHBzOi8vcC1wb3R0aWVyLmdpdGh1Yi5pby9WdWxuZXJhYmlsaXR5X2FtcGhpYmlhbnNfZ2xvYmFsX3dhcm1pbmcvKS4gSWYgb3BlbmluZyB0aGlzIGNvZGUgaW4gUnN0dWRpbyBvciBWU2NvZGUsIHBsZWFzZSB1c2UgdGhlIGhlYWRlcnMgdG8gbmF2aWdhdGUgdGhpcyBkb2N1bWVudC4gDQpBdCB0aGUgYm90dG9tIG9mIHRoZSBoZWFkZXJzIG9uIHRoZSBrbml0dGVkIHBhZ2UsIHlvdSBhbHNvIGhhdmUgdGhlIG9wdGlvbiB0byB2aXN1YWxpemUgdGhpcyBkb2N1bWVudCB1c2luZyBhICoqbGlnaHQqKiAgb3IgKipkYXJrKiogdGhlbWUuDQoNCldoaWxlIG5vdCBhbGwgKipkYXRhKiogYW5kICoqUkRhdGEqKiBmaWxlcyBhcmUgcHJvdmlkZWQgaW4gdGhpcyByZXBvc2l0b3J5IGR1ZSB0byBtZW1vcnkgc2l6ZSBsaW1pdHMgaW4gR2l0aHViLCBhbGwgZmlsZXMgYXJlIGF2YWlsYWJsZSB1cG9uIHJlcXVlc3QuIE91dHB1dHMgZnJvbSBpbnRlcm1lZGlhdGUgZmlsZXMgYXJlIGFsc28gcHJlc2VudGVkIHRocm91Z2hvdXQuIFBsZWFzZSBmZWVsIGZyZWUgdG8gY29udGFjdCBQYXRyaWNlIFBvdHRpZXIgKHAucG90dGllckB1bnN3LmVkdS5hdSkgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgZmluZCBtaXN0YWtlcyBpbiB0aGUgY29kZSwgb3IgaWYgeW91IHdvdWxkIGxpa2UgdG8gYWNjZXNzIHNwZWNpZmljIGZpbGVzLiBXZSB3aWxsIGFsc28gYXJjaGl2ZSBhbGwgZmlsZXMgdG8gYSBwZXJtYW5lbnQgcmVwb3NpdG9yeSB1cG9uIGpvdXJuYWwgYWNjZXB0YW5jZS4NCg0KTm90ZSB0aGF0IHNwZWNpZXMgbGV2ZWwgb2NjdXJyZW5jZXMgYXJlIG5hbWVkICJwb3B1bGF0aW9ucyIgaW4gdGhpcyBjb2RlLCBhbmQgYXNzZW1ibGFnZXMgYXJlIHJlZmVycmVkIHRvIGFzICJjb21tdW5pdGllcyIuDQoNCiMgKipEYXRhIHByb2Nlc3NpbmcqKiANCg0KIyMgKipMb2FkIHBhY2thZ2VzIGFuZCBkYXRhKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyAqKkxvYWQgcGFja2FnZXMqKg0KDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSwNCiAgICAgICAgICAgICAgIGthYmxlRXh0cmEsDQogICAgICAgICAgICAgICB2aXJpZGlzLA0KICAgICAgICAgICAgICAgdmlyaWRpc0xpdGUsDQogICAgICAgICAgICAgICBtYXBzLA0KICAgICAgICAgICAgICAgYXBlLA0KICAgICAgICAgICAgICAgbmFuaWFyLA0KICAgICAgICAgICAgICAgcGF0Y2h3b3JrLA0KICAgICAgICAgICAgICAgUi51dGlscywNCiAgICAgICAgICAgICAgIGdndHJlZSwgIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIll1TGFiLVNNVS9nZ3RyZWUiKQ0KICAgICAgICAgICAgICAgZ2d0cmVlRXh0cmEsICMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJ4aWFuZ3Bpbi9nZ3RyZWVFeHRyYSIpDQogICAgICAgICAgICAgICBwaHl0b29scywNCiAgICAgICAgICAgICAgIHRpZHl0cmVlLA0KICAgICAgICAgICAgICAgZ2duZXdzY2FsZSwgDQogICAgICAgICAgICAgICBSQ29sb3JCcmV3ZXIsDQogICAgICAgICAgICAgICBnZ2Rpc3QsDQogICAgICAgICAgICAgICBnZ3N0YXRzcGxvdCwNCiAgICAgICAgICAgICAgIGhlcmUsDQogICAgICAgICAgICAgICBnZ0V4dHJhLA0KICAgICAgICAgICAgICAgZ2diZWVzd2FybSwNCiAgICAgICAgICAgICAgIHJhc3RlciwNCiAgICAgICAgICAgICAgIHNwLA0KICAgICAgICAgICAgICAgcmFzdGVyU3AsIyByZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiUlMtZWNvL3Jhc3RlclNwIiwgYnVpbGRfdmlnbmV0dGVzID0gVCkNCiAgICAgICAgICAgICAgIHJnZW9zLA0KICAgICAgICAgICAgICAgbGV0c1IsIA0KICAgICAgICAgICAgICAgcnJlZGxpc3QsDQogICAgICAgICAgICAgICB0YXhpemUsIyByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicm9wZW5zY2kvdGF4aXplIikNCiAgICAgICAgICAgICAgIHJyZWRsaXN0LCAjcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJvcGVuc2NpL3JyZWRsaXN0IikNCiAgICAgICAgICAgICAgIHJnZGFsLA0KICAgICAgICAgICAgICAgcmdlb3MsDQogICAgICAgICAgICAgICBwdXJyciwNCiAgICAgICAgICAgICAgIHBhcmFsbGVsLA0KICAgICAgICAgICAgICAgZG9QYXJhbGxlbCwNCiAgICAgICAgICAgICAgIGFiaW5kLA0KICAgICAgICAgICAgICAgY3VybCwNCiAgICAgICAgICAgICAgIHpvbywNCiAgICAgICAgICAgICAgIHNmLA0KICAgICAgICAgICAgICAgZGF0YS50YWJsZSwNCiAgICAgICAgICAgICAgIHB1cnJyLA0KICAgICAgICAgICAgICAgUk5ldENERiwgDQogICAgICAgICAgICAgICBOaWNoZU1hcFIsICMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJodHRwczovL2dpdGh1Yi5jb20vbXJrZS9OaWNoZU1hcFIiKQ0KICAgICAgICAgICAgICAgbWljcm9jbGltYSwNCiAgICAgICAgICAgICAgIGxldHNSLA0KICAgICAgICAgICAgICAgTUNNQ2dsbW0sDQogICAgICAgICAgICAgICBtZ2N2LCANCiAgICAgICAgICAgICAgIGdhbW00LA0KICAgICAgICAgICAgICAgcmxhbmcsDQogICAgICAgICAgICAgICBmdXR1cmUsDQogICAgICAgICAgICAgICBmdXJyciwNCiAgICAgICAgICAgICAgIGZ1dHVyZS5hcHBseSwgDQogICAgICAgICAgICAgICBmdXRpbGUubG9nZ2VyLA0KICAgICAgICAgICAgICAgcm5hdHVyYWxlYXJ0aCwNCiAgICAgICAgICAgICAgIHJuYXR1cmFsZWFydGhkYXRhLA0KICAgICAgICAgICAgICAgcm5hdHVyYWxlYXJ0aGhpcmVzLA0KICAgICAgICAgICAgICAgbWV0YWZvciwNCiAgICAgICAgICAgICAgIGdnc3BhdGlhbCwNCiAgICAgICAgICAgICAgIGx3Z2VvbSwNCiAgICAgICAgICAgICAgIGNvd3Bsb3QsDQogICAgICAgICAgICAgICBsbWU0LA0KICAgICAgICAgICAgICAgZ2dlZmZlY3RzLA0KICAgICAgICAgICAgICAgb3B0aW14LA0KICAgICAgICAgICAgICAgZW1tZWFucykgIA0KDQonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKSAjIEZ1bmN0aW9uIG9wcG9zaXRlIG9mICVpbiUNCmBgYA0KDQojIyMgKipMb2FkIGRhdGEgYW5kIHBoeWxvZ2VuZXRpYyB0cmVlKioNCg0KYGBge3IsIGV2YWw9Rn0NCmQgPC0gcmVhZF9jc3YoImRhdGEvZGF0YV9Qb3R0aWVyX2V0X2FsXzIwMjIuY3N2IikgIyBDdXJhdGVkIGRhdGEgZnJvbSBQb3R0aWVyIGV0IGFsLiAoMjAyMikgU2NpZW50aWZpYyBEYXRhDQp0cmVlIDwtIHJlYWQudHJlZSgiZGF0YS9KZXR6X1B5cm9uXzIwMThfY29uc2Vuc3VzLnRyZSIpICMgTG9hZCBjb25zZW5zdXMgdHJlZSBmcm9tIEpldHogYW5kIFB5cm9uICgyMDE4KSBOYXR1cmUgRWNvbG9neSBhbmQgRXZvbHV0aW9uDQp0cmVlX21ldGFkYXRhIDwtIHJlYWRfY3N2KCJkYXRhL0pldHpfUHlyb25fbWV0YWRhdGFfdHJlZS5jc3YiKSAjIE1ldGFkYXRhIGZvciBzcGVjaWVzIGluIHRoZSB0cmVlDQpKb2huc29uIDwtIHJlYWRfY3N2KCJkYXRhL2RhdGFfSm9obnNvbl9ldF9hbF8yMDIzLmNzdiIpICMgQm9keSBtYXNzIGRhdGEgZnJvbSBKb2huc29uIGV0IGFsLiAoMjAyMykgR2xvYmFsIEVjb2xvZ3kgYW5kIEJpb2dlb2dyYXBoeQ0KZWNvdHlwZSA8LSByZWFkX2NzdigiZGF0YS9lY290eXBlX2RhdGEuY3N2IikgIyBFY290eXBlIGRhdGEgZnJvbSBXdSBldCBhbC4gKDIwMjQpLiBpbiBwcmVwOyBhbmQgc3VwcGxlbWVudGVkIGJ5IGRhdGEgZnJvbSBQaWV0cm8gUG9sbG8gYW5kIEEuIE5heWVsbGkgUml2ZXJhLVZpbGxhbnVldmENCg0KYGBgDQoNCiMjIyAqKkxvYWQgYW5kIHByb2Nlc3MgZGF0YSBmcm9tIHRoZSBJVUNOKioNCg0KYGBge3IsIGV2YWw9Rn0NCklVQ05fcG9seWdvbnM8LSBzaGFwZWZpbGUoJ2RhdGEvYW1waGliaWFuX0lVQ05fbWFwcy9BTVBISUJJQU5TLnNocCcpDQoNCklVQ05fcG9seWdvbnM8LUlVQ05fcG9seWdvbnNbSVVDTl9wb2x5Z29ucyRwcmVzZW5jZT09MSxdICMgT25seSBrZWVwIGV4dGFudCBhbXBoaWJpYW5zDQpJVUNOX3BvbHlnb25zPC1JVUNOX3BvbHlnb25zW0lVQ05fcG9seWdvbnMkY2F0ZWdvcnkhPSJFWCIsIF0gIyBSZW1vdmUgZXh0aW5jdCBzcGVjaWVzIA0KSVVDTl9wb2x5Z29uczwtSVVDTl9wb2x5Z29uc1tJVUNOX3BvbHlnb25zJGNhdGVnb3J5IT0iRVciLCBdDQpJVUNOX3BvbHlnb25zQGRhdGEkYmlub21pYWwgPC0gSVVDTl9wb2x5Z29uc0BkYXRhJHNjaV9uYW1lDQoNCnNhdmVSRFMoSVVDTl9wb2x5Z29ucywgZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3Jhc3Rlcl9JVUNOX3BvbHlnb25zLnJkcyIpDQoNCiMgY3JlYXRlIGEgdGFibGUgd2l0aCBJVUNOIHNwZWNpZXMgbmFtZXMsIHRheG9ub21pYyBpbmZvcm1hdGlvbiwgYW5kIHRocmVhdCBzdGF0dXMNCklVQ05fZGF0YTwtIGRhdGEuZnJhbWUodGlwLmxhYmVsID0gSVVDTl9wb2x5Z29uc0BkYXRhJGJpbm9taWFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgPSBJVUNOX3BvbHlnb25zQGRhdGEkb3JkZXJfLCANCiAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gSVVDTl9wb2x5Z29uc0BkYXRhJGZhbWlseSwNCiAgICAgICAgICAgICAgICAgICAgICAgSVVDTl9zdGF0dXMgPSBJVUNOX3BvbHlnb25zQGRhdGEkY2F0ZWdvcnkpDQpgYGANCg0KIyMjDQoNCiMjICoqUHJvY2VzcyB0cmFpbmluZyBkYXRhIGZvciB0aGUgaW1wdXRhdGlvbioqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgZ2VuZXJhdGUgYSBkYXRhc2V0IHdpdGggMyBhY2NsaW1hdGlvbiB0ZW1wZXJhdHVyZXMgcGVyIHNwZWNpZXMgd2l0aCB+OTAlIG1pc3NpbmcgZGF0YSAoNTIxMyBzcGVjaWVzIGluIHRvdGFsKS4NCg0KIyMjICoqRmlsdGVyaW5nIHRyYWluaW5nIGRhdGEqKg0KDQpIZXJlLCB3ZSBmb2N1cyBvbiBkYXRhIGZvciB3aGljaCB3ZSBwb3NzZXNzIHRoZSBhY2NsaW1hdGlvbiBvciBhY2NsaW1hdGlzYXRpb24gdGVtcGVyYXR1cmVzDQoNCmBgYHtyLCBldmFsPUZ9DQojIFByb2Nlc3MgZGF0YSBmcm9tIFBvdHRpZXIgZXQgYWwuIDIwMjINCmQudHJhaW5pbmcgPC0gZmlsdGVyKGQsIA0KICAgICAgICAgICAgICAgICAgICAgIGQkYWNjbGltYXRpb25fdGVtcCE9Ik5BInwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFtYmllbnRfdGVtcCE9Ik5BInwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cmF0ZV90ZW1wIT0iTkEifA0KICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJfdGVtcCE9Ik5BInwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JvZHlfdGVtcCE9Ik5BIiwgIyBSZW1vdmUgZGF0YSB3aXRob3V0IGFjY2xpbWF0aW9uIG9yIGFjY2xpbWF0aXNhdGlvbiB0ZW1wZXJhdHVyZXMNCiAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkPT0iYWR1bHRzInxsaWZlX3N0YWdlX3Rlc3RlZD09ImxhcnZhZSIpICMgVGFrZSBkYXRhIGZyb20gYm90aCBhZHVsdHMgYW5kIGxhcnZhZQ0KDQojIFRha2UgdGhlIGFjY2xpbWF0aXNhdGlvbiB0ZW1wZXJhdHVyZSAocHJlZmVyYWJseSB0aGUgZmllbGQgYm9keSB0ZW1wZXJhdHVyZSBvciBtaWNyb2Vudmlyb25tZW50YWwgdGVtcGVyYXR1cmUpIGFzIHRoZSBhY2NsaW1hdGlvbiB0ZW1wZXJhdHVyZQ0KZC50cmFpbmluZyA8LSBkLnRyYWluaW5nICU+JSANCiAgbXV0YXRlKGFjY2xpbWF0aW9uX3RlbXAgPSBpZmVsc2UoIWlzLm5hKGFjY2xpbWF0aW9uX3RlbXApLCBhY2NsaW1hdGlvbl90ZW1wLCAjIFRha2UgYWNjbGltYXRpb24gdGVtcGVyYXR1cmUgd2hlbiBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShmaWVsZF9ib2R5X3RlbXApLCBmaWVsZF9ib2R5X3RlbXAsICMgT3RoZXJ3aXNlIHRha2UgdGhlIGZpZWxkIGJvZHkgdGVtcGVyYXR1cmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoc3Vic3RyYXRlX3RlbXApLCBzdWJzdHJhdGVfdGVtcCwgIyBPdGhlcndpc2UgdGFrZSB0aGUgc3Vic3RyYXRlIHRlbXBlcmF0dXJlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYSh3YXRlcl90ZW1wKSwgd2F0ZXJfdGVtcCwgYW1iaWVudF90ZW1wKSkpKSkgIyBPdGhlcndpc2UgdGFrZSB0aGUgd2F0ZXIgdGVtcGVyYXR1cmUgb3IgYW1iaWVudCB0ZW1wZXJhdHVyZQ0KDQoNCmBgYA0KDQoNCiMjIyAqKk1hdGNoIHNwZWNpZXMgbmFtZXMgd2l0aCB0aGUgSVVDTiByZWQgbGlzdCoqDQoNCmBgYHtyLCBldmFsPUZ9DQoNCmQudHJhaW5pbmckdGlwLmxhYmVsIDwtIGQudHJhaW5pbmckc3BlY2llcyAjIFJlbmFtZSBzcGVjaWVzIG5hbWUgdG8gdGlwLmxhYmVsDQoNCnRyZWUkdGlwLmxhYmVsIDwtIGdzdWIoIl8iLCAiICIsIHRyZWUkdGlwLmxhYmVsKSAjIFJlbW92ZSB1bmRlcnNjb3JlIGJldHdlZW4gc3BlY2llcyBuYW1lcyBpbiB0aGUgdHJlZQ0KDQpkLnRyYWluaW5nIDwtIGRhdGEuZnJhbWUoZC50cmFpbmluZ1tkLnRyYWluaW5nJHRpcC5sYWJlbCAlaW4lIHRyZWUkdGlwLmxhYmVsLCBdICkgIyBPbmx5IGdldCBzcGVjaWVzIGZvciB3aGljaCB3ZSBoYXZlIHBoeWxvZ2VuZXRpYyBpbmZvcm1hdGlvbg0KDQpkLm5vdF9JVUNOIDwtIGQudHJhaW5pbmdbZC50cmFpbmluZyR0aXAubGFiZWwgJSFpbiUgSVVDTl9kYXRhJHRpcC5sYWJlbCwgXSAjIElkZW50aWZ5IHNwZWNpZXMgbm90IGxpc3RlZCBpbiB0aGUgSVVDTg0KZC5ub3RfSVVDTiR0aXAubGFiZWwgPC0gYXMuZmFjdG9yKGQubm90X0lVQ04kdGlwLmxhYmVsKSAjIDYzIHNwZWNpZXMgbm90IG1hdGNoaW5nIElVQ04gcmVkIGxpc3QgDQoNCiMgUmVuYW1lIHNwZWNpZXMgbmFtZSBpbiB0aGUgZGF0YSBhbmQgcGh5bG9nZW5ldGljIHRyZWUgdG8gbWF0Y2ggSVVDTiBkYXRhDQoNCiMjIyBEZW5kcm9wc29waHVzIGxhYmlhbGlzIC0tPiBEZW5kcm9wc29waHVzIG1vbGl0b3IgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IkRlbmRyb3Bzb3BodXMgbGFiaWFsaXMiXSA8LSAiRGVuZHJvcHNvcGh1cyBtb2xpdG9yIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iRGVuZHJvcHNvcGh1cyBsYWJpYWxpcyJdIDwtICJEZW5kcm9wc29waHVzIG1vbGl0b3IiDQoNCiMjIyBIeWxhIGFuZGVyc29uaWkgLS0+IERyeW9waHl0ZXMgYW5kZXJzb25paSBpbiByZWRsaXN0DQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeWxhIGFuZGVyc29uaWkiXSA8LSAiRHJ5b3BoeXRlcyBhbmRlcnNvbmlpIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlsYSBhbmRlcnNvbmlpIl0gPC0gIkRyeW9waHl0ZXMgYW5kZXJzb25paSINCg0KIyMjIEh5bGEgY2hyeXNvc2NlbGlzIC0tPiBEcnlvcGh5dGVzIGNocnlzb3NjZWxpcyBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlsYSBjaHJ5c29zY2VsaXMiXSA8LSAiRHJ5b3BoeXRlcyBjaHJ5c29zY2VsaXMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeWxhIGNocnlzb3NjZWxpcyJdIDwtICJEcnlvcGh5dGVzIGNocnlzb3NjZWxpcyINCg0KIyMjIEh5bGEgY2luZXJlYSAtLT4gRHJ5b3BoeXRlcyBjaW5lcmV1cyBpbiByZWRsaXN0DQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeWxhIGNpbmVyZWEiXSA8LSAiRHJ5b3BoeXRlcyBjaW5lcmV1cyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5bGEgY2luZXJlYSJdIDwtICJEcnlvcGh5dGVzIGNpbmVyZXVzIg0KDQojIyMgSHlsYSBzcXVpcmVsbGEgLS0+IERyeW9waHl0ZXMgc3F1aXJlbGx1cyBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlsYSBzcXVpcmVsbGEiXSA8LSAiRHJ5b3BoeXRlcyBzcXVpcmVsbHVzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlsYSBzcXVpcmVsbGEiXSA8LSAiRHJ5b3BoeXRlcyBzcXVpcmVsbHVzIg0KDQojIyMgSHlsYSB2ZXJzaWNvbG9yIC0tPiBEcnlvcGh5dGVzIHZlcnNpY29sb3IgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5bGEgdmVyc2ljb2xvciJdIDwtICJEcnlvcGh5dGVzIHZlcnNpY29sb3IiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeWxhIHZlcnNpY29sb3IiXSA8LSAiRHJ5b3BoeXRlcyB2ZXJzaWNvbG9yIg0KDQojIyMgSHlsYSB3YWxrZXJpIC0tPiBEcnlvcGh5dGVzIHdhbGtlcmkgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5bGEgd2Fsa2VyaSJdIDwtICJEcnlvcGh5dGVzIHdhbGtlcmkiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeWxhIHdhbGtlcmkiXSA8LSAiRHJ5b3BoeXRlcyB3YWxrZXJpIg0KDQojIyMgSHlub2JpdXMgZnVjYSAtLT4gSHlub2JpdXMgZnVjdXMgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5bm9iaXVzIGZ1Y2EiXSA8LSAiSHlub2JpdXMgZnVjdXMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeW5vYml1cyBmdWNhIl0gPC0gIkh5bm9iaXVzIGZ1Y3VzIg0KDQojIyMgSHlwc2lib2FzIGNpbmVyYXNjZW5zIC0tPiBCb2FuYSBjaW5lcmFzY2VucyBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGNpbmVyYXNjZW5zIl0gPC0gIkJvYW5hIGNpbmVyYXNjZW5zIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGNpbmVyYXNjZW5zIl0gPC0gIkJvYW5hIGNpbmVyYXNjZW5zIg0KDQojIyMgSHlwc2lib2FzIGZhYmVyIC0tLT4gQm9hbmEgZmFiZXIgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBmYWJlciJdIDwtICJCb2FuYSBmYWJlciINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBmYWJlciJdIDwtICJCb2FuYSBmYWJlciINCg0KIyMjIEh5cHNpYm9hcyBnZW9ncmFwaGljdXMgLS0+IEJvYW5hIGdlb2dyYXBoaWNhIGluIHJlZGxpc3QgDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgZ2VvZ3JhcGhpY3VzIl0gPC0gIkJvYW5hIGdlb2dyYXBoaWNhIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGdlb2dyYXBoaWN1cyJdIDwtICJCb2FuYSBnZW9ncmFwaGljYSINCg0KIyMjIEh5cHNpYm9hcyBsYW5jaWZvcm1pcyAtLT4gQm9hbmEgbGFuY2lmb3JtaXMgaW4gcmVkbGlzdA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGxhbmNpZm9ybWlzIl0gPC0gIkJvYW5hIGxhbmNpZm9ybWlzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGxhbmNpZm9ybWlzIl0gPC0gIkJvYW5hIGxhbmNpZm9ybWlzIg0KDQojIyMgSHlwc2lib2FzIHB1bmN0YXR1cyAtLT4gQm9hbmEgcHVuY3RhdGEgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBwdW5jdGF0dXMiXSA8LSAiQm9hbmEgcHVuY3RhdGEiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgcHVuY3RhdHVzIl0gPC0gIkJvYW5hIHB1bmN0YXRhIg0KDQojIyMgUGFjaHltZWR1c2EgZGFjbmljb2xvciAtLT4gQWdhbHljaG5pcyBkYWNuaWNvbG9yIGluIHJlZGxpc3QgDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJQYWNoeW1lZHVzYSBkYWNuaWNvbG9yIl0gPC0gIkFnYWx5Y2huaXMgZGFjbmljb2xvciINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlBhY2h5bWVkdXNhIGRhY25pY29sb3IiXSA8LSAiQWdhbHljaG5pcyBkYWNuaWNvbG9yIg0KDQojIyMgUmFuYSBiZXJsYW5kaWVyaSAtLT4gTGl0aG9iYXRlcyBiZXJsYW5kaWVyaSBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iUmFuYSBiZXJsYW5kaWVyaSJdIDwtICJMaXRob2JhdGVzIGJlcmxhbmRpZXJpIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUmFuYSBiZXJsYW5kaWVyaSJdIDwtICJMaXRob2JhdGVzIGJlcmxhbmRpZXJpIg0KDQojIyMgUmFuYSBjYXRlc2JlaWFuYSAtLT4gTGl0aG9iYXRlcyBjYXRlc2JlaWFudXMgaW4gcmVkbGlzdA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iUmFuYSBjYXRlc2JlaWFuYSJdIDwtICJMaXRob2JhdGVzIGNhdGVzYmVpYW51cyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlJhbmEgY2F0ZXNiZWlhbmEiXSA8LSAiTGl0aG9iYXRlcyBjYXRlc2JlaWFudXMiDQoNCiMjIyBSYW5hIGNsYW1pdGFucyAtLT4gTGl0aG9iYXRlcyBjbGFtaXRhbnMgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlJhbmEgY2xhbWl0YW5zIl0gPC0gIkxpdGhvYmF0ZXMgY2xhbWl0YW5zIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUmFuYSBjbGFtaXRhbnMiXSA8LSAiTGl0aG9iYXRlcyBjbGFtaXRhbnMiDQoNCiMjIyBSYW5hIHBhbG1pcGVzIC0tPiBMaXRob2JhdGVzIHBhbG1pcGVzIGluIHJlZGxpc3QgDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJSYW5hIHBhbG1pcGVzIl0gPC0gIkxpdGhvYmF0ZXMgcGFsbWlwZXMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJSYW5hIHBhbG1pcGVzIl0gPC0gIkxpdGhvYmF0ZXMgcGFsbWlwZXMiDQoNCiMjIyBSYW5hIHBhbHVzdHJpcyAtLT4gTGl0aG9iYXRlcyBwYWx1c3RyaXMgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlJhbmEgcGFsdXN0cmlzIl0gPC0gIkxpdGhvYmF0ZXMgcGFsdXN0cmlzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUmFuYSBwYWx1c3RyaXMiXSA8LSAiTGl0aG9iYXRlcyBwYWx1c3RyaXMiDQoNCiMjIyBSYW5hIHBpcGllbnMgLS0+IExpdGhvYmF0ZXMgcGlwaWVucyBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iUmFuYSBwaXBpZW5zIl0gPC0gIkxpdGhvYmF0ZXMgcGlwaWVucyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlJhbmEgcGlwaWVucyJdIDwtICJMaXRob2JhdGVzIHBpcGllbnMiDQoNCiMjIyBSYW5hIHNwaGVub2NlcGhhbGEgLS0+IExpdGhvYmF0ZXMgc3BoZW5vY2VwaGFsdXMgaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlJhbmEgc3BoZW5vY2VwaGFsYSJdIDwtICJMaXRob2JhdGVzIHNwaGVub2NlcGhhbHVzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUmFuYSBzcGhlbm9jZXBoYWxhIl0gPC0gIkxpdGhvYmF0ZXMgc3BoZW5vY2VwaGFsdXMiDQoNCiMjIyBSYW5hIHN5bHZhdGljYSAtLT4gTGl0aG9iYXRlcyBzeWx2YXRpY3VzIGluIHJlZGxpc3QgDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJSYW5hIHN5bHZhdGljYSJdIDwtICJMaXRob2JhdGVzIHN5bHZhdGljdXMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJSYW5hIHN5bHZhdGljYSJdIDwtICJMaXRob2JhdGVzIHN5bHZhdGljdXMiDQoNCiMjIyBSYW5hIHZpcmdhdGlwZXMgLS0+IExpdGhvYmF0ZXMgdmlyZ2F0aXBlcyBpbiByZWRsaXN0IA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iUmFuYSB2aXJnYXRpcGVzIl0gPC0gIkxpdGhvYmF0ZXMgdmlyZ2F0aXBlcyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlJhbmEgdmlyZ2F0aXBlcyJdIDwtICJMaXRob2JhdGVzIHZpcmdhdGlwZXMiDQoNCiMjIyBSYW5hIHdhcnN6ZXdpdHNjaGlpIC0tPiBMaXRob2JhdGVzIHdhcnN6ZXdpdHNjaGlpIGluIHJlZGxpc3QNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlJhbmEgd2Fyc3pld2l0c2NoaWkiXSA8LSAiTGl0aG9iYXRlcyB3YXJzemV3aXRzY2hpaSINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlJhbmEgd2Fyc3pld2l0c2NoaWkiXSA8LSAiTGl0aG9iYXRlcyB3YXJzemV3aXRzY2hpaSINCg0KIyMjIFJoaW5lbGxhIHNjaG5laWRlcmkgLS0tPiBSaGluZWxsYSBkaXB0eWNoYSBpbiByZWRsaXN0DQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJSaGluZWxsYSBzY2huZWlkZXJpIl0gPC0gIlJoaW5lbGxhIGRpcHR5Y2hhIg0KDQojIyMgU3luY29wZSBiYXNzbGVyaSAtLT4gQ2hpYXNtb2NsZWlzIGJhc3NsZXJpIGluIHJlZGxpc3QNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlN5bmNvcGUgYmFzc2xlcmkiXSA8LSAiQ2hpYXNtb2NsZWlzIGJhc3NsZXJpIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iU3luY29wZSBiYXNzbGVyaSJdIDwtICJDaGlhc21vY2xlaXMgYmFzc2xlcmkiDQoNCiMjIyBFY25vbWlvaHlsYSBtaW90eW1wYW51bSAtLT4gUmhlb2h5bGEgbWlvdHltcGFudW0gaW4gcmVkbGlzdCANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IkVjbm9taW9oeWxhIG1pb3R5bXBhbnVtIl0gPC0gIlJoZW9oeWxhIG1pb3R5bXBhbnVtIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iRWNub21pb2h5bGEgbWlvdHltcGFudW0iXSA8LSAiUmhlb2h5bGEgbWlvdHltcGFudW0iDQoNCiMjIyBFdXBlbXBoaXggbmF0dGVyZXJpIC0tPiBQaHlzYWxhZW11cyBuYXR0ZXJlcmkgaW4gcmVkbGlzdA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iRXVwZW1waGl4IG5hdHRlcmVyaSJdIDwtICJQaHlzYWxhZW11cyBuYXR0ZXJlcmkiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJFdXBlbXBoaXggbmF0dGVyZXJpIl0gPC0gIlBoeXNhbGFlbXVzIG5hdHRlcmVyaSINCg0KIyMjIEh5bGFyYW5hIGxhYmlhbGlzIC0tPiBDaGFsY29yYW5hIGxhYmlhbGlzIGluIHJlZGxpc3QNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5bGFyYW5hIGxhYmlhbGlzIl0gPC0gIkNoYWxjb3JhbmEgbGFiaWFsaXMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeWxhcmFuYSBsYWJpYWxpcyJdIDwtICJDaGFsY29yYW5hIGxhYmlhbGlzIg0KDQojIyMgSHlwc2lib2FzIGFsYm9tYXJnaW5hdHVzIC0tPiBCb2FuYSBhbGJvbWFyZ2luYXRhIGluIHJlZGxpc3QNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBhbGJvbWFyZ2luYXR1cyJdIDwtICJCb2FuYSBhbGJvbWFyZ2luYXRhIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGFsYm9tYXJnaW5hdHVzIl0gPC0gIkJvYW5hIGFsYm9tYXJnaW5hdGEiDQoNCiMjIyBIeXBzaWJvYXMgYWxib3B1bmN0YXR1cyAtLT4gQm9hbmEgYWxib3B1bmN0YXRhIGluIHJlZGxpc3QNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBhbGJvcHVuY3RhdHVzIl0gPC0gIkJvYW5hIGFsYm9wdW5jdGF0YSINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBhbGJvcHVuY3RhdHVzIl0gPC0gIkJvYW5hIGFsYm9wdW5jdGF0YSINCg0KIyMjIEh5cHNpYm9hcyBib2FucyAtLT4gQm9hbmEgYm9hbnMgaW4gcmVkbGlzdA0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGJvYW5zIl0gPC0gIkJvYW5hIGJvYW5zIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIGJvYW5zIl0gPC0gIkJvYW5hIGJvYW5zIg0KDQojIyMgSHlwc2lib2FzIGNyZXBpdGFucyAtLT4gQm9hbmEgY3JlcGl0YW5zDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgY3JlcGl0YW5zIl0gPC0gIkJvYW5hIGNyZXBpdGFucyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBjcmVwaXRhbnMiXSA8LSAiQm9hbmEgY3JlcGl0YW5zIg0KDQojIyMgSHlwc2lib2FzIGN1cnVwaSAtLT4gQm9hbmEgY3VydXBpDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgY3VydXBpIl0gPC0gIkJvYW5hIGN1cnVwaSINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBjdXJ1cGkiXSA8LSAiQm9hbmEgY3VydXBpIg0KDQojIyMgSHlwc2lib2FzIGZhc2NpYXR1cyAtLT4gQm9hbmEgZmFzY2lhdGENCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBmYXNjaWF0dXMiXSA8LSAiQm9hbmEgZmFzY2lhdGEiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgZmFzY2lhdHVzIl0gPC0gIkJvYW5hIGZhc2NpYXRhIg0KDQojIyMgSHlwc2lib2FzIHBhcmRhbGlzIC0tPiBCb2FuYSBwYXJkYWxpcyANCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBwYXJkYWxpcyJdIDwtICJCb2FuYSBwYXJkYWxpcyINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBwYXJkYWxpcyJdIDwtICJCb2FuYSBwYXJkYWxpcyINCg0KIyMjIEh5cHNpYm9hcyBwZWxsdWNlbnMgLS0+IEJvYW5hIHBlbGx1Y2Vucw0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlwc2lib2FzIHBlbGx1Y2VucyJdIDwtICJCb2FuYSBwZWxsdWNlbnMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgcGVsbHVjZW5zIl0gPC0gIkJvYW5hIHBlbGx1Y2VucyINCg0KIyMjIEh5cHNpYm9hcyBwdWxjaGVsbHVzIC0tPiBCb2FuYSBwdWxjaGVsbGENCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBwdWxjaGVsbHVzIl0gPC0gIkJvYW5hIHB1bGNoZWxsYSINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09Ikh5cHNpYm9hcyBwdWxjaGVsbHVzIl0gPC0gIkJvYW5hIHB1bGNoZWxsYSINCg0KIyMjIEh5cHNpYm9hcyByYW5pY2VwcyAtLT4gQm9hbmEgcmFuaWNlcHMNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09Ikh5cHNpYm9hcyByYW5pY2VwcyJdIDwtICJCb2FuYSByYW5pY2VwcyINCg0KIyMjIEh5cHNpYm9hcyByb3NlbmJlcmdpIC0tPiBCb2FuYSByYW5pY2Vwcw0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iSHlwc2lib2FzIHJvc2VuYmVyZ2kiXSA8LSAiQm9hbmEgcmFuaWNlcHMiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgcm9zZW5iZXJnaSJdIDwtICJCb2FuYSByYW5pY2VwcyINCg0KIyMjIEh5cHNpYm9hcyBzZW1pbGluZWF0dXMgLS0+IEJvYW5hIHNlbWlsaW5lYXRhDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJIeXBzaWJvYXMgc2VtaWxpbmVhdHVzIl0gPC0gIkJvYW5hIHNlbWlsaW5lYXRhIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iSHlwc2lib2FzIHNlbWlsaW5lYXR1cyJdIDwtICJCb2FuYSBzZW1pbGluZWF0YSINCg0KIyMjIFBoeWxsb21lZHVzYSBub3JkZXN0aW5hIC0tPiBQaXRoZWNvcHVzIG5vcmRlc3RpbnVzDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJQaHlsbG9tZWR1c2Egbm9yZGVzdGluYSJdIDwtICJQaXRoZWNvcHVzIG5vcmRlc3RpbnVzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUGh5bGxvbWVkdXNhIG5vcmRlc3RpbmEiXSA8LSAiUGl0aGVjb3B1cyBub3JkZXN0aW51cyINCg0KIyMjIFBoeWxsb21lZHVzYSByb2hkZWkgLS0+IFBpdGhlY29wdXMgcm9oZGVpDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJQaHlsbG9tZWR1c2Egcm9oZGVpIl0gPC0gIlBpdGhlY29wdXMgcm9oZGVpIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUGh5bGxvbWVkdXNhIHJvaGRlaSJdIDwtICJQaXRoZWNvcHVzIHJvaGRlaSINCg0KIyMjIFJhbmEgYndhbmEtLT4gTGl0aG9iYXRlcyBid2FuYQ0KZC50cmFpbmluZyR0aXAubGFiZWxbZC50cmFpbmluZyR0aXAubGFiZWwgPT0iUmFuYSBid2FuYSJdIDwtICJMaXRob2JhdGVzIGJ3YW5hIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iUmFuYSBid2FuYSJdIDwtICJMaXRob2JhdGVzIGJ3YW5hIg0KDQojIyMgUmFuYSB2YWlsbGFudGkgLS0+IExpdGhvYmF0ZXMgdmFpbGxhbnRpDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJSYW5hIHZhaWxsYW50aSJdIDwtICJMaXRob2JhdGVzIHZhaWxsYW50aSINCnRyZWUkdGlwLmxhYmVsW3RyZWUkdGlwLmxhYmVsID09IlJhbmEgdmFpbGxhbnRpIl0gPC0gIkxpdGhvYmF0ZXMgdmFpbGxhbnRpIg0KDQojIyMgUmhpbmVsbGEgaHVtYm9sZHRpIC0tPiBSaGluZWxsYSBncmFudWxvc2ENCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlJoaW5lbGxhIGh1bWJvbGR0aSJdIDwtICJSaGluZWxsYSBncmFudWxvc2EiDQoNCiMjIyBTY2luYXggYWdpbGlzIC0tPiBPbG9seWdvbiBhZ2lsaXMNCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlNjaW5heCBhZ2lsaXMiXSA8LSAiT2xvbHlnb24gYWdpbGlzIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iU2NpbmF4IGFnaWxpcyJdIDwtICJPbG9seWdvbiBhZ2lsaXMiDQoNCiMjIyBTY2luYXggYXJvbW90aHllbGxhIC0tPiBPbG9seWdvbiBhcm9tb3RoeWVsbGENCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlNjaW5heCBhcm9tb3RoeWVsbGEiXSA8LSAiT2xvbHlnb24gYXJvbW90aHllbGxhIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iU2NpbmF4IGFyb21vdGh5ZWxsYSJdIDwtICJPbG9seWdvbiBhcm9tb3RoeWVsbGEiDQoNCiMjIyBTY2luYXggc3RyaWdpbGF0dXMgLS0+IE9sb2x5Z29uIHN0cmlnaWxhdGENCmQudHJhaW5pbmckdGlwLmxhYmVsW2QudHJhaW5pbmckdGlwLmxhYmVsID09IlNjaW5heCBzdHJpZ2lsYXR1cyJdIDwtICJPbG9seWdvbiBzdHJpZ2lsYXRhIg0KdHJlZSR0aXAubGFiZWxbdHJlZSR0aXAubGFiZWwgPT0iU2NpbmF4IHN0cmlnaWxhdHVzIl0gPC0gIk9sb2x5Z29uIHN0cmlnaWxhdGEiDQoNCiMjIyBTcGhhZW5vcmh5bmNodXMgcGF1bG9hbHZpbmkgLS0+IEdhYm9oeWxhIHBhdWxvYWx2aW5pDQpkLnRyYWluaW5nJHRpcC5sYWJlbFtkLnRyYWluaW5nJHRpcC5sYWJlbCA9PSJTcGhhZW5vcmh5bmNodXMgcGF1bG9hbHZpbmkiXSA8LSAiR2Fib2h5bGEgcGF1bG9hbHZpbmkiDQp0cmVlJHRpcC5sYWJlbFt0cmVlJHRpcC5sYWJlbCA9PSJTcGhhZW5vcmh5bmNodXMgcGF1bG9hbHZpbmkiXSA8LSAiR2Fib2h5bGEgcGF1bG9hbHZpbmkiDQoNCiMjIyMjIyMgU3BlY2llcyBub3QgbWF0Y2hpbmcgSVVDTiBvciBub3QgaGF2aW5nIGRpc3RyaWJ1dGlvbiByYW5nZXMgIyMjIyMjIyMjIw0KDQojIEh5cHNpYm9hcyBhbG1lbmRhcml6YWUgLS0+IG5vdCBpbiBJVUNODQojIEVsYWNoaXN0b2NsZWlzIG11aXJhcXVpdGFuIC0tPiBub3QgaW4gSVVDTg0KIyBFcGlwZWRvYmF0ZXMgZGFyd2lud2FsbGFjZWkgLS0+IG5vdCBpbiBJVUNODQojIEh5bG94YWx1cyB5YXN1bmkgLS0+IG5vdCBpbiBJVUNODQojIFByaXN0aW1hbnRpcyByZWljaGxlaSAtLT4gbm90IGluIElVQ04NCiMgUHJpc3RpbWFudGlzIGJpY2FudHVzIC0tPiBub3QgaW4gSVVDTg0KIyBQbGV0aG9kb24gY2hsb3JvYnJ5b25pcyAtLT4gbm90IGluIElVQ04NCiMgUGxldGhvZG9uIGdyb2JtYW5pIC0tPiBub3QgaW4gSVVDTg0KIyBQbGV0aG9kb24gb2NtdWxnZWUgLS0+IG5vdCBpbiBJVUNODQojIFBsZXRob2RvbiB2YXJpb2xhdHVzIC0tPiBub3QgaW4gSVVDTg0KIyBSaGluZWxsYSBhemFyYWkgLS0+IG5vdCBpbiBJVUNODQojIFRyYWNoeWNlcGhhbHVzIGN1bmF1YXJ1IC0tPiBub3QgaW4gSVVDTg0KIyBTY2luYXggc3RyaWdpbGF0dXMgLS0+IGluIHRoZSBJVUNOLCBidXQgbm8gZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbg0KIyBVcGVyb2xlaWEgbWFybW9yYXRhIC0tPiBpbiB0aGUgSVVDTiwgYnV0IG5vIGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24NCg0Kc2F2ZVJEUyh0cmVlLCAiUmRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikgICMgU2F2ZSB0aGUgbW9kaWZpZWQgcGh5bG9nZW5ldGljIHRyZWUNCg0KZC5ub3RfSVVDTjwtZC50cmFpbmluZ1tkLnRyYWluaW5nJHRpcC5sYWJlbCAlIWluJSBJVUNOX2RhdGEkdGlwLmxhYmVsLCBdICMgQ2hlY2sgaWYgYWxsIHJlcGxhY2VtZW50cyB3ZXJlIGRvbmUgY29ycmVjdGx5DQp1bmlxdWUoZC5ub3RfSVVDTiRzcGVjaWVzKSAjIEFsbCBnb29kLCAxNCBzcGVjaWVzIG5vdCBjYXB0dXJlZA0KDQpkLnRyYWluaW5nPC1kLnRyYWluaW5nW2QudHJhaW5pbmckdGlwLmxhYmVsICVpbiUgSVVDTl9kYXRhJHRpcC5sYWJlbCwgXSAjIE9ubHkgZ2V0IHNwZWNpZXMgZm9yIHdoaWNoIHdlIGhhdmUgSVVDTiByYW5nZXMNCmQudHJhaW5pbmc8LXVuaXF1ZShkLnRyYWluaW5nKQ0KDQpzcGVjaWVzPC1kaXN0aW5jdChkYXRhLmZyYW1lKHRpcC5sYWJlbD1kLnRyYWluaW5nJHRpcC5sYWJlbCkpICMgTGlzdCBvZiB1bmlxdWUgc3BlY2llcyBuYW1lcyAoNTI0IHNwZWNpZXMgd2l0aCBwaHlsb2dlbnkgYW5kIGRpc3RyaWJ1dGlvbiByYW5nZSkNCg0KZC50cmFpbmluZyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCkgJT4lIA0KICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obiksIG1pbiA9IG1pbihuKSwgbWF4ID0gbWF4KG4pKSAjIDUuMDggZXN0aW1hdGVzIHBlciBzcGVjaWVzIG9uIGF2ZXJhZ2UNCg0KZC50cmFpbmluZyAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBmaWx0ZXIobiA+IDEpICU+JQ0KICB1bmdyb3VwKCkgIyAyODcgc3BlY2llcyB3aXRoIG1vcmUgdGhhbiBvbmUgZXN0aW1hdGUuDQpgYGANCg0KIyMNCg0KIyMjICoqTWVyZ2UgZWNvdHlwZSBkYXRhIHdpdGggdGhlIHRyYWluaW5nIGRhdGEgYW5kIGRvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyoqDQoNCmBgYHtyLCBldmFsPUZ9DQojIFNlbGVjdCByZWxldmFudCB2YXJpYWJsZXMNCmQudHJhaW5pbmcgPC0gZHBseXI6OnNlbGVjdChkLnRyYWluaW5nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2xpbWF0ZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2xpbWF0aW9uX3RlbXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjbGltYXRpb25fdGltZSwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X21hc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGl1bV90ZXN0X3RlbXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbXBpbmcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fVVRMLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9VVEwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9VVEwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdHlwZSkNCg0KZC50cmFpbmluZyA8LSBsZWZ0X2pvaW4oZC50cmFpbmluZywgZHBseXI6OnNlbGVjdCh1bmlxdWUoSVVDTl9kYXRhKSwgdGlwLmxhYmVsLCBJVUNOX3N0YXR1cykpICMgVXBkYXRlIElVQ04gc3RhdHVzDQoNCiMgUHJvY2VzcyBlY290eXBlIGRhdGEgDQplY290eXBlJHRpcC5sYWJlbCA8LSBlY290eXBlJGJpbm9taWFsICMgUmVuYW1lIHNwZWNpZXMgbmFtZQ0KZWNvdHlwZSRvcmRlcl9uYW1lIDwtIHN0cl90b190aXRsZShlY290eXBlJG9yZGVyX25hbWUpDQplY290eXBlJGZhbWlseV9uYW1lIDwtIHN0cl90b190aXRsZShlY290eXBlJGZhbWlseV9uYW1lKQ0KZWNvdHlwZSRiaW5vbWlhbF90cmVlX3BoeWxvIDwtIGdzdWIoIl8iLCAiICIsIGVjb3R5cGUkYmlub21pYWxfdHJlZV9waHlsbykNCg0KZWNvdHlwZV9zcDwtZWNvdHlwZQ0KDQojIE1hdGNoIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzIGluIHRoZSBlY290eXBlIGRhdGEgdG8gdGhlIHRyYWluaW5nIGRhdGENCmVjb3R5cGVfSVVDTl9tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWxfSVVDTiAlaW4lIGQudHJhaW5pbmckdGlwLmxhYmVsLCBdICU+JSBtdXRhdGUobWF0Y2hlZF92YXI9ImJpbm9taWFsX0lVQ04iKQ0KZWNvdHlwZV9iaW5vbWlhbF9tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWwgJWluJSBkLnRyYWluaW5nJHRpcC5sYWJlbCwgXSAlPiUgICBtdXRhdGUobWF0Y2hlZF92YXIgPSAiYmlub21pYWwiKQ0KZWNvdHlwZV9waHlsb19tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWxfdHJlZV9waHlsbyAlaW4lIGQudHJhaW5pbmckdGlwLmxhYmVsLCBdICU+JSAgbXV0YXRlKG1hdGNoZWRfdmFyID0gImJpbm9taWFsX3RyZWVfcGh5bG8iKQ0KDQoNCiMgQ29tYmluZSB0aGUgZGF0YXNldHMgYW5kIGNyZWF0ZSB0aGUgJ3RpcC5sYWJlbCcgY29sdW1uIGJhc2VkIG9uIHRoZSAnbWF0Y2hlZF92YXInIGNvbHVtDQpjb21iaW5lZF9kYXRhIDwtIGJpbmRfcm93cyhlY290eXBlX0lVQ05fbWF0Y2gsIGVjb3R5cGVfYmlub21pYWxfbWF0Y2gsIGVjb3R5cGVfcGh5bG9fbWF0Y2gpICU+JQ0KICBtdXRhdGUodGlwLmxhYmVsID0gY2FzZV93aGVuKA0KICAgIG1hdGNoZWRfdmFyID09ICJiaW5vbWlhbF9JVUNOIiB+IGJpbm9taWFsX0lVQ04sDQogICAgbWF0Y2hlZF92YXIgPT0gImJpbm9taWFsIiB+IGJpbm9taWFsLA0KICAgIG1hdGNoZWRfdmFyID09ICJiaW5vbWlhbF90cmVlX3BoeWxvIiB+IGJpbm9taWFsX3RyZWVfcGh5bG8NCiAgKSkNCg0KZWNvdHlwZV9zcCA8LSBjb21iaW5lZF9kYXRhICU+JQ0KICBkaXN0aW5jdCh0aXAubGFiZWwsIC5rZWVwX2FsbCA9IFRSVUUpIA0KDQojIE1lcmdlIGVjb3R5cGUgaW5mb3JtYXRpb24gaW4gdGhlIHRyYWluaW5nIGRhdGENCmQudHJhaW5pbmcgPC0gbGVmdF9qb2luKGQudHJhaW5pbmcsIGRwbHlyOjpzZWxlY3QoZWNvdHlwZV9zcCwgdGlwLmxhYmVsLCBlY290eXBlLCBzZWNvbmRfZWNvdHlwZSwgc3RyYXRlZ3ksIE5vdGVzKSkgDQoNCg0KZC50cmFpbmluZyA8LSBkLnRyYWluaW5nICU+JSBtdXRhdGUoc2RfVVRMPSBpZmVsc2UoZXJyb3JfdHlwZT09InNlIiAmIGlzLm5hKG5fVVRMKT09IlRSVUUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlcnJvcl90eXBlPT0ic2QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9VVEwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX1VUTCpzcXJ0KG5fVVRMKSkpKSAjIENvbnZlcnQgU0UgdG8gU0QNCmBgYA0KDQojIyAqKlByb2Nlc3MgbGlzdCBvZiBzcGVjaWVzIHRvIGltcHV0ZSoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMgKipTZWxlY3Qgc3BlY2llcyB0byBiZSBpbXB1dGVkKiogDQoNCkhlcmUsIHdlIGZvY3VzIG9uIHNwZWNpZXMgZm9yIHdoaWNoIHdlIGhhdmUgZWNvdHlwZSBkYXRhLCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIHJhbmdlLCBhbmQgbWF0Y2hpbmcgdGhlIHBoeWxvZ2VuZXRpYyB0cmVlIGZyb20gSmV0eiBhbmQgUHlyb24gKDIwMTgpDQoNCmBgYHtyLCBldmFsPUZ9DQoNCiMgRmlsdGVyIHNwZWNpZXMgZm9yIHdoaWNoIHdlIGhhdmUgSVVDTiBkaXN0cmlidXRpb24gcmFuZ2UgYW5kIHBoeWxvZ2VuZXRpYyBwb3NpdGlvbg0KDQp0cmVlX3NwPC1kYXRhLmZyYW1lKHRpcC5sYWJlbCA9IHRyZWUkdGlwLmxhYmVsKSAjIERhdGEgZnJhbWUgd2l0aCBhbGwgc3BlY2llcyBpbiB0aGUgcGh5bG9nZW5ldGljIHRyZWUNCg0KdHJlZV9zcDwtZGF0YS5mcmFtZSh0aXAubGFiZWwgPSB0cmVlX3NwW3RyZWVfc3AkdGlwLmxhYmVsICVpbiUgSVVDTl9kYXRhJHRpcC5sYWJlbCwgXSApIyBPbmx5IGdldCBzcGVjaWVzIGZvciB3aGljaCB3ZSBoYXZlIElVQ04gcmFuZ2VzICg1NzkyKQ0KDQplY290eXBlX3NwPC1kcGx5cjo6c2VsZWN0KGVjb3R5cGUsIG9yZGVyX25hbWUsIGZhbWlseV9uYW1lLCBlY290eXBlLCBzZWNvbmRfZWNvdHlwZSwgc3RyYXRlZ3ksIE5vdGVzLCBTVkxfY20sIG1hc3NfZywgYmlub21pYWwsIGJpbm9taWFsX0lVQ04sIGJpbm9taWFsX3RyZWVfcGh5bG8pDQoNCiMgTWF0Y2ggdGhlIGRpZmZlcmVudCB2YXJpYWJsZXMgaW4gdGhlIGVjb3R5cGUgZGF0YSB0byB0aGUgcGh5bG9nZW5ldGljIHRyZWUNCmVjb3R5cGVfSVVDTl9tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWxfSVVDTiAlaW4lIHRyZWVfc3AkdGlwLmxhYmVsLCBdICU+JSBtdXRhdGUobWF0Y2hlZF92YXI9ImJpbm9taWFsX0lVQ04iKQ0KZWNvdHlwZV9iaW5vbWlhbF9tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWwgJWluJSB0cmVlX3NwJHRpcC5sYWJlbCwgXSAlPiUgICBtdXRhdGUobWF0Y2hlZF92YXIgPSAiYmlub21pYWwiKQ0KZWNvdHlwZV9waHlsb19tYXRjaCA8LSBlY290eXBlX3NwW2Vjb3R5cGVfc3AkYmlub21pYWxfdHJlZV9waHlsbyAlaW4lIHRyZWVfc3AkdGlwLmxhYmVsLCBdICU+JSAgbXV0YXRlKG1hdGNoZWRfdmFyID0gImJpbm9taWFsX3RyZWVfcGh5bG8iKQ0KDQojIENvbWJpbmUgdGhlIGRhdGFzZXRzIGFuZCBjcmVhdGUgdGhlICd0aXAubGFiZWwnIGNvbHVtbiBiYXNlZCBvbiB0aGUgJ21hdGNoZWRfdmFyJyBjb2x1bQ0KY29tYmluZWRfZGF0YSA8LSBiaW5kX3Jvd3MoZWNvdHlwZV9JVUNOX21hdGNoLCBlY290eXBlX2Jpbm9taWFsX21hdGNoLCBlY290eXBlX3BoeWxvX21hdGNoKSAlPiUNCiAgbXV0YXRlKHRpcC5sYWJlbCA9IGNhc2Vfd2hlbigNCiAgICBtYXRjaGVkX3ZhciA9PSAiYmlub21pYWxfSVVDTiIgfiBiaW5vbWlhbF9JVUNOLA0KICAgIG1hdGNoZWRfdmFyID09ICJiaW5vbWlhbCIgfiBiaW5vbWlhbCwNCiAgICBtYXRjaGVkX3ZhciA9PSAiYmlub21pYWxfdHJlZV9waHlsbyIgfiBiaW5vbWlhbF90cmVlX3BoeWxvDQogICkpDQoNCmVjb3R5cGVfc3AgPC0gY29tYmluZWRfZGF0YSAlPiUNCiAgZGlzdGluY3QodGlwLmxhYmVsLCAua2VlcF9hbGwgPSBUUlVFKSANCg0KDQojIFJlbW92ZSBvYmxpZ2F0ZSBjYXZlLWR3ZWxsZXJzDQplY290eXBlX3NwIDwtIGVjb3R5cGVfc3AgJT4lIA0KICAgZmlsdGVyKHN0cmF0ZWd5ICE9ICJPYmxpZ2F0ZSBjYXZlLWR3ZWxsZXIiIHwgaXMubmEoc3RyYXRlZ3kpPT1UUlVFKQ0KDQojIEFkZCBhIG1lbnRpb24gZm9yIHBhZWRvbW9ycGhpYyBzcGVjaWVzIA0KZWNvdHlwZV9zcCA8LSBlY290eXBlX3NwICU+JSANCiAgbXV0YXRlKHN0cmF0ZWd5ID0gaWZlbHNlKHN0cmF0ZWd5ID09ICJQYWVkb21vcnBoaWMifCBOb3RlcyA9PSAiUGFlZG9tb3JwaGljIiwgIlBhZWRvbW9ycGhpYyIsIE5BKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1Ob3RlcykNCg0KIyMgTm93IHdlIGNyZWF0ZSBhIGxpc3Qgb2YgZGF0YS1kZWZpY2llbnQgc3BlY2llcyB0aGF0IG1hdGNoIHRoZSBwaHlsb2dlbnkgYW5kIGZvciB3aGljaCB3ZSBrbm93IHRoZSBlY290eXBlDQoNCmRhdGFfZGVmaWNpZW50X3NwPC1kYXRhLmZyYW1lKHRpcC5sYWJlbCA9IHRyZWVfc3BbdHJlZV9zcCR0aXAubGFiZWwgJSFpbiUgZC50cmFpbmluZyR0aXAubGFiZWwsIF0pICMgRGF0YSBmcmFtZSB3aXRoIGFsbCBzcGVjaWVzIHdlIGRvIG5vdCBoYXZlIGRhdGEgZm9yICg1MjY4KQ0KDQpkYXRhX2RlZmljaWVudF9zcCA8LSBkYXRhLmZyYW1lKHRpcC5sYWJlbCA9IGRhdGFfZGVmaWNpZW50X3NwW2RhdGFfZGVmaWNpZW50X3NwJHRpcC5sYWJlbCAlaW4lIGVjb3R5cGVfc3AkdGlwLmxhYmVsLCBdKSAjIEZvY3VzIG9uIHNwZWNpZXMgd2UgaGF2ZSBlY290eXBlIGRhdGEgKDQ4MjIpDQoNCg0KZGF0YV9kZWZpY2llbnRfc3A8LWxlZnRfam9pbihkYXRhX2RlZmljaWVudF9zcCwgZWNvdHlwZV9zcCwgYnk9InRpcC5sYWJlbCIpICMgQXNzaWduIGVjb3R5cGUgZGF0YSB0byBlYWNoIHNwZWNpZXMuIA0KZGF0YV9kZWZpY2llbnRfc3A8LWxlZnRfam9pbihkYXRhX2RlZmljaWVudF9zcCwgZHBseXI6OnNlbGVjdCh1bmlxdWUoSVVDTl9kYXRhKSwgdGlwLmxhYmVsLCBJVUNOX3N0YXR1cykpDQoNCmRhdGFfZGVmaWNpZW50X3NwPC1kcGx5cjo6c2VsZWN0KGRhdGFfZGVmaWNpZW50X3NwLCB0aXAubGFiZWwsIG9yZGVyPW9yZGVyX25hbWUsIGZhbWlseT1mYW1pbHlfbmFtZSwgSVVDTl9zdGF0dXMsIGVjb3R5cGUsIHNlY29uZF9lY290eXBlLCBzdHJhdGVneSwgU1ZMPVNWTF9jbSwgbWFzc19nKSAjIDQ4MjIgc3BlY2llcw0KDQojIEFkZCBib2R5IG1hc3MgZGF0YSBmcm9tIEpvaG5zb24gZXQgYWwuIDIwMjMgDQoNCkpvaG5zb24kdGlwLmxhYmVsIDwtIEpvaG5zb24kU3BlY2llcw0KSm9obnNvbiR0aXAubGFiZWwgPC0gZ3N1YigiXyIsICIgIiwgSm9obnNvbiR0aXAubGFiZWwpDQpKb2huc29uJG1hc3NfSm9obnNvbiA8LSBKb2huc29uJEJvZHlfbWFzcw0KDQpkYXRhX2RlZmljaWVudF9zcCA8LSBsZWZ0X2pvaW4oZGF0YV9kZWZpY2llbnRfc3AsIGRwbHlyOjpzZWxlY3QoSm9obnNvbiwgdGlwLmxhYmVsLCBtYXNzX0pvaG5zb24pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gInRpcC5sYWJlbCIpDQoNCiMgQ2hvb3NlIHRoZSBib2R5IG1hc3MgZnJvbSBOaWt5IGFuZCBXdSAoMjAyMykgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZSB0YWtlIGl0IGZyb20gSm9obnNvbiBldCBhbC4gMjAyMyANCmRhdGFfZGVmaWNpZW50X3NwIDwtIGRhdGFfZGVmaWNpZW50X3NwICU+JSAgbXV0YXRlKGJvZHlfbWFzcyA9IGlmZWxzZShpcy5uYShtYXNzX2cpPT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNzX2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NfSm9obnNvbikpDQoNCg0KIyBSZW1vdmUgQ2FlY2lsaWFucyBiZWNhdXNlIHdlIGRpZCBub3QgaGF2ZSBkYXRhIGZvciB0aGlzIE9yZGVyLiANCmRhdGFfZGVmaWNpZW50X3NwPC1maWx0ZXIoZGF0YV9kZWZpY2llbnRfc3AsIG9yZGVyIT0iR3ltbm9waGlvbmEiKQ0KDQoNCiMgQWxsIHNwZWNpZXMgdGhhdCB3aWxsIGJlIGltcHV0ZWQgKDQ2Nzkgc3BlY2llcykNCmFsbF9zcGVjaWVzIDwtIGRwbHlyOjpzZWxlY3QoZGF0YV9kZWZpY2llbnRfc3AsIC1tYXNzX2csIC1tYXNzX0pvaG5zb24pDQpgYGANCg0KDQojIyMgKipQcm9jZXNzIHNwZWNpZXMgaW4gdGhlIHRyYWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIGltcHV0ZWQqKg0KDQpXZSB3aWxsIGFsc28gZ2VuZXJhdGUgMyBuZXcgZXN0aW1hdGVzIHBlciBzcGVjaWVzLCBmb3IgdGhlIHNwZWNpZXMgd2UgYWxyZWFkeSBoYXZlIGluIHRoZSB0cmFpbmluZyBkYXRhc2V0LiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gc3RhbmRhcmRpc2UgQ1RtYXggZXN0aW1hdGVzIHVzaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMuIA0KDQpgYGB7ciwgZXZhbD1GfQ0Kc3BlY2llc190cmFpbmluZyA8LSBkcGx5cjo6c2VsZWN0KGQudHJhaW5pbmcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVDTl9zdGF0dXMpDQojIE1hdGNoIHdpdGggdGhlIGVjb3R5cGUgZGF0YXNldA0Kc3BlY2llc190cmFpbmluZyA8LSBsZWZ0X2pvaW4oc3BlY2llc190cmFpbmluZywgZHBseXI6OnNlbGVjdChlY290eXBlX3NwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY290eXBlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2Vjb3R5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWTD1TVkxfY20sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NfZykpDQojIE1hdGNoIHdpdGggSm9obnNvbiBldCBhbC4gYm9keSBtYXNzIGRhdGENCnNwZWNpZXNfdHJhaW5pbmcgPC0gbGVmdF9qb2luKHNwZWNpZXNfdHJhaW5pbmcsIGRwbHlyOjpzZWxlY3QoSm9obnNvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NfSm9obnNvbikpDQojIFRha2UgdGhlIGRhdGEgZnJvbSBKb2huc29uIGV0IGFsLiB3aGVuIGF2YWlsYWJsZQ0Kc3BlY2llc190cmFpbmluZyA8LSBzcGVjaWVzX3RyYWluaW5nICU+JSAgbXV0YXRlKGJvZHlfbWFzcyA9IGlmZWxzZShpcy5uYShtYXNzX2cpPT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNzX2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3NfSm9obnNvbikpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoLW1hc3NfZywgLW1hc3NfSm9obnNvbikNCmBgYA0KDQoNCg0KIyMjICoqTWVyZ2UgZGF0YXNldHMgb2Ygc3BlY2llcyB3ZSBuZWVkIHRvIGltcHV0ZSBhbmQgYXNzaWduIHByZWRpY3RvcnMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KZGF0YV90b19pbXAgPC0gZnVsbF9qb2luKHNwZWNpZXNfdHJhaW5pbmcsIGFsbF9zcGVjaWVzKSANCmRhdGFfdG9faW1wIDwtIGRpc3RpbmN0KGRhdGFfdG9faW1wKQ0KDQpkYXRhX3RvX2ltcCAgPC0gZGF0YV90b19pbXAgJT4lIG11dGF0ZShyYW1waW5nPTEsICMgbW9zdCBjb21tb24gcmFtcGluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjbGltYXRlZD0iYWNjbGltYXRlZCIsICMgYWNjbGltYXRlZCBhbmltYWxzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NsaW1hdGlvbl90ZW1wID0gTkEsICMgIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIGJpb3BoeXNpY2FsIG1vZGVscw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjbGltYXRpb25fdGltZT0xMCwgIyBtb3N0IGNvbW1vbiBhY2NsaW1hdGlvbiB0aW1lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludD0iT1MiLCAjIE1vc3QgY29tbW9uIGVuZHBvaW50OyBtb3N0IHByZWNpc2Ugb25lIHRvbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaXVtX3Rlc3RfdGVtcD0iYm9keV93YXRlciIsICMgQm9keSBvciB3YXRlciB0ZW1wZXJhdHVyZSByZWNvcmRlZCBkdXJpbmcgYXNzYXkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkPSJhZHVsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wdXRlZD0ieWVzIikgIA0KYGBgDQoNCiMjDQoNCiMjICoqQ29tYmluZSB0cmFpbmluZyBkYXRhIGFuZCBsaXN0IG9mIHNwZWNpZXMgdG8gaW1wdXRlKioNCg0KYGBge3IsIGV2YWw9Rn0NCg0KZC50cmFpbmluZzwtbXV0YXRlKGQudHJhaW5pbmcsIGltcHV0ZWQ9Im5vIikgIyBhZGQgYSBjb2x1bW4gImltcHV0ZWQiDQoNCmQudHJhaW5pbmcgPC0gbXV0YXRlKGQudHJhaW5pbmcsIG1lZGl1bV90ZXN0X3RlbXAgPSBpZmVsc2UobWVkaXVtX3Rlc3RfdGVtcD09ImJvZHkifG1lZGl1bV90ZXN0X3RlbXA9PSJ3YXRlciIsICJib2R5X3dhdGVyIiwgImFtYmllbnQiKSkgDQoNCmRhdGFfZm9yX2ltcDwtIGZ1bGxfam9pbihkLnRyYWluaW5nLCBkYXRhX3RvX2ltcCkgIyBKb2luIHRoZSB0cmFpbiBkYXRhIHRvIHRoZSBkYXRhIHRvIGltcHV0ZSANCg0KZGF0YV9mb3JfaW1wPC1tdXRhdGUoZGF0YV9mb3JfaW1wLCBzcGVjaWVzPXRpcC5sYWJlbCkgIyBBZGQgYW5vdGhlciBjb2x1bW4gZm9yIHNwZWNpZXMgc28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgcmFuZG9tIGVmZmVjdCBhcyB3ZWxsLg0KDQpkYXRhX2Zvcl9pbXA8LW11dGF0ZShkYXRhX2Zvcl9pbXAsIHJvd19uID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCg0KIyBNYW51YWxseSBhZGQgbWlzc2luZyBlY290eXBlcw0KDQojIFN1YnNldCB0aGUgZGF0YV9mb3JfaW1wIGRhdGFmcmFtZSB0byByZW1vdmUgdGhlIHJvd3Mgd2l0aCBtaXNzaW5nIGVjb3R5cGUgdmFsdWVzDQpkYXRhX3dpdGhfZWNvdHlwZXMgPC0gZGF0YV9mb3JfaW1wWyFpcy5uYShkYXRhX2Zvcl9pbXAkZWNvdHlwZSksXQ0KDQojIElkZW50aWZ5IG1pc3Npbmcgc3BlY2llcw0KbWlzc2luZ19lY290eXBlcyA8LSBkYXRhX2Zvcl9pbXBbaXMubmEoZGF0YV9mb3JfaW1wJGVjb3R5cGUpLF0NCg0KIyBNYW51YWxseSBhZGQgbWlzc2luZyBlY290eXBlcw0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiQ29waGl4YWx1cyBhdXN0cmFsaXMiLCAiZWNvdHlwZSJdIDwtICJHcm91bmQtZHdlbGxpbmciDQptaXNzaW5nX2Vjb3R5cGVzW21pc3NpbmdfZWNvdHlwZXMkdGlwLmxhYmVsID09ICJPcmVvYmF0ZXMgZ2VtY2FyZSIsICJlY290eXBlIl0gPC0gIkdyb3VuZC1kd2VsbGluZyINCm1pc3NpbmdfZWNvdHlwZXNbbWlzc2luZ19lY290eXBlcyR0aXAubGFiZWwgPT0gIk9yZW9iYXRlcyBncmFudWxvc3VzIiwgImVjb3R5cGUiXSA8LSAiR3JvdW5kLWR3ZWxsaW5nIg0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiRHJ5b3BoeXRlcyB3YWxrZXJpIiwgImVjb3R5cGUiXSA8LSAiR3JvdW5kLWR3ZWxsaW5nIg0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiSHlub2JpdXMgZnVjdXMiLCAiZWNvdHlwZSJdIDwtICJHcm91bmQtZHdlbGxpbmciDQptaXNzaW5nX2Vjb3R5cGVzW21pc3NpbmdfZWNvdHlwZXMkdGlwLmxhYmVsID09ICJLYWxvcGhyeW51cyBsaW1ib29saWF0aSIsICJlY290eXBlIl0gPC0gIkdyb3VuZC1kd2VsbGluZyINCm1pc3NpbmdfZWNvdHlwZXNbbWlzc2luZ19lY290eXBlcyR0aXAubGFiZWwgPT0gIlByaXN0aW1hbnRpcyBmZXN0YWUiLCAiZWNvdHlwZSJdIDwtICJHcm91bmQtZHdlbGxpbmciDQptaXNzaW5nX2Vjb3R5cGVzW21pc3NpbmdfZWNvdHlwZXMkdGlwLmxhYmVsID09ICJQcmlzdGltYW50aXMgbWF0aWRpa3R5byIsICJlY290eXBlIl0gPC0gIkdyb3VuZC1kd2VsbGluZyINCm1pc3NpbmdfZWNvdHlwZXNbbWlzc2luZ19lY290eXBlcyR0aXAubGFiZWwgPT0gIlByaXN0aW1hbnRpcyBwaGFyYW5nb2JhdGVzIiwgImVjb3R5cGUiXSA8LSAiR3JvdW5kLWR3ZWxsaW5nIg0KDQptaXNzaW5nX2Vjb3R5cGVzW21pc3NpbmdfZWNvdHlwZXMkdGlwLmxhYmVsID09ICJDaGFsY29yYW5hIGxhYmlhbGlzIiwgImVjb3R5cGUiXSA8LSAiU3RyZWFtLWR3ZWxsaW5nIg0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiSHlsb3hhbHVzIGl0YWxvaSIsICJlY290eXBlIl0gPC0gIlN0cmVhbS1kd2VsbGluZyINCg0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiQ3lub3BzIG9yaWVudGFsaXMiLCAiZWNvdHlwZSJdIDwtICJBcXVhdGljIg0KbWlzc2luZ19lY290eXBlc1ttaXNzaW5nX2Vjb3R5cGVzJHRpcC5sYWJlbCA9PSAiUGFyYW1lc290cml0b24gbGFiaWF0dXMiLCAiZWNvdHlwZSJdIDwtICJBcXVhdGljIg0KDQptaXNzaW5nX2Vjb3R5cGVzW21pc3NpbmdfZWNvdHlwZXMkdGlwLmxhYmVsID09ICJEZW5kcm9wc29waHVzIG1vbGl0b3IiLCAiZWNvdHlwZSJdIDwtICJBcmJvcmVhbCINCm1pc3NpbmdfZWNvdHlwZXNbbWlzc2luZ19lY290eXBlcyR0aXAubGFiZWwgPT0gIlBvbHlwZWRhdGVzIGJyYXVlcmkiLCAiZWNvdHlwZSJdIDwtICJBcmJvcmVhbCINCg0KIyBNZXJnZSB0aGUgdHdvIGRhdGEgZnJhbWVzIGJhc2VkIG9uIG1hdGNoaW5nIHRpcC5sYWJlbCB2YWx1ZXMNCmRhdGFfZm9yX2ltcCA8LSByYmluZChkYXRhX3dpdGhfZWNvdHlwZXMsIG1pc3NpbmdfZWNvdHlwZXMpDQoNCiMgU2F2ZSB0aGUgcHJlbGltaW5hcnkgZGF0YSBmb3IgdGhlIGltcHV0YXRpb24gKHdlIHN0aWxsIG5lZWQgdG8gYWRkIHRoZSB0ZW1wZXJhdHVyZSkNCnNhdmVSRFMoZGF0YV9mb3JfaW1wLCAiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQpgYGANCg0KIyMgKipNYXRjaCBzcGVjaWVzIHRvIHRoZWlyIGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24qKiANCg0KYGBge3IsIGV2YWw9Rn0NCklVQ05fcG9seWdvbnMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcmFzdGVyX0lVQ05fcG9seWdvbnMucmRzIikgIyBTYXZlIHByb2Nlc3NlZCBJVUNOIHBvbHlnb25zDQoNCnBvbHlnb248LXN1YnNldChJVUNOX3BvbHlnb25zLCBJVUNOX3BvbHlnb25zQGRhdGEkYmlub21pYWwgJWluJSBkYXRhX2Zvcl9pbXAkdGlwLmxhYmVsKQ0KDQojIFJhc3Rlcml6ZSBhdCBhIDEtZGVncmVlIHJlc29sdXRpb24NCnJhc3Rlcl9wb2x5Z29uPC1sZXRzLnByZXNhYihwb2x5Z29uLCByZXNvbD0xKSANCnByZXNlbmNlX2Fic2VuY2U8LWRhdGEuZnJhbWUocmFzdGVyX3BvbHlnb24kUHJlc2VuY2VfYW5kX0Fic2VuY2VfTWF0cml4KQ0KDQojIFBpdm90IGxvbmdlcg0KcHJlc2VuY2VfYWJzZW5jZTwtcGl2b3RfbG9uZ2VyKHByZXNlbmNlX2Fic2VuY2UsIGNvbHM9QWNhbnRoaXhhbHVzLnNvbmphZTpaYWNoYWVudXMucGFydnVsdXMsIG5hbWVzX3RvID0gInRpcC5sYWJlbCIsIHZhbHVlc190byA9ICJQcmVzZW5jZSIpIA0KcHJlc2VuY2U8LWZpbHRlcihwcmVzZW5jZV9hYnNlbmNlLCBQcmVzZW5jZT09IjEiKSAjIE9ubHkga2VlcCByb3dzIHdoZXJlIHNwZWNpZXMgYXJlIHByZXNlbnQNCg0Kc2F2ZVJEUyhwcmVzZW5jZSwgZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXMucmRzIikNCg0KZGlzdGluY3RfY29vcmQ8LSBkaXN0aW5jdChkcGx5cjo6c2VsZWN0KHByZXNlbmNlLCAtUHJlc2VuY2UsIC0gdGlwLmxhYmVsKSkgIyBDb29yZGluYXRlcyB3aGVyZSBzcGVjaWVzIGFyZSBwcmVzZW50ICgxNDExOSBncmlkIGNlbGxzKQ0KZGlzdGluY3RfY29vcmQ8LWRpc3RpbmN0X2Nvb3JkICU+JSByZW5hbWUoeD1Mb25naXR1ZGUueC4sIHk9TGF0aXR1ZGUueS4pDQoNCnNhdmVSRFMoZGlzdGluY3RfY29vcmQsIGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlcy5yZHMiKQ0KYGBgDQoNCg0KIyMgKipBZGp1c3QgY29vcmRpbmF0ZXMgdG8gbGFuZCBtYXNzZXMqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNClJhc3Rlcml6aW5nIGF0IGEgMS1kZWdyZWUgcmVzb2x1dGlvbiBwcm9kdWNlcyBkYXRhIHBvaW50cyB0aGF0IGRvIG5vdCBuZWNlc3NhcmlseSBtYXRjaCBsYW5kIG1hc3Nlcy4gVGhlcmVmb3JlLCB0aGVzZSBjb29yZGluYXRlcyBtdXN0IGJlIGFkanVzdGVkDQoNCiMjIyAqKkxvb3Agb3ZlciBjb29yZGluYXRlcyBhbmQgZmluZCBtYXRjaGluZyBsYW5kKiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0RhdGFfd3JhbmdsaW5nL0FkanVzdGluZ19jb29yZGluYXRlcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9EYXRhX3dyYW5nbGluZy9BZGp1c3RpbmdfY29vcmRpbmF0ZXMucGJzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCiMgRnVuY3Rpb24gdG8gY2hlY2sgaWYgY29vcmRpbmF0ZSBpcyBvbiBsYW5kDQpjaGVja19pZl9wb2ludF9vbl9sYW5kIDwtIGZ1bmN0aW9uKGxvbiwgbGF0KSB7DQogIHBvaW50IDwtIHN0X3BvaW50KGMobG9uLCBsYXQpKQ0KICBwb2ludF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhwb2ludCksIGNycyA9IDQzMjYpICAjIHNwZWNpZnkgdGhlIENSUyB3aGVuIHlvdSBjcmVhdGUgdGhlIHN0X3BvaW50DQogIHN0X3RyYW5zZm9ybShwb2ludF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpICAjIHRyYW5zZm9ybSB0aGUgcG9pbnQgdG8gbWF0Y2ggdGhlIENSUyBvZiB0aGUgbGFuZF9wb2x5Z29uDQogIHN0X2ludGVyc2VjdHMobGFuZF9wb2x5Z29uLCBwb2ludF9zZiwgc3BhcnNlID0gRkFMU0UpWzEsIDFdDQp9DQoNCg0KYWRqdXN0X2Nvb3JkaW5hdGVzX3RvX2xhbmQgPC0gZnVuY3Rpb24obG9uLCBsYXQpIHsNCiAgaWYoY2hlY2tfaWZfcG9pbnRfb25fbGFuZChsb24sIGxhdCkpIHsNCiAgICByZXR1cm4oYyhsb24sIGxhdCkpDQogIH0NCiAgDQogIHN0ZXBzIDwtIHNlcSgtMC40NSwgMC40NSwgYnkgPSAwLjA1KQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgYm90aCBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGluIHRoZSBmdWxsIHJhbmdlIG9mIHN0ZXBzDQogIGZvcihkeCBpbiBzdGVwcykgew0KICAgIGZvcihkeSBpbiBzdGVwcykgew0KICAgICAgaWYoY2hlY2tfaWZfcG9pbnRfb25fbGFuZChsb24gKyBkeCwgbGF0ICsgZHkpKSB7DQogICAgICAgIHJldHVybihjKGxvbiArIGR4LCBsYXQgKyBkeSkpDQogICAgICB9DQogICAgfQ0KICB9DQogIA0KICByZXR1cm4oTlVMTCkgICMgcmV0dXJuIE5VTEwgaWYgbm8gbGFuZCBmb3VuZA0KfQ0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlcy5yZHMiKQ0KDQpkaXN0aW5jdF9jb29yZF9hZGogPC0gYXMuZGF0YS5mcmFtZShkaXN0aW5jdF9jb29yZCAlPiUgcmVuYW1lKGxvbj14LCBsYXQ9eSkpDQoNCiMgSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcm93IGluIHRoZSBkYXRhZnJhbWUNCmZvcihpIGluIDE6bnJvdyhkaXN0aW5jdF9jb29yZF9hZGopKSB7DQogIHByaW50KHBhc3RlKCJQcm9jZXNzaW5nIGxvbjogIiwgZGlzdGluY3RfY29vcmRfYWRqJGxvbltpXSwgIiwgbGF0OiAiLCBkaXN0aW5jdF9jb29yZF9hZGokbGF0W2ldKSkNCiAgYWRqdXN0ZWRfY29vcmRzIDwtIGFkanVzdF9jb29yZGluYXRlc190b19sYW5kKGRpc3RpbmN0X2Nvb3JkX2FkaiRsb25baV0sIGRpc3RpbmN0X2Nvb3JkX2FkaiRsYXRbaV0pDQogIGlmICghaXMubnVsbChhZGp1c3RlZF9jb29yZHMpKSB7DQogICAgcHJpbnQocGFzdGUoIkFkanVzdGVkIGxvbjogIiwgYWRqdXN0ZWRfY29vcmRzWzFdLCAiLCBsYXQ6ICIsIGFkanVzdGVkX2Nvb3Jkc1syXSkpDQogICAgZGlzdGluY3RfY29vcmRfYWRqJGxvbltpXSA8LSBhZGp1c3RlZF9jb29yZHNbMV0NCiAgICBkaXN0aW5jdF9jb29yZF9hZGokbGF0W2ldIDwtIGFkanVzdGVkX2Nvb3Jkc1syXQ0KICB9IGVsc2Ugew0KICAgIHByaW50KHBhc3RlKCJObyBzdWl0YWJsZSBsYW5kIGNvb3JkaW5hdGVzIGZvdW5kIGZvciBsb246ICIsIGRpc3RpbmN0X2Nvb3JkX2FkaiRsb25baV0sICIsIGxhdDogIiwgZGlzdGluY3RfY29vcmRfYWRqJGxhdFtpXSkpDQogIH0NCn0NCg0Kc2F2ZVJEUyhkaXN0aW5jdF9jb29yZF9hZGosIGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGoucmRzIikNCmBgYA0KDQojIyMgKipBZGp1c3QgY29vcmRpbmF0ZXMgbm90IG1hdGNoaW5nIGxhbmQgbWFzc2VzKiogDQoNClNvbWUgY29vcmRpbmF0ZXMgd2VyZSBub3QgYWRqdXN0ZWQgcHJvcGVybHksIGFuZCBoYWQgdG8gdW5kZXJnbyBmdXJ0aGVyIHByb2Nlc3NpbmcuDQoNCmBgYHtyLCBldmFsPUZ9DQoNCnNwZWNpZXNfb2NjdXJyZW5jZTwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzLnJkcyIpDQpzcGVjaWVzX29jY3VycmVuY2U8LSByZW5hbWUoc3BlY2llc19vY2N1cnJlbmNlLGxvbj1Mb25naXR1ZGUueC4sIGxhdD1MYXRpdHVkZS55LikNCg0Kbl9zcGVjaWVzPC0gdW5pcXVlKHNwZWNpZXNfb2NjdXJyZW5jZSR0aXAubGFiZWwpICMgNTIxMyANCg0KZGlzdGluY3RfY29vcmRfYWRqIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGoucmRzIikNCg0KIyBJZGVudGlmeSBjb29yZGluYXRlcyB0aGF0IGRpZCBub3QgaW50ZXJzZWN0IHdpdGggbGFuZCBtYXNzZXMNCmZhaWxlZF9jb29yZHMgPC0gZGF0YS5mcmFtZSgNCiAgbG9uID0gYygtMTI0LjUsIDM4LjUsIC0xMjMuNSwgMTI5LjUsIC0xMDcuNSwgLTc0LjUsIC02OC41LCAtNjUuNSwgMTIyLjUsIDk3LjUsIA0KICAgICAgICAgIDEyMC41LCAxMjYuNSwgLTE0LjUsIC05LjUsIDEwNy41LCAtMC41LCAwLjUsIC0wLjUsIDAuNSwgNi41LCAxNTAuNSwgLTUuNSwgDQogICAgICAgICAgNTAuNSwgMTcuNSwgMjUuNSwgMTIyLjUsIC02NC41KSwNCiAgbGF0ID0gYyg0NS41LCA0MS41LCAzNy41LCAyNy41LCAyMy41LCAxOS41LCAxOS41LCAxNy41LCAxNS41LCAxMy41LCAxMC41LCAxMC41LCANCiAgICAgICAgICA5LjUsIDQuNSwgMy41LCAwLjUsIDAuNSwgLTAuNSwgLTAuNSwgLTAuNSwgLTguNSwgLTE2LjUsIC0xNi41LCAtMzMuNSwgLTM0LjUsIA0KICAgICAgICAgIC0zNC41LCAtNDEuNSkNCikNCg0KDQpkaXN0aW5jdF9jb29yZF9hZGogPC0gZGlzdGluY3RfY29vcmRfYWRqICU+JQ0KICBtdXRhdGUoaWQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCmZhaWxlZF9jb29yZHMgPC0gZmFpbGVkX2Nvb3JkcyAlPiUNCiAgbXV0YXRlKGlkID0gcGFzdGUobG9uLCBsYXQpKQ0KDQojIFJlcGxhY2UgdGhlIGNvb3JkaW5hdGVzIA0KZGlzdGluY3RfY29vcmRfYWRqIDwtIGRpc3RpbmN0X2Nvb3JkX2FkaiAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKGMobG9uLCBsYXQpLCB+IGlmX2Vsc2UoaWQgJWluJSBmYWlsZWRfY29vcmRzJGlkLCBOQV9yZWFsXywgLikpDQogICkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLWlkKQ0KDQojIEdldCBvcmlnaW5hbCBkaXN0aW5jdCBjb29yZGluYXRlcw0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzLnJkcyIpDQoNCmRpc3RpbmN0X2Nvb3JkX2FkajwtIGNiaW5kKGRpc3RpbmN0X2Nvb3JkLCBkaXN0aW5jdF9jb29yZF9hZGopDQoNCg0KZGlzdGluY3RfY29vcmRfYWRqPC0gZmlsdGVyKGRpc3RpbmN0X2Nvb3JkX2FkaiwgaXMubmEobGF0KT09RkFMU0UpDQoNCnNhdmVSRFMoZGlzdGluY3RfY29vcmRfYWRqLCBmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCg0KIyMNCnNwZWNpZXNfb2NjdXJyZW5jZSA8LSBzcGVjaWVzX29jY3VycmVuY2UgJT4lDQogIG11dGF0ZShpZCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0Kc3BlY2llc19vY2N1cnJlbmNlICA8LSBzcGVjaWVzX29jY3VycmVuY2UgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcyhjKGxvbiwgbGF0KSwgfiBpZl9lbHNlKGlkICVpbiUgZmFpbGVkX2Nvb3JkcyRpZCwgTkFfcmVhbF8sIC4pKQ0KICApICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1pZCkNCg0Kc3BlY2llc19vY2N1cnJlbmNlIDwtIGZpbHRlcihzcGVjaWVzX29jY3VycmVuY2UsIGlzLm5hKGxhdCk9PUZBTFNFKQ0KDQpuX3NwZWNpZXM8LSB1bmlxdWUoc3BlY2llc19vY2N1cnJlbmNlJHRpcC5sYWJlbCkgIyA1MjAzLiBBbGwgZ29vZC4NCg0KDQojIyMgVXBkYXRpbmcgc3BlY2llcyBvY2N1cnJlbmNlIGRhdGFzZXQNCg0KZGlzdGluY3RfY29vcmQ8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KDQojIE1hdGNoIGJvZHkgbWFzcyBkYXRhIHRvIGNvb3JkaW5hdGVzDQpwcmVzZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzLnJkcyIpDQpwcmVzZW5jZSA8LSBkcGx5cjo6cmVuYW1lKHByZXNlbmNlLGxvbj1Mb25naXR1ZGUueC4sIGxhdD1MYXRpdHVkZS55LikNCnByZXNlbmNlJHRpcC5sYWJlbCA8LSBnc3ViKCJcXC4iLCAiICIsIHByZXNlbmNlJHRpcC5sYWJlbCkNCg0KcHJlc2VuY2VfYWRqdXN0ZWQgPC0gcHJlc2VuY2UgJT4lDQogIGRwbHlyOjpsZWZ0X2pvaW4oZGlzdGluY3RfY29vcmQsIGJ5ID0gYygibG9uIiA9ICJ4IiwgImxhdCIgPSAieSIpKQ0KDQpwcmVzZW5jZSA8LSBkcGx5cjo6cmVuYW1lKHByZXNlbmNlX2FkanVzdGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfbG9uID0gbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfbGF0ID0gbGF0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gPSBsb24ueSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ID0gbGF0LnkpDQoNCnByZXNlbmNlIDwtIGRwbHlyOjpmaWx0ZXIocHJlc2VuY2UsIGlzLm5hKGxvbik9PUZBTFNFKQ0KDQoNCnNhdmVSRFMocHJlc2VuY2UsIGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQoNCg0KIyMjIyMgQWRqdXN0IGNvb3JkaW5hdGVzIHRoYXQgd2VyZSBub3QgcHJvcGVybHkgYWRqdXN0ZWQgIyMjIyMjIyMjIyMjDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUNCiAgbXV0YXRlKA0KICAgIGxvbiA9IGNhc2Vfd2hlbigNCiAgICAgIGxvbiA9PSAtMTcuOTUgJiBsYXQgPT0gMjcuNzAgfiAtMTcuOTUsDQogICAgICBsb24gPT0gNTQuMDUgJiBsYXQgPT0gMjYuNTAgfiA1NC4wNSwNCiAgICAgIGxvbiA9PSAxMDcuNTAgJiBsYXQgPT0gMTAuNTAgfiAxMDcuNSwNCiAgICAgIGxvbiA9PSAiMC4wNSIgJiBsYXQgPT0gNS42NSB+IDAuMDUsDQogICAgICBsb24gPT0gMTM0LjA1ICYgbGF0ID09IC0wLjk1IH4gMTM0LjA1LA0KICAgICAgbG9uID09IDU1LjI1ICYgbGF0ID09IC00LjUwIH4gNTUuMjMsDQogICAgICBsb24gPT0gMTMzLjUwICYgbGF0ID09IC0xMS41MCB+IDEzMy40NSwNCiAgICAgIGxvbiA9PSAtMzguOTUgJiBsYXQgPT0gLTE0LjEwIH4gLTM4Ljk3LA0KICAgICAgbG9uID09IC01Ljc1ICYgbGF0ID09IC0xNS45NSB+IC01LjcwLA0KICAgICAgbG9uID09IDQ5LjA1ICYgbGF0ID09IC0xOS4xNSB+IDQ5LjAyLA0KICAgICAgbG9uID09IDMwLjA1ICYgbGF0ID09IC0zMS4yNSB+IDMwLjA1LA0KICAgICAgbG9uID09IDE0Ny4wNSAmIGxhdCA9PSAtMzguNTAgfiAxNDcuMDUsDQogICAgICBsb24gPT0gMTc0LjUgJiBsYXQgPT0gLTM1LjUgfiAxNzQuNDUsDQogICAgICBUUlVFIH4gbG9uDQogICAgKSwNCiAgICBsYXQgPSBjYXNlX3doZW4oDQogICAgICBsb24gPT0gLTE3Ljk1ICYgbGF0ID09IDI3LjcwIH4gMjcuNzUsDQogICAgICBsb24gPT0gNTQuMDUgJiBsYXQgPT0gMjYuNTAgfiAyNi44LA0KICAgICAgbG9uID09IDEwNy41MCAmIGxhdCA9PSAxMC41MCB+IDEwLjU1LA0KICAgICAgbG9uID09ICIwLjA1IiAmIGxhdCA9PSA1LjY1IH4gNS43MCwNCiAgICAgIGxvbiA9PSAxMzQuMDUgJiBsYXQgPT0gLTAuOTUgfiAtMC44NSwNCiAgICAgIGxvbiA9PSA1NS4yNSAmIGxhdCA9PSAtNC41MCB+IC00LjUsDQogICAgICBsb24gPT0gMTMzLjUwICYgbGF0ID09IC0xMS41MCB+IC0xMS41LA0KICAgICAgbG9uID09IC0zOC45NSAmIGxhdCA9PSAtMTQuMTAgfiAtMTQuMSwNCiAgICAgIGxvbiA9PSAtNS43NSAmIGxhdCA9PSAtMTUuOTUgfiAtMTUuOTUsDQogICAgICBsb24gPT0gNDkuMDUgJiBsYXQgPT0gLTE5LjE1IH4gLTE5LjE1LA0KICAgICAgbG9uID09IDMwLjA1ICYgbGF0ID09IC0zMS4yNSB+IC0zMS4yMCwNCiAgICAgIGxvbiA9PSAxNDcuMDUgJiBsYXQgPT0gLTM4LjUwIH4gLTM4LjQ1LA0KICAgICAgbG9uID09IDE3NC41ICYgbGF0ID09IC0zNS41IH4gLTM1LjUsDQogICAgICBUUlVFIH4gbGF0DQogICAgKQ0KICApDQpzYXZlUkRTKGRpc3RpbmN0X2Nvb3JkLCBmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCg0KIyMjIFNhbWUgZm9yIHNwZWNpZXMgY29vcmRpbmF0ZXMNCg0Kc3BlY2llc19jb29yZGluYXRlcyA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KDQpzcGVjaWVzX2Nvb3JkaW5hdGVzIDwtIHNwZWNpZXNfY29vcmRpbmF0ZXMgJT4lIA0KICBtdXRhdGUoDQogICAgbG9uID0gY2FzZV93aGVuKA0KICAgICAgbG9uID09IC0xNy45NSAmIGxhdCA9PSAyNy43MCB+IC0xNy45NSwNCiAgICAgIGxvbiA9PSA1NC4wNSAmIGxhdCA9PSAyNi41MCB+IDU0LjA1LA0KICAgICAgbG9uID09IDEwNy41MCAmIGxhdCA9PSAxMC41MCB+IDEwNy41LA0KICAgICAgbG9uID09ICIwLjA1IiAmIGxhdCA9PSA1LjY1IH4gMC4wNSwNCiAgICAgIGxvbiA9PSAxMzQuMDUgJiBsYXQgPT0gLTAuOTUgfiAxMzQuMDUsDQogICAgICBsb24gPT0gNTUuMjUgJiBsYXQgPT0gLTQuNTAgfiA1NS4yMywNCiAgICAgIGxvbiA9PSAxMzMuNTAgJiBsYXQgPT0gLTExLjUwIH4gMTMzLjQ1LA0KICAgICAgbG9uID09IC0zOC45NSAmIGxhdCA9PSAtMTQuMTAgfiAtMzguOTcsDQogICAgICBsb24gPT0gLTUuNzUgJiBsYXQgPT0gLTE1Ljk1IH4gLTUuNzAsDQogICAgICBsb24gPT0gNDkuMDUgJiBsYXQgPT0gLTE5LjE1IH4gNDkuMDIsDQogICAgICBsb24gPT0gMzAuMDUgJiBsYXQgPT0gLTMxLjI1IH4gMzAuMDUsDQogICAgICBsb24gPT0gMTQ3LjA1ICYgbGF0ID09IC0zOC41MCB+IDE0Ny4wNSwNCiAgICAgIGxvbiA9PSAxNzQuNSAmIGxhdCA9PSAtMzUuNSB+IDE3NC40NSwNCiAgICAgIFRSVUUgfiBsb24NCiAgICApLA0KICAgIGxhdCA9IGNhc2Vfd2hlbigNCiAgICAgIGxvbiA9PSAtMTcuOTUgJiBsYXQgPT0gMjcuNzAgfiAyNy43NSwNCiAgICAgIGxvbiA9PSA1NC4wNSAmIGxhdCA9PSAyNi41MCB+IDI2LjgsDQogICAgICBsb24gPT0gMTA3LjUwICYgbGF0ID09IDEwLjUwIH4gMTAuNTUsDQogICAgICBsb24gPT0gIjAuMDUiICYgbGF0ID09IDUuNjUgfiA1LjcwLA0KICAgICAgbG9uID09IDEzNC4wNSAmIGxhdCA9PSAtMC45NSB+IC0wLjg1LA0KICAgICAgbG9uID09IDU1LjI1ICYgbGF0ID09IC00LjUwIH4gLTQuNSwNCiAgICAgIGxvbiA9PSAxMzMuNTAgJiBsYXQgPT0gLTExLjUwIH4gLTExLjUsDQogICAgICBsb24gPT0gLTM4Ljk1ICYgbGF0ID09IC0xNC4xMCB+IC0xNC4xLA0KICAgICAgbG9uID09IC01Ljc1ICYgbGF0ID09IC0xNS45NSB+IC0xNS45NSwNCiAgICAgIGxvbiA9PSA0OS4wNSAmIGxhdCA9PSAtMTkuMTUgfiAtMTkuMTUsDQogICAgICBsb24gPT0gMzAuMDUgJiBsYXQgPT0gLTMxLjI1IH4gLTMxLjIwLA0KICAgICAgbG9uID09IDE0Ny4wNSAmIGxhdCA9PSAtMzguNTAgfiAtMzguNDUsDQogICAgICBsb24gPT0gMTc0LjUgJiBsYXQgPT0gLTM1LjUgfiAtMzUuNSwNCiAgICAgIFRSVUUgfiBsYXQNCiAgICApDQogICkNCg0Kc2F2ZVJEUyhzcGVjaWVzX2Nvb3JkaW5hdGVzLCBmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KYGBgDQoNCiMNCg0KIyAqKkJpb3BoeXNpY2FsIG1vZGVsbGluZyoqIA0KDQpUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHlvdSBoYXZlIGRvd25sb2FkZWQgTkNFUCBhbmQgVGVycmFDbGltYXRlIGRhdGEgbG9jYWxseS4gTkNFUCBkYXRhIGNhbiBiZSBkb3dubG9hZGVkIGF0IGh0dHBzOi8vcHNsLm5vYWEuZ292L3RocmVkZHMvY2F0YWxvZy9EYXRhc2V0cy9uY2VwLnJlYW5hbHlzaXMyL2dhdXNzaWFuX2dyaWQvY2F0YWxvZy5odG1sIA0KOyBhbmQgVGVycmFDbGltYXRlIGRhdGEgY2FuIGJlIGRvd25sb2FkZWQgYXQgaHR0cHM6Ly93d3cuY2xpbWF0b2xvZ3lsYWIub3JnL3RlcnJhY2xpbWF0ZS5odG1sIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9CaW9waHlzaWNhbF9tb2RlbGxpbmcvKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9CaW9waHlzaWNhbF9tb2RlbGxpbmcvKiogDQpUaGVzZSBmb2xkZXJzIGNvbnRhaW4gUiBmaWxlcyBmb3IgZWFjaCBtaWNyb2hhYml0YXQgKCoqU3Vic3RyYXRlLyoqIGZvciB0ZXJyZXN0cmlhbCBjb25kaXRpb25zOyAqKlBvbmQvKiogZm9yIGFxdWF0aWMgY29uZGl0aW9uczsgKipBcmJvcmVhbC8qKiBmb3IgYXJib3JlYWwgY29uZGl0aW9ucykgYW5kIGNsaW1hdGljIHNjZW5hcmlvICgqKi9jdXJyZW50KiogZm9yIDIwMDYtMjAxNTsgKioyQy8qKiBmb3IgKzIgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVsczsgb3IgKio0Qy8qKiBmb3IgKzQgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscykuDQoNCkZvciBlYWNoIGNvbmRpdGlvbnMsIFIgZmlsZXMgYXJlIHNlcGFyYXRlZCBpbiBiYXRjaGVzIHRvIHJlZHVjZSBtZW1vcnkgYW5kIHRpbWUgcmVxdWlyZW1lbnRzLiBUaGVyZSBhcmUgYWxzbyBmaWxlcyB3aXRoIHRoZSBzdWZmaXggIioqLi4ucHJvYmxlbWF0aWNfbG9jYXRpb25zKiogb3IgIioqLi4uZmFpbGVkX2xvY2F0aW9ucyoqIi4NClRoZSBmb3JtZXIgcmVmZXIgdG8gbG9jYXRpb25zIHRoYXQgZGlkIG5vdCBydW4gcHJvcGVybHkgaW4gcGFyYWxsZWwgKGUuZy4gZ290IHN0dWNrIGluIGVuZGxlc3MgbG9vcHMpIGFuZCBoYWQgdG8gcnVuIGluIHJlZ3VsYXIgZm9yIGxvb3BzOyB3aGlsZSBmYWlsZWQgbG9jYXRpb25zIGFyZSBsb2NhdGlvbnMgdGhhdCB3ZXJlIGlkZW50aWZpZWQgYXMgZmFpbGluZywgcG9zdC1ob2MsIGFuZCB0aGF0IG5lZWRlZCBzbWFsbCBhZGp1c3RtZW50cyAoaS5lLiwgaW5jcmVhc2UgaW4gdGhlIGVycm9yIHRvbGVyYW5jZSBmb3IgY2FsY3VsYXRpbmcgc29pbCB0ZW1wZXJhdHVyZXMgaW4gTmljaGVNYXBSKS4gQWxsIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBldmVudHVhbGx5IHJhbiB3aXRob3V0IGVycm9yLg0KDQpPbmNlIGFsbCBSIHNjcmlwdHMgaGF2ZSBmaW5pc2hlZCBydW5uaW5nLCB5b3UgY2FuIGNvbWJpbmUgdGhlIG91dHB1dHMgZnJvbSBhbGwgZmlsZXMgdXNpbmcgdGhlICIqKkNvbWJpbmluZ19vdXRwdXRzLi4uKioiIGZpbGUgZm9yIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gDQoNCk1vZGVscyBmb3IgYXJib3JlYWwgc3BlY2llcyBhbHNvIHJlcXVpcmUgZnVydGhlciBhZGp1c3RtZW50cyBiZWNhdXNlIHRoZXkgcmFuIG9uIGEgc3Vic2V0IG9mIHNwZWNpZXMuIFlvdSBjYW4gZmluZCB0aGUgc2NyaXB0IHRvIHN1YnNldCBhcmJvcmVhbCBzcGVjaWVzIGluICoqUi9EYXRhX3dyYW5nbGluZy9GaWx0ZXJpbmdfZGF0YV9mb3JfYXJib3JlYWxfc3BlY2llcy5SKiosIGFzIHdlbGwgYXMgc29tZSBjb2RlIHRvIG1hdGNoIHRoZSByb3cgbnVtYmVycyBrbm93biB0byBiZSAicHJvYmxlbWF0aWMgbG9jYXRpb25zIiBpbiB0aGlzIHN1YnNldHRlZCBkYXRhc2V0IGluICoqUi9EYXRhX3dyYW5nbGluZy9NYXRjaGluZ19yb3dfbnVtYmVyc19wcm9ibGVtYXRpY19sb2NhdGlvbnNfYXJib3JlYWwuUioqDQoNCiMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQojIyMgKipDdXJyZW50IGNsaW1hdGUqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHByb2Nlc3MgY29vcmRpbmF0ZXMqKg0KYGBge3IsIGV2YWw9Rn0NCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KDQojIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDE4MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciAzMCBtaW51dGVzDQoNCg0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggbG9jYXRpb24NCnByb2Nlc3NfbG9jYXRpb24gPC0gZnVuY3Rpb24obG9jKSB7DQogIA0KICBwcmludChwYXN0ZSgiUHJvY2Vzc2luZyBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogIA0KICAjIFNldCBwYXJhbWV0ZXJzDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIGNvb3JkczwtIGMobG9jJGxvbiwgbG9jJGxhdCkNCiAgDQogIEVSUiA8LSAxLjUgICMgQWRqdXN0aW5nIEVSUiBiYXNlZCBvbiB0aGUgbG9jYXRpb25zIChsb2NhdGlvbnMgd2l0aCBzbm93IHNvbWV0aW1lcyBuZWVkIGEgaGlnaGVyIHZhbHVlKQ0KICANCiAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJykNCiAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgIyBJZiB0aGUgcHJvY2VzcyB0YWtlcyBsb25nZXIgdGhhbiAxMCBtaW51dGVzLCBicmVhay4NCiAgDQogIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9IGVsc2Ugew0KICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICB9DQogIA0KICANCiAgIyBXaGVuIHRoZSBmaXJzdCBtaWNyb19uY2VwIGZhaWxzLCB0cnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgRVJSDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHdoaWxlKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKXsNCiAgICAgIEVSUiA8LSBFUlIgKyAwLjUNCiAgICAgIA0KICAgICAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIG1pY3JvX25jZXAoKSBmdW5jdGlvbiBpbnNpZGUgdGhlIHdoaWxlIGxvb3AgYXMgd2VsbA0KICAgICAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICAgICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcpDQogICAgICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogICAgICANCiAgICAgIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICAgICAgcHJpbnQocGFzdGUoIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgICAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJtaWNyb19uY2VwIGluc2lkZSB3aGlsZSBsb29wIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICAgICAgfQ0KICAgICAgDQogICAgICAjIElmIEVSUiBleGNlZWRzIDUsIGJyZWFrIHRoZSBsb29wIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIG1pY3JvJG1ldG91dFssMV0NCiAgICAgIGlmKEVSUiA+PSA1KXsNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogICMgSWYgZXZlbiBhZnRlciBhZGp1c3RpbmcgRVJSIG1pY3JvX25jZXAgZmFpbHMsIHJldHVybiBhbiBlcnJvciBtZXNzYWdlDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogICMgQW5vdGhlciBleHBsaWNpdCBjaGVjaw0KICBpZiAoIW1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgYXNzaWduKCJtaWNybyIsIG1pY3JvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogIHN1Y2Nlc3MgPC0gRkFMU0UNCiAgcmVzdWx0IDwtIE5VTEwNCiAgDQogICMgVXNlIHdpdGhUaW1lb3V0KCkgZm9yIHRoZSBlY3RvdGhlcm0oKSBmdW5jdGlvbiBhcyB3ZWxsDQogIGVjdG9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICB0cnlDYXRjaCh7DQogICAgICBlY3RvIDwtIE5pY2hlTWFwUjo6ZWN0b3RoZXJtKGxpdmU9MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSBsb2MkbWVkaWFuX21hc3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQogICAgICBsaXN0KHN1Y2Nlc3MgPSBUUlVFLCBlY3RvID0gZWN0bykNCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IEZBTFNFLA0KICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLA0KICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gcGFzdGUoIkZhaWxlZCBvbiBlY3RvdGhlcm0gY2FsbDoiLCBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKQ0KICAgIH0pDQogIH0sIHRpbWVvdXQgPSAyMDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgDQogIGlmIChpbmhlcml0cyhlY3RvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwoZWN0b19yZXN1bHQpKSB7DQogICAgcHJpbnQocGFzdGUoImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9DQogIA0KICBpZighZWN0b19yZXN1bHQkc3VjY2Vzcyl7DQogICAgcmV0dXJuKGVjdG9fcmVzdWx0KQ0KICB9DQogIA0KICBnYygpDQogIA0KICAjIEFzc2lnbiB0aGUgc3VjY2Vzc2Z1bCBlY3RvIHJlc3VsdCB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogIGVjdG8gPC0gZWN0b19yZXN1bHQkZWN0bw0KICBhc3NpZ24oImVjdG8iLCBlY3RvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICBlbnZpcm9uIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KICANCiAgDQogICMgTWF4IGFuZCBtZWFuIGRhaWx5IHRlbXBlcmF0dXJlcw0KICBkYWlseV90ZW1wIDwtIGVudmlyb24gJT4lDQogICAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQsDQogICAgICAgICAgICAgICAgICBFUlIgPSBFUlIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShFUlIsIFlFQVIsIERPWSwgbG9uID0gcGFzdGUobG9jJGxvbiksIGxhdD1wYXN0ZShsb2MkbGF0KSkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSByb2xsaW5nIHdlZWtseSB0ZW1wZXJhdHVyZQ0KICBjYWxjX3llYXJseV9yb2xsaW5nX21lYW4gPC0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgZGF0YSRtYXhfd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtYXhfdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgcmV0dXJuKGRhdGEpDQogIH0NCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByb2xsaW5nIG1lYW4gZm9yIGVhY2ggeWVhciBhbmQgbG9jYXRpb24NCiAgZGFpbHlfdGVtcCA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KICANCiAgIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQogIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gb3ZlcmFsbCBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgd2FybWVzdCBkYXlzIG9mIGVhY2ggeWVhcg0KICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICByZXN1bHQgPC0gbGlzdChkYWlseV90ZW1wLCANCiAgICAgICAgICAgICAgICAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzKQ0KICANCiAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IGVjdG9fcmVzdWx0JHN1Y2Nlc3MsIHJlc3VsdCA9IHJlc3VsdCkpICMgUmV0dXJuIGEgbGlzdCB3aXRoIGEgc3VjY2VzcyBmbGFnIGFuZCB0aGUgcmVzdWx0Lg0KICANCn0NCmBgYA0KDQojIyMjICoqRnVuY3Rpb24gdG8gcHJvY2VzcyBjb29yZGluYXRlcyBpbiBjaHVua3MqKiANCg0KUHJvY2Vzc2luZyB0aGUgY29vcmRpbmF0ZXMgaW4gY2h1bmtzIGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGEgY2h1bmsgb2YgbG9jYXRpb25zDQpwcm9jZXNzX2NodW5rIDwtIGZ1bmN0aW9uKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpIHsNCiAgIyBSZWFkIGluIGRpc3RpbmN0IGNvb3JkaW5hdGVzDQogIGRpc3RpbmN0X2Nvb3JkPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCiAgDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkWywgMzo0XQ0KICBkaXN0aW5jdF9jb29yZCA8LSByZW5hbWUoZGlzdGluY3RfY29vcmQsIHggPSBsb24sIHkgPSBsYXQpDQogIA0KICAjIEFkanVzdCB0aGUgcmFuZ2Ugb2YgbG9jYXRpb25zDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW3N0YXJ0X2luZGV4OmVuZF9pbmRleCxdDQogIGxvY19saXN0IDwtIHNwbGl0KGRpc3RpbmN0X2Nvb3JkLCBzZXEobnJvdyhkaXN0aW5jdF9jb29yZCkpKQ0KICBsb2NfbGlzdCA8LSBsYXBwbHkobG9jX2xpc3QsIHVubGlzdCkNCiAgDQogICMgTWF0Y2ggYm9keSBtYXNzIGRhdGEgdG8gY29vcmRpbmF0ZXMNCiAgcHJlc2VuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KICANCiAgZGF0YV9mb3JfaW1wIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQogIA0KICBwcmVzZW5jZV9ib2R5X21hc3MgPC0gbWVyZ2UocHJlc2VuY2UsIGRwbHlyOjpzZWxlY3QoZGF0YV9mb3JfaW1wLCB0aXAubGFiZWwsIGJvZHlfbWFzcyksIGJ5ID0gInRpcC5sYWJlbCIpDQogIG1lZGlhbl9ib2R5X21hc3MgPC0gcHJlc2VuY2VfYm9keV9tYXNzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShtZWRpYW5fbWFzcyA9IG1lZGlhbihib2R5X21hc3MsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIGRwbHlyOjp1bmdyb3VwKCkNCiAgDQogIG1lZGlhbl9ib2R5X21hc3MgPC0gbXV0YXRlKG1lZGlhbl9ib2R5X21hc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzID0gaWZlbHNlKGlzLm5hKG1lZGlhbl9tYXNzKT09VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC40LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbWFzcykpDQogIA0KICAjIENvbnZlcnQgbG9jX2xpc3QgYmFjayBpbnRvIGEgZGF0YSBmcmFtZQ0KICBsb2NfZGYgPC0gZG8uY2FsbCgicmJpbmQiLCBsb2NfbGlzdCkNCiAgbG9jX2RmIDwtIGFzLmRhdGEuZnJhbWUobG9jX2RmKQ0KICBuYW1lcyhsb2NfZGYpIDwtIGMoImxvbiIsICJsYXQiKQ0KICANCiAgIyBKb2luIGxvY19kZiBhbmQgbWVkaWFuX2JvZHlfbWFzcw0KICBsb2NfZGYgPC0gZHBseXI6OmxlZnRfam9pbihsb2NfZGYsIG1lZGlhbl9ib2R5X21hc3MsIGJ5ID0gYygibG9uIiwgImxhdCIpKQ0KICANCiAgIyBDb252ZXJ0IGxvY19kZiBiYWNrIGludG8gYSBsaXN0DQogIGxvY19saXN0IDwtIHNwbGl0KGxvY19kZiwgc2VxKG5yb3cobG9jX2RmKSkpDQogIA0KICAjICMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCiAgcGxhbihtdWx0aWNvcmUod29ya2Vycz0xNikpDQogIA0KICAjIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCiAgb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy50aW1lb3V0ID0gMTgwMCkgICMgU2V0IGEgZ2xvYmFsIHRpbWVvdXQgZm9yIDMwIG1pbnV0ZXMNCiAgDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIA0KICBTeXMudGltZSgpDQogIA0KICByZXN1bHRzIDwtIGZ1dHVyZS5hcHBseTo6ZnV0dXJlX2xhcHBseShsb2NfbGlzdCwgcHJvY2Vzc19sb2NhdGlvbiwgZnV0dXJlLnBhY2thZ2VzPWMoIk5pY2hlTWFwUiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pY3JvY2xpbWEiLCAiZHBseXIiLCAiem9vIiwgIlIudXRpbHMiKSkNCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIA0KICBzYXZlUkRTKHJlc3VsdHMsIGZpbGU9cGFzdGUwKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfc3Vic3RyYXRlXyIsIHN0YXJ0X2luZGV4LCAiLSIsIGVuZF9pbmRleCwgIi5yZHMiKSkNCiAgDQp9DQpgYGANCg0KIyMjIyAqKlByb2Nlc3MgYWxsIGxvY2F0aW9ucyoqDQoNCmBgYHtyLCBldmFsPUZ9DQoNCmRzdGFydCA8LSAiMDEvMDEvMjAwNSINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQoNClN5cy50aW1lKCkNCg0KY2h1bmtfc2l6ZSA8LSAxNg0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHJvdyBudW1iZXJzIGluIGRpc3RpbmN0X2Nvb3JkDQpzdGFydF9yb3cgPC0gMQ0KZW5kX3JvdyA8LSAxNDA5Mg0KDQojIENhbGN1bGF0ZSB0b3RhbCBjaHVua3MgZm9yIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCnRvdGFsX2NodW5rcyA8LSBjZWlsaW5nKChlbmRfcm93IC0gc3RhcnRfcm93ICsgMSkgLyBjaHVua19zaXplKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGNodW5rDQpmb3IoaSBpbiBzZXEodG90YWxfY2h1bmtzKSkgew0KICAjIENhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIGluZGljZXMgZm9yIHRoZSBjdXJyZW50IGNodW5rDQogIHN0YXJ0X2luZGV4IDwtICgoaSAtIDEpICogY2h1bmtfc2l6ZSkgKyBzdGFydF9yb3cNCiAgZW5kX2luZGV4IDwtIG1pbihpICogY2h1bmtfc2l6ZSArIHN0YXJ0X3JvdyAtIDEsIGVuZF9yb3cpDQogIA0KICAjIENhbGwgdGhlIHByb2Nlc3NfY2h1bmsgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQgb2YgNjAwIHNlY29uZHMNCiAgcmVzdWx0IDwtIHByb2Nlc3NfY2h1bmsoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkNCn0NCg0KU3lzLnRpbWUoKQ0KYGBgDQoNCiMjIyMgKipDb21iaW5lIG91dHB1dHMqKiANCg0KTm90ZSB0aGF0IHNvbWUgY29vcmRpbmF0ZXMgZmFpbGVkIHRvIHJ1biB3aXRoIHRoZSBjb2RlIHByb3ZpZGVkIGFib3ZlLCBhbmQgaGVuY2UgcmFuIHVzaW5nIHNsaWdodGx5IGRpZmZlcmVudCBwYXJhbWV0ZXJzIChoaWdoZXIgZXJyb3IgdG9sZXJhbmNlIGZvciBjYWxjdWxhdGluZyBzb2lsIHRlbXBlcmF0dXJlczsgbm90IGluIHBhcmFsbGVsIHNlc3Npb24pLiBTZWUgZGV0YWlscyBbSEVSRV0NCk5vdGUgYWxzbyB0aGF0IHRoZSB5ZWFyIDIwMDUgd2FzIHRha2VuIG91dCBhcyBhIGJ1cm4gaW4gdG8gYWxsb3cgdGhlIG1vZGVscyB0byBmdWxseSBjb252ZXJnZS4gDQoNCmBgYHtyLCBldmFsID1GfQ0KDQojIExpc3Qgb2YgZm9sZGVycyBmb3IgZWFjaCB0eXBlIG9mIGZpbGUNCmZvbGRlcnMgPC0gYygiMXN0X2JhdGNoIiwgIjJuZF9iYXRjaCIsICIzcmRfYmF0Y2giLCAiNHRoX2JhdGNoIiwgIjV0aF9iYXRjaCIpDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyDQogIHBhdGhfdG9fcmRzIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvcmVzdWx0cyIsIGZvbGRlciwgc2VwID0gIi8iKQ0KICANCiAgIyBHZXQgdGhlIGxpc3Qgb2YgYWxsIHJkcyBmaWxlcyBpbiB0aGUgZm9sZGVyDQogIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3JkcywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICANCiAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW50byBhIGxpc3QNCiAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICANCiAgIyBFeHRyYWN0ICdyZXN1bHQnIGZyb20gZWFjaCBzdWJsaXN0IGluIG5lc3RlZF9saXN0X3Jlc3VsdHMNCiAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgbGFwcGx5KHgsIGZ1bmN0aW9uKHkpIHlbWyJyZXN1bHQiXV0pKQ0KICANCiAgIyBGbGF0dGVuIHRoZSBsaXN0DQogIGZsYXR0ZW5lZF9saXN0IDwtIGRvLmNhbGwoImMiLCBuZXN0ZWRfbGlzdF9yZXN1bHRzKQ0KICANCiAgIyBDb21iaW5lIGFsbCBkYXRhZnJhbWVzIGZvciBlYWNoIG1ldHJpYyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICBjb21iaW5lZF9kYWlseV90ZW1wW1tmb2xkZXJdXSA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShmbGF0dGVuZWRfbGlzdCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCiAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXApDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzKQ0KDQojIENvbnZlcnQgdG8gbnVtZXJpYyB2YWx1ZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbG9uIDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsb24pDQpjb21iaW5lZF9kYWlseV90ZW1wJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0KQ0KDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsb24pDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsYXQgPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsYXQpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgZWFjaCBmb2xkZXINCmZvciAoZm9sZGVyIGluIGZvbGRlcnMpIHsNCiAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIHN1YmZvbGRlciAicHJvYmxlbWF0aWNfbG9jYXRpb25zIg0KICBwYXRoX3RvX3N1YmZvbGRlciA8LSBwYXN0ZSgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS9jdXJyZW50L3Jlc3VsdHMiLCBmb2xkZXIsICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiLCBzZXAgPSAiLyIpDQogIA0KICAjIENoZWNrIGlmIHRoZSBzdWJmb2xkZXIgZXhpc3RzDQogIGlmIChkaXIuZXhpc3RzKHBhdGhfdG9fc3ViZm9sZGVyKSkgew0KICAgICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIHN1YmZvbGRlcg0KICAgIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3N1YmZvbGRlciwgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICAgIA0KICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogICAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICAgIA0KICAgICMgRXh0cmFjdCB0aGUgZm91ciBkYXRhZnJhbWVzIGZyb20gZWFjaCBsaXN0IGFuZCB1bmxpc3QgJ2xhdCcgYW5kICdsb24nIGNvbHVtbnMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1sxXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1syXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIA0KICAgIA0KICAgICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlcg0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXINCiAgfQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgc3ViZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEdldCB0aGUgcGF0aCB0byB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcGF0aF90b19mYWlsZWRfbG9jYXRpb25zIDwtICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvcmVzdWx0cy9mYWlsZWRfbG9jYXRpb25zIg0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGxpc3QoKQ0KDQojIEdldCB0aGUgbGlzdCBvZiAucmRzIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpyZHNfZmlsZXNfZmFpbGVkIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQojIExvb3Agb3ZlciBlYWNoIC5yZHMgZmlsZQ0KZm9yIChmaWxlX2ZhaWxlZCBpbiByZHNfZmlsZXNfZmFpbGVkKSB7DQogICMgUmVhZCB0aGUgLnJkcyBmaWxlIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkIDwtIHJlYWRSRFMoZmlsZV9mYWlsZWQpDQogIA0KICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIHRoZSBsaXN0DQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMV1dDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzJdXQ0KICANCiAgIyBTdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcyBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZF9zdWJmb2xkZXINCiAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkW1tmaWxlX2ZhaWxlZF1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXINCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyBTYXZlIGZpbGVzDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS9jdXJyZW50L2RhaWx5X3RlbXBfc3Vic3RyYXRlLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS9jdXJyZW50L2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZS5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5c19zdWJzdHJhdGUucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyBDaGVjayBmb3IgbWlzc2luZyBjb29yZGluYXRlcyBhZ2Fpbg0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIG11dGF0ZShkaXN0aW5jdF9jb29yZCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIG11dGF0ZShjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCiMgRnVuY3Rpb24gb3Bwb3NpdGUgb2YgJWluJQ0KJyUhaW4lJyA8LSBmdW5jdGlvbih4LHkpISgnJWluJScoeCx5KSkgDQoNCm1pc3NpbmdfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCxdDQptaXNzaW5nX2Nvb3JkDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzIDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0KSkNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMNCg0KIyMjIA0KY2hlY2tfZHVwPC0gZ3JvdXBfYnkoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGxvbiwgbGF0LCBZRUFSLCBET1kpICU+JSBzdW1tYXJpc2Uobj1uKCkpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gZmlsdGVyKGNoZWNrX2R1cCwgbj4xKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIG11dGF0ZShsb2Nfd2l0aF9tb3JlX3RoYW5fb25lLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0Kcm93X25fZHVwPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQpKQ0Kcm93X25fZHVwDQpkdXBfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCxdDQpkdXBfY29vcmQNCg0KIyBTYXZlIHRoZSBjb21iaW5lZCBkYXRhDQpzYXZlUkRTKG1pc3NpbmdfY29vcmQsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvbWlzc2luZ19jb29yZGluYXRlcy5yZHMiKQ0Kc2F2ZVJEUyhtaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvbWlzc2luZ19jb29yZGluYXRlc19yb3dfbi5yZHMiKQ0Kc2F2ZVJEUyhyb3dfbl9kdXAsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvY3VycmVudC9yb3dfbl9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpzYXZlUkRTKGR1cF9jb29yZCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS9jdXJyZW50L2R1cGxpY2F0ZWRfY29vcmRpbmF0ZXMucmRzIikNCmBgYA0KDQoNCg0KIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgYXNzdW1lIGEgY2xpbWF0ZSBwcm9qZWN0aW9uIGFzc3VtaW5nIDIgZGVncmVlcyBvZiB3YXJtaW5nLiANCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHByb2Nlc3MgY29vcmRpbmF0ZXMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCg0KIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAxODAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgMzAgbWludXRlcw0KDQoNCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIGxvY2F0aW9uDQpwcm9jZXNzX2xvY2F0aW9uIDwtIGZ1bmN0aW9uKGxvYykgew0KICANCiAgcHJpbnQocGFzdGUoIlByb2Nlc3NpbmcgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICANCiAgIyBTZXQgcGFyYW1ldGVycw0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICBjb29yZHM8LSBjKGxvYyRsb24sIGxvYyRsYXQpDQogIA0KICAjIENoZWNrIGlmIGN1cnJlbnQgaW5kZXggZmFsbHMgd2l0aGluIGFueSBvZiB0aGUgcHJvYmxlbWF0aWMgcmFuZ2VzDQogIEVSUiA8LSAxLjUNCiAgDQogIG1pY3JvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSBFUlIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0gZWxzZSB7DQogICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogIH0NCiAgDQogIA0KICAjIFdoZW4gdGhlIGZpcnN0IG1pY3JvX25jZXAgZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBFUlINCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgd2hpbGUobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpew0KICAgICAgRVJSIDwtIEVSUiArIDAuNQ0KICAgICAgDQogICAgICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgbWljcm9fbmNlcCgpIGZ1bmN0aW9uIGluc2lkZSB0aGUgd2hpbGUgbG9vcCBhcyB3ZWxsDQogICAgICBtaWNyb19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgICAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gRVJSLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgICAgIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgICAgIA0KICAgICAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgICAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgICB9DQogICAgICANCiAgICAgICMgSWYgRVJSIGV4Y2VlZHMgNSwgYnJlYWsgdGhlIGxvb3AgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgbWljcm8kbWV0b3V0WywxXQ0KICAgICAgaWYoRVJSID49IDUpew0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCiAgIyBJZiBldmVuIGFmdGVyIGFkanVzdGluZyBFUlIgbWljcm9fbmNlcCBmYWlscywgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UNCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgIyBBbm90aGVyIGV4cGxpY2l0IGNoZWNrDQogIGlmICghbWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICBhc3NpZ24oIm1pY3JvIiwgbWljcm8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgc3VjY2VzcyA8LSBGQUxTRQ0KICByZXN1bHQgPC0gTlVMTA0KICANCiAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIGVjdG90aGVybSgpIGZ1bmN0aW9uIGFzIHdlbGwNCiAgZWN0b19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgIHRyeUNhdGNoKHsNCiAgICAgIGVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0wLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IGxvYyRtZWRpYW5fbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IFRSVUUsIGVjdG8gPSBlY3RvKQ0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbGlzdChzdWNjZXNzID0gRkFMU0UsDQogICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksDQogICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBwYXN0ZSgiRmFpbGVkIG9uIGVjdG90aGVybSBjYWxsOiIsIGFzLmNoYXJhY3Rlcihjb25kaXRpb25NZXNzYWdlKGUpKSkpDQogICAgfSkNCiAgfSwgdGltZW91dCA9IDMwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgaWYgKGluaGVyaXRzKGVjdG9fcmVzdWx0LCAidHJ5LWVycm9yIikgfHwgaXMubnVsbChlY3RvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJlY3RvdGhlcm0oKSBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0NCiAgDQogIGlmKCFlY3RvX3Jlc3VsdCRzdWNjZXNzKXsNCiAgICByZXR1cm4oZWN0b19yZXN1bHQpDQogIH0NCiAgDQogIGdjKCkNCiAgDQogICMgQXNzaWduIHRoZSBzdWNjZXNzZnVsIGVjdG8gcmVzdWx0IHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgZWN0byA8LSBlY3RvX3Jlc3VsdCRlY3RvDQogIGFzc2lnbigiZWN0byIsIGVjdG8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIGVudmlyb24gPC0gYXMuZGF0YS5mcmFtZShlY3RvJGVudmlyb24pDQogIA0KICAjIE1heCBhbmQgbWVhbiBkYWlseSB0ZW1wZXJhdHVyZXMNCiAgZGFpbHlfdGVtcCA8LSBlbnZpcm9uICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0LA0KICAgICAgICAgICAgICAgICAgRVJSID0gRVJSKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoRVJSLCBZRUFSLCBET1ksIGxvbiA9IHBhc3RlKGxvYyRsb24pLCBsYXQ9cGFzdGUobG9jJGxhdCkpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICAjIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcm9sbGluZyB3ZWVrbHkgdGVtcGVyYXR1cmUNCiAgY2FsY195ZWFybHlfcm9sbGluZ19tZWFuIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgICBkYXRhJG1lYW5fd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtZWFuX3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIGRhdGEkbWF4X3dlZWtseV90ZW1wIDwtIHpvbzo6cm9sbGFwcGx5KGRhdGEkbWF4X3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIHJldHVybihkYXRhKQ0KICB9DQogIA0KICAjIENhbGN1bGF0ZSB0aGUgcm9sbGluZyBtZWFuIGZvciBlYWNoIHllYXIgYW5kIGxvY2F0aW9uDQogIGRhaWx5X3RlbXAgPC0gZGFpbHlfdGVtcCAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgbG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCiAgDQogICMgSWRlbnRpZnkgdGhlIHdhcm1lc3QgOTEgZGF5cyAoMyBtb250aHMpIG9mIGVhY2ggeWVhcg0KICBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkNCiAgDQogICMgQ2FsY3VsYXRlIHRoZSBtZWFuIG92ZXJhbGwgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgdGhlIHdhcm1lc3QgZGF5cyBvZiBlYWNoIHllYXINCiAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIGZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICAgIHRoaXJkX3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuNzUpLA0KICAgICAgICAgICAgICAgICAgICAgbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgobWF4X3RlbXApLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KICANCiAgcmVzdWx0IDwtIGxpc3QoZGFpbHlfdGVtcCwgDQogICAgICAgICAgICAgICAgIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCANCiAgICAgICAgICAgICAgICAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cykNCiAgDQogIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBlY3RvX3Jlc3VsdCRzdWNjZXNzLCByZXN1bHQgPSByZXN1bHQpKSAjIFJldHVybiBhIGxpc3Qgd2l0aCBhIHN1Y2Nlc3MgZmxhZyBhbmQgdGhlIHJlc3VsdC4NCiAgDQp9DQpgYGANCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHByb2Nlc3MgY29vcmRpbmF0ZXMgaW4gY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIEZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBjaHVuayBvZiBsb2NhdGlvbnMNCnByb2Nlc3NfY2h1bmsgPC0gZnVuY3Rpb24oc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkgew0KICAjIFJlYWQgaW4gZGlzdGluY3QgY29vcmRpbmF0ZXMNCiAgZGlzdGluY3RfY29vcmQ8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KICANCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbLDM6NF0NCiAgZGlzdGluY3RfY29vcmQgPC0gcmVuYW1lKGRpc3RpbmN0X2Nvb3JkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IGxvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9IGxhdCkNCiAgDQogICMgQWRqdXN0IHRoZSByYW5nZSBvZiBsb2NhdGlvbnMNCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbc3RhcnRfaW5kZXg6ZW5kX2luZGV4LF0NCiAgbG9jX2xpc3QgPC0gc3BsaXQoZGlzdGluY3RfY29vcmQsIHNlcShucm93KGRpc3RpbmN0X2Nvb3JkKSkpDQogIGxvY19saXN0IDwtIGxhcHBseShsb2NfbGlzdCwgdW5saXN0KQ0KICANCiAgIyBNYXRjaCBib2R5IG1hc3MgZGF0YSB0byBjb29yZGluYXRlcw0KICBwcmVzZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQogIA0KICBkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCiAgDQogIHByZXNlbmNlX2JvZHlfbWFzcyA8LSBtZXJnZShwcmVzZW5jZSwgZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIHRpcC5sYWJlbCwgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBwcmVzZW5jZV9ib2R5X21hc3MgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKG1lZGlhbl9tYXNzID0gbWVkaWFuKGJvZHlfbWFzcywgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZHBseXI6OnVuZ3JvdXAoKQ0KICANCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBtdXRhdGUobWVkaWFuX2JvZHlfbWFzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MgPSBpZmVsc2UoaXMubmEobWVkaWFuX21hc3MpPT1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzKSkNCiAgDQogICMgQ29udmVydCBsb2NfbGlzdCBiYWNrIGludG8gYSBkYXRhIGZyYW1lDQogIGxvY19kZiA8LSBkby5jYWxsKCJyYmluZCIsIGxvY19saXN0KQ0KICBsb2NfZGYgPC0gYXMuZGF0YS5mcmFtZShsb2NfZGYpDQogIG5hbWVzKGxvY19kZikgPC0gYygibG9uIiwgImxhdCIpDQogIA0KICAjIEpvaW4gbG9jX2RmIGFuZCBtZWRpYW5fYm9keV9tYXNzDQogIGxvY19kZiA8LSBkcGx5cjo6bGVmdF9qb2luKGxvY19kZiwgbWVkaWFuX2JvZHlfbWFzcywgYnkgPSBjKCJsb24iLCAibGF0IikpDQogIA0KICAjIENvbnZlcnQgbG9jX2RmIGJhY2sgaW50byBhIGxpc3QNCiAgbG9jX2xpc3QgPC0gc3BsaXQobG9jX2RmLCBzZXEobnJvdyhsb2NfZGYpKSkNCiAgDQogICMgIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KICBwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCiAgDQogICMgU2V0IHRoZSBnbG9iYWwgdGltZW91dA0KICBvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAxODAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgNTAgbWludXRlcw0KICANCiAgZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KICBkZmluaXNoIDwtICIzMS8xMi8yMDE1Ig0KICANCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIHJlc3VsdHMgPC0gZnV0dXJlLmFwcGx5OjpmdXR1cmVfbGFwcGx5KGxvY19saXN0LCBwcm9jZXNzX2xvY2F0aW9uLCBmdXR1cmUucGFja2FnZXM9YygiTmljaGVNYXBSIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9jbGltYSIsICJkcGx5ciIsICJ6b28iLCAiUi51dGlscyIpKQ0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgDQogIHNhdmVSRFMocmVzdWx0cywgZmlsZT1wYXN0ZTAoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvMkMvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfc3Vic3RyYXRlX2Z1dHVyZTJDXyIsIHN0YXJ0X2luZGV4LCAiLSIsIGVuZF9pbmRleCwgIi5yZHMiKSkNCiAgDQp9DQpgYGANCg0KIyMjIyAqKlByb2Nlc3MgYWxsIGxvY2F0aW9ucyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCg0KU3lzLnRpbWUoKQ0KDQpjaHVua19zaXplIDwtIDE2DQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgcm93IG51bWJlcnMgaW4gZGlzdGluY3RfY29vcmQNCnN0YXJ0X3JvdyA8LSAxDQplbmRfcm93IDwtIDE0MDkyDQoNCiMgQ2FsY3VsYXRlIHRvdGFsIGNodW5rcyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZQ0KdG90YWxfY2h1bmtzIDwtIGNlaWxpbmcoKGVuZF9yb3cgLSBzdGFydF9yb3cgKyAxKSAvIGNodW5rX3NpemUpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggY2h1bmsNCmZvcihpIGluIHNlcSh0b3RhbF9jaHVua3MpKSB7DQogICMgQ2FsY3VsYXRlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgY2h1bmsNCiAgc3RhcnRfaW5kZXggPC0gKChpIC0gMSkgKiBjaHVua19zaXplKSArIHN0YXJ0X3Jvdw0KICBlbmRfaW5kZXggPC0gbWluKGkgKiBjaHVua19zaXplICsgc3RhcnRfcm93IC0gMSwgZW5kX3JvdykNCiAgDQogICMgQ2FsbCB0aGUgcHJvY2Vzc19jaHVuayBmdW5jdGlvbiB3aXRoIGEgdGltZW91dCBvZiA2MDAgc2Vjb25kcw0KICByZXN1bHQgPC0gcHJvY2Vzc19jaHVuayhzdGFydF9pbmRleCwgZW5kX2luZGV4KQ0KfQ0KDQpTeXMudGltZSgpDQpgYGANCg0KIyMjIyAqKkNvbWJpbmUgb3V0cHV0cyoqIA0KDQpOb3RlIHRoYXQgc29tZSBjb29yZGluYXRlcyBmYWlsZWQgdG8gcnVuIHdpdGggdGhlIGNvZGUgcHJvdmlkZWQgYWJvdmUsIGFuZCBoZW5jZSByYW4gdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IHBhcmFtZXRlcnMgKGhpZ2hlciBlcnJvciB0b2xlcmFuY2UgZm9yIGNhbGN1bGF0aW5nIHNvaWwgdGVtcGVyYXR1cmVzOyBub3QgaW4gcGFyYWxsZWwgc2Vzc2lvbikuIFNlZSBkZXRhaWxzIFtIRVJFXQ0KTm90ZSBhbHNvIHRoYXQgdGhlIHllYXIgMjAwNSB3YXMgdGFrZW4gb3V0IGFzIGEgYnVybiBpbiB0byBhbGxvdyB0aGUgbW9kZWxzIHRvIGZ1bGx5IGNvbnZlcmdlLiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIExpc3Qgb2YgZm9sZGVycyBmb3IgZWFjaCB0eXBlIG9mIGZpbGUNCmZvbGRlcnMgPC0gYygiMXN0X2JhdGNoIiwgIjJuZF9iYXRjaCIsICIzcmRfYmF0Y2giLCAiNHRoX2JhdGNoIiwgIjV0aF9iYXRjaCIsIA0KICAgICAgICAgICAgICI2dGhfYmF0Y2giLCAiN3RoX2JhdGNoIiwgIjh0aF9iYXRjaCIsICI5dGhfYmF0Y2giLCAiMTB0aF9iYXRjaCIsDQogICAgICAgICAgICAgIjExdGhfYmF0Y2giLCAiMTJ0aF9iYXRjaCIsICIxM3RoX2JhdGNoIiwgIjE0dGhfYmF0Y2giKQ0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXAgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgZWFjaCBmb2xkZXINCmZvciAoZm9sZGVyIGluIGZvbGRlcnMpIHsNCiAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIGZvbGRlcg0KICBwYXRoX3RvX3JkcyA8LSBwYXN0ZSgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9yZXN1bHRzIiwgZm9sZGVyLCBzZXAgPSAiLyIpDQogIA0KICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBmb2xkZXINCiAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fcmRzLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogIA0KICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogIA0KICAjIEV4dHJhY3QgJ3Jlc3VsdCcgZnJvbSBlYWNoIHN1Ymxpc3QgaW4gbmVzdGVkX2xpc3RfcmVzdWx0cw0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgZnVuY3Rpb24oeSkgeVtbInJlc3VsdCJdXSkpDQogIA0KICAjIEZsYXR0ZW4gdGhlIGxpc3QNCiAgZmxhdHRlbmVkX2xpc3QgPC0gZG8uY2FsbCgiYyIsIG5lc3RlZF9saXN0X3Jlc3VsdHMpDQogIA0KICAjIENvbWJpbmUgYWxsIGRhdGFmcmFtZXMgZm9yIGVhY2ggbWV0cmljIGFuZCBzdG9yZSB0aGVtIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c1tbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMpDQoNCiMgQ29udmVydCB0byBudW1lcmljIHZhbHVlcw0KY29tYmluZWRfZGFpbHlfdGVtcCRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsYXQpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgc3ViZm9sZGVyICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiDQogIHBhdGhfdG9fc3ViZm9sZGVyIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzJDL3Jlc3VsdHMiLCBmb2xkZXIsICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiLCBzZXAgPSAiLyIpDQogIA0KICAjIENoZWNrIGlmIHRoZSBzdWJmb2xkZXIgZXhpc3RzDQogIGlmIChkaXIuZXhpc3RzKHBhdGhfdG9fc3ViZm9sZGVyKSkgew0KICAgICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIHN1YmZvbGRlcg0KICAgIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3N1YmZvbGRlciwgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICAgIA0KICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogICAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICAgIA0KICAgICMgRXh0cmFjdCB0aGUgZm91ciBkYXRhZnJhbWVzIGZyb20gZWFjaCBsaXN0IGFuZCB1bmxpc3QgJ2xhdCcgYW5kICdsb24nIGNvbHVtbnMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1sxXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1syXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIA0KICAgICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlcg0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXINCiAgfQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgc3ViZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEdldCB0aGUgcGF0aCB0byB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcGF0aF90b19mYWlsZWRfbG9jYXRpb25zIDwtICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzJDL3Jlc3VsdHMvZmFpbGVkX2xvY2F0aW9ucyINCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBsaXN0KCkNCg0KIyBHZXQgdGhlIGxpc3Qgb2YgLnJkcyBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcmRzX2ZpbGVzX2ZhaWxlZCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBMb29wIG92ZXIgZWFjaCAucmRzIGZpbGUNCmZvciAoZmlsZV9mYWlsZWQgaW4gcmRzX2ZpbGVzX2ZhaWxlZCkgew0KICAjIFJlYWQgdGhlIC5yZHMgZmlsZSBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZCA8LSByZWFkUkRTKGZpbGVfZmFpbGVkKQ0KICANCiAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSB0aGUgbGlzdA0KICBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzFdXQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyIDwtIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkW1sicmVzdWx0Il1dW1syXV0NCg0KICAjIFN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkW1tmaWxlX2ZhaWxlZF1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlcg0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkX3N1YmZvbGRlcg0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgZmlsZXMgaW4gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQ29tYmluZSBmaWxlcw0KY29tYmluZWRfZGFpbHlfdGVtcF9hbGwgPC0gcmJpbmQoY29tYmluZWRfZGFpbHlfdGVtcCwgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYywgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gcmJpbmQoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQpDQoNCiMgUmVtb3ZlIHRoZSBmaXJzdCB5ZWFyIChidXJuLWluKQ0KY29tYmluZWRfZGFpbHlfdGVtcF9hbGwgPC0gZmlsdGVyKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBZRUFSIT0iMjAwNSIpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gZmlsdGVyKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgWUVBUiE9IjIwMDUiKQ0KDQojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCB0ZW1wZXJhdHVyZSBhY3Jvc3MgY29vcmRpbmF0ZXMNCmNvbWJpbmVkX292ZXJhbGxfdGVtcF9hbGwgPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1lYW4gPSBtZWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIGZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICAgICAgICAgZmlyc3RfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4yNSksDQogICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQoNCiMgU2F2ZSBmaWxlcw0Kc2F2ZVJEUyhjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvMkMvZGFpbHlfdGVtcF9zdWJzdHJhdGVfMkMucmRzIikNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzJDL2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV8yQy5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzJDL292ZXJhbGxfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlXzJDLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyBDaGVjayBmb3IgbWlzc2luZyBjb29yZGluYXRlcyBhZ2Fpbg0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIG11dGF0ZShkaXN0aW5jdF9jb29yZCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIG11dGF0ZShjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCiMgRnVuY3Rpb24gb3Bwb3NpdGUgb2YgJWluJQ0KJyUhaW4lJyA8LSBmdW5jdGlvbih4LHkpISgnJWluJScoeCx5KSkgDQoNCm1pc3NpbmdfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCxdDQptaXNzaW5nX2Nvb3JkDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzIDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0KSkNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMNCg0KIyMjIA0KY2hlY2tfZHVwPC0gZ3JvdXBfYnkoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGxvbiwgbGF0LCBZRUFSLCBET1kpICU+JSBzdW1tYXJpc2Uobj1uKCkpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gZmlsdGVyKGNoZWNrX2R1cCwgbj4xKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIG11dGF0ZShsb2Nfd2l0aF9tb3JlX3RoYW5fb25lLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0Kcm93X25fZHVwPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQpKQ0Kcm93X25fZHVwDQpkdXBfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCxdDQpkdXBfY29vcmQNCg0KIyBTYXZlIHRoZSBjb21iaW5lZCBkYXRhDQpzYXZlUkRTKG1pc3NpbmdfY29vcmQsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzJDL21pc3NpbmdfY29vcmRpbmF0ZXMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9taXNzaW5nX2Nvb3JkaW5hdGVzX3Jvd19uLnJkcyIpDQpzYXZlUkRTKHJvd19uX2R1cCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9yb3dfbl9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpzYXZlUkRTKGR1cF9jb29yZCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpgYGANCg0KDQojIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHByb2Nlc3MgY29vcmRpbmF0ZXMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyAjIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCg0KIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAyNzAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgNDUgbWludXRlcw0KDQoNCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIGxvY2F0aW9uDQpwcm9jZXNzX2xvY2F0aW9uIDwtIGZ1bmN0aW9uKGxvYykgew0KICANCiAgcHJpbnQocGFzdGUoIlByb2Nlc3NpbmcgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICANCiAgIyBTZXQgcGFyYW1ldGVycw0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICBjb29yZHM8LSBjKGxvYyRsb24sIGxvYyRsYXQpDQogIA0KICAjIENoZWNrIGlmIGN1cnJlbnQgaW5kZXggZmFsbHMgd2l0aGluIGFueSBvZiB0aGUgcHJvYmxlbWF0aWMgcmFuZ2VzDQogIEVSUiA8LSAxLjUNCiAgDQogIG1pY3JvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSBFUlIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0gZWxzZSB7DQogICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogIH0NCiAgDQogIA0KICAjIFdoZW4gdGhlIGZpcnN0IG1pY3JvX25jZXAgZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBFUlINCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgd2hpbGUobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpew0KICAgICAgRVJSIDwtIEVSUiArIDAuNQ0KICAgICAgDQogICAgICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgbWljcm9fbmNlcCgpIGZ1bmN0aW9uIGluc2lkZSB0aGUgd2hpbGUgbG9vcCBhcyB3ZWxsDQogICAgICBtaWNyb19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgICAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gRVJSLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgICAgIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgICAgIA0KICAgICAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgICAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgICB9DQogICAgICANCiAgICAgICMgSWYgRVJSIGV4Y2VlZHMgNSwgYnJlYWsgdGhlIGxvb3AgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgbWljcm8kbWV0b3V0WywxXQ0KICAgICAgaWYoRVJSID49IDUpew0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCiAgIyBJZiBldmVuIGFmdGVyIGFkanVzdGluZyBFUlIgbWljcm9fbmNlcCBmYWlscywgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UNCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgIyBBbm90aGVyIGV4cGxpY2l0IGNoZWNrDQogIGlmICghbWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICBhc3NpZ24oIm1pY3JvIiwgbWljcm8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgc3VjY2VzcyA8LSBGQUxTRQ0KICByZXN1bHQgPC0gTlVMTA0KICANCiAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIGVjdG90aGVybSgpIGZ1bmN0aW9uIGFzIHdlbGwNCiAgZWN0b19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgIHRyeUNhdGNoKHsNCiAgICAgIGVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0wLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IGxvYyRtZWRpYW5fbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IFRSVUUsIGVjdG8gPSBlY3RvKQ0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbGlzdChzdWNjZXNzID0gRkFMU0UsDQogICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksDQogICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBwYXN0ZSgiRmFpbGVkIG9uIGVjdG90aGVybSBjYWxsOiIsIGFzLmNoYXJhY3Rlcihjb25kaXRpb25NZXNzYWdlKGUpKSkpDQogICAgfSkNCiAgfSwgdGltZW91dCA9IDMwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgaWYgKGluaGVyaXRzKGVjdG9fcmVzdWx0LCAidHJ5LWVycm9yIikgfHwgaXMubnVsbChlY3RvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJlY3RvdGhlcm0oKSBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0NCiAgDQogIGlmKCFlY3RvX3Jlc3VsdCRzdWNjZXNzKXsNCiAgICByZXR1cm4oZWN0b19yZXN1bHQpDQogIH0NCiAgDQogIGdjKCkNCiAgDQogICMgQXNzaWduIHRoZSBzdWNjZXNzZnVsIGVjdG8gcmVzdWx0IHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgZWN0byA8LSBlY3RvX3Jlc3VsdCRlY3RvDQogIGFzc2lnbigiZWN0byIsIGVjdG8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIGVudmlyb24gPC0gYXMuZGF0YS5mcmFtZShlY3RvJGVudmlyb24pDQogIA0KICAjIE1heCBhbmQgbWVhbiBkYWlseSB0ZW1wZXJhdHVyZXMNCiAgZGFpbHlfdGVtcCA8LSBlbnZpcm9uICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0LA0KICAgICAgICAgICAgICAgICAgRVJSID0gRVJSKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoRVJSLCBZRUFSLCBET1ksIGxvbiA9IHBhc3RlKGxvYyRsb24pLCBsYXQ9cGFzdGUobG9jJGxhdCkpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICAjIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcm9sbGluZyB3ZWVrbHkgdGVtcGVyYXR1cmUNCiAgY2FsY195ZWFybHlfcm9sbGluZ19tZWFuIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgICBkYXRhJG1lYW5fd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtZWFuX3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIGRhdGEkbWF4X3dlZWtseV90ZW1wIDwtIHpvbzo6cm9sbGFwcGx5KGRhdGEkbWF4X3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIHJldHVybihkYXRhKQ0KICB9DQogIA0KICAjIENhbGN1bGF0ZSB0aGUgcm9sbGluZyBtZWFuIGZvciBlYWNoIHllYXIgYW5kIGxvY2F0aW9uDQogIGRhaWx5X3RlbXAgPC0gZGFpbHlfdGVtcCAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgbG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCiAgDQogICMgSWRlbnRpZnkgdGhlIHdhcm1lc3QgOTEgZGF5cyAoMyBtb250aHMpIG9mIGVhY2ggeWVhcg0KICBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkNCiAgDQogICMgQ2FsY3VsYXRlIHRoZSBtZWFuIG92ZXJhbGwgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgdGhlIHdhcm1lc3QgZGF5cyBvZiBlYWNoIHllYXINCiAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIGZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICAgIHRoaXJkX3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuNzUpLA0KICAgICAgICAgICAgICAgICAgICAgbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgobWF4X3RlbXApLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KICANCiAgcmVzdWx0IDwtIGxpc3QoZGFpbHlfdGVtcCwgDQogICAgICAgICAgICAgICAgIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCANCiAgICAgICAgICAgICAgICAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cykNCiAgDQogIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBlY3RvX3Jlc3VsdCRzdWNjZXNzLCByZXN1bHQgPSByZXN1bHQpKSAjIFJldHVybiBhIGxpc3Qgd2l0aCBhIHN1Y2Nlc3MgZmxhZyBhbmQgdGhlIHJlc3VsdC4NCiAgDQp9DQpgYGANCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHByb2Nlc3MgY29vcmRpbmF0ZXMgaW4gY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIEZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBjaHVuayBvZiBsb2NhdGlvbnMNCnByb2Nlc3NfY2h1bmsgPC0gZnVuY3Rpb24oc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkgew0KICAjIFJlYWQgaW4gZGlzdGluY3QgY29vcmRpbmF0ZXMNCiAgZGlzdGluY3RfY29vcmQ8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KICANCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbLDM6NF0NCiAgZGlzdGluY3RfY29vcmQgPC0gcmVuYW1lKGRpc3RpbmN0X2Nvb3JkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IGxvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9IGxhdCkNCiAgDQogICMgQWRqdXN0IHRoZSByYW5nZSBvZiBsb2NhdGlvbnMNCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbc3RhcnRfaW5kZXg6ZW5kX2luZGV4LF0NCiAgbG9jX2xpc3QgPC0gc3BsaXQoZGlzdGluY3RfY29vcmQsIHNlcShucm93KGRpc3RpbmN0X2Nvb3JkKSkpDQogIGxvY19saXN0IDwtIGxhcHBseShsb2NfbGlzdCwgdW5saXN0KQ0KICANCiAgIyBNYXRjaCBib2R5IG1hc3MgZGF0YSB0byBjb29yZGluYXRlcw0KICBwcmVzZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQogIA0KICBkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCiAgDQogIHByZXNlbmNlX2JvZHlfbWFzcyA8LSBtZXJnZShwcmVzZW5jZSwgZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIHRpcC5sYWJlbCwgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBwcmVzZW5jZV9ib2R5X21hc3MgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKG1lZGlhbl9tYXNzID0gbWVkaWFuKGJvZHlfbWFzcywgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZHBseXI6OnVuZ3JvdXAoKQ0KICANCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBtdXRhdGUobWVkaWFuX2JvZHlfbWFzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MgPSBpZmVsc2UoaXMubmEobWVkaWFuX21hc3MpPT1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzKSkNCiAgDQogICMgQ29udmVydCBsb2NfbGlzdCBiYWNrIGludG8gYSBkYXRhIGZyYW1lDQogIGxvY19kZiA8LSBkby5jYWxsKCJyYmluZCIsIGxvY19saXN0KQ0KICBsb2NfZGYgPC0gYXMuZGF0YS5mcmFtZShsb2NfZGYpDQogIG5hbWVzKGxvY19kZikgPC0gYygibG9uIiwgImxhdCIpDQogIA0KICAjIEpvaW4gbG9jX2RmIGFuZCBtZWRpYW5fYm9keV9tYXNzDQogIGxvY19kZiA8LSBkcGx5cjo6bGVmdF9qb2luKGxvY19kZiwgbWVkaWFuX2JvZHlfbWFzcywgYnkgPSBjKCJsb24iLCAibGF0IikpDQogIA0KICAjIENvbnZlcnQgbG9jX2RmIGJhY2sgaW50byBhIGxpc3QNCiAgbG9jX2xpc3QgPC0gc3BsaXQobG9jX2RmLCBzZXEobnJvdyhsb2NfZGYpKSkNCiAgDQogICMgIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KICBwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCiAgDQogICMgU2V0IHRoZSBnbG9iYWwgdGltZW91dA0KICBvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAyNzAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgNDUgbWludXRlcw0KICANCiAgZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KICBkZmluaXNoIDwtICIzMS8xMi8yMDE1Ig0KICANCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIHJlc3VsdHMgPC0gZnV0dXJlLmFwcGx5OjpmdXR1cmVfbGFwcGx5KGxvY19saXN0LCBwcm9jZXNzX2xvY2F0aW9uLCBmdXR1cmUucGFja2FnZXM9YygiTmljaGVNYXBSIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9jbGltYSIsICJkcGx5ciIsICJ6b28iLCAiUi51dGlscyIpKQ0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgDQogIHNhdmVSRFMocmVzdWx0cywgZmlsZT1wYXN0ZTAoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvNEMvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDXyIsIHN0YXJ0X2luZGV4LCAiLSIsIGVuZF9pbmRleCwgIi5yZHMiKSkNCiAgDQp9DQpgYGANCg0KIyMjIyAqKlByb2Nlc3MgYWxsIGxvY2F0aW9ucyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCg0KU3lzLnRpbWUoKQ0KDQpjaHVua19zaXplIDwtIDE2DQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgcm93IG51bWJlcnMgaW4gZGlzdGluY3RfY29vcmQNCnN0YXJ0X3JvdyA8LSAxDQplbmRfcm93IDwtIDE0MDkyDQoNCiMgQ2FsY3VsYXRlIHRvdGFsIGNodW5rcyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZQ0KdG90YWxfY2h1bmtzIDwtIGNlaWxpbmcoKGVuZF9yb3cgLSBzdGFydF9yb3cgKyAxKSAvIGNodW5rX3NpemUpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggY2h1bmsNCmZvcihpIGluIHNlcSh0b3RhbF9jaHVua3MpKSB7DQogICMgQ2FsY3VsYXRlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgY2h1bmsNCiAgc3RhcnRfaW5kZXggPC0gKChpIC0gMSkgKiBjaHVua19zaXplKSArIHN0YXJ0X3Jvdw0KICBlbmRfaW5kZXggPC0gbWluKGkgKiBjaHVua19zaXplICsgc3RhcnRfcm93IC0gMSwgZW5kX3JvdykNCiAgDQogICMgQ2FsbCB0aGUgcHJvY2Vzc19jaHVuayBmdW5jdGlvbiB3aXRoIGEgdGltZW91dCBvZiA2MDAgc2Vjb25kcw0KICByZXN1bHQgPC0gcHJvY2Vzc19jaHVuayhzdGFydF9pbmRleCwgZW5kX2luZGV4KQ0KfQ0KDQpTeXMudGltZSgpDQpgYGANCg0KIyMjIyAqKkNvbWJpbmUgb3V0cHV0cyoqIA0KDQpOb3RlIHRoYXQgc29tZSBjb29yZGluYXRlcyBmYWlsZWQgdG8gcnVuIHdpdGggdGhlIGNvZGUgcHJvdmlkZWQgYWJvdmUsIGFuZCBoZW5jZSByYW4gdXNpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IHBhcmFtZXRlcnMgKGhpZ2hlciBlcnJvciB0b2xlcmFuY2UgZm9yIGNhbGN1bGF0aW5nIHNvaWwgdGVtcGVyYXR1cmVzOyBub3QgaW4gcGFyYWxsZWwgc2Vzc2lvbikuIFNlZSBkZXRhaWxzIFtIRVJFXQ0KTm90ZSBhbHNvIHRoYXQgdGhlIHllYXIgMjAwNSB3YXMgdGFrZW4gb3V0IGFzIGEgYnVybiBpbiB0byBhbGxvdyB0aGUgbW9kZWxzIHRvIGZ1bGx5IGNvbnZlcmdlLiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIExpc3Qgb2YgZm9sZGVycyBmb3IgZWFjaCB0eXBlIG9mIGZpbGUNCmZvbGRlcnMgPC0gYygiMXN0X2JhdGNoIiwgIjJuZF9iYXRjaCIsICIzcmRfYmF0Y2giLCAiNHRoX2JhdGNoIiwgIjV0aF9iYXRjaCIsIA0KICAgICAgICAgICAgICI2dGhfYmF0Y2giLCAiN3RoX2JhdGNoIiwgIjh0aF9iYXRjaCIsICI5dGhfYmF0Y2giLCAiMTB0aF9iYXRjaCIsDQogICAgICAgICAgICAgIjExdGhfYmF0Y2giLCAiMTJ0aF9iYXRjaCIsICIxM3RoX2JhdGNoIiwgIjE0dGhfYmF0Y2giKQ0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXAgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgZWFjaCBmb2xkZXINCmZvciAoZm9sZGVyIGluIGZvbGRlcnMpIHsNCiAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIGZvbGRlcg0KICBwYXRoX3RvX3JkcyA8LSBwYXN0ZSgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS80Qy9yZXN1bHRzIiwgZm9sZGVyLCBzZXAgPSAiLyIpDQogIA0KICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBmb2xkZXINCiAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fcmRzLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogIA0KICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogIA0KICAjIEV4dHJhY3QgJ3Jlc3VsdCcgZnJvbSBlYWNoIHN1Ymxpc3QgaW4gbmVzdGVkX2xpc3RfcmVzdWx0cw0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgZnVuY3Rpb24oeSkgeVtbInJlc3VsdCJdXSkpDQogIA0KICAjIEZsYXR0ZW4gdGhlIGxpc3QNCiAgZmxhdHRlbmVkX2xpc3QgPC0gZG8uY2FsbCgiYyIsIG5lc3RlZF9saXN0X3Jlc3VsdHMpDQogIA0KICAjIENvbWJpbmUgYWxsIGRhdGFmcmFtZXMgZm9yIGVhY2ggbWV0cmljIGFuZCBzdG9yZSB0aGVtIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c1tbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMpDQoNCiMgQ29udmVydCB0byBudW1lcmljIHZhbHVlcw0KY29tYmluZWRfZGFpbHlfdGVtcCRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsYXQpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgc3ViZm9sZGVyICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiDQogIHBhdGhfdG9fc3ViZm9sZGVyIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL3Jlc3VsdHMiLCBmb2xkZXIsICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiLCBzZXAgPSAiLyIpDQogIA0KICAjIENoZWNrIGlmIHRoZSBzdWJmb2xkZXIgZXhpc3RzDQogIGlmIChkaXIuZXhpc3RzKHBhdGhfdG9fc3ViZm9sZGVyKSkgew0KICAgICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIHN1YmZvbGRlcg0KICAgIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3N1YmZvbGRlciwgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICAgIA0KICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogICAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICAgIA0KICAgICMgRXh0cmFjdCB0aGUgZm91ciBkYXRhZnJhbWVzIGZyb20gZWFjaCBsaXN0IGFuZCB1bmxpc3QgJ2xhdCcgYW5kICdsb24nIGNvbHVtbnMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1sxXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1syXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIA0KICAgICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlcg0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXINCiAgfQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgc3ViZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEdldCB0aGUgcGF0aCB0byB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcGF0aF90b19mYWlsZWRfbG9jYXRpb25zIDwtICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL3Jlc3VsdHMvZmFpbGVkX2xvY2F0aW9ucyINCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBsaXN0KCkNCg0KIyBHZXQgdGhlIGxpc3Qgb2YgLnJkcyBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcmRzX2ZpbGVzX2ZhaWxlZCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBMb29wIG92ZXIgZWFjaCAucmRzIGZpbGUNCmZvciAoZmlsZV9mYWlsZWQgaW4gcmRzX2ZpbGVzX2ZhaWxlZCkgew0KICAjIFJlYWQgdGhlIC5yZHMgZmlsZSBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZCA8LSByZWFkUkRTKGZpbGVfZmFpbGVkKQ0KICANCiAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSB0aGUgbGlzdA0KICBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzFdXQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyIDwtIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkW1sicmVzdWx0Il1dW1syXV0NCg0KICAjIFN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkW1tmaWxlX2ZhaWxlZF1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlcg0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkX3N1YmZvbGRlcg0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgZmlsZXMgaW4gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCiMgU2F2ZSBmaWxlcw0Kc2F2ZVJEUyhjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvNEMvZGFpbHlfdGVtcF9zdWJzdHJhdGVfNEMucmRzIikNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV80Qy5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL292ZXJhbGxfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlXzRDLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyBDaGVjayBmb3IgbWlzc2luZyBjb29yZGluYXRlcyBhZ2Fpbg0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIG11dGF0ZShkaXN0aW5jdF9jb29yZCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIG11dGF0ZShjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCiMgRnVuY3Rpb24gb3Bwb3NpdGUgb2YgJWluJQ0KJyUhaW4lJyA8LSBmdW5jdGlvbih4LHkpISgnJWluJScoeCx5KSkgDQoNCm1pc3NpbmdfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCxdDQptaXNzaW5nX2Nvb3JkDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzIDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0KSkNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMNCg0KIyMjIA0KY2hlY2tfZHVwPC0gZ3JvdXBfYnkoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGxvbiwgbGF0LCBZRUFSLCBET1kpICU+JSBzdW1tYXJpc2Uobj1uKCkpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gZmlsdGVyKGNoZWNrX2R1cCwgbj4xKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIG11dGF0ZShsb2Nfd2l0aF9tb3JlX3RoYW5fb25lLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0Kcm93X25fZHVwPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQpKQ0Kcm93X25fZHVwDQpkdXBfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCxdDQpkdXBfY29vcmQNCg0KIyBTYXZlIHRoZSBjb21iaW5lZCBkYXRhDQpzYXZlUkRTKG1pc3NpbmdfY29vcmQsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL21pc3NpbmdfY29vcmRpbmF0ZXMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS80Qy9taXNzaW5nX2Nvb3JkaW5hdGVzX3Jvd19uLnJkcyIpDQpzYXZlUkRTKHJvd19uX2R1cCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS80Qy9yb3dfbl9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpzYXZlUkRTKGR1cF9jb29yZCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS80Qy9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpgYGANCg0KIyMNCg0KIyMgKipQb25kcyBvciB3ZXRsYW5kcyoqICANCg0KIyMjICoqQ3VycmVudCBjbGltYXRlKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzKioNCmBgYHtyLCBldmFsPUZ9DQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCg0KIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAzNjAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgMSBob3VyDQoNCg0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggbG9jYXRpb24NCnByb2Nlc3NfbG9jYXRpb24gPC0gZnVuY3Rpb24obG9jKSB7DQogIA0KICBwcmludChwYXN0ZSgiUHJvY2Vzc2luZyBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogIA0KICAjIFNldCBwYXJhbWV0ZXJzDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIGNvb3JkczwtIGMobG9jJGxvbiwgbG9jJGxhdCkNCiAgDQogIEVSUiA8LSAxLjUgICMgQWRqdXN0aW5nIEVSUiBiYXNlZCBvbiB0aGUgbG9jYXRpb25zIChsb2NhdGlvbnMgd2l0aCBzbm93IHNvbWV0aW1lcyBuZWVkIGEgaGlnaGVyIHZhbHVlKQ0KICANCiAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJykNCiAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgIyBJZiB0aGUgcHJvY2VzcyB0YWtlcyBsb25nZXIgdGhhbiAxMCBtaW51dGVzLCBicmVhay4NCiAgDQogIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9IGVsc2Ugew0KICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICAgIG1pY3JvJG1ldG91dFssIDEzXSA8LSAwICMgTWFrZSBzdXJlIHRoZSBwb25kIHN0YXlzIGluIHRoZSBzaGFkZQ0KICB9DQogIA0KICANCiAgIyBXaGVuIHRoZSBmaXJzdCBtaWNyb19uY2VwIGZhaWxzLCB0cnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgRVJSDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHdoaWxlKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKXsNCiAgICAgIEVSUiA8LSBFUlIgKyAwLjUNCiAgICAgIA0KICAgICAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIG1pY3JvX25jZXAoKSBmdW5jdGlvbiBpbnNpZGUgdGhlIHdoaWxlIGxvb3AgYXMgd2VsbA0KICAgICAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICAgICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcpDQogICAgICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogICAgICANCiAgICAgIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICAgICAgcHJpbnQocGFzdGUoIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgICAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJtaWNyb19uY2VwIGluc2lkZSB3aGlsZSBsb29wIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICAgICAgICBtaWNybyRtZXRvdXRbLCAxM10gPC0gMCAjIE1ha2Ugc3VyZSB0aGUgcG9uZCBzdGF5cyBpbiB0aGUgc2hhZGUNCiAgICAgIH0NCiAgICAgIA0KICAgICAgIyBJZiBFUlIgZXhjZWVkcyA1LCBicmVhayB0aGUgbG9vcCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBtaWNybyRtZXRvdXRbLDFdDQogICAgICBpZihFUlIgPj0gNSl7DQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICB9DQogIA0KICAjIElmIGV2ZW4gYWZ0ZXIgYWRqdXN0aW5nIEVSUiBtaWNyb19uY2VwIGZhaWxzLCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZQ0KICBpZiAobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmFpbGVkIG9uIG1pY3JvX25jZXAgY2FsbCIpKQ0KICB9DQogIA0KICAjIEFub3RoZXIgZXhwbGljaXQgY2hlY2sNCiAgaWYgKCFtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIGFzc2lnbigibWljcm8iLCBtaWNybywgZW52aXIgPSBnbG9iYWxlbnYoKSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmFpbGVkIG9uIG1pY3JvX25jZXAgY2FsbCIpKQ0KICB9DQogIA0KICBzdWNjZXNzIDwtIEZBTFNFDQogIHJlc3VsdCA8LSBOVUxMDQogIA0KICBtaWNybyRtZXRvdXRbLCAxM10gPC0gMCAjIE1ha2Ugc3VyZSB0aGUgcG9uZCBzdGF5cyBpbiB0aGUgc2hhZGUNCiAgDQogICMgVXNlIHdpdGhUaW1lb3V0KCkgZm9yIHRoZSBlY3RvdGhlcm0oKSBmdW5jdGlvbiBhcyB3ZWxsDQogIGVjdG9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICB0cnlDYXRjaCh7DQogICAgICBlY3RvIDwtIE5pY2hlTWFwUjo6ZWN0b3RoZXJtKA0KICAgICAgICBjb250YWluZXI9MSwgIyBjb250YWluZXIgbW9kZWwNCiAgICAgICAgY29udGg9MTUwMCwgIyBzaGFsbG93IHBvbmQgb2YgMS41bSBkZXB0aA0KICAgICAgICBjb250dz0xMjAwMCwjIHBvbmQgb2YgMTJtIHdpZHRoDQogICAgICAgIGNvbnR5cGU9MSwgIyBjb250YWluZXIgc3VuayBpbnRvIHRoZSBncm91bmQgbGlrZSBhIHBvbmQNCiAgICAgICAgcmFpbm11bHQgPSAxMDAwMDAwMDAwLCAjIHJhaW5mYWxsIG11bHRpcGxpZXIsIHRvIGtlZXAgdGhlIHBvbmQgd2V0DQogICAgICAgIGNvbnRpbml0ID0gMTUwMCwgIyBJbml0aWFsIGNvbnRhaW5lciB3YXRlciBsZXZlbCAoMS41bSkNCiAgICAgICAgY29udGhvbGUgPSAwLCAjIERhaWx5IGxvc3Mgb2YgaGVpZ2h0IChtbSkgZHVlIHRvIGhvbGUgaW4gY29udGFpbmVyIChlLmcuIGluZmlsdHJhdGlvbikNCiAgICAgICAgY29udHdldD0xMDAsICMgMTAwJSBvZiBjb250YWluZXIgc3VyZmFjZSBhcmVhIGFjdGluZyBhcyBmcmVlIHdhdGVyIGV4Y2hhbmdlcg0KICAgICAgICBjb250b25seT0xKQ0KICAgICAgDQogICAgICBsaXN0KHN1Y2Nlc3MgPSBUUlVFLCBlY3RvID0gZWN0bykNCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IEZBTFNFLA0KICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLA0KICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gcGFzdGUoIkZhaWxlZCBvbiBlY3RvdGhlcm0gY2FsbDoiLCBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKQ0KICAgIH0pDQogIH0sIHRpbWVvdXQgPSAyMDAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogIA0KICBpZiAoaW5oZXJpdHMoZWN0b19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKGVjdG9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJlY3RvdGhlcm0oKSBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgfQ0KICANCiAgaWYoIWVjdG9fcmVzdWx0JHN1Y2Nlc3Mpew0KICAgIHJldHVybihlY3RvX3Jlc3VsdCkNCiAgfQ0KICANCiAgZ2MoKQ0KICANCiAgIyBBc3NpZ24gdGhlIHN1Y2Nlc3NmdWwgZWN0byByZXN1bHQgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICBlY3RvIDwtIGVjdG9fcmVzdWx0JGVjdG8NCiAgYXNzaWduKCJlY3RvIiwgZWN0bywgZW52aXIgPSBnbG9iYWxlbnYoKSkNCiAgZW52aXJvbiA8LSBhcy5kYXRhLmZyYW1lKGVjdG8kZW52aXJvbikNCiAgDQogICMgTWF4IGFuZCBtZWFuIGRhaWx5IHRlbXBlcmF0dXJlcw0KICBkYWlseV90ZW1wIDwtIGVudmlyb24gJT4lDQogICAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQsDQogICAgICAgICAgICAgICAgICBFUlIgPSBFUlIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShFUlIsIFlFQVIsIERPWSwgbG9uID0gcGFzdGUobG9jJGxvbiksIGxhdD1wYXN0ZShsb2MkbGF0KSkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSByb2xsaW5nIHdlZWtseSB0ZW1wZXJhdHVyZQ0KICBjYWxjX3llYXJseV9yb2xsaW5nX21lYW4gPC0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgZGF0YSRtYXhfd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtYXhfdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgcmV0dXJuKGRhdGEpDQogIH0NCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByb2xsaW5nIG1lYW4gZm9yIGVhY2ggeWVhciBhbmQgbG9jYXRpb24NCiAgZGFpbHlfdGVtcCA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KICANCiAgIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQogIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gb3ZlcmFsbCBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgd2FybWVzdCBkYXlzIG9mIGVhY2ggeWVhcg0KICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICByZXN1bHQgPC0gbGlzdChkYWlseV90ZW1wLCANCiAgICAgICAgICAgICAgICAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzKQ0KICANCiAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IGVjdG9fcmVzdWx0JHN1Y2Nlc3MsIHJlc3VsdCA9IHJlc3VsdCkpICMgUmV0dXJuIGEgbGlzdCB3aXRoIGEgc3VjY2VzcyBmbGFnIGFuZCB0aGUgcmVzdWx0Lg0KICANCn0NCg0KYGBgDQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzIGluIGNodW5rcyoqIA0KDQpQcm9jZXNzaW5nIHRoZSBjb29yZGluYXRlcyBpbiBjaHVua3MgaXMgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gDQoNCmBgYHtyLCBldmFsPUZ9DQojIEZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBjaHVuayBvZiBsb2NhdGlvbnMNCnByb2Nlc3NfY2h1bmsgPC0gZnVuY3Rpb24oc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkgew0KICAjIFJlYWQgaW4gZGlzdGluY3QgY29vcmRpbmF0ZXMNCiAgZGlzdGluY3RfY29vcmQ8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KICANCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbLCAzOjRdDQogIGRpc3RpbmN0X2Nvb3JkIDwtIHJlbmFtZShkaXN0aW5jdF9jb29yZCwgeCA9IGxvbiwgeSA9IGxhdCkNCiAgDQogICMgQWRqdXN0IHRoZSByYW5nZSBvZiBsb2NhdGlvbnMNCiAgZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbc3RhcnRfaW5kZXg6ZW5kX2luZGV4LF0NCiAgbG9jX2xpc3QgPC0gc3BsaXQoZGlzdGluY3RfY29vcmQsIHNlcShucm93KGRpc3RpbmN0X2Nvb3JkKSkpDQogIGxvY19saXN0IDwtIGxhcHBseShsb2NfbGlzdCwgdW5saXN0KQ0KICANCiAgIyBNYXRjaCBib2R5IG1hc3MgZGF0YSB0byBjb29yZGluYXRlcw0KICBwcmVzZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQogIA0KICBkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCiAgDQogIHByZXNlbmNlX2JvZHlfbWFzcyA8LSBtZXJnZShwcmVzZW5jZSwgZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIHRpcC5sYWJlbCwgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBwcmVzZW5jZV9ib2R5X21hc3MgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKG1lZGlhbl9tYXNzID0gbWVkaWFuKGJvZHlfbWFzcywgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZHBseXI6OnVuZ3JvdXAoKQ0KICANCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBtdXRhdGUobWVkaWFuX2JvZHlfbWFzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MgPSBpZmVsc2UoaXMubmEobWVkaWFuX21hc3MpPT1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzKSkNCiAgDQogICMgQ29udmVydCBsb2NfbGlzdCBiYWNrIGludG8gYSBkYXRhIGZyYW1lDQogIGxvY19kZiA8LSBkby5jYWxsKCJyYmluZCIsIGxvY19saXN0KQ0KICBsb2NfZGYgPC0gYXMuZGF0YS5mcmFtZShsb2NfZGYpDQogIG5hbWVzKGxvY19kZikgPC0gYygibG9uIiwgImxhdCIpDQogIA0KICAjIEpvaW4gbG9jX2RmIGFuZCBtZWRpYW5fYm9keV9tYXNzDQogIGxvY19kZiA8LSBkcGx5cjo6bGVmdF9qb2luKGxvY19kZiwgbWVkaWFuX2JvZHlfbWFzcywgYnkgPSBjKCJsb24iLCAibGF0IikpDQogIA0KICAjIENvbnZlcnQgbG9jX2RmIGJhY2sgaW50byBhIGxpc3QNCiAgbG9jX2xpc3QgPC0gc3BsaXQobG9jX2RmLCBzZXEobnJvdyhsb2NfZGYpKSkNCiAgDQogICMgIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KICBwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCiAgDQogICMgU2V0IHRoZSBnbG9iYWwgdGltZW91dA0KICBvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAzNjAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgNjAgbWludXRlcw0KICANCiAgZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KICBkZmluaXNoIDwtICIzMS8xMi8yMDE1Ig0KICANCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIHJlc3VsdHMgPC0gZnV0dXJlLmFwcGx5OjpmdXR1cmVfbGFwcGx5KGxvY19saXN0LCBwcm9jZXNzX2xvY2F0aW9uLCBmdXR1cmUucGFja2FnZXM9YygiTmljaGVNYXBSIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9jbGltYSIsICJkcGx5ciIsICJ6b28iLCAiUi51dGlscyIpKQ0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgDQogIHNhdmVSRFMocmVzdWx0cywgZmlsZT1wYXN0ZTAoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kL2N1cnJlbnQvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfcG9uZF8iLCBzdGFydF9pbmRleCwgIi0iLCBlbmRfaW5kZXgsICIucmRzIikpDQogIA0KfQ0KYGBgDQoNCiMjIyMgKipQcm9jZXNzIGFsbCBsb2NhdGlvbnMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCg0KU3lzLnRpbWUoKQ0KDQpjaHVua19zaXplIDwtIDE2DQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgcm93IG51bWJlcnMgaW4gZGlzdGluY3RfY29vcmQNCnN0YXJ0X3JvdyA8LSAxDQplbmRfcm93IDwtIDE0MDkyDQoNCiMgQ2FsY3VsYXRlIHRvdGFsIGNodW5rcyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZQ0KdG90YWxfY2h1bmtzIDwtIGNlaWxpbmcoKGVuZF9yb3cgLSBzdGFydF9yb3cgKyAxKSAvIGNodW5rX3NpemUpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggY2h1bmsNCmZvcihpIGluIHNlcSh0b3RhbF9jaHVua3MpKSB7DQogICMgQ2FsY3VsYXRlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgY2h1bmsNCiAgc3RhcnRfaW5kZXggPC0gKChpIC0gMSkgKiBjaHVua19zaXplKSArIHN0YXJ0X3Jvdw0KICBlbmRfaW5kZXggPC0gbWluKGkgKiBjaHVua19zaXplICsgc3RhcnRfcm93IC0gMSwgZW5kX3JvdykNCiAgDQogICMgQ2FsbCB0aGUgcHJvY2Vzc19jaHVuayBmdW5jdGlvbiB3aXRoIGEgdGltZW91dCBvZiA2MDAgc2Vjb25kcw0KICByZXN1bHQgPC0gcHJvY2Vzc19jaHVuayhzdGFydF9pbmRleCwgZW5kX2luZGV4KQ0KfQ0KDQpTeXMudGltZSgpDQoNCmBgYA0KDQojIyMjICoqQ29tYmluZSBvdXRwdXRzKiogDQoNCk5vdGUgdGhhdCBzb21lIGNvb3JkaW5hdGVzIGZhaWxlZCB0byBydW4gd2l0aCB0aGUgY29kZSBwcm92aWRlZCBhYm92ZSwgYW5kIGhlbmNlIHJhbiB1c2luZyBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycyAoaGlnaGVyIGVycm9yIHRvbGVyYW5jZSBmb3IgY2FsY3VsYXRpbmcgc29pbCB0ZW1wZXJhdHVyZXM7IG5vdCBpbiBwYXJhbGxlbCBzZXNzaW9uKS4gU2VlIGRldGFpbHMgW0hFUkVdDQpOb3RlIGFsc28gdGhhdCB0aGUgeWVhciAyMDA1IHdhcyB0YWtlbiBvdXQgYXMgYSBidXJuIGluIHRvIGFsbG93IHRoZSBtb2RlbHMgdG8gZnVsbHkgY29udmVyZ2UuIA0KDQpgYGB7ciwgZXZhbCA9Rn0NCiMgTGlzdCBvZiBmb2xkZXJzIGZvciBlYWNoIHR5cGUgb2YgZmlsZQ0KZm9sZGVycyA8LSBjKCIxc3RfYmF0Y2giLCAiMm5kX2JhdGNoIiwgIjNyZF9iYXRjaCIsIA0KICAgICAgICAgICAgICIyMXN0X2JhdGNoIiwgIjIybmRfYmF0Y2giLCAiMjNyZF9iYXRjaCIsIA0KICAgICAgICAgICAgICIzMXN0X2JhdGNoIiwgIjMybmRfYmF0Y2giLCAiMzNyZF9iYXRjaCIpDQpmb2xkZXJzMiA8LSBwYXN0ZTAoNDoyMCwgInRoX2JhdGNoIikNCmZvbGRlcnMzIDwtIHBhc3RlMCgyNDozMCwgInRoX2JhdGNoIikNCmZvbGRlcnM0IDwtIHBhc3RlMCgzNDozNiwgInRoX2JhdGNoIikNCg0KZm9sZGVycyA8LSBjKGZvbGRlcnMsIGZvbGRlcnMyLCBmb2xkZXJzMywgZm9sZGVyczQpDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyDQogIHBhdGhfdG9fcmRzIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC9jdXJyZW50L3Jlc3VsdHMiLCBmb2xkZXIsIHNlcCA9ICIvIikNCiAgDQogICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIGZvbGRlcg0KICByZHNfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gcGF0aF90b19yZHMsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgDQogICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KHJkc19maWxlcywgcmVhZFJEUykNCiAgDQogICMgRXh0cmFjdCAncmVzdWx0JyBmcm9tIGVhY2ggc3VibGlzdCBpbiBuZXN0ZWRfbGlzdF9yZXN1bHRzDQogIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCBmdW5jdGlvbih5KSB5W1sicmVzdWx0Il1dKSkNCiAgDQogICMgRmxhdHRlbiB0aGUgbGlzdA0KICBmbGF0dGVuZWRfbGlzdCA8LSBkby5jYWxsKCJjIiwgbmVzdGVkX2xpc3RfcmVzdWx0cykNCiAgDQogICMgQ29tYmluZSBhbGwgZGF0YWZyYW1lcyBmb3IgZWFjaCBtZXRyaWMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcFtbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzW1tmb2xkZXJdXSA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShmbGF0dGVuZWRfbGlzdCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIGZvbGRlcnMNCmNvbWJpbmVkX2RhaWx5X3RlbXAgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cykNCg0KIyBDb252ZXJ0IHRvIG51bWVyaWMgdmFsdWVzDQpjb21iaW5lZF9kYWlseV90ZW1wJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXAkbG9uKQ0KY29tYmluZWRfZGFpbHlfdGVtcCRsYXQgPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxhdCkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbG9uIDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbG9uKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbGF0KQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIGVhY2ggZm9sZGVyDQpmb3IgKGZvbGRlciBpbiBmb2xkZXJzKSB7DQogICMgR2V0IHRoZSBwYXRoIHRvIHRoZSBzdWJmb2xkZXIgInByb2JsZW1hdGljX2xvY2F0aW9ucyINCiAgcGF0aF90b19zdWJmb2xkZXIgPC0gcGFzdGUoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kL2N1cnJlbnQvcmVzdWx0cyIsIGZvbGRlciwgInByb2JsZW1hdGljX2xvY2F0aW9ucyIsIHNlcCA9ICIvIikNCiAgDQogICMgQ2hlY2sgaWYgdGhlIHN1YmZvbGRlciBleGlzdHMNCiAgaWYgKGRpci5leGlzdHMocGF0aF90b19zdWJmb2xkZXIpKSB7DQogICAgIyBHZXQgdGhlIGxpc3Qgb2YgYWxsIHJkcyBmaWxlcyBpbiB0aGUgc3ViZm9sZGVyDQogICAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fc3ViZm9sZGVyLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogICAgDQogICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW50byBhIGxpc3QNCiAgICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogICAgDQogICAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSBlYWNoIGxpc3QgYW5kIHVubGlzdCAnbGF0JyBhbmQgJ2xvbicgY29sdW1ucw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzFdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzJdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgDQogICAgIyBTdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcyBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlcg0KICB9DQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBzdWJmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYykNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgR2V0IHRoZSBwYXRoIHRvIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMgPC0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kL2N1cnJlbnQvcmVzdWx0cy9mYWlsZWRfbG9jYXRpb25zIg0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGxpc3QoKQ0KDQojIEdldCB0aGUgbGlzdCBvZiAucmRzIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpyZHNfZmlsZXNfZmFpbGVkIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQojIExvb3Agb3ZlciBlYWNoIC5yZHMgZmlsZQ0KZm9yIChmaWxlX2ZhaWxlZCBpbiByZHNfZmlsZXNfZmFpbGVkKSB7DQogICMgUmVhZCB0aGUgLnJkcyBmaWxlIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkIDwtIHJlYWRSRFMoZmlsZV9mYWlsZWQpDQogIA0KICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIHRoZSBsaXN0DQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMV1dDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzJdXQ0KDQogICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRfc3ViZm9sZGVyDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCiMgU2F2ZSBmaWxlcw0Kc2F2ZVJEUyhjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kL2N1cnJlbnQvZGFpbHlfdGVtcF9wb25kLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvY3VycmVudC9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX292ZXJhbGxfdGVtcF9hbGwsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kL2N1cnJlbnQvb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5c19wb25kLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyBDaGVjayBmb3IgbWlzc2luZyBjb29yZGluYXRlcyBhZ2Fpbg0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIG11dGF0ZShkaXN0aW5jdF9jb29yZCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIG11dGF0ZShjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCiMgRnVuY3Rpb24gb3Bwb3NpdGUgb2YgJWluJQ0KJyUhaW4lJyA8LSBmdW5jdGlvbih4LHkpISgnJWluJScoeCx5KSkgDQoNCm1pc3NpbmdfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCxdDQptaXNzaW5nX2Nvb3JkDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzIDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0KSkNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMNCg0KIyMjIA0KY2hlY2tfZHVwPC0gZ3JvdXBfYnkoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGxvbiwgbGF0LCBZRUFSLCBET1kpICU+JSBzdW1tYXJpc2Uobj1uKCkpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gZmlsdGVyKGNoZWNrX2R1cCwgbj4xKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIG11dGF0ZShsb2Nfd2l0aF9tb3JlX3RoYW5fb25lLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0Kcm93X25fZHVwPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQpKQ0Kcm93X25fZHVwDQpkdXBfY29vcmQgPC0gZGlzdGluY3RfY29vcmRbZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCxdDQpkdXBfY29vcmQNCg0KIyBTYXZlIHRoZSBjb21iaW5lZCBkYXRhDQpzYXZlUkRTKG1pc3NpbmdfY29vcmQsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC9jdXJyZW50L21pc3NpbmdfY29vcmRpbmF0ZXMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvY3VycmVudC9taXNzaW5nX2Nvb3JkaW5hdGVzX3Jvd19uLnJkcyIpDQpzYXZlUkRTKHJvd19uX2R1cCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvY3VycmVudC9yb3dfbl9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQpzYXZlUkRTKGR1cF9jb29yZCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvY3VycmVudC9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCkhlcmUsIHdlIGFzc3VtZSBhIGNsaW1hdGUgcHJvamVjdGlvbiBhc3N1bWluZyAyIGRlZ3JlZXMgb2Ygd2FybWluZy4gDQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzKioNCg0KYGBge3IsIGV2YWw9Rn0NCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KDQojIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDM2MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciA2MCBtaW51dGVzDQoNCg0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggbG9jYXRpb24NCnByb2Nlc3NfbG9jYXRpb24gPC0gZnVuY3Rpb24obG9jKSB7DQogIA0KICBwcmludChwYXN0ZSgiUHJvY2Vzc2luZyBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogIA0KICAjIFNldCBwYXJhbWV0ZXJzDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIGNvb3JkczwtIGMobG9jJGxvbiwgbG9jJGxhdCkNCiAgDQogIEVSUiA8LSAxLjUgICMgQWRqdXN0aW5nIEVSUiBiYXNlZCBvbiB0aGUgbG9jYXRpb25zIChsb2NhdGlvbnMgd2l0aCBzbm93IHNvbWV0aW1lcyBuZWVkIGEgaGlnaGVyIHZhbHVlKQ0KICANCiAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ2RhdGEvVGVycmFDbGltYXRlL2RhdGEnKQ0KICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogIA0KICAjIElmIHRoZSBwcm9jZXNzIHRha2VzIGxvbmdlciB0aGFuIDEwIG1pbnV0ZXMsIGJyZWFrLg0KICANCiAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0gZWxzZSB7DQogICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgbWljcm8kbWV0b3V0WywgMTNdIDwtIDAgIyBNYWtlIHN1cmUgdGhlIHBvbmQgc3RheXMgaW4gdGhlIHNoYWRlDQogIH0NCiAgDQogIA0KICAjIFdoZW4gdGhlIGZpcnN0IG1pY3JvX25jZXAgZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBFUlINCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgd2hpbGUobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpew0KICAgICAgRVJSIDwtIEVSUiArIDAuNQ0KICAgICAgDQogICAgICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgbWljcm9fbmNlcCgpIGZ1bmN0aW9uIGluc2lkZSB0aGUgd2hpbGUgbG9vcCBhcyB3ZWxsDQogICAgICBtaWNyb19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgICAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gRVJSLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgICAgIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgICAgIA0KICAgICAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgICAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgICAgIG1pY3JvJG1ldG91dFssIDEzXSA8LSAwICMgTWFrZSBzdXJlIHRoZSBwb25kIHN0YXlzIGluIHRoZSBzaGFkZQ0KICAgICAgfQ0KICAgICAgDQogICAgICAjIElmIEVSUiBleGNlZWRzIDUsIGJyZWFrIHRoZSBsb29wIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIG1pY3JvJG1ldG91dFssMV0NCiAgICAgIGlmKEVSUiA+PSA1KXsNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogICMgSWYgZXZlbiBhZnRlciBhZGp1c3RpbmcgRVJSIG1pY3JvX25jZXAgZmFpbHMsIHJldHVybiBhbiBlcnJvciBtZXNzYWdlDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogICMgQW5vdGhlciBleHBsaWNpdCBjaGVjaw0KICBpZiAoIW1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgYXNzaWduKCJtaWNybyIsIG1pY3JvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogIHN1Y2Nlc3MgPC0gRkFMU0UNCiAgcmVzdWx0IDwtIE5VTEwNCiAgDQogIG1pY3JvJG1ldG91dFssIDEzXSA8LSAwICMgTWFrZSBzdXJlIHRoZSBwb25kIHN0YXlzIGluIHRoZSBzaGFkZQ0KICANCiAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIGVjdG90aGVybSgpIGZ1bmN0aW9uIGFzIHdlbGwNCiAgZWN0b19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgIHRyeUNhdGNoKHsNCiAgICAgIGVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0oDQogICAgICAgIGNvbnRhaW5lcj0xLCAjIGNvbnRhaW5lciBtb2RlbA0KICAgICAgICBjb250aD0xNTAwLCAjIHNoYWxsb3cgcG9uZCBvZiAxLjVtIGRlcHRoDQogICAgICAgIGNvbnR3PTEyMDAwLCMgcG9uZCBvZiAxMm0gd2lkdGgNCiAgICAgICAgY29udHlwZT0xLCAjIGNvbnRhaW5lciBzdW5rIGludG8gdGhlIGdyb3VuZCBsaWtlIGEgcG9uZA0KICAgICAgICByYWlubXVsdCA9IDEwMDAwMDAwMDAsICMgcmFpbmZhbGwgbXVsdGlwbGllciwgdG8ga2VlcCB0aGUgcG9uZCB3ZXQNCiAgICAgICAgY29udGluaXQgPSAxNTAwLCAjIEluaXRpYWwgY29udGFpbmVyIHdhdGVyIGxldmVsICgxLjVtKQ0KICAgICAgICBjb250aG9sZSA9IDAsICMgRGFpbHkgbG9zcyBvZiBoZWlnaHQgKG1tKSBkdWUgdG8gaG9sZSBpbiBjb250YWluZXIgKGUuZy4gaW5maWx0cmF0aW9uKQ0KICAgICAgICBjb250d2V0PTEwMCwgIyAxMDAlIG9mIGNvbnRhaW5lciBzdXJmYWNlIGFyZWEgYWN0aW5nIGFzIGZyZWUgd2F0ZXIgZXhjaGFuZ2VyDQogICAgICAgIGNvbnRvbmx5PTEpDQogICAgICANCiAgICAgIGxpc3Qoc3VjY2VzcyA9IFRSVUUsIGVjdG8gPSBlY3RvKQ0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbGlzdChzdWNjZXNzID0gRkFMU0UsDQogICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksDQogICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBwYXN0ZSgiRmFpbGVkIG9uIGVjdG90aGVybSBjYWxsOiIsIGFzLmNoYXJhY3Rlcihjb25kaXRpb25NZXNzYWdlKGUpKSkpDQogICAgfSkNCiAgfSwgdGltZW91dCA9IDIwMDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgDQogIGlmIChpbmhlcml0cyhlY3RvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwoZWN0b19yZXN1bHQpKSB7DQogICAgcHJpbnQocGFzdGUoImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9DQogIA0KICBpZighZWN0b19yZXN1bHQkc3VjY2Vzcyl7DQogICAgcmV0dXJuKGVjdG9fcmVzdWx0KQ0KICB9DQogIA0KICBnYygpDQogIA0KICAjIEFzc2lnbiB0aGUgc3VjY2Vzc2Z1bCBlY3RvIHJlc3VsdCB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogIGVjdG8gPC0gZWN0b19yZXN1bHQkZWN0bw0KICBhc3NpZ24oImVjdG8iLCBlY3RvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICBlbnZpcm9uIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KICANCiAgIyBNYXggYW5kIG1lYW4gZGFpbHkgdGVtcGVyYXR1cmVzDQogIGRhaWx5X3RlbXAgPC0gZW52aXJvbiAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCwNCiAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUikgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KEVSUiwgWUVBUiwgRE9ZLCBsb24gPSBwYXN0ZShsb2MkbG9uKSwgbGF0PXBhc3RlKGxvYyRsYXQpKSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwNCiAgICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KICANCiAgIyBDcmVhdGUgYSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHJvbGxpbmcgd2Vla2x5IHRlbXBlcmF0dXJlDQogIGNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiA8LSBmdW5jdGlvbihkYXRhKSB7DQogICAgZGF0YSRtZWFuX3dlZWtseV90ZW1wIDwtIHpvbzo6cm9sbGFwcGx5KGRhdGEkbWVhbl90ZW1wLCB3aWR0aCA9IDcsIEZVTiA9IG1lYW4sIGFsaWduID0gInJpZ2h0IiwgcGFydGlhbCA9IFRSVUUsIGZpbGwgPSBOQSkNCiAgICBkYXRhJG1heF93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1heF90ZW1wLCB3aWR0aCA9IDcsIEZVTiA9IG1lYW4sIGFsaWduID0gInJpZ2h0IiwgcGFydGlhbCA9IFRSVUUsIGZpbGwgPSBOQSkNCiAgICByZXR1cm4oZGF0YSkNCiAgfQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIHJvbGxpbmcgbWVhbiBmb3IgZWFjaCB5ZWFyIGFuZCBsb2NhdGlvbg0KICBkYWlseV90ZW1wIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfbW9kaWZ5KH5jYWxjX3llYXJseV9yb2xsaW5nX21lYW4oLikpDQogIA0KICAjIElkZW50aWZ5IHRoZSB3YXJtZXN0IDkxIGRheXMgKDMgbW9udGhzKSBvZiBlYWNoIHllYXINCiAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gZGFpbHlfdGVtcCAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgbG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApDQogIA0KICAjIENhbGN1bGF0ZSB0aGUgbWVhbiBvdmVyYWxsIG1heGltdW0gdGVtcGVyYXR1cmUgZm9yIHRoZSB3YXJtZXN0IGRheXMgb2YgZWFjaCB5ZWFyDQogIG92ZXJhbGxfdGVtcF93YXJtZXN0X2RheXMgPC0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXplKG1lYW4gPSBtZWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4yNSksDQogICAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICAgIG5pbmV0eWZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC45NSksDQogICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogIHJlc3VsdCA8LSBsaXN0KGRhaWx5X3RlbXAsIA0KICAgICAgICAgICAgICAgICBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgDQogICAgICAgICAgICAgICAgIG92ZXJhbGxfdGVtcF93YXJtZXN0X2RheXMpDQogIA0KICByZXR1cm4obGlzdChzdWNjZXNzID0gZWN0b19yZXN1bHQkc3VjY2VzcywgcmVzdWx0ID0gcmVzdWx0KSkgIyBSZXR1cm4gYSBsaXN0IHdpdGggYSBzdWNjZXNzIGZsYWcgYW5kIHRoZSByZXN1bHQuDQogIA0KfQ0KYGBgDQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzIGluIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGEgY2h1bmsgb2YgbG9jYXRpb25zDQpwcm9jZXNzX2NodW5rIDwtIGZ1bmN0aW9uKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpIHsNCiAgIyBSZWFkIGluIGRpc3RpbmN0IGNvb3JkaW5hdGVzDQogIGRpc3RpbmN0X2Nvb3JkPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCiAgDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkWywgMzo0XQ0KICBkaXN0aW5jdF9jb29yZCA8LSByZW5hbWUoZGlzdGluY3RfY29vcmQsIHggPSBsb24sIHkgPSBsYXQpDQogIA0KICAjIEFkanVzdCB0aGUgcmFuZ2Ugb2YgbG9jYXRpb25zDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW3N0YXJ0X2luZGV4OmVuZF9pbmRleCxdDQogIGxvY19saXN0IDwtIHNwbGl0KGRpc3RpbmN0X2Nvb3JkLCBzZXEobnJvdyhkaXN0aW5jdF9jb29yZCkpKQ0KICBsb2NfbGlzdCA8LSBsYXBwbHkobG9jX2xpc3QsIHVubGlzdCkNCiAgDQogICMgTWF0Y2ggYm9keSBtYXNzIGRhdGEgdG8gY29vcmRpbmF0ZXMNCiAgcHJlc2VuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KICANCiAgZGF0YV9mb3JfaW1wIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQogIA0KICBwcmVzZW5jZV9ib2R5X21hc3MgPC0gbWVyZ2UocHJlc2VuY2UsIGRwbHlyOjpzZWxlY3QoZGF0YV9mb3JfaW1wLCB0aXAubGFiZWwsIGJvZHlfbWFzcyksIGJ5ID0gInRpcC5sYWJlbCIpDQogIG1lZGlhbl9ib2R5X21hc3MgPC0gcHJlc2VuY2VfYm9keV9tYXNzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShtZWRpYW5fbWFzcyA9IG1lZGlhbihib2R5X21hc3MsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIGRwbHlyOjp1bmdyb3VwKCkNCiAgDQogIG1lZGlhbl9ib2R5X21hc3MgPC0gbXV0YXRlKG1lZGlhbl9ib2R5X21hc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzID0gaWZlbHNlKGlzLm5hKG1lZGlhbl9tYXNzKT09VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC40LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbWFzcykpDQogIA0KICAjIENvbnZlcnQgbG9jX2xpc3QgYmFjayBpbnRvIGEgZGF0YSBmcmFtZQ0KICBsb2NfZGYgPC0gZG8uY2FsbCgicmJpbmQiLCBsb2NfbGlzdCkNCiAgbG9jX2RmIDwtIGFzLmRhdGEuZnJhbWUobG9jX2RmKQ0KICBuYW1lcyhsb2NfZGYpIDwtIGMoImxvbiIsICJsYXQiKQ0KICANCiAgIyBKb2luIGxvY19kZiBhbmQgbWVkaWFuX2JvZHlfbWFzcw0KICBsb2NfZGYgPC0gZHBseXI6OmxlZnRfam9pbihsb2NfZGYsIG1lZGlhbl9ib2R5X21hc3MsIGJ5ID0gYygibG9uIiwgImxhdCIpKQ0KICANCiAgIyBDb252ZXJ0IGxvY19kZiBiYWNrIGludG8gYSBsaXN0DQogIGxvY19saXN0IDwtIHNwbGl0KGxvY19kZiwgc2VxKG5yb3cobG9jX2RmKSkpDQogIA0KICAjICMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCiAgcGxhbihtdWx0aWNvcmUod29ya2Vycz0xNikpDQogIA0KICAjIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCiAgb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy50aW1lb3V0ID0gMzYwMCkgICMgU2V0IGEgZ2xvYmFsIHRpbWVvdXQgZm9yIDMwIG1pbnV0ZXMNCiAgDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIA0KICBTeXMudGltZSgpDQogIA0KICByZXN1bHRzIDwtIGZ1dHVyZS5hcHBseTo6ZnV0dXJlX2xhcHBseShsb2NfbGlzdCwgcHJvY2Vzc19sb2NhdGlvbiwgZnV0dXJlLnBhY2thZ2VzPWMoIk5pY2hlTWFwUiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pY3JvY2xpbWEiLCAiZHBseXIiLCAiem9vIiwgIlIudXRpbHMiKSkNCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIA0KICBzYXZlUkRTKHJlc3VsdHMsIGZpbGU9cGFzdGUwKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9yZXN1bHRzLzFzdF9iYXRjaC9yZXN1bHRzX2Jpb3BoeXNpY2FsX21vZGVsbGluZ19wb25kX2Z1dHVyZTJDXyIsIHN0YXJ0X2luZGV4LCAiLSIsIGVuZF9pbmRleCwgIi5yZHMiKSkNCiAgDQp9DQpgYGANCg0KDQoNCiMjIyMgKipQcm9jZXNzIGFsbCBsb2NhdGlvbnMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRzdGFydCA8LSAiMDEvMDEvMjAwNSINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQoNClN5cy50aW1lKCkNCg0KY2h1bmtfc2l6ZSA8LSAxNg0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHJvdyBudW1iZXJzIGluIGRpc3RpbmN0X2Nvb3JkDQpzdGFydF9yb3cgPC0gMQ0KZW5kX3JvdyA8LSAxNDA5Mg0KDQojIENhbGN1bGF0ZSB0b3RhbCBjaHVua3MgZm9yIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCnRvdGFsX2NodW5rcyA8LSBjZWlsaW5nKChlbmRfcm93IC0gc3RhcnRfcm93ICsgMSkgLyBjaHVua19zaXplKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGNodW5rDQpmb3IoaSBpbiBzZXEodG90YWxfY2h1bmtzKSkgew0KICAjIENhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIGluZGljZXMgZm9yIHRoZSBjdXJyZW50IGNodW5rDQogIHN0YXJ0X2luZGV4IDwtICgoaSAtIDEpICogY2h1bmtfc2l6ZSkgKyBzdGFydF9yb3cNCiAgZW5kX2luZGV4IDwtIG1pbihpICogY2h1bmtfc2l6ZSArIHN0YXJ0X3JvdyAtIDEsIGVuZF9yb3cpDQogIA0KICAjIENhbGwgdGhlIHByb2Nlc3NfY2h1bmsgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQgb2YgNjAwIHNlY29uZHMNCiAgcmVzdWx0IDwtIHByb2Nlc3NfY2h1bmsoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkNCn0NCg0KU3lzLnRpbWUoKQ0KYGBgDQoNCiMjIyMgKipDb21iaW5lIG91dHB1dHMqKiANCg0KTm90ZSB0aGF0IHNvbWUgY29vcmRpbmF0ZXMgZmFpbGVkIHRvIHJ1biB3aXRoIHRoZSBjb2RlIHByb3ZpZGVkIGFib3ZlLCBhbmQgaGVuY2UgcmFuIHVzaW5nIHNsaWdodGx5IGRpZmZlcmVudCBwYXJhbWV0ZXJzIChoaWdoZXIgZXJyb3IgdG9sZXJhbmNlIGZvciBjYWxjdWxhdGluZyBzb2lsIHRlbXBlcmF0dXJlczsgbm90IGluIHBhcmFsbGVsIHNlc3Npb24pLiBTZWUgZGV0YWlscyBbSEVSRV0NCk5vdGUgYWxzbyB0aGF0IHRoZSB5ZWFyIDIwMDUgd2FzIHRha2VuIG91dCBhcyBhIGJ1cm4gaW4gdG8gYWxsb3cgdGhlIG1vZGVscyB0byBmdWxseSBjb252ZXJnZS4gDQoNCmBgYHtyLCBldmFsPUZ9DQojIExpc3Qgb2YgZm9sZGVycyBmb3IgZWFjaCB0eXBlIG9mIGZpbGUNCmZvbGRlcnMgPC0gYygiMXN0X2JhdGNoIiwgIjJuZF9iYXRjaCIsICIzcmRfYmF0Y2giLCANCiAgICAgICAgICAgICAiMjFzdF9iYXRjaCIsICIyMm5kX2JhdGNoIiwgIjIzcmRfYmF0Y2giLCANCiAgICAgICAgICAgICAiMzFzdF9iYXRjaCIsICIzMm5kX2JhdGNoIiwgIjMzcmRfYmF0Y2giKQ0KZm9sZGVyczIgPC0gcGFzdGUwKDQ6MjAsICJ0aF9iYXRjaCIpDQpmb2xkZXJzMyA8LSBwYXN0ZTAoMjQ6MzAsICJ0aF9iYXRjaCIpDQpmb2xkZXJzNCA8LSBwYXN0ZTAoMzQ6MzYsICJ0aF9iYXRjaCIpDQoNCmZvbGRlcnMgPC0gYyhmb2xkZXJzLCBmb2xkZXJzMiwgZm9sZGVyczMsIGZvbGRlcnM0KQ0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXAgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgZWFjaCBmb2xkZXINCmZvciAoZm9sZGVyIGluIGZvbGRlcnMpIHsNCiAgDQogICMgR2V0IHRoZSBwYXRoIHRvIHRoZSBmb2xkZXINCiAgcGF0aF90b19yZHMgPC0gcGFzdGUoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzJDL3Jlc3VsdHMiLCBmb2xkZXIsIHNlcCA9ICIvIikNCiAgDQogICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIGZvbGRlcg0KICByZHNfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gcGF0aF90b19yZHMsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgDQogICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KHJkc19maWxlcywgcmVhZFJEUykNCiAgDQogICMgRXh0cmFjdCAncmVzdWx0JyBmcm9tIGVhY2ggc3VibGlzdCBpbiBuZXN0ZWRfbGlzdF9yZXN1bHRzDQogIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCBmdW5jdGlvbih5KSB5W1sicmVzdWx0Il1dKSkNCiAgDQogICMgRmxhdHRlbiB0aGUgbGlzdA0KICBmbGF0dGVuZWRfbGlzdCA8LSBkby5jYWxsKCJjIiwgbmVzdGVkX2xpc3RfcmVzdWx0cykNCiAgDQogICMgQ29tYmluZSBhbGwgZGF0YWZyYW1lcyBmb3IgZWFjaCBtZXRyaWMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcFtbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzW1tmb2xkZXJdXSA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShmbGF0dGVuZWRfbGlzdCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIGZvbGRlcnMNCmNvbWJpbmVkX2RhaWx5X3RlbXAgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cykNCg0KIyBDb252ZXJ0IHRvIG51bWVyaWMgdmFsdWVzDQpjb21iaW5lZF9kYWlseV90ZW1wJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXAkbG9uKQ0KY29tYmluZWRfZGFpbHlfdGVtcCRsYXQgPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxhdCkNCg0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbG9uIDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbG9uKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbGF0KQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIGVhY2ggZm9sZGVyDQpmb3IgKGZvbGRlciBpbiBmb2xkZXJzKSB7DQogIA0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgc3ViZm9sZGVyICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiDQogIHBhdGhfdG9fc3ViZm9sZGVyIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9yZXN1bHRzIiwgZm9sZGVyLCAicHJvYmxlbWF0aWNfbG9jYXRpb25zIiwgc2VwID0gIi8iKQ0KICANCiAgIyBDaGVjayBpZiB0aGUgc3ViZm9sZGVyIGV4aXN0cw0KICBpZiAoZGlyLmV4aXN0cyhwYXRoX3RvX3N1YmZvbGRlcikpIHsNCiAgICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBzdWJmb2xkZXINCiAgICByZHNfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gcGF0aF90b19zdWJmb2xkZXIsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgICANCiAgICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICAgIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KHJkc19maWxlcywgcmVhZFJEUykNCiAgICANCiAgICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIGVhY2ggbGlzdCBhbmQgdW5saXN0ICdsYXQnIGFuZCAnbG9uJyBjb2x1bW5zDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF9zdWJmb2xkZXIgPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgew0KICAgICAgZGYgPC0geFtbMV1dDQogICAgICBpZiAoaXMubGlzdChkZiRsYXQpKSBkZiRsYXQgPC0gdW5saXN0KGRmJGxhdCkNCiAgICAgIGlmIChpcy5saXN0KGRmJGxvbikpIGRmJGxvbiA8LSB1bmxpc3QoZGYkbG9uKQ0KICAgICAgZGYNCiAgICB9KSkNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXIgPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgew0KICAgICAgZGYgPC0geFtbMl1dDQogICAgICBpZiAoaXMubGlzdChkZiRsYXQpKSBkZiRsYXQgPC0gdW5saXN0KGRmJGxhdCkNCiAgICAgIGlmIChpcy5saXN0KGRmJGxvbikpIGRmJGxvbiA8LSB1bmxpc3QoZGYkbG9uKQ0KICAgICAgZGYNCiAgICB9KSkNCiAgICANCiAgICAjIFN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpY1tbZm9sZGVyXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9zdWJmb2xkZXINCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpY1tbZm9sZGVyXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3ViZm9sZGVyDQogIH0NCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIHN1YmZvbGRlcnMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYykNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBHZXQgdGhlIHBhdGggdG8gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCnBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucyA8LSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvcmVzdWx0cy9mYWlsZWRfbG9jYXRpb25zIg0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGxpc3QoKQ0KDQojIEdldCB0aGUgbGlzdCBvZiAucmRzIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpyZHNfZmlsZXNfZmFpbGVkIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQojIExvb3Agb3ZlciBlYWNoIC5yZHMgZmlsZQ0KZm9yIChmaWxlX2ZhaWxlZCBpbiByZHNfZmlsZXNfZmFpbGVkKSB7DQogICMgUmVhZCB0aGUgLnJkcyBmaWxlIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkIDwtIHJlYWRSRFMoZmlsZV9mYWlsZWQpDQogIA0KICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIHRoZSBsaXN0DQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMV1dDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzJdXQ0KDQogICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRfc3ViZm9sZGVyDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyBTYXZlIGZpbGVzDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvZGFpbHlfdGVtcF9wb25kXzJDLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF8yQy5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9vdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfMkMucmRzIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMjIENoZWNrIGZvciBtaXNzaW5nIGNvb3JkaW5hdGVzIGFnYWluDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gbXV0YXRlKGRpc3RpbmN0X2Nvb3JkLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0KDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gbXV0YXRlKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KIyBGdW5jdGlvbiBvcHBvc2l0ZSBvZiAlaW4lDQonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKSANCg0KbWlzc2luZ19jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0LF0NCm1pc3NpbmdfY29vcmQNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMgPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJSFpbiUgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsJGxvbl9sYXQpKQ0KbWlzc2luZ19jb29yZF9yb3dfbnVtYmVycw0KDQojIyMgDQpjaGVja19kdXA8LSBncm91cF9ieShjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgbG9uLCBsYXQsIFlFQVIsIERPWSkgJT4lIHN1bW1hcmlzZShuPW4oKSkNCmxvY193aXRoX21vcmVfdGhhbl9vbmU8LSBmaWx0ZXIoY2hlY2tfZHVwLCBuPjEpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gbXV0YXRlKGxvY193aXRoX21vcmVfdGhhbl9vbmUsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQpyb3dfbl9kdXA8LSBkYXRhLmZyYW1lKHJvd19uID0gd2hpY2goZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCkpDQpyb3dfbl9kdXANCmR1cF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICVpbiUgbG9jX3dpdGhfbW9yZV90aGFuX29uZSRsb25fbGF0LF0NCmR1cF9jb29yZA0KDQojIFNhdmUgdGhlIGNvbWJpbmVkIGRhdGENCnNhdmVSRFMobWlzc2luZ19jb29yZCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzJDL21pc3NpbmdfY29vcmRpbmF0ZXNfMkMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvbWlzc2luZ19jb29yZGluYXRlc19yb3dfbl8yQy5yZHMiKQ0Kc2F2ZVJEUyhyb3dfbl9kdXAsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzJDL3Jvd19uX2R1cGxpY2F0ZWRfY29vcmRpbmF0ZXNfMkMucmRzIikNCnNhdmVSRFMoZHVwX2Nvb3JkLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzXzJDLnJkcyIpDQpgYGANCg0KIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzKioNCg0KYGBge3IsIGV2YWw9Rn0NCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KDQojIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDM2MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciA2MCBtaW51dGVzDQoNCg0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggbG9jYXRpb24NCnByb2Nlc3NfbG9jYXRpb24gPC0gZnVuY3Rpb24obG9jKSB7DQogIA0KICBwcmludChwYXN0ZSgiUHJvY2Vzc2luZyBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogIA0KICAjIFNldCBwYXJhbWV0ZXJzDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIGNvb3JkczwtIGMobG9jJGxvbiwgbG9jJGxhdCkNCiAgDQogIEVSUiA8LSAxLjUgICMgQWRqdXN0aW5nIEVSUiBiYXNlZCBvbiB0aGUgbG9jYXRpb25zIChsb2NhdGlvbnMgd2l0aCBzbm93IHNvbWV0aW1lcyBuZWVkIGEgaGlnaGVyIHZhbHVlKQ0KICANCiAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ2RhdGEvVGVycmFDbGltYXRlL2RhdGEnKQ0KICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogIA0KICAjIElmIHRoZSBwcm9jZXNzIHRha2VzIGxvbmdlciB0aGFuIDEwIG1pbnV0ZXMsIGJyZWFrLg0KICANCiAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0gZWxzZSB7DQogICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgbWljcm8kbWV0b3V0WywgMTNdIDwtIDAgIyBNYWtlIHN1cmUgdGhlIHBvbmQgc3RheXMgaW4gdGhlIHNoYWRlDQogIH0NCiAgDQogIA0KICAjIFdoZW4gdGhlIGZpcnN0IG1pY3JvX25jZXAgZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBFUlINCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgd2hpbGUobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpew0KICAgICAgRVJSIDwtIEVSUiArIDAuNQ0KICAgICAgDQogICAgICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgbWljcm9fbmNlcCgpIGZ1bmN0aW9uIGluc2lkZSB0aGUgd2hpbGUgbG9vcCBhcyB3ZWxsDQogICAgICBtaWNyb19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgICAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gRVJSLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgICAgIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgICAgIA0KICAgICAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgICAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgICAgIG1pY3JvJG1ldG91dFssIDEzXSA8LSAwICMgTWFrZSBzdXJlIHRoZSBwb25kIHN0YXlzIGluIHRoZSBzaGFkZQ0KICAgICAgfQ0KICAgICAgDQogICAgICAjIElmIEVSUiBleGNlZWRzIDUsIGJyZWFrIHRoZSBsb29wIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIG1pY3JvJG1ldG91dFssMV0NCiAgICAgIGlmKEVSUiA+PSA1KXsNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogICMgSWYgZXZlbiBhZnRlciBhZGp1c3RpbmcgRVJSIG1pY3JvX25jZXAgZmFpbHMsIHJldHVybiBhbiBlcnJvciBtZXNzYWdlDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogICMgQW5vdGhlciBleHBsaWNpdCBjaGVjaw0KICBpZiAoIW1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgYXNzaWduKCJtaWNybyIsIG1pY3JvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogIHN1Y2Nlc3MgPC0gRkFMU0UNCiAgcmVzdWx0IDwtIE5VTEwNCiAgDQogIG1pY3JvJG1ldG91dFssIDEzXSA8LSAwICMgTWFrZSBzdXJlIHRoZSBwb25kIHN0YXlzIGluIHRoZSBzaGFkZQ0KICANCiAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIGVjdG90aGVybSgpIGZ1bmN0aW9uIGFzIHdlbGwNCiAgZWN0b19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgIHRyeUNhdGNoKHsNCiAgICAgIGVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0oDQogICAgICAgIGNvbnRhaW5lcj0xLCAjIGNvbnRhaW5lciBtb2RlbA0KICAgICAgICBjb250aD0xNTAwLCAjIHNoYWxsb3cgcG9uZCBvZiAxLjVtIGRlcHRoDQogICAgICAgIGNvbnR3PTEyMDAwLCMgcG9uZCBvZiAxMm0gd2lkdGgNCiAgICAgICAgY29udHlwZT0xLCAjIGNvbnRhaW5lciBzdW5rIGludG8gdGhlIGdyb3VuZCBsaWtlIGEgcG9uZA0KICAgICAgICByYWlubXVsdCA9IDEwMDAwMDAwMDAsICMgcmFpbmZhbGwgbXVsdGlwbGllciwgdG8ga2VlcCB0aGUgcG9uZCB3ZXQNCiAgICAgICAgY29udGluaXQgPSAxNTAwLCAjIEluaXRpYWwgY29udGFpbmVyIHdhdGVyIGxldmVsICgxLjVtKQ0KICAgICAgICBjb250aG9sZSA9IDAsICMgRGFpbHkgbG9zcyBvZiBoZWlnaHQgKG1tKSBkdWUgdG8gaG9sZSBpbiBjb250YWluZXIgKGUuZy4gaW5maWx0cmF0aW9uKQ0KICAgICAgICBjb250d2V0PTEwMCwgIyAxMDAlIG9mIGNvbnRhaW5lciBzdXJmYWNlIGFyZWEgYWN0aW5nIGFzIGZyZWUgd2F0ZXIgZXhjaGFuZ2VyDQogICAgICAgIGNvbnRvbmx5PTEpDQogICAgICANCiAgICAgIGxpc3Qoc3VjY2VzcyA9IFRSVUUsIGVjdG8gPSBlY3RvKQ0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbGlzdChzdWNjZXNzID0gRkFMU0UsDQogICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksDQogICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBwYXN0ZSgiRmFpbGVkIG9uIGVjdG90aGVybSBjYWxsOiIsIGFzLmNoYXJhY3Rlcihjb25kaXRpb25NZXNzYWdlKGUpKSkpDQogICAgfSkNCiAgfSwgdGltZW91dCA9IDIwMDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgDQogIGlmIChpbmhlcml0cyhlY3RvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwoZWN0b19yZXN1bHQpKSB7DQogICAgcHJpbnQocGFzdGUoImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9DQogIA0KICBpZighZWN0b19yZXN1bHQkc3VjY2Vzcyl7DQogICAgcmV0dXJuKGVjdG9fcmVzdWx0KQ0KICB9DQogIA0KICBnYygpDQogIA0KICAjIEFzc2lnbiB0aGUgc3VjY2Vzc2Z1bCBlY3RvIHJlc3VsdCB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogIGVjdG8gPC0gZWN0b19yZXN1bHQkZWN0bw0KICBhc3NpZ24oImVjdG8iLCBlY3RvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICBlbnZpcm9uIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KICANCiAgDQogICMgTWF4IGFuZCBtZWFuIGRhaWx5IHRlbXBlcmF0dXJlcw0KICBkYWlseV90ZW1wIDwtIGVudmlyb24gJT4lDQogICAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQsDQogICAgICAgICAgICAgICAgICBFUlIgPSBFUlIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShFUlIsIFlFQVIsIERPWSwgbG9uID0gcGFzdGUobG9jJGxvbiksIGxhdD1wYXN0ZShsb2MkbGF0KSkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSByb2xsaW5nIHdlZWtseSB0ZW1wZXJhdHVyZQ0KICBjYWxjX3llYXJseV9yb2xsaW5nX21lYW4gPC0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgZGF0YSRtYXhfd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtYXhfdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgcmV0dXJuKGRhdGEpDQogIH0NCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByb2xsaW5nIG1lYW4gZm9yIGVhY2ggeWVhciBhbmQgbG9jYXRpb24NCiAgZGFpbHlfdGVtcCA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KICANCiAgIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQogIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gb3ZlcmFsbCBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgd2FybWVzdCBkYXlzIG9mIGVhY2ggeWVhcg0KICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICByZXN1bHQgPC0gbGlzdChkYWlseV90ZW1wLCANCiAgICAgICAgICAgICAgICAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzKQ0KICANCiAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IGVjdG9fcmVzdWx0JHN1Y2Nlc3MsIHJlc3VsdCA9IHJlc3VsdCkpICMgUmV0dXJuIGEgbGlzdCB3aXRoIGEgc3VjY2VzcyBmbGFnIGFuZCB0aGUgcmVzdWx0Lg0KICANCn0NCmBgYA0KDQojIyMjICoqRnVuY3Rpb24gdG8gcHJvY2VzcyBjb29yZGluYXRlcyBpbiBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBhIGNodW5rIG9mIGxvY2F0aW9ucw0KcHJvY2Vzc19jaHVuayA8LSBmdW5jdGlvbihzdGFydF9pbmRleCwgZW5kX2luZGV4KSB7DQogICMgUmVhZCBpbiBkaXN0aW5jdCBjb29yZGluYXRlcw0KICBkaXN0aW5jdF9jb29yZDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQogIA0KICBkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFssIDM6NF0NCiAgZGlzdGluY3RfY29vcmQgPC0gcmVuYW1lKGRpc3RpbmN0X2Nvb3JkLCB4ID0gbG9uLCB5ID0gbGF0KQ0KICANCiAgIyBBZGp1c3QgdGhlIHJhbmdlIG9mIGxvY2F0aW9ucw0KICBkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtzdGFydF9pbmRleDplbmRfaW5kZXgsXQ0KICBsb2NfbGlzdCA8LSBzcGxpdChkaXN0aW5jdF9jb29yZCwgc2VxKG5yb3coZGlzdGluY3RfY29vcmQpKSkNCiAgbG9jX2xpc3QgPC0gbGFwcGx5KGxvY19saXN0LCB1bmxpc3QpDQogIA0KICAjIE1hdGNoIGJvZHkgbWFzcyBkYXRhIHRvIGNvb3JkaW5hdGVzDQogIHByZXNlbmNlIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCiAgDQogIGRhdGFfZm9yX2ltcCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KICANCiAgcHJlc2VuY2VfYm9keV9tYXNzIDwtIG1lcmdlKHByZXNlbmNlLCBkcGx5cjo6c2VsZWN0KGRhdGFfZm9yX2ltcCwgdGlwLmxhYmVsLCBib2R5X21hc3MpLCBieSA9ICJ0aXAubGFiZWwiKQ0KICBtZWRpYW5fYm9keV9tYXNzIDwtIHByZXNlbmNlX2JvZHlfbWFzcyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UobWVkaWFuX21hc3MgPSBtZWRpYW4oYm9keV9tYXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBkcGx5cjo6dW5ncm91cCgpDQogIA0KICBtZWRpYW5fYm9keV9tYXNzIDwtIG11dGF0ZShtZWRpYW5fYm9keV9tYXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbWFzcyA9IGlmZWxzZShpcy5uYShtZWRpYW5fbWFzcyk9PVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MpKQ0KICANCiAgIyBDb252ZXJ0IGxvY19saXN0IGJhY2sgaW50byBhIGRhdGEgZnJhbWUNCiAgbG9jX2RmIDwtIGRvLmNhbGwoInJiaW5kIiwgbG9jX2xpc3QpDQogIGxvY19kZiA8LSBhcy5kYXRhLmZyYW1lKGxvY19kZikNCiAgbmFtZXMobG9jX2RmKSA8LSBjKCJsb24iLCAibGF0IikNCiAgDQogICMgSm9pbiBsb2NfZGYgYW5kIG1lZGlhbl9ib2R5X21hc3MNCiAgbG9jX2RmIDwtIGRwbHlyOjpsZWZ0X2pvaW4obG9jX2RmLCBtZWRpYW5fYm9keV9tYXNzLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCiAgDQogICMgQ29udmVydCBsb2NfZGYgYmFjayBpbnRvIGEgbGlzdA0KICBsb2NfbGlzdCA8LSBzcGxpdChsb2NfZGYsIHNlcShucm93KGxvY19kZikpKQ0KICANCiAgIyAjIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQogIHBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KICANCiAgIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQogIG9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDM2MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciAzMCBtaW51dGVzDQogIA0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgcmVzdWx0cyA8LSBmdXR1cmUuYXBwbHk6OmZ1dHVyZV9sYXBwbHkobG9jX2xpc3QsIHByb2Nlc3NfbG9jYXRpb24sIGZ1dHVyZS5wYWNrYWdlcz1jKCJOaWNoZU1hcFIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWNyb2NsaW1hIiwgImRwbHlyIiwgInpvbyIsICJSLnV0aWxzIikpDQogIA0KICBTeXMudGltZSgpDQogIA0KICANCiAgc2F2ZVJEUyhyZXN1bHRzLCBmaWxlPXBhc3RlMCgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfcG9uZF9mdXR1cmU0Q18iLCBzdGFydF9pbmRleCwgIi0iLCBlbmRfaW5kZXgsICIucmRzIikpDQogIA0KfQ0KYGBgDQoNCiMjIyMgKipQcm9jZXNzIGFsbCBsb2NhdGlvbnMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRzdGFydCA8LSAiMDEvMDEvMjAwNSINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQoNClN5cy50aW1lKCkNCg0KY2h1bmtfc2l6ZSA8LSAxNg0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHJvdyBudW1iZXJzIGluIGRpc3RpbmN0X2Nvb3JkDQpzdGFydF9yb3cgPC0gMQ0KZW5kX3JvdyA8LSAxNDA5Mg0KDQojIENhbGN1bGF0ZSB0b3RhbCBjaHVua3MgZm9yIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCnRvdGFsX2NodW5rcyA8LSBjZWlsaW5nKChlbmRfcm93IC0gc3RhcnRfcm93ICsgMSkgLyBjaHVua19zaXplKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGNodW5rDQpmb3IoaSBpbiBzZXEodG90YWxfY2h1bmtzKSkgew0KICAjIENhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIGluZGljZXMgZm9yIHRoZSBjdXJyZW50IGNodW5rDQogIHN0YXJ0X2luZGV4IDwtICgoaSAtIDEpICogY2h1bmtfc2l6ZSkgKyBzdGFydF9yb3cNCiAgZW5kX2luZGV4IDwtIG1pbihpICogY2h1bmtfc2l6ZSArIHN0YXJ0X3JvdyAtIDEsIGVuZF9yb3cpDQogIA0KICAjIENhbGwgdGhlIHByb2Nlc3NfY2h1bmsgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQgb2YgNjAwIHNlY29uZHMNCiAgcmVzdWx0IDwtIHByb2Nlc3NfY2h1bmsoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCkNCn0NCg0KU3lzLnRpbWUoKQ0KYGBgDQoNCiMjIyMgKipDb21iaW5lIG91dHB1dHMqKiANCg0KTm90ZSB0aGF0IHNvbWUgY29vcmRpbmF0ZXMgZmFpbGVkIHRvIHJ1biB3aXRoIHRoZSBjb2RlIHByb3ZpZGVkIGFib3ZlLCBhbmQgaGVuY2UgcmFuIHVzaW5nIHNsaWdodGx5IGRpZmZlcmVudCBwYXJhbWV0ZXJzIChoaWdoZXIgZXJyb3IgdG9sZXJhbmNlIGZvciBjYWxjdWxhdGluZyBzb2lsIHRlbXBlcmF0dXJlczsgbm90IGluIHBhcmFsbGVsIHNlc3Npb24pLiBTZWUgZGV0YWlscyBbSEVSRV0NCk5vdGUgYWxzbyB0aGF0IHRoZSB5ZWFyIDIwMDUgd2FzIHRha2VuIG91dCBhcyBhIGJ1cm4gaW4gdG8gYWxsb3cgdGhlIG1vZGVscyB0byBmdWxseSBjb252ZXJnZS4gDQoNCmBgYHtyLCBldmFsID1GfQ0KIyBMaXN0IG9mIGZvbGRlcnMgZm9yIGVhY2ggdHlwZSBvZiBmaWxlDQpmb2xkZXJzIDwtIGMoIjFzdF9iYXRjaCIsICIybmRfYmF0Y2giLCAiM3JkX2JhdGNoIiwgDQogICAgICAgICAgICAgIjIxc3RfYmF0Y2giLCAiMjJuZF9iYXRjaCIsICIyM3JkX2JhdGNoIiwgDQogICAgICAgICAgICAgIjMxc3RfYmF0Y2giLCAiMzJuZF9iYXRjaCIsICIzM3JkX2JhdGNoIikNCmZvbGRlcnMyIDwtIHBhc3RlMCg0OjIwLCAidGhfYmF0Y2giKQ0KZm9sZGVyczMgPC0gcGFzdGUwKDI0OjMwLCAidGhfYmF0Y2giKQ0KZm9sZGVyczQgPC0gcGFzdGUwKDM0OjM2LCAidGhfYmF0Y2giKQ0KDQpmb2xkZXJzIDwtIGMoZm9sZGVycywgZm9sZGVyczIsIGZvbGRlcnMzLCBmb2xkZXJzNCkNCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIGVhY2ggZm9sZGVyDQpmb3IgKGZvbGRlciBpbiBmb2xkZXJzKSB7DQogIA0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyDQogIHBhdGhfdG9fcmRzIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC80Qy9yZXN1bHRzIiwgZm9sZGVyLCBzZXAgPSAiLyIpDQogIA0KICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBmb2xkZXINCiAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fcmRzLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogIA0KICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogIA0KICAjIEV4dHJhY3QgJ3Jlc3VsdCcgZnJvbSBlYWNoIHN1Ymxpc3QgaW4gbmVzdGVkX2xpc3RfcmVzdWx0cw0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgZnVuY3Rpb24oeSkgeVtbInJlc3VsdCJdXSkpDQogIA0KICAjIEZsYXR0ZW4gdGhlIGxpc3QNCiAgZmxhdHRlbmVkX2xpc3QgPC0gZG8uY2FsbCgiYyIsIG5lc3RlZF9saXN0X3Jlc3VsdHMpDQogIA0KICAjIENvbWJpbmUgYWxsIGRhdGFmcmFtZXMgZm9yIGVhY2ggbWV0cmljIGFuZCBzdG9yZSB0aGVtIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c1tbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMpDQoNCiMgQ29udmVydCB0byBudW1lcmljIHZhbHVlcw0KY29tYmluZWRfZGFpbHlfdGVtcCRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsYXQpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICANCiAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIHN1YmZvbGRlciAicHJvYmxlbWF0aWNfbG9jYXRpb25zIg0KICBwYXRoX3RvX3N1YmZvbGRlciA8LSBwYXN0ZSgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvcmVzdWx0cyIsIGZvbGRlciwgInByb2JsZW1hdGljX2xvY2F0aW9ucyIsIHNlcCA9ICIvIikNCiAgDQogICMgQ2hlY2sgaWYgdGhlIHN1YmZvbGRlciBleGlzdHMNCiAgaWYgKGRpci5leGlzdHMocGF0aF90b19zdWJmb2xkZXIpKSB7DQogICAgIyBHZXQgdGhlIGxpc3Qgb2YgYWxsIHJkcyBmaWxlcyBpbiB0aGUgc3ViZm9sZGVyDQogICAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fc3ViZm9sZGVyLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogICAgDQogICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW50byBhIGxpc3QNCiAgICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogICAgDQogICAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSBlYWNoIGxpc3QgYW5kIHVubGlzdCAnbGF0JyBhbmQgJ2xvbicgY29sdW1ucw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzFdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzJdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgDQogICAgIyBTdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcyBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlcg0KICB9DQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBzdWJmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYykNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgR2V0IHRoZSBwYXRoIHRvIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMgPC0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzRDL3Jlc3VsdHMvZmFpbGVkX2xvY2F0aW9ucyINCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBsaXN0KCkNCg0KIyBHZXQgdGhlIGxpc3Qgb2YgLnJkcyBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcmRzX2ZpbGVzX2ZhaWxlZCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCg0KIyBMb29wIG92ZXIgZWFjaCAucmRzIGZpbGUNCmZvciAoZmlsZV9mYWlsZWQgaW4gcmRzX2ZpbGVzX2ZhaWxlZCkgew0KICAjIFJlYWQgdGhlIC5yZHMgZmlsZSBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZCA8LSByZWFkUkRTKGZpbGVfZmFpbGVkKQ0KICANCiAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSB0aGUgbGlzdA0KICBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzFdXQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyIDwtIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkW1sicmVzdWx0Il1dW1syXV0NCg0KICAjIFN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkW1tmaWxlX2ZhaWxlZF1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlcg0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkX3N1YmZvbGRlcg0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgZmlsZXMgaW4gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQ29tYmluZSBmaWxlcw0KY29tYmluZWRfZGFpbHlfdGVtcF9hbGwgPC0gcmJpbmQoY29tYmluZWRfZGFpbHlfdGVtcCwgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYywgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gcmJpbmQoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQpDQoNCiMgUmVtb3ZlIHRoZSBmaXJzdCB5ZWFyIChidXJuLWluKQ0KY29tYmluZWRfZGFpbHlfdGVtcF9hbGwgPC0gZmlsdGVyKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBZRUFSIT0iMjAwNSIpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gZmlsdGVyKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgWUVBUiE9IjIwMDUiKQ0KDQojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCB0ZW1wZXJhdHVyZSBhY3Jvc3MgY29vcmRpbmF0ZXMNCmNvbWJpbmVkX292ZXJhbGxfdGVtcF9hbGwgPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1lYW4gPSBtZWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIGZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICAgICAgICAgZmlyc3RfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4yNSksDQogICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQojIFNhdmUgZmlsZXMNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC80Qy9kYWlseV90ZW1wX3BvbmRfNEMucmRzIikNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC80Qy9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kXzRDLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX292ZXJhbGxfdGVtcF9hbGwsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzRDL292ZXJhbGxfdGVtcF93YXJtZXN0X2RheXNfcG9uZF80Qy5yZHMiKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyMgQ2hlY2sgZm9yIG1pc3NpbmcgY29vcmRpbmF0ZXMgYWdhaW4NCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBtdXRhdGUoZGlzdGluY3RfY29vcmQsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBtdXRhdGUoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0KDQojIEZ1bmN0aW9uIG9wcG9zaXRlIG9mICVpbiUNCiclIWluJScgPC0gZnVuY3Rpb24oeCx5KSEoJyVpbiUnKHgseSkpIA0KDQptaXNzaW5nX2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW2Rpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJSFpbiUgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsJGxvbl9sYXQsXQ0KbWlzc2luZ19jb29yZA0KbWlzc2luZ19jb29yZF9yb3dfbnVtYmVycyA8LSBkYXRhLmZyYW1lKHJvd19uID0gd2hpY2goZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCkpDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzDQoNCiMjIyANCmNoZWNrX2R1cDwtIGdyb3VwX2J5KGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBsb24sIGxhdCwgWUVBUiwgRE9ZKSAlPiUgc3VtbWFyaXNlKG49bigpKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIGZpbHRlcihjaGVja19kdXAsIG4+MSkNCmxvY193aXRoX21vcmVfdGhhbl9vbmU8LSBtdXRhdGUobG9jX3dpdGhfbW9yZV90aGFuX29uZSwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCnJvd19uX2R1cDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICVpbiUgbG9jX3dpdGhfbW9yZV90aGFuX29uZSRsb25fbGF0KSkNCnJvd19uX2R1cA0KZHVwX2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW2Rpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQsXQ0KZHVwX2Nvb3JkDQoNCiMgU2F2ZSB0aGUgY29tYmluZWQgZGF0YQ0Kc2F2ZVJEUyhtaXNzaW5nX2Nvb3JkLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvbWlzc2luZ19jb29yZGluYXRlc180Qy5yZHMiKQ0Kc2F2ZVJEUyhtaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC80Qy9taXNzaW5nX2Nvb3JkaW5hdGVzX3Jvd19uXzRDLnJkcyIpDQpzYXZlUkRTKHJvd19uX2R1cCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvcm93X25fZHVwbGljYXRlZF9jb29yZGluYXRlc180Qy5yZHMiKQ0Kc2F2ZVJEUyhkdXBfY29vcmQsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzRDL2R1cGxpY2F0ZWRfY29vcmRpbmF0ZXNfNEMucmRzIikNCg0KYGBgDQoNCiMjDQoNCiMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KIyMjICoqRmlsdGVyIGRhdGEgdG8gYXJib3JlYWwgb3Igc2VtaS1hcmJvcmVhbCBzcGVjaWVzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKSAjIEZ1bmN0aW9uIG9wcG9zaXRlIG9mICVpbiUNCg0KIyBHZW5lcmF0ZSBsaXN0IG9mIGNvb3JkaW5hdGVzIGZvciBhcmJvcmVhbCBzcGVjaWVzLCBzcGVjaWZpY2FsbHkgDQpkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KZGF0YV9mb3JfaW1wIDwtIGRhdGFfZm9yX2ltcCAlPiUNCiAgbXV0YXRlKGFyYm9yZWFsID0gaWZlbHNlKGVjb3R5cGUgPT0gIkFyYm9yZWFsIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9lY290eXBlID09ICJBcmJvcmVhbCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfZWNvdHlwZSA9PSAiU2VtaS1hcmJvcmVhbCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfZWNvdHlwZSA9PSAiU2VtaS1BcmJvcmVhbCIsICJ5ZXMiLCAibm8iKSkgJT4lIA0KICBtdXRhdGUoYXJib3JlYWwgPSBpZmVsc2UoaXMubmEoYXJib3JlYWwpPT1UUlVFLCAibm8iLCBhcmJvcmVhbCkpDQoNCmRhdGFfYXJib3JlYWwgPC0gZmlsdGVyKGRhdGFfZm9yX2ltcCwgYXJib3JlYWwgPT0ieWVzIikNCg0Kc2F2ZVJEUyhkYXRhX2FyYm9yZWFsLCBmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGF0YV9hcmJvcmVhbF9zcC5yZHMiKQ0KDQojIyMgQWRqdXN0IHNwZWNpZXMgY29vcmRpbmF0ZXMgDQpzcGVjaWVzX2Nvb3JkaW5hdGVzX2FkaiA8LSByZWFkUkRTKGZpbGU9J1JEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcycpDQpzcGVjaWVzX2Nvb3JkaW5hdGVzX2Fkal9hcmJvcmVhbCA8LSBzcGVjaWVzX2Nvb3JkaW5hdGVzX2FkaltzcGVjaWVzX2Nvb3JkaW5hdGVzX2FkaiR0aXAubGFiZWwgJWluJSBkYXRhX2FyYm9yZWFsJHRpcC5sYWJlbCwgXQ0KDQpzYXZlUkRTKHNwZWNpZXNfY29vcmRpbmF0ZXNfYWRqX2FyYm9yZWFsLCBmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KDQoNCiMgTm93IGdldCBsaXN0IG9mIHVuaXF1ZSBjb29yZGluYXRlcw0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3QoZHBseXI6OnNlbGVjdChzcGVjaWVzX2Nvb3JkaW5hdGVzX2Fkal9hcmJvcmVhbCwgLVByZXNlbmNlLCAtdGlwLmxhYmVsKSkNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSByZW5hbWUoeCA9IG9yaWdpbmFsX2xvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBvcmlnaW5hbF9sYXQpDQoNCnNhdmVSRFMoZGlzdGluY3RfY29vcmQsIGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KYGBgDQoNCg0KIyMjICoqQ3VycmVudCBjbGltYXRlKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzKioNCmBgYHtyLCBldmFsPUZ9DQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCg0KIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAxODAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgMzAgbWludXRlcw0KDQoNCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIGxvY2F0aW9uDQpwcm9jZXNzX2xvY2F0aW9uIDwtIGZ1bmN0aW9uKGxvYykgew0KICANCiAgcHJpbnQocGFzdGUoIlByb2Nlc3NpbmcgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICANCiAgIyBTZXQgcGFyYW1ldGVycw0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICBjb29yZHM8LSBjKGxvYyRsb24sIGxvYyRsYXQpDQogIA0KICBFUlIgPC0gMS41ICAjIEFkanVzdGluZyBFUlIgYmFzZWQgb24gdGhlIGxvY2F0aW9ucyAobG9jYXRpb25zIHdpdGggc25vdyBzb21ldGltZXMgbmVlZCBhIGhpZ2hlciB2YWx1ZSkNCiAgDQogIG1pY3JvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLCAjIDIgbWV0ZXJzIGFib3ZlIGdyb3VuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kZmFjID0gMC4yLCAjIFJlZHVjZSB3aW5kIHNwZWVkIGJ5IDgwJSBpbiBkZW5zZSB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbWEuTEFJID0gMC45LCAjIDkwJSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSBFUlIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcpDQogIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgDQogICMgSWYgdGhlIHByb2Nlc3MgdGFrZXMgbG9uZ2VyIHRoYW4gMTAgbWludXRlcywgYnJlYWsuDQogIA0KICBpZiAoaW5oZXJpdHMobWljcm9fcmVzdWx0LCAidHJ5LWVycm9yIikgfHwgaXMubnVsbChtaWNyb19yZXN1bHQpKSB7DQogICAgcHJpbnQocGFzdGUoIm1pY3JvX25jZXAgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgfSBlbHNlIHsNCiAgICBtaWNybyA8LSBtaWNyb19yZXN1bHQNCiAgfQ0KICANCiAgDQogICMgV2hlbiB0aGUgZmlyc3QgbWljcm9fbmNlcCBmYWlscywgdHJ5IGFnYWluIHdpdGggZGlmZmVyZW50IEVSUg0KICBpZiAobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICB3aGlsZShtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSl7DQogICAgICBFUlIgPC0gRVJSICsgMC41DQogICAgICANCiAgICAgICMgVXNlIHdpdGhUaW1lb3V0KCkgZm9yIHRoZSBtaWNyb19uY2VwKCkgZnVuY3Rpb24gaW5zaWRlIHRoZSB3aGlsZSBsb29wIGFzIHdlbGwNCiAgICAgIG1pY3JvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgICAgIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNyaHl0ID0gMiwgIyAyIG1ldGVycyBhYm92ZSBncm91bmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjIsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgODAlIGluIGRlbnNlIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbWEuTEFJID0gMC45LCAjIDkwJSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcpDQogICAgICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogICAgICANCiAgICAgIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICAgICAgcHJpbnQocGFzdGUoIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgICAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJtaWNyb19uY2VwIGluc2lkZSB3aGlsZSBsb29wIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICAgICAgfQ0KICAgICAgDQogICAgICAjIElmIEVSUiBleGNlZWRzIDUsIGJyZWFrIHRoZSBsb29wIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIG1pY3JvJG1ldG91dFssMV0NCiAgICAgIGlmKEVSUiA+PSA1KXsNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogICMgSWYgZXZlbiBhZnRlciBhZGp1c3RpbmcgRVJSIG1pY3JvX25jZXAgZmFpbHMsIHJldHVybiBhbiBlcnJvciBtZXNzYWdlDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogICMgQW5vdGhlciBleHBsaWNpdCBjaGVjaw0KICBpZiAoIW1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgYXNzaWduKCJtaWNybyIsIG1pY3JvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGYWlsZWQgb24gbWljcm9fbmNlcCBjYWxsIikpDQogIH0NCiAgDQogIHN1Y2Nlc3MgPC0gRkFMU0UNCiAgcmVzdWx0IDwtIE5VTEwNCiAgDQogIG1pY3JvJG1ldG91dFssIDNdIDwtIG1pY3JvJG1ldG91dFssIDRdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDJtKQ0KICBtaWNybyRtZXRvdXRbLCA1XSA8LSBtaWNybyRtZXRvdXRbLCA2XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgybSkNCiAgbWljcm8kbWV0b3V0WywgN10gPC0gbWljcm8kbWV0b3V0WywgOF0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMm0pDQogIA0KICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgZWN0b3RoZXJtKCkgZnVuY3Rpb24gYXMgd2VsbA0KICBlY3RvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgdHJ5Q2F0Y2goew0KICAgICAgZWN0byA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gbG9jJG1lZGlhbl9tYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KICAgICAgbGlzdChzdWNjZXNzID0gVFJVRSwgZWN0byA9IGVjdG8pDQogICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICBsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwNCiAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwNCiAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IHBhc3RlKCJGYWlsZWQgb24gZWN0b3RoZXJtIGNhbGw6IiwgYXMuY2hhcmFjdGVyKGNvbmRpdGlvbk1lc3NhZ2UoZSkpKSkNCiAgICB9KQ0KICB9LCB0aW1lb3V0ID0gMjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogIA0KICBpZiAoaW5oZXJpdHMoZWN0b19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKGVjdG9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJlY3RvdGhlcm0oKSBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQiKSkNCiAgfQ0KICANCiAgaWYoIWVjdG9fcmVzdWx0JHN1Y2Nlc3Mpew0KICAgIHJldHVybihlY3RvX3Jlc3VsdCkNCiAgfQ0KICANCiAgZ2MoKQ0KICANCiAgIyBBc3NpZ24gdGhlIHN1Y2Nlc3NmdWwgZWN0byByZXN1bHQgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICBlY3RvIDwtIGVjdG9fcmVzdWx0JGVjdG8NCiAgYXNzaWduKCJlY3RvIiwgZWN0bywgZW52aXIgPSBnbG9iYWxlbnYoKSkNCiAgZW52aXJvbiA8LSBhcy5kYXRhLmZyYW1lKGVjdG8kZW52aXJvbikNCiAgDQogICMgTWF4IGFuZCBtZWFuIGRhaWx5IHRlbXBlcmF0dXJlcw0KICBkYWlseV90ZW1wIDwtIGVudmlyb24gJT4lDQogICAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQsDQogICAgICAgICAgICAgICAgICBFUlIgPSBFUlIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShFUlIsIFlFQVIsIERPWSwgbG9uID0gcGFzdGUobG9jJGxvbiksIGxhdD1wYXN0ZShsb2MkbGF0KSkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSByb2xsaW5nIHdlZWtseSB0ZW1wZXJhdHVyZQ0KICBjYWxjX3llYXJseV9yb2xsaW5nX21lYW4gPC0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgZGF0YSRtYXhfd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtYXhfdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgcmV0dXJuKGRhdGEpDQogIH0NCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByb2xsaW5nIG1lYW4gZm9yIGVhY2ggeWVhciBhbmQgbG9jYXRpb24NCiAgZGFpbHlfdGVtcCA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KICANCiAgIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQogIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gb3ZlcmFsbCBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgd2FybWVzdCBkYXlzIG9mIGVhY2ggeWVhcg0KICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICByZXN1bHQgPC0gbGlzdChkYWlseV90ZW1wLCANCiAgICAgICAgICAgICAgICAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzKQ0KICANCiAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IGVjdG9fcmVzdWx0JHN1Y2Nlc3MsIHJlc3VsdCA9IHJlc3VsdCkpICMgUmV0dXJuIGEgbGlzdCB3aXRoIGEgc3VjY2VzcyBmbGFnIGFuZCB0aGUgcmVzdWx0Lg0KICANCn0NCmBgYA0KDQojIyMjICoqRnVuY3Rpb24gdG8gcHJvY2VzcyBjb29yZGluYXRlcyBpbiBjaHVua3MqKiANCg0KUHJvY2Vzc2luZyB0aGUgY29vcmRpbmF0ZXMgaW4gY2h1bmtzIGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGEgY2h1bmsgb2YgbG9jYXRpb25zDQpwcm9jZXNzX2NodW5rIDwtIGZ1bmN0aW9uKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpIHsNCiAgIyBSZWFkIGluIGRpc3RpbmN0IGNvb3JkaW5hdGVzDQogIGRpc3RpbmN0X2Nvb3JkPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCiAgDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkWywgMzo0XQ0KICBkaXN0aW5jdF9jb29yZCA8LSByZW5hbWUoZGlzdGluY3RfY29vcmQsIHggPSBsb24sIHkgPSBsYXQpDQogIA0KICAjIEFkanVzdCB0aGUgcmFuZ2Ugb2YgbG9jYXRpb25zDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW3N0YXJ0X2luZGV4OmVuZF9pbmRleCxdDQogIGxvY19saXN0IDwtIHNwbGl0KGRpc3RpbmN0X2Nvb3JkLCBzZXEobnJvdyhkaXN0aW5jdF9jb29yZCkpKQ0KICBsb2NfbGlzdCA8LSBsYXBwbHkobG9jX2xpc3QsIHVubGlzdCkNCiAgDQogICMgTWF0Y2ggYm9keSBtYXNzIGRhdGEgdG8gY29vcmRpbmF0ZXMNCiAgcHJlc2VuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KICANCiAgZGF0YSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kYXRhX2FyYm9yZWFsX3NwLnJkcyIpDQogIA0KICBwcmVzZW5jZV9ib2R5X21hc3MgPC0gbWVyZ2UocHJlc2VuY2UsIGRwbHlyOjpzZWxlY3QoZGF0YSwgdGlwLmxhYmVsLCBib2R5X21hc3MpLCBieSA9ICJ0aXAubGFiZWwiKQ0KICBtZWRpYW5fYm9keV9tYXNzIDwtIHByZXNlbmNlX2JvZHlfbWFzcyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UobWVkaWFuX21hc3MgPSBtZWRpYW4oYm9keV9tYXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBkcGx5cjo6dW5ncm91cCgpDQogIA0KICBtZWRpYW5fYm9keV9tYXNzIDwtIG11dGF0ZShtZWRpYW5fYm9keV9tYXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbWFzcyA9IGlmZWxzZShpcy5uYShtZWRpYW5fbWFzcyk9PVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MpKQ0KICANCiAgIyBDb252ZXJ0IGxvY19saXN0IGJhY2sgaW50byBhIGRhdGEgZnJhbWUNCiAgbG9jX2RmIDwtIGRvLmNhbGwoInJiaW5kIiwgbG9jX2xpc3QpDQogIGxvY19kZiA8LSBhcy5kYXRhLmZyYW1lKGxvY19kZikNCiAgbmFtZXMobG9jX2RmKSA8LSBjKCJsb24iLCAibGF0IikNCiAgDQogICMgSm9pbiBsb2NfZGYgYW5kIG1lZGlhbl9ib2R5X21hc3MNCiAgbG9jX2RmIDwtIGRwbHlyOjpsZWZ0X2pvaW4obG9jX2RmLCBtZWRpYW5fYm9keV9tYXNzLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCiAgDQogICMgQ29udmVydCBsb2NfZGYgYmFjayBpbnRvIGEgbGlzdA0KICBsb2NfbGlzdCA8LSBzcGxpdChsb2NfZGYsIHNlcShucm93KGxvY19kZikpKQ0KICANCiAgIyAjIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQogIHBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KICANCiAgIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQogIG9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDE4MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciAzMCBtaW51dGVzDQogIA0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgcmVzdWx0cyA8LSBmdXR1cmUuYXBwbHk6OmZ1dHVyZV9sYXBwbHkobG9jX2xpc3QsIHByb2Nlc3NfbG9jYXRpb24sIGZ1dHVyZS5wYWNrYWdlcz1jKCJOaWNoZU1hcFIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWNyb2NsaW1hIiwgImRwbHlyIiwgInpvbyIsICJSLnV0aWxzIikpDQogIA0KICBTeXMudGltZSgpDQogIA0KICANCiAgc2F2ZVJEUyhyZXN1bHRzLCBmaWxlPXBhc3RlMCgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsL2N1cnJlbnQvcmVzdWx0cy8xc3RfYmF0Y2gvcmVzdWx0c19iaW9waHlzaWNhbF9tb2RlbGxpbmdfYXJib3JlYWxfIiwgc3RhcnRfaW5kZXgsICItIiwgZW5kX2luZGV4LCAiLnJkcyIpKQ0KICANCn0NCmBgYA0KDQojIyMjICoqUHJvY2VzcyBhbGwgbG9jYXRpb25zKioNCg0KYGBge3IsIGV2YWw9Rn0NCmRzdGFydCA8LSAiMDEvMDEvMjAwNSINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQoNClN5cy50aW1lKCkNCg0KY2h1bmtfc2l6ZSA8LSAxNg0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHJvdyBudW1iZXJzIGluIGRpc3RpbmN0X2Nvb3JkDQpzdGFydF9yb3cgPC0gMQ0KZW5kX3JvdyA8LSA2NjE0DQoNCiMgQ2FsY3VsYXRlIHRvdGFsIGNodW5rcyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZQ0KdG90YWxfY2h1bmtzIDwtIGNlaWxpbmcoKGVuZF9yb3cgLSBzdGFydF9yb3cgKyAxKSAvIGNodW5rX3NpemUpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggY2h1bmsNCmZvcihpIGluIHNlcSh0b3RhbF9jaHVua3MpKSB7DQogICMgQ2FsY3VsYXRlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGN1cnJlbnQgY2h1bmsNCiAgc3RhcnRfaW5kZXggPC0gKChpIC0gMSkgKiBjaHVua19zaXplKSArIHN0YXJ0X3Jvdw0KICBlbmRfaW5kZXggPC0gbWluKGkgKiBjaHVua19zaXplICsgc3RhcnRfcm93IC0gMSwgZW5kX3JvdykNCiAgDQogICMgQ2FsbCB0aGUgcHJvY2Vzc19jaHVuayBmdW5jdGlvbiB3aXRoIGEgdGltZW91dCBvZiA2MDAgc2Vjb25kcw0KICByZXN1bHQgPC0gcHJvY2Vzc19jaHVuayhzdGFydF9pbmRleCwgZW5kX2luZGV4KQ0KfQ0KDQpTeXMudGltZSgpDQoNCmBgYA0KDQojIyMjICoqQ29tYmluZSBvdXRwdXRzKiogDQoNCk5vdGUgdGhhdCBzb21lIGNvb3JkaW5hdGVzIGZhaWxlZCB0byBydW4gd2l0aCB0aGUgY29kZSBwcm92aWRlZCBhYm92ZSwgYW5kIGhlbmNlIHJhbiB1c2luZyBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycyAoaGlnaGVyIGVycm9yIHRvbGVyYW5jZSBmb3IgY2FsY3VsYXRpbmcgc29pbCB0ZW1wZXJhdHVyZXM7IG5vdCBpbiBwYXJhbGxlbCBzZXNzaW9uKS4gU2VlIGRldGFpbHMgW0hFUkVdDQpOb3RlIGFsc28gdGhhdCB0aGUgeWVhciAyMDA1IHdhcyB0YWtlbiBvdXQgYXMgYSBidXJuIGluIHRvIGFsbG93IHRoZSBtb2RlbHMgdG8gZnVsbHkgY29udmVyZ2UuIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMaXN0IG9mIGZvbGRlcnMgZm9yIGVhY2ggdHlwZSBvZiBmaWxlDQpmb2xkZXJzIDwtIGMoIjFzdF9iYXRjaCIsICIybmRfYmF0Y2giLCAiM3JkX2JhdGNoIiwgIjR0aF9iYXRjaCIsICI1dGhfYmF0Y2giLCAiNnRoX2JhdGNoIiwgIjd0aF9iYXRjaCIpDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyDQogIHBhdGhfdG9fcmRzIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvY3VycmVudC9yZXN1bHRzIiwgZm9sZGVyLCBzZXAgPSAiLyIpDQogIA0KICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBmb2xkZXINCiAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fcmRzLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogIA0KICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogIA0KICAjIEV4dHJhY3QgJ3Jlc3VsdCcgZnJvbSBlYWNoIHN1Ymxpc3QgaW4gbmVzdGVkX2xpc3RfcmVzdWx0cw0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgZnVuY3Rpb24oeSkgeVtbInJlc3VsdCJdXSkpDQogIA0KICAjIEZsYXR0ZW4gdGhlIGxpc3QNCiAgZmxhdHRlbmVkX2xpc3QgPC0gZG8uY2FsbCgiYyIsIG5lc3RlZF9saXN0X3Jlc3VsdHMpDQogIA0KICAjIENvbWJpbmUgYWxsIGRhdGFmcmFtZXMgZm9yIGVhY2ggbWV0cmljIGFuZCBzdG9yZSB0aGVtIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c1tbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMpDQoNCiMgQ29udmVydCB0byBudW1lcmljIHZhbHVlcw0KY29tYmluZWRfZGFpbHlfdGVtcCRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsYXQpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgc3ViZm9sZGVyICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiDQogIHBhdGhfdG9fc3ViZm9sZGVyIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvY3VycmVudC9yZXN1bHRzIiwgZm9sZGVyLCAicHJvYmxlbWF0aWNfbG9jYXRpb25zIiwgc2VwID0gIi8iKQ0KICANCiAgIyBDaGVjayBpZiB0aGUgc3ViZm9sZGVyIGV4aXN0cw0KICBpZiAoZGlyLmV4aXN0cyhwYXRoX3RvX3N1YmZvbGRlcikpIHsNCiAgICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBzdWJmb2xkZXINCiAgICByZHNfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gcGF0aF90b19zdWJmb2xkZXIsIHBhdHRlcm4gPSAiKi5yZHMiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgICANCiAgICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICAgIG5lc3RlZF9saXN0X3Jlc3VsdHMgPC0gbGFwcGx5KHJkc19maWxlcywgcmVhZFJEUykNCiAgICANCiAgICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIGVhY2ggbGlzdCBhbmQgdW5saXN0ICdsYXQnIGFuZCAnbG9uJyBjb2x1bW5zDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF9zdWJmb2xkZXIgPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgew0KICAgICAgZGYgPC0geFtbMV1dDQogICAgICBpZiAoaXMubGlzdChkZiRsYXQpKSBkZiRsYXQgPC0gdW5saXN0KGRmJGxhdCkNCiAgICAgIGlmIChpcy5saXN0KGRmJGxvbikpIGRmJGxvbiA8LSB1bmxpc3QoZGYkbG9uKQ0KICAgICAgZGYNCiAgICB9KSkNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXIgPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgew0KICAgICAgZGYgPC0geFtbMl1dDQogICAgICBpZiAoaXMubGlzdChkZiRsYXQpKSBkZiRsYXQgPC0gdW5saXN0KGRmJGxhdCkNCiAgICAgIGlmIChpcy5saXN0KGRmJGxvbikpIGRmJGxvbiA8LSB1bmxpc3QoZGYkbG9uKQ0KICAgICAgZGYNCiAgICB9KSkNCiAgICANCiAgICAjIFN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpY1tbZm9sZGVyXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9zdWJmb2xkZXINCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpY1tbZm9sZGVyXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3ViZm9sZGVyDQogIH0NCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIHN1YmZvbGRlcnMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYykNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBHZXQgdGhlIHBhdGggdG8gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCnBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucyA8LSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsL2N1cnJlbnQvcmVzdWx0cy9mYWlsZWRfbG9jYXRpb25zIg0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGxpc3QoKQ0KDQojIEdldCB0aGUgbGlzdCBvZiAucmRzIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpyZHNfZmlsZXNfZmFpbGVkIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQojIExvb3Agb3ZlciBlYWNoIC5yZHMgZmlsZQ0KZm9yIChmaWxlX2ZhaWxlZCBpbiByZHNfZmlsZXNfZmFpbGVkKSB7DQogICMgUmVhZCB0aGUgLnJkcyBmaWxlIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkIDwtIHJlYWRSRFMoZmlsZV9mYWlsZWQpDQogIA0KICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIHRoZSBsaXN0DQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMV1dDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzJdXQ0KDQogICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRfc3ViZm9sZGVyDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyBTYXZlIGZpbGVzDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsL2N1cnJlbnQvZGFpbHlfdGVtcF9hcmJvcmVhbC5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYm9yZWFsLnJkcyIpDQpzYXZlUkRTKGNvbWJpbmVkX292ZXJhbGxfdGVtcF9hbGwsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L292ZXJhbGxfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWwucmRzIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMjIENoZWNrIGZvciBtaXNzaW5nIGNvb3JkaW5hdGVzIGFnYWluDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gbXV0YXRlKGRpc3RpbmN0X2Nvb3JkLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0KDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gbXV0YXRlKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KIyBGdW5jdGlvbiBvcHBvc2l0ZSBvZiAlaW4lDQonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKSANCg0KbWlzc2luZ19jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0LF0NCm1pc3NpbmdfY29vcmQNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMgPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJSFpbiUgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsJGxvbl9sYXQpKQ0KbWlzc2luZ19jb29yZF9yb3dfbnVtYmVycw0KDQojIyMgDQpjaGVja19kdXA8LSBncm91cF9ieShjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgbG9uLCBsYXQsIFlFQVIsIERPWSkgJT4lIHN1bW1hcmlzZShuPW4oKSkNCmxvY193aXRoX21vcmVfdGhhbl9vbmU8LSBmaWx0ZXIoY2hlY2tfZHVwLCBuPjEpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gbXV0YXRlKGxvY193aXRoX21vcmVfdGhhbl9vbmUsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQpyb3dfbl9kdXA8LSBkYXRhLmZyYW1lKHJvd19uID0gd2hpY2goZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCkpDQpyb3dfbl9kdXANCmR1cF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICVpbiUgbG9jX3dpdGhfbW9yZV90aGFuX29uZSRsb25fbGF0LF0NCmR1cF9jb29yZA0KDQojIFNhdmUgdGhlIGNvbWJpbmVkIGRhdGENCnNhdmVSRFMobWlzc2luZ19jb29yZCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L21pc3NpbmdfY29vcmRpbmF0ZXMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsL2N1cnJlbnQvbWlzc2luZ19jb29yZGluYXRlc19yb3dfbi5yZHMiKQ0Kc2F2ZVJEUyhyb3dfbl9kdXAsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L3Jvd19uX2R1cGxpY2F0ZWRfY29vcmRpbmF0ZXMucmRzIikNCnNhdmVSRFMoZHVwX2Nvb3JkLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvY3VycmVudC9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzLnJkcyIpDQoNCmBgYA0KDQojIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpIZXJlLCB3ZSBhc3N1bWUgYSBjbGltYXRlIHByb2plY3Rpb24gYXNzdW1pbmcgMiBkZWdyZWVzIG9mIHdhcm1pbmcuIA0KDQojIyMjICoqRnVuY3Rpb24gdG8gcHJvY2VzcyBjb29yZGluYXRlcyoqDQoNCmBgYHtyLCBldmFsPUZ9DQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCg0KIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAxODAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgMzAgbWludXRlcw0KDQoNCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBlYWNoIGxvY2F0aW9uDQpwcm9jZXNzX2xvY2F0aW9uIDwtIGZ1bmN0aW9uKGxvYykgew0KICANCiAgcHJpbnQocGFzdGUoIlByb2Nlc3NpbmcgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICANCiAgIyBTZXQgcGFyYW1ldGVycw0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICBjb29yZHM8LSBjKGxvYyRsb24sIGxvYyRsYXQpDQogIA0KICBFUlIgPC0gMS41ICAjIEFkanVzdGluZyBFUlIgYmFzZWQgb24gdGhlIGxvY2F0aW9ucyAobG9jYXRpb25zIHdpdGggc25vdyBzb21ldGltZXMgbmVlZCBhIGhpZ2hlciB2YWx1ZSkNCiAgDQogIG1pY3JvX3Jlc3VsdCA8LSB3aXRoVGltZW91dCh7DQogICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLCAjIDIgbWV0ZXJzIGFib3ZlIGdyb3VuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kZmFjID0gMC4yLCAjIFJlZHVjZSB3aW5kIHNwZWVkIGJ5IDgwJSBpbiBkZW5zZSB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbWEuTEFJID0gMC45LCAjIDkwJSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSBFUlIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ2RhdGEvTkNFUCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgIyBJZiB0aGUgcHJvY2VzcyB0YWtlcyBsb25nZXIgdGhhbiAxMCBtaW51dGVzLCBicmVhay4NCiAgDQogIGlmIChpbmhlcml0cyhtaWNyb19yZXN1bHQsICJ0cnktZXJyb3IiKSB8fCBpcy5udWxsKG1pY3JvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9IGVsc2Ugew0KICAgIG1pY3JvIDwtIG1pY3JvX3Jlc3VsdA0KICB9DQogIA0KICANCiAgIyBXaGVuIHRoZSBmaXJzdCBtaWNyb19uY2VwIGZhaWxzLCB0cnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgRVJSDQogIGlmIChtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIHdoaWxlKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKXsNCiAgICAgIEVSUiA8LSBFUlIgKyAwLjUNCiAgICAgIA0KICAgICAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIG1pY3JvX25jZXAoKSBmdW5jdGlvbiBpbnNpZGUgdGhlIHdoaWxlIGxvb3AgYXMgd2VsbA0KICAgICAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICAgICAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLCAjIDIgbWV0ZXJzIGFib3ZlIGdyb3VuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZGZhYyA9IDAuMiwgIyBSZWR1Y2Ugd2luZCBzcGVlZCBieSA4MCUgaW4gZGVuc2UgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltYS5MQUkgPSAwLjksICMgOTAlIG9mIHRoZSByYWRpYXRpb24gaXMgZGlmZnVzZWQgYmVjYXVzZSBvZiB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gRVJSLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdkYXRhL1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiAgICAgIH0sIHRpbWVvdXQgPSA2MDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgICAgIA0KICAgICAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgICAgICBwcmludChwYXN0ZSgibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IGZvciBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogICAgICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIm1pY3JvX25jZXAgaW5zaWRlIHdoaWxlIGxvb3AgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogICAgICB9DQogICAgICANCiAgICAgICMgSWYgRVJSIGV4Y2VlZHMgNSwgYnJlYWsgdGhlIGxvb3AgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgbWljcm8kbWV0b3V0WywxXQ0KICAgICAgaWYoRVJSID49IDUpew0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICANCiAgIyBJZiBldmVuIGFmdGVyIGFkanVzdGluZyBFUlIgbWljcm9fbmNlcCBmYWlscywgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UNCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgIyBBbm90aGVyIGV4cGxpY2l0IGNoZWNrDQogIGlmICghbWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICBhc3NpZ24oIm1pY3JvIiwgbWljcm8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLCANCiAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZhaWxlZCBvbiBtaWNyb19uY2VwIGNhbGwiKSkNCiAgfQ0KICANCiAgc3VjY2VzcyA8LSBGQUxTRQ0KICByZXN1bHQgPC0gTlVMTA0KICANCiAgbWljcm8kbWV0b3V0WywgM10gPC0gbWljcm8kbWV0b3V0WywgNF0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMm0pDQogIG1pY3JvJG1ldG91dFssIDVdIDwtIG1pY3JvJG1ldG91dFssIDZdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDJtKQ0KICBtaWNybyRtZXRvdXRbLCA3XSA8LSBtaWNybyRtZXRvdXRbLCA4XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgybSkNCiAgDQogICMgVXNlIHdpdGhUaW1lb3V0KCkgZm9yIHRoZSBlY3RvdGhlcm0oKSBmdW5jdGlvbiBhcyB3ZWxsDQogIGVjdG9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICB0cnlDYXRjaCh7DQogICAgICBlY3RvIDwtIE5pY2hlTWFwUjo6ZWN0b3RoZXJtKGxpdmU9MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSBsb2MkbWVkaWFuX21hc3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQogICAgICBsaXN0KHN1Y2Nlc3MgPSBUUlVFLCBlY3RvID0gZWN0bykNCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IEZBTFNFLA0KICAgICAgICAgICBsb2MgPSBjKGxvbiA9IGxvYyRsb24sIGxhdCA9IGxvYyRsYXQpLA0KICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gcGFzdGUoIkZhaWxlZCBvbiBlY3RvdGhlcm0gY2FsbDoiLCBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKQ0KICAgIH0pDQogIH0sIHRpbWVvdXQgPSAyMDAsIG9uVGltZW91dCA9ICJ3YXJuaW5nIikNCiAgDQogIGlmIChpbmhlcml0cyhlY3RvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwoZWN0b19yZXN1bHQpKSB7DQogICAgcHJpbnQocGFzdGUoImVjdG90aGVybSgpIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCIpKQ0KICB9DQogIA0KICBpZighZWN0b19yZXN1bHQkc3VjY2Vzcyl7DQogICAgcmV0dXJuKGVjdG9fcmVzdWx0KQ0KICB9DQogIA0KICBnYygpDQogIA0KICAjIEFzc2lnbiB0aGUgc3VjY2Vzc2Z1bCBlY3RvIHJlc3VsdCB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogIGVjdG8gPC0gZWN0b19yZXN1bHQkZWN0bw0KICBhc3NpZ24oImVjdG8iLCBlY3RvLCBlbnZpciA9IGdsb2JhbGVudigpKQ0KICBlbnZpcm9uIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KICANCiAgDQogICMgTWF4IGFuZCBtZWFuIGRhaWx5IHRlbXBlcmF0dXJlcw0KICBkYWlseV90ZW1wIDwtIGVudmlyb24gJT4lDQogICAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQsDQogICAgICAgICAgICAgICAgICBFUlIgPSBFUlIpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShFUlIsIFlFQVIsIERPWSwgbG9uID0gcGFzdGUobG9jJGxvbiksIGxhdD1wYXN0ZShsb2MkbGF0KSkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICdkcm9wJykNCiAgDQogICMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSByb2xsaW5nIHdlZWtseSB0ZW1wZXJhdHVyZQ0KICBjYWxjX3llYXJseV9yb2xsaW5nX21lYW4gPC0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgZGF0YSRtYXhfd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtYXhfdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLCBhbGlnbiA9ICJyaWdodCIsIHBhcnRpYWwgPSBUUlVFLCBmaWxsID0gTkEpDQogICAgcmV0dXJuKGRhdGEpDQogIH0NCiAgDQogICMgQ2FsY3VsYXRlIHRoZSByb2xsaW5nIG1lYW4gZm9yIGVhY2ggeWVhciBhbmQgbG9jYXRpb24NCiAgZGFpbHlfdGVtcCA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KICANCiAgIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQogIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXAgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIG1lYW4gb3ZlcmFsbCBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgd2FybWVzdCBkYXlzIG9mIGVhY2ggeWVhcg0KICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgICAgdGhpcmRfcXVhcnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC43NSksDQogICAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChtYXhfdGVtcCksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICByZXN1bHQgPC0gbGlzdChkYWlseV90ZW1wLCANCiAgICAgICAgICAgICAgICAgZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICBvdmVyYWxsX3RlbXBfd2FybWVzdF9kYXlzKQ0KICANCiAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IGVjdG9fcmVzdWx0JHN1Y2Nlc3MsIHJlc3VsdCA9IHJlc3VsdCkpICMgUmV0dXJuIGEgbGlzdCB3aXRoIGEgc3VjY2VzcyBmbGFnIGFuZCB0aGUgcmVzdWx0Lg0KICANCn0NCg0KYGBgDQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzIGluIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGEgY2h1bmsgb2YgbG9jYXRpb25zDQpwcm9jZXNzX2NodW5rIDwtIGZ1bmN0aW9uKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpIHsNCiAgIyBSZWFkIGluIGRpc3RpbmN0IGNvb3JkaW5hdGVzDQogIGRpc3RpbmN0X2Nvb3JkPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCiAgDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkWywgMzo0XQ0KICBkaXN0aW5jdF9jb29yZCA8LSByZW5hbWUoZGlzdGluY3RfY29vcmQsIHggPSBsb24sIHkgPSBsYXQpDQogIA0KICAjIEFkanVzdCB0aGUgcmFuZ2Ugb2YgbG9jYXRpb25zDQogIGRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW3N0YXJ0X2luZGV4OmVuZF9pbmRleCxdDQogIGxvY19saXN0IDwtIHNwbGl0KGRpc3RpbmN0X2Nvb3JkLCBzZXEobnJvdyhkaXN0aW5jdF9jb29yZCkpKQ0KICBsb2NfbGlzdCA8LSBsYXBwbHkobG9jX2xpc3QsIHVubGlzdCkNCiAgDQogICMgTWF0Y2ggYm9keSBtYXNzIGRhdGEgdG8gY29vcmRpbmF0ZXMNCiAgcHJlc2VuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KICANCiAgZGF0YSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kYXRhX2FyYm9yZWFsX3NwLnJkcyIpDQogIA0KICBwcmVzZW5jZV9ib2R5X21hc3MgPC0gbWVyZ2UocHJlc2VuY2UsIGRwbHlyOjpzZWxlY3QoZGF0YSwgdGlwLmxhYmVsLCBib2R5X21hc3MpLCBieSA9ICJ0aXAubGFiZWwiKQ0KICBtZWRpYW5fYm9keV9tYXNzIDwtIHByZXNlbmNlX2JvZHlfbWFzcyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UobWVkaWFuX21hc3MgPSBtZWRpYW4oYm9keV9tYXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBkcGx5cjo6dW5ncm91cCgpDQogIA0KICBtZWRpYW5fYm9keV9tYXNzIDwtIG11dGF0ZShtZWRpYW5fYm9keV9tYXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbWFzcyA9IGlmZWxzZShpcy5uYShtZWRpYW5fbWFzcyk9PVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MpKQ0KICANCiAgIyBDb252ZXJ0IGxvY19saXN0IGJhY2sgaW50byBhIGRhdGEgZnJhbWUNCiAgbG9jX2RmIDwtIGRvLmNhbGwoInJiaW5kIiwgbG9jX2xpc3QpDQogIGxvY19kZiA8LSBhcy5kYXRhLmZyYW1lKGxvY19kZikNCiAgbmFtZXMobG9jX2RmKSA8LSBjKCJsb24iLCAibGF0IikNCiAgDQogICMgSm9pbiBsb2NfZGYgYW5kIG1lZGlhbl9ib2R5X21hc3MNCiAgbG9jX2RmIDwtIGRwbHlyOjpsZWZ0X2pvaW4obG9jX2RmLCBtZWRpYW5fYm9keV9tYXNzLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCiAgDQogICMgQ29udmVydCBsb2NfZGYgYmFjayBpbnRvIGEgbGlzdA0KICBsb2NfbGlzdCA8LSBzcGxpdChsb2NfZGYsIHNlcShucm93KGxvY19kZikpKQ0KICANCiAgIyAjIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQogIHBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KICANCiAgIyBTZXQgdGhlIGdsb2JhbCB0aW1lb3V0DQogIG9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDE4MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciAzMCBtaW51dGVzDQogIA0KICBkc3RhcnQgPC0gIjAxLzAxLzIwMDUiDQogIGRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQogIA0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgcmVzdWx0cyA8LSBmdXR1cmUuYXBwbHk6OmZ1dHVyZV9sYXBwbHkobG9jX2xpc3QsIHByb2Nlc3NfbG9jYXRpb24sIGZ1dHVyZS5wYWNrYWdlcz1jKCJOaWNoZU1hcFIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWNyb2NsaW1hIiwgImRwbHlyIiwgInpvbyIsICJSLnV0aWxzIikpDQogIA0KICBTeXMudGltZSgpDQogIA0KICANCiAgc2F2ZVJEUyhyZXN1bHRzLCBmaWxlPXBhc3RlMCgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzJDL3Jlc3VsdHMvMXN0X2JhdGNoL3Jlc3VsdHNfYmlvcGh5c2ljYWxfbW9kZWxsaW5nX2FyYm9yZWFsX2Z1dHVyZTJDXyIsIHN0YXJ0X2luZGV4LCAiLSIsIGVuZF9pbmRleCwgIi5yZHMiKSkNCiAgDQp9DQpgYGANCg0KIyMjIyAqKlByb2Nlc3MgYWxsIGxvY2F0aW9ucyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCg0KU3lzLnRpbWUoKQ0KDQpjaHVua19zaXplIDwtIDE2DQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgcm93IG51bWJlcnMgaW4gZGlzdGluY3RfY29vcmQNCnN0YXJ0X3JvdyA8LSAxDQplbmRfcm93IDwtIDY2MTQNCg0KIyBDYWxjdWxhdGUgdG90YWwgY2h1bmtzIGZvciB0aGUgc3BlY2lmaWVkIHJhbmdlDQp0b3RhbF9jaHVua3MgPC0gY2VpbGluZygoZW5kX3JvdyAtIHN0YXJ0X3JvdyArIDEpIC8gY2h1bmtfc2l6ZSkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBjaHVuaw0KZm9yKGkgaW4gc2VxKHRvdGFsX2NodW5rcykpIHsNCiAgIyBDYWxjdWxhdGUgc3RhcnQgYW5kIGVuZCBpbmRpY2VzIGZvciB0aGUgY3VycmVudCBjaHVuaw0KICBzdGFydF9pbmRleCA8LSAoKGkgLSAxKSAqIGNodW5rX3NpemUpICsgc3RhcnRfcm93DQogIGVuZF9pbmRleCA8LSBtaW4oaSAqIGNodW5rX3NpemUgKyBzdGFydF9yb3cgLSAxLCBlbmRfcm93KQ0KICANCiAgIyBDYWxsIHRoZSBwcm9jZXNzX2NodW5rIGZ1bmN0aW9uIHdpdGggYSB0aW1lb3V0IG9mIDYwMCBzZWNvbmRzDQogIHJlc3VsdCA8LSBwcm9jZXNzX2NodW5rKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpDQp9DQoNClN5cy50aW1lKCkNCmBgYA0KDQojIyMjICoqQ29tYmluZSBvdXRwdXRzKiogDQoNCk5vdGUgdGhhdCBzb21lIGNvb3JkaW5hdGVzIGZhaWxlZCB0byBydW4gd2l0aCB0aGUgY29kZSBwcm92aWRlZCBhYm92ZSwgYW5kIGhlbmNlIHJhbiB1c2luZyBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycyAoaGlnaGVyIGVycm9yIHRvbGVyYW5jZSBmb3IgY2FsY3VsYXRpbmcgc29pbCB0ZW1wZXJhdHVyZXM7IG5vdCBpbiBwYXJhbGxlbCBzZXNzaW9uKS4gU2VlIGRldGFpbHMgW0hFUkVdDQpOb3RlIGFsc28gdGhhdCB0aGUgeWVhciAyMDA1IHdhcyB0YWtlbiBvdXQgYXMgYSBidXJuIGluIHRvIGFsbG93IHRoZSBtb2RlbHMgdG8gZnVsbHkgY29udmVyZ2UuIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQojIExpc3Qgb2YgZm9sZGVycyBmb3IgZWFjaCB0eXBlIG9mIGZpbGUNCmZvbGRlcnMgPC0gYygiMXN0X2JhdGNoIiwgIjJuZF9iYXRjaCIsICIzcmRfYmF0Y2giLCAiNHRoX2JhdGNoIiwgIjV0aF9iYXRjaCIsICI2dGhfYmF0Y2giLCAiN3RoX2JhdGNoIikNCg0KIyBJbml0aWFsaXplIGVtcHR5IGxpc3RzIHRvIHN0b3JlIHRoZSBjb21iaW5lZCBkYXRhZnJhbWVzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIGVhY2ggZm9sZGVyDQpmb3IgKGZvbGRlciBpbiBmb2xkZXJzKSB7DQogICMgR2V0IHRoZSBwYXRoIHRvIHRoZSBmb2xkZXINCiAgcGF0aF90b19yZHMgPC0gcGFzdGUoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC8yQy9yZXN1bHRzIiwgZm9sZGVyLCBzZXAgPSAiLyIpDQogIA0KICAjIEdldCB0aGUgbGlzdCBvZiBhbGwgcmRzIGZpbGVzIGluIHRoZSBmb2xkZXINCiAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fcmRzLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogIA0KICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbnRvIGEgbGlzdA0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogIA0KICAjIEV4dHJhY3QgJ3Jlc3VsdCcgZnJvbSBlYWNoIHN1Ymxpc3QgaW4gbmVzdGVkX2xpc3RfcmVzdWx0cw0KICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgZnVuY3Rpb24oeSkgeVtbInJlc3VsdCJdXSkpDQogIA0KICAjIEZsYXR0ZW4gdGhlIGxpc3QNCiAgZmxhdHRlbmVkX2xpc3QgPC0gZG8uY2FsbCgiYyIsIG5lc3RlZF9saXN0X3Jlc3VsdHMpDQogIA0KICAjIENvbWJpbmUgYWxsIGRhdGFmcmFtZXMgZm9yIGVhY2ggbWV0cmljIGFuZCBzdG9yZSB0aGVtIGluIHRoZSByZXNwZWN0aXZlIGxpc3RzDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KICBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c1tbZm9sZGVyXV0gPC0gZG8uY2FsbCgicmJpbmQiLCBsYXBwbHkoZmxhdHRlbmVkX2xpc3QsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXMpDQoNCiMgQ29udmVydCB0byBudW1lcmljIHZhbHVlcw0KY29tYmluZWRfZGFpbHlfdGVtcCRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0IDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsYXQpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxvbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzJGxhdCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgc3ViZm9sZGVyICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiDQogIHBhdGhfdG9fc3ViZm9sZGVyIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvcmVzdWx0cyIsIGZvbGRlciwgInByb2JsZW1hdGljX2xvY2F0aW9ucyIsIHNlcCA9ICIvIikNCiAgDQogICMgQ2hlY2sgaWYgdGhlIHN1YmZvbGRlciBleGlzdHMNCiAgaWYgKGRpci5leGlzdHMocGF0aF90b19zdWJmb2xkZXIpKSB7DQogICAgIyBHZXQgdGhlIGxpc3Qgb2YgYWxsIHJkcyBmaWxlcyBpbiB0aGUgc3ViZm9sZGVyDQogICAgcmRzX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fc3ViZm9sZGVyLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQogICAgDQogICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW50byBhIGxpc3QNCiAgICBuZXN0ZWRfbGlzdF9yZXN1bHRzIDwtIGxhcHBseShyZHNfZmlsZXMsIHJlYWRSRFMpDQogICAgDQogICAgIyBFeHRyYWN0IHRoZSBmb3VyIGRhdGFmcmFtZXMgZnJvbSBlYWNoIGxpc3QgYW5kIHVubGlzdCAnbGF0JyBhbmQgJ2xvbicgY29sdW1ucw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzFdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3ViZm9sZGVyIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KG5lc3RlZF9saXN0X3Jlc3VsdHMsIGZ1bmN0aW9uKHgpIHsNCiAgICAgIGRmIDwtIHhbWzJdXQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbGF0KSkgZGYkbGF0IDwtIHVubGlzdChkZiRsYXQpDQogICAgICBpZiAoaXMubGlzdChkZiRsb24pKSBkZiRsb24gPC0gdW5saXN0KGRmJGxvbikNCiAgICAgIGRmDQogICAgfSkpDQogICAgDQogICAgIyBTdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcyBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfc3ViZm9sZGVyDQogICAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWNbW2ZvbGRlcl1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlcg0KICB9DQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBzdWJmb2xkZXJzDQpjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYykNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgR2V0IHRoZSBwYXRoIHRvIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpwYXRoX3RvX2ZhaWxlZF9sb2NhdGlvbnMgPC0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC8yQy9yZXN1bHRzL2ZhaWxlZF9sb2NhdGlvbnMiDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWQgPC0gbGlzdCgpDQoNCiMgR2V0IHRoZSBsaXN0IG9mIC5yZHMgZmlsZXMgaW4gdGhlICJmYWlsZWRfbG9jYXRpb25zIiBmb2xkZXINCnJkc19maWxlc19mYWlsZWQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGF0aF90b19mYWlsZWRfbG9jYXRpb25zLCBwYXR0ZXJuID0gIioucmRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpDQoNCiMgTG9vcCBvdmVyIGVhY2ggLnJkcyBmaWxlDQpmb3IgKGZpbGVfZmFpbGVkIGluIHJkc19maWxlc19mYWlsZWQpIHsNCiAgIyBSZWFkIHRoZSAucmRzIGZpbGUgaW50byBhIGxpc3QNCiAgbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWQgPC0gcmVhZFJEUyhmaWxlX2ZhaWxlZCkNCiAgDQogICMgRXh0cmFjdCB0aGUgZm91ciBkYXRhZnJhbWVzIGZyb20gdGhlIGxpc3QNCiAgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRfc3ViZm9sZGVyIDwtIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkW1sicmVzdWx0Il1dW1sxXV0NCiAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMl1dDQoNCiAgIyBTdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcyBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZF9zdWJmb2xkZXINCiAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkW1tmaWxlX2ZhaWxlZF1dIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXINCn0NCg0KIyBDb21iaW5lIHRoZSBkYXRhZnJhbWVzIGZyb20gYWxsIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGRvLmNhbGwoInJiaW5kIiwgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIENvbWJpbmUgZmlsZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsIDwtIHJiaW5kKGNvbWJpbmVkX2RhaWx5X3RlbXAsIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIHJiaW5kKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkKQ0KDQojIFJlbW92ZSB0aGUgZmlyc3QgeWVhciAoYnVybi1pbikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsIDwtIGZpbHRlcihjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgWUVBUiE9IjIwMDUiKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsIDwtIGZpbHRlcihjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIFlFQVIhPSIyMDA1IikNCg0KIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgdGVtcGVyYXR1cmUgYWNyb3NzIGNvb3JkaW5hdGVzDQpjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsIDwtIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtZWFuID0gbWVhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICBmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgICAgICAgIGZpcnN0X3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMjUpLA0KICAgICAgICAgICAgICAgICAgIHRoaXJkX3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuNzUpLA0KICAgICAgICAgICAgICAgICAgIG5pbmV0eWZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC45NSksDQogICAgICAgICAgICAgICAgICAgbWluID0gbWluKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgobWF4X3RlbXApLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQojIFNhdmUgZmlsZXMNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIGZpbGU9ICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvZGFpbHlfdGVtcF9hcmJvcmVhbF8yQy5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC8yQy9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJvcmVhbF8yQy5yZHMiKQ0Kc2F2ZVJEUyhjb21iaW5lZF9vdmVyYWxsX3RlbXBfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5c19hcmJvcmVhbF8yQy5yZHMiKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyMgQ2hlY2sgZm9yIG1pc3NpbmcgY29vcmRpbmF0ZXMgYWdhaW4NCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBtdXRhdGUoZGlzdGluY3RfY29vcmQsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQoNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBtdXRhdGUoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0KDQojIEZ1bmN0aW9uIG9wcG9zaXRlIG9mICVpbiUNCiclIWluJScgPC0gZnVuY3Rpb24oeCx5KSEoJyVpbiUnKHgseSkpIA0KDQptaXNzaW5nX2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW2Rpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJSFpbiUgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsJGxvbl9sYXQsXQ0KbWlzc2luZ19jb29yZA0KbWlzc2luZ19jb29yZF9yb3dfbnVtYmVycyA8LSBkYXRhLmZyYW1lKHJvd19uID0gd2hpY2goZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlIWluJSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwkbG9uX2xhdCkpDQptaXNzaW5nX2Nvb3JkX3Jvd19udW1iZXJzDQoNCiMjIyANCmNoZWNrX2R1cDwtIGdyb3VwX2J5KGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBsb24sIGxhdCwgWUVBUiwgRE9ZKSAlPiUgc3VtbWFyaXNlKG49bigpKQ0KbG9jX3dpdGhfbW9yZV90aGFuX29uZTwtIGZpbHRlcihjaGVja19kdXAsIG4+MSkNCmxvY193aXRoX21vcmVfdGhhbl9vbmU8LSBtdXRhdGUobG9jX3dpdGhfbW9yZV90aGFuX29uZSwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCnJvd19uX2R1cDwtIGRhdGEuZnJhbWUocm93X24gPSB3aGljaChkaXN0aW5jdF9jb29yZCRsb25fbGF0ICVpbiUgbG9jX3dpdGhfbW9yZV90aGFuX29uZSRsb25fbGF0KSkNCnJvd19uX2R1cA0KZHVwX2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkW2Rpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJWluJSBsb2Nfd2l0aF9tb3JlX3RoYW5fb25lJGxvbl9sYXQsXQ0KZHVwX2Nvb3JkDQoNCiMgU2F2ZSB0aGUgY29tYmluZWQgZGF0YQ0Kc2F2ZVJEUyhtaXNzaW5nX2Nvb3JkLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzJDL21pc3NpbmdfY29vcmRpbmF0ZXNfMkMucmRzIikNCnNhdmVSRFMobWlzc2luZ19jb29yZF9yb3dfbnVtYmVycywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzJDL21pc3NpbmdfY29vcmRpbmF0ZXNfcm93X25fMkMucmRzIikNCnNhdmVSRFMocm93X25fZHVwLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvcm93X25fZHVwbGljYXRlZF9jb29yZGluYXRlc18yQy5yZHMiKQ0Kc2F2ZVJEUyhkdXBfY29vcmQsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC8yQy9kdXBsaWNhdGVkX2Nvb3JkaW5hdGVzXzJDLnJkcyIpDQpgYGANCg0KIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipGdW5jdGlvbiB0byBwcm9jZXNzIGNvb3JkaW5hdGVzKioNCg0KYGBge3IsIGV2YWw9Rn0NCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MTYpKQ0KDQojIFNldCB0aGUgZ2xvYmFsIHRpbWVvdXQNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMudGltZW91dCA9IDE4MDApICAjIFNldCBhIGdsb2JhbCB0aW1lb3V0IGZvciAzMCBtaW51dGVzDQoNCg0KIyBGdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggbG9jYXRpb24NCnByb2Nlc3NfbG9jYXRpb24gPC0gZnVuY3Rpb24obG9jKSB7DQogIA0KICBwcmludChwYXN0ZSgiUHJvY2Vzc2luZyBsb2NhdGlvbiB3aXRoIGxvbiA9IiwgbG9jJGxvbiwgImxhdCA9IiwgbG9jJGxhdCkpDQogIA0KICAjIFNldCBwYXJhbWV0ZXJzDQogIGRzdGFydCA8LSAiMDEvMDEvMjAwNSINCiAgZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCiAgDQogIGNvb3JkczwtIGMobG9jJGxvbiwgbG9jJGxhdCkNCiAgDQogIEVSUiA8LSAxLjUgICMgQWRqdXN0aW5nIEVSUiBiYXNlZCBvbiB0aGUgbG9jYXRpb25zIChsb2NhdGlvbnMgd2l0aCBzbm93IHNvbWV0aW1lcyBuZWVkIGEgaGlnaGVyIHZhbHVlKQ0KICANCiAgbWljcm9fcmVzdWx0IDwtIHdpdGhUaW1lb3V0KHsNCiAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDIsICMgMiBtZXRlcnMgYWJvdmUgZ3JvdW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjIsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgODAlIGluIGRlbnNlIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltYS5MQUkgPSAwLjksICMgOTAlIG9mIHRoZSByYWRpYXRpb24gaXMgZGlmZnVzZWQgYmVjYXVzZSBvZiB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IEVSUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnZGF0YS9OQ0VQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ2RhdGEvVGVycmFDbGltYXRlL2RhdGEnKQ0KICB9LCB0aW1lb3V0ID0gNjAwLCBvblRpbWVvdXQgPSAid2FybmluZyIpDQogIA0KICAjIElmIHRoZSBwcm9jZXNzIHRha2VzIGxvbmdlciB0aGFuIDEwIG1pbnV0ZXMsIGJyZWFrLg0KICANCiAgaWYgKGluaGVyaXRzKG1pY3JvX3Jlc3VsdCwgInRyeS1lcnJvciIpIHx8IGlzLm51bGwobWljcm9fcmVzdWx0KSkgew0KICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0gZWxzZSB7DQogICAgbWljcm8gPC0gbWljcm9fcmVzdWx0DQogIH0NCiAgDQogIA0KICAjIFdoZW4gdGhlIGZpcnN0IG1pY3JvX25jZXAgZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBFUlINCiAgaWYgKG1heChtaWNybyRtZXRvdXRbLDFdID09IDApKSB7DQogICAgd2hpbGUobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpew0KICAgICAgRVJSIDwtIEVSUiArIDAuNQ0KICAgICAgDQogICAgICAjIFVzZSB3aXRoVGltZW91dCgpIGZvciB0aGUgbWljcm9fbmNlcCgpIGZ1bmN0aW9uIGluc2lkZSB0aGUgd2hpbGUgbG9vcCBhcyB3ZWxsDQogICAgICBtaWNyb19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgICAgICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDIsICMgMiBtZXRlcnMgYWJvdmUgZ3JvdW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kZmFjID0gMC4yLCAjIFJlZHVjZSB3aW5kIHNwZWVkIGJ5IDgwJSBpbiBkZW5zZSB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW1hLkxBSSA9IDAuOSwgIyA5MCUgb2YgdGhlIHJhZGlhdGlvbiBpcyBkaWZmdXNlZCBiZWNhdXNlIG9mIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSBFUlIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdkYXRhL05DRVAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ2RhdGEvVGVycmFDbGltYXRlL2RhdGEnKQ0KICAgICAgfSwgdGltZW91dCA9IDYwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICAgICAgDQogICAgICBpZiAoaW5oZXJpdHMobWljcm9fcmVzdWx0LCAidHJ5LWVycm9yIikgfHwgaXMubnVsbChtaWNyb19yZXN1bHQpKSB7DQogICAgICAgIHByaW50KHBhc3RlKCJtaWNyb19uY2VwIGluc2lkZSB3aGlsZSBsb29wIGV4Y2VlZGVkIHRpbWUgbGltaXQgZm9yIGxvY2F0aW9uIHdpdGggbG9uID0iLCBsb2MkbG9uLCAibGF0ID0iLCBsb2MkbGF0KSkNCiAgICAgICAgcmV0dXJuKGxpc3Qoc3VjY2VzcyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAibWljcm9fbmNlcCBpbnNpZGUgd2hpbGUgbG9vcCBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogICAgICB9IGVsc2Ugew0KICAgICAgICBtaWNybyA8LSBtaWNyb19yZXN1bHQNCiAgICAgIH0NCiAgICAgIA0KICAgICAgIyBJZiBFUlIgZXhjZWVkcyA1LCBicmVhayB0aGUgbG9vcCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBtaWNybyRtZXRvdXRbLDFdDQogICAgICBpZihFUlIgPj0gNSl7DQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICB9DQogIA0KICAjIElmIGV2ZW4gYWZ0ZXIgYWRqdXN0aW5nIEVSUiBtaWNyb19uY2VwIGZhaWxzLCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZQ0KICBpZiAobWF4KG1pY3JvJG1ldG91dFssMV0gPT0gMCkpIHsNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmFpbGVkIG9uIG1pY3JvX25jZXAgY2FsbCIpKQ0KICB9DQogIA0KICAjIEFub3RoZXIgZXhwbGljaXQgY2hlY2sNCiAgaWYgKCFtYXgobWljcm8kbWV0b3V0WywxXSA9PSAwKSkgew0KICAgIGFzc2lnbigibWljcm8iLCBtaWNybywgZW52aXIgPSBnbG9iYWxlbnYoKSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4obGlzdChzdWNjZXNzID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksIA0KICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmFpbGVkIG9uIG1pY3JvX25jZXAgY2FsbCIpKQ0KICB9DQogIA0KICBzdWNjZXNzIDwtIEZBTFNFDQogIHJlc3VsdCA8LSBOVUxMDQogIA0KICBtaWNybyRtZXRvdXRbLCAzXSA8LSBtaWNybyRtZXRvdXRbLCA0XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgybSkNCiAgbWljcm8kbWV0b3V0WywgNV0gPC0gbWljcm8kbWV0b3V0WywgNl0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMm0pDQogIG1pY3JvJG1ldG91dFssIDddIDwtIG1pY3JvJG1ldG91dFssIDhdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDJtKQ0KICANCiAgIyBVc2Ugd2l0aFRpbWVvdXQoKSBmb3IgdGhlIGVjdG90aGVybSgpIGZ1bmN0aW9uIGFzIHdlbGwNCiAgZWN0b19yZXN1bHQgPC0gd2l0aFRpbWVvdXQoew0KICAgIHRyeUNhdGNoKHsNCiAgICAgIGVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0wLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IGxvYyRtZWRpYW5fbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCiAgICAgIGxpc3Qoc3VjY2VzcyA9IFRSVUUsIGVjdG8gPSBlY3RvKQ0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbGlzdChzdWNjZXNzID0gRkFMU0UsDQogICAgICAgICAgIGxvYyA9IGMobG9uID0gbG9jJGxvbiwgbGF0ID0gbG9jJGxhdCksDQogICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBwYXN0ZSgiRmFpbGVkIG9uIGVjdG90aGVybSBjYWxsOiIsIGFzLmNoYXJhY3Rlcihjb25kaXRpb25NZXNzYWdlKGUpKSkpDQogICAgfSkNCiAgfSwgdGltZW91dCA9IDIwMCwgb25UaW1lb3V0ID0gIndhcm5pbmciKQ0KICANCiAgaWYgKGluaGVyaXRzKGVjdG9fcmVzdWx0LCAidHJ5LWVycm9yIikgfHwgaXMubnVsbChlY3RvX3Jlc3VsdCkpIHsNCiAgICBwcmludChwYXN0ZSgiZWN0b3RoZXJtKCkgZXhjZWVkZWQgdGltZSBsaW1pdCBmb3IgbG9jYXRpb24gd2l0aCBsb24gPSIsIGxvYyRsb24sICJsYXQgPSIsIGxvYyRsYXQpKQ0KICAgIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgbG9jID0gYyhsb24gPSBsb2MkbG9uLCBsYXQgPSBsb2MkbGF0KSwgDQogICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJlY3RvdGhlcm0oKSBleGNlZWRlZCB0aW1lIGxpbWl0IikpDQogIH0NCiAgDQogIGlmKCFlY3RvX3Jlc3VsdCRzdWNjZXNzKXsNCiAgICByZXR1cm4oZWN0b19yZXN1bHQpDQogIH0NCiAgDQogIGdjKCkNCiAgDQogICMgQXNzaWduIHRoZSBzdWNjZXNzZnVsIGVjdG8gcmVzdWx0IHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgZWN0byA8LSBlY3RvX3Jlc3VsdCRlY3RvDQogIGFzc2lnbigiZWN0byIsIGVjdG8sIGVudmlyID0gZ2xvYmFsZW52KCkpDQogIGVudmlyb24gPC0gYXMuZGF0YS5mcmFtZShlY3RvJGVudmlyb24pDQogIA0KICAjIE1heCBhbmQgbWVhbiBkYWlseSB0ZW1wZXJhdHVyZXMNCiAgZGFpbHlfdGVtcCA8LSBlbnZpcm9uICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0LA0KICAgICAgICAgICAgICAgICAgRVJSID0gRVJSKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoRVJSLCBZRUFSLCBET1ksIGxvbiA9IHBhc3RlKGxvYyRsb24pLCBsYXQ9cGFzdGUobG9jJGxhdCkpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAnZHJvcCcpDQogIA0KICAjIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcm9sbGluZyB3ZWVrbHkgdGVtcGVyYXR1cmUNCiAgY2FsY195ZWFybHlfcm9sbGluZ19tZWFuIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgICBkYXRhJG1lYW5fd2Vla2x5X3RlbXAgPC0gem9vOjpyb2xsYXBwbHkoZGF0YSRtZWFuX3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIGRhdGEkbWF4X3dlZWtseV90ZW1wIDwtIHpvbzo6cm9sbGFwcGx5KGRhdGEkbWF4X3RlbXAsIHdpZHRoID0gNywgRlVOID0gbWVhbiwgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICAgIHJldHVybihkYXRhKQ0KICB9DQogIA0KICAjIENhbGN1bGF0ZSB0aGUgcm9sbGluZyBtZWFuIGZvciBlYWNoIHllYXIgYW5kIGxvY2F0aW9uDQogIGRhaWx5X3RlbXAgPC0gZGFpbHlfdGVtcCAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgbG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCiAgDQogICMgSWRlbnRpZnkgdGhlIHdhcm1lc3QgOTEgZGF5cyAoMyBtb250aHMpIG9mIGVhY2ggeWVhcg0KICBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShZRUFSLCBsb24sIGxhdCkgJT4lDQogICAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkNCiAgDQogICMgQ2FsY3VsYXRlIHRoZSBtZWFuIG92ZXJhbGwgbWF4aW11bSB0ZW1wZXJhdHVyZSBmb3IgdGhlIHdhcm1lc3QgZGF5cyBvZiBlYWNoIHllYXINCiAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5cyAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKG1heF90ZW1wKSwNCiAgICAgICAgICAgICAgICAgICAgIGZpZnRoX3BlcmNlbnRpbGUgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICAgIHRoaXJkX3F1YXJ0aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuNzUpLA0KICAgICAgICAgICAgICAgICAgICAgbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgobWF4X3RlbXApLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KICANCiAgcmVzdWx0IDwtIGxpc3QoZGFpbHlfdGVtcCwgDQogICAgICAgICAgICAgICAgIGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCANCiAgICAgICAgICAgICAgICAgb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5cykNCiAgDQogIHJldHVybihsaXN0KHN1Y2Nlc3MgPSBlY3RvX3Jlc3VsdCRzdWNjZXNzLCByZXN1bHQgPSByZXN1bHQpKSAjIFJldHVybiBhIGxpc3Qgd2l0aCBhIHN1Y2Nlc3MgZmxhZyBhbmQgdGhlIHJlc3VsdC4NCiAgDQp9DQoNCmBgYA0KDQojIyMjICoqRnVuY3Rpb24gdG8gcHJvY2VzcyBjb29yZGluYXRlcyBpbiBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgRnVuY3Rpb24gdG8gcHJvY2VzcyBhIGNodW5rIG9mIGxvY2F0aW9ucw0KcHJvY2Vzc19jaHVuayA8LSBmdW5jdGlvbihzdGFydF9pbmRleCwgZW5kX2luZGV4KSB7DQogICMgUmVhZCBpbiBkaXN0aW5jdCBjb29yZGluYXRlcw0KICBkaXN0aW5jdF9jb29yZDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQogIA0KICBkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFssIDM6NF0NCiAgZGlzdGluY3RfY29vcmQgPC0gcmVuYW1lKGRpc3RpbmN0X2Nvb3JkLCB4ID0gbG9uLCB5ID0gbGF0KQ0KICANCiAgIyBBZGp1c3QgdGhlIHJhbmdlIG9mIGxvY2F0aW9ucw0KICBkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtzdGFydF9pbmRleDplbmRfaW5kZXgsXQ0KICBsb2NfbGlzdCA8LSBzcGxpdChkaXN0aW5jdF9jb29yZCwgc2VxKG5yb3coZGlzdGluY3RfY29vcmQpKSkNCiAgbG9jX2xpc3QgPC0gbGFwcGx5KGxvY19saXN0LCB1bmxpc3QpDQogIA0KICAjIE1hdGNoIGJvZHkgbWFzcyBkYXRhIHRvIGNvb3JkaW5hdGVzDQogIHByZXNlbmNlIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCiAgDQogIGRhdGEgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvZGF0YV9hcmJvcmVhbF9zcC5yZHMiKQ0KICANCiAgcHJlc2VuY2VfYm9keV9tYXNzIDwtIG1lcmdlKHByZXNlbmNlLCBkcGx5cjo6c2VsZWN0KGRhdGEsIHRpcC5sYWJlbCwgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBwcmVzZW5jZV9ib2R5X21hc3MgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgICBkcGx5cjo6c3VtbWFyaXNlKG1lZGlhbl9tYXNzID0gbWVkaWFuKGJvZHlfbWFzcywgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZHBseXI6OnVuZ3JvdXAoKQ0KICANCiAgbWVkaWFuX2JvZHlfbWFzcyA8LSBtdXRhdGUobWVkaWFuX2JvZHlfbWFzcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX21hc3MgPSBpZmVsc2UoaXMubmEobWVkaWFuX21hc3MpPT1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9tYXNzKSkNCiAgDQogICMgQ29udmVydCBsb2NfbGlzdCBiYWNrIGludG8gYSBkYXRhIGZyYW1lDQogIGxvY19kZiA8LSBkby5jYWxsKCJyYmluZCIsIGxvY19saXN0KQ0KICBsb2NfZGYgPC0gYXMuZGF0YS5mcmFtZShsb2NfZGYpDQogIG5hbWVzKGxvY19kZikgPC0gYygibG9uIiwgImxhdCIpDQogIA0KICAjIEpvaW4gbG9jX2RmIGFuZCBtZWRpYW5fYm9keV9tYXNzDQogIGxvY19kZiA8LSBkcGx5cjo6bGVmdF9qb2luKGxvY19kZiwgbWVkaWFuX2JvZHlfbWFzcywgYnkgPSBjKCJsb24iLCAibGF0IikpDQogIA0KICAjIENvbnZlcnQgbG9jX2RmIGJhY2sgaW50byBhIGxpc3QNCiAgbG9jX2xpc3QgPC0gc3BsaXQobG9jX2RmLCBzZXEobnJvdyhsb2NfZGYpKSkNCiAgDQogICMgIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KICBwbGFuKG11bHRpY29yZSh3b3JrZXJzPTE2KSkNCiAgDQogICMgU2V0IHRoZSBnbG9iYWwgdGltZW91dA0KICBvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLnRpbWVvdXQgPSAxODAwKSAgIyBTZXQgYSBnbG9iYWwgdGltZW91dCBmb3IgMzAgbWludXRlcw0KICANCiAgZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KICBkZmluaXNoIDwtICIzMS8xMi8yMDE1Ig0KICANCiAgDQogIFN5cy50aW1lKCkNCiAgDQogIHJlc3VsdHMgPC0gZnV0dXJlLmFwcGx5OjpmdXR1cmVfbGFwcGx5KGxvY19saXN0LCBwcm9jZXNzX2xvY2F0aW9uLCBmdXR1cmUucGFja2FnZXM9YygiTmljaGVNYXBSIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9jbGltYSIsICJkcGx5ciIsICJ6b28iLCAiUi51dGlscyIpKQ0KICANCiAgU3lzLnRpbWUoKQ0KICANCiAgDQogIHNhdmVSRFMocmVzdWx0cywgZmlsZT1wYXN0ZTAoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC80Qy9yZXN1bHRzLzFzdF9iYXRjaC9yZXN1bHRzX2Jpb3BoeXNpY2FsX21vZGVsbGluZ19hcmJvcmVhbF9mdXR1cmU0Q18iLCBzdGFydF9pbmRleCwgIi0iLCBlbmRfaW5kZXgsICIucmRzIikpDQogIA0KfQ0KDQpgYGANCg0KIyMjIyAqKlByb2Nlc3MgYWxsIGxvY2F0aW9ucyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KZHN0YXJ0IDwtICIwMS8wMS8yMDA1Ig0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSINCg0KU3lzLnRpbWUoKQ0KDQpjaHVua19zaXplIDwtIDE2DQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgcm93IG51bWJlcnMgaW4gZGlzdGluY3RfY29vcmQNCnN0YXJ0X3JvdyA8LSAxDQplbmRfcm93IDwtIDY2MTQNCg0KIyBDYWxjdWxhdGUgdG90YWwgY2h1bmtzIGZvciB0aGUgc3BlY2lmaWVkIHJhbmdlDQp0b3RhbF9jaHVua3MgPC0gY2VpbGluZygoZW5kX3JvdyAtIHN0YXJ0X3JvdyArIDEpIC8gY2h1bmtfc2l6ZSkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBjaHVuaw0KZm9yKGkgaW4gc2VxKHRvdGFsX2NodW5rcykpIHsNCiAgIyBDYWxjdWxhdGUgc3RhcnQgYW5kIGVuZCBpbmRpY2VzIGZvciB0aGUgY3VycmVudCBjaHVuaw0KICBzdGFydF9pbmRleCA8LSAoKGkgLSAxKSAqIGNodW5rX3NpemUpICsgc3RhcnRfcm93DQogIGVuZF9pbmRleCA8LSBtaW4oaSAqIGNodW5rX3NpemUgKyBzdGFydF9yb3cgLSAxLCBlbmRfcm93KQ0KICANCiAgIyBDYWxsIHRoZSBwcm9jZXNzX2NodW5rIGZ1bmN0aW9uIHdpdGggYSB0aW1lb3V0IG9mIDYwMCBzZWNvbmRzDQogIHJlc3VsdCA8LSBwcm9jZXNzX2NodW5rKHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgpDQp9DQoNClN5cy50aW1lKCkNCmBgYA0KDQojIyMjICoqQ29tYmluZSBvdXRwdXRzKiogDQoNCk5vdGUgdGhhdCBzb21lIGNvb3JkaW5hdGVzIGZhaWxlZCB0byBydW4gd2l0aCB0aGUgY29kZSBwcm92aWRlZCBhYm92ZSwgYW5kIGhlbmNlIHJhbiB1c2luZyBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycyAoaGlnaGVyIGVycm9yIHRvbGVyYW5jZSBmb3IgY2FsY3VsYXRpbmcgc29pbCB0ZW1wZXJhdHVyZXM7IG5vdCBpbiBwYXJhbGxlbCBzZXNzaW9uKS4gU2VlIGRldGFpbHMgW0hFUkVdDQpOb3RlIGFsc28gdGhhdCB0aGUgeWVhciAyMDA1IHdhcyB0YWtlbiBvdXQgYXMgYSBidXJuIGluIHRvIGFsbG93IHRoZSBtb2RlbHMgdG8gZnVsbHkgY29udmVyZ2UuIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMaXN0IG9mIGZvbGRlcnMgZm9yIGVhY2ggdHlwZSBvZiBmaWxlDQpmb2xkZXJzIDwtIGMoIjFzdF9iYXRjaCIsICIybmRfYmF0Y2giLCAiM3JkX2JhdGNoIiwgIjR0aF9iYXRjaCIsICI1dGhfYmF0Y2giLCAiNnRoX2JhdGNoIiwgIjd0aF9iYXRjaCIpDQoNCiMgSW5pdGlhbGl6ZSBlbXB0eSBsaXN0cyB0byBzdG9yZSB0aGUgY29tYmluZWQgZGF0YWZyYW1lcw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBsaXN0KCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciBlYWNoIGZvbGRlcg0KZm9yIChmb2xkZXIgaW4gZm9sZGVycykgew0KICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyDQogIHBhdGhfdG9fcmRzIDwtIHBhc3RlKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvcmVzdWx0cyIsIGZvbGRlciwgc2VwID0gIi8iKQ0KICANCiAgIyBHZXQgdGhlIGxpc3Qgb2YgYWxsIHJkcyBmaWxlcyBpbiB0aGUgZm9sZGVyDQogIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3JkcywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICANCiAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW50byBhIGxpc3QNCiAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICANCiAgIyBFeHRyYWN0ICdyZXN1bHQnIGZyb20gZWFjaCBzdWJsaXN0IGluIG5lc3RlZF9saXN0X3Jlc3VsdHMNCiAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkobmVzdGVkX2xpc3RfcmVzdWx0cywgZnVuY3Rpb24oeCkgbGFwcGx5KHgsIGZ1bmN0aW9uKHkpIHlbWyJyZXN1bHQiXV0pKQ0KICANCiAgIyBGbGF0dGVuIHRoZSBsaXN0DQogIGZsYXR0ZW5lZF9saXN0IDwtIGRvLmNhbGwoImMiLCBuZXN0ZWRfbGlzdF9yZXN1bHRzKQ0KICANCiAgIyBDb21iaW5lIGFsbCBkYXRhZnJhbWVzIGZvciBlYWNoIG1ldHJpYyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgcmVzcGVjdGl2ZSBsaXN0cw0KICBjb21iaW5lZF9kYWlseV90ZW1wW1tmb2xkZXJdXSA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShmbGF0dGVuZWRfbGlzdCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCiAgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNbW2ZvbGRlcl1dIDwtIGRvLmNhbGwoInJiaW5kIiwgbGFwcGx5KGZsYXR0ZW5lZF9saXN0LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXApDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzKQ0KDQojIENvbnZlcnQgdG8gbnVtZXJpYyB2YWx1ZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXAkbG9uIDwtIGFzLm51bWVyaWMoY29tYmluZWRfZGFpbHlfdGVtcCRsb24pDQpjb21iaW5lZF9kYWlseV90ZW1wJGxhdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkX2RhaWx5X3RlbXAkbGF0KQ0KDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsb24gPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsb24pDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsYXQgPC0gYXMubnVtZXJpYyhjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cyRsYXQpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMgPC0gbGlzdCgpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgZWFjaCBmb2xkZXINCmZvciAoZm9sZGVyIGluIGZvbGRlcnMpIHsNCiAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIHN1YmZvbGRlciAicHJvYmxlbWF0aWNfbG9jYXRpb25zIg0KICBwYXRoX3RvX3N1YmZvbGRlciA8LSBwYXN0ZSgiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzRDL3Jlc3VsdHMiLCBmb2xkZXIsICJwcm9ibGVtYXRpY19sb2NhdGlvbnMiLCBzZXAgPSAiLyIpDQogIA0KICAjIENoZWNrIGlmIHRoZSBzdWJmb2xkZXIgZXhpc3RzDQogIGlmIChkaXIuZXhpc3RzKHBhdGhfdG9fc3ViZm9sZGVyKSkgew0KICAgICMgR2V0IHRoZSBsaXN0IG9mIGFsbCByZHMgZmlsZXMgaW4gdGhlIHN1YmZvbGRlcg0KICAgIHJkc19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXRoX3RvX3N1YmZvbGRlciwgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICAgIA0KICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGludG8gYSBsaXN0DQogICAgbmVzdGVkX2xpc3RfcmVzdWx0cyA8LSBsYXBwbHkocmRzX2ZpbGVzLCByZWFkUkRTKQ0KICAgIA0KICAgICMgRXh0cmFjdCB0aGUgZm91ciBkYXRhZnJhbWVzIGZyb20gZWFjaCBsaXN0IGFuZCB1bmxpc3QgJ2xhdCcgYW5kICdsb24nIGNvbHVtbnMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1sxXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YmZvbGRlciA8LSBkby5jYWxsKCJyYmluZCIsIGxhcHBseShuZXN0ZWRfbGlzdF9yZXN1bHRzLCBmdW5jdGlvbih4KSB7DQogICAgICBkZiA8LSB4W1syXV0NCiAgICAgIGlmIChpcy5saXN0KGRmJGxhdCkpIGRmJGxhdCA8LSB1bmxpc3QoZGYkbGF0KQ0KICAgICAgaWYgKGlzLmxpc3QoZGYkbG9uKSkgZGYkbG9uIDwtIHVubGlzdChkZiRsb24pDQogICAgICBkZg0KICAgIH0pKQ0KICAgIA0KICAgICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgICBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3N1YmZvbGRlcg0KICAgIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljW1tmb2xkZXJdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJmb2xkZXINCiAgfQ0KfQ0KDQojIENvbWJpbmUgdGhlIGRhdGFmcmFtZXMgZnJvbSBhbGwgc3ViZm9sZGVycw0KY29tYmluZWRfZGFpbHlfdGVtcF9wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfcHJvYmxlbWF0aWMpDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wcm9ibGVtYXRpYyA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3Byb2JsZW1hdGljKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEdldCB0aGUgcGF0aCB0byB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KcGF0aF90b19mYWlsZWRfbG9jYXRpb25zIDwtICJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvcmVzdWx0cy9mYWlsZWRfbG9jYXRpb25zIg0KDQojIEluaXRpYWxpemUgZW1wdHkgbGlzdHMgdG8gc3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMNCmNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkIDwtIGxpc3QoKQ0KY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfZmFpbGVkIDwtIGxpc3QoKQ0KDQojIEdldCB0aGUgbGlzdCBvZiAucmRzIGZpbGVzIGluIHRoZSAiZmFpbGVkX2xvY2F0aW9ucyIgZm9sZGVyDQpyZHNfZmlsZXNfZmFpbGVkIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhdGhfdG9fZmFpbGVkX2xvY2F0aW9ucywgcGF0dGVybiA9ICIqLnJkcyIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KDQojIExvb3Agb3ZlciBlYWNoIC5yZHMgZmlsZQ0KZm9yIChmaWxlX2ZhaWxlZCBpbiByZHNfZmlsZXNfZmFpbGVkKSB7DQogICMgUmVhZCB0aGUgLnJkcyBmaWxlIGludG8gYSBsaXN0DQogIG5lc3RlZF9saXN0X3Jlc3VsdHNfZmFpbGVkIDwtIHJlYWRSRFMoZmlsZV9mYWlsZWQpDQogIA0KICAjIEV4dHJhY3QgdGhlIGZvdXIgZGF0YWZyYW1lcyBmcm9tIHRoZSBsaXN0DQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfZmFpbGVkX3N1YmZvbGRlciA8LSBuZXN0ZWRfbGlzdF9yZXN1bHRzX2ZhaWxlZFtbInJlc3VsdCJdXVtbMV1dDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZF9zdWJmb2xkZXIgPC0gbmVzdGVkX2xpc3RfcmVzdWx0c19mYWlsZWRbWyJyZXN1bHQiXV1bWzJdXQ0KDQogICMgU3RvcmUgdGhlIGNvbWJpbmVkIGRhdGFmcmFtZXMgaW4gdGhlIHJlc3BlY3RpdmUgbGlzdHMNCiAgY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRbW2ZpbGVfZmFpbGVkXV0gPC0gY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWRfc3ViZm9sZGVyDQogIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZFtbZmlsZV9mYWlsZWRdXSA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19mYWlsZWRfc3ViZm9sZGVyDQp9DQoNCiMgQ29tYmluZSB0aGUgZGF0YWZyYW1lcyBmcm9tIGFsbCBmaWxlcyBpbiB0aGUgImZhaWxlZF9sb2NhdGlvbnMiIGZvbGRlcg0KY29tYmluZWRfZGFpbHlfdGVtcF9mYWlsZWQgPC0gZG8uY2FsbCgicmJpbmQiLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCA8LSBkby5jYWxsKCJyYmluZCIsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBDb21iaW5lIGZpbGVzDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wLCBjb21iaW5lZF9kYWlseV90ZW1wX3Byb2JsZW1hdGljLCBjb21iaW5lZF9kYWlseV90ZW1wX2ZhaWxlZCkNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSByYmluZChjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcHJvYmxlbWF0aWMsIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2ZhaWxlZCkNCg0KIyBSZW1vdmUgdGhlIGZpcnN0IHllYXIgKGJ1cm4taW4pDQpjb21iaW5lZF9kYWlseV90ZW1wX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF9hbGwsIFlFQVIhPSIyMDA1IikNCmNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCA8LSBmaWx0ZXIoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBZRUFSIT0iMjAwNSIpDQoNCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIHRlbXBlcmF0dXJlIGFjcm9zcyBjb29yZGluYXRlcw0KY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCA8LSBjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbiA9IG1lYW4obWF4X3RlbXApLA0KICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgZmlmdGhfcGVyY2VudGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgICAgICAgICBmaXJzdF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjI1KSwNCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFydGlsZSA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjc1KSwNCiAgICAgICAgICAgICAgICAgICBuaW5ldHlmaWZ0aF9wZXJjZW50aWxlID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihtYXhfdGVtcCksDQogICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heF90ZW1wKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyBTYXZlIGZpbGVzDQpzYXZlUkRTKGNvbWJpbmVkX2RhaWx5X3RlbXBfYWxsLCBmaWxlPSAiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzRDL2RhaWx5X3RlbXBfYXJib3JlYWxfNEMucmRzIikNCnNhdmVSRFMoY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfNEMucmRzIikNCnNhdmVSRFMoY29tYmluZWRfb3ZlcmFsbF90ZW1wX2FsbCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzRDL292ZXJhbGxfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfNEMucmRzIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMjIENoZWNrIGZvciBtaXNzaW5nIGNvb3JkaW5hdGVzIGFnYWluDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gbXV0YXRlKGRpc3RpbmN0X2Nvb3JkLCBsb25fbGF0ID0gcGFzdGUobG9uLCBsYXQpKQ0KDQpjb21iaW5lZF9kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hbGwgPC0gbXV0YXRlKGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCwgbG9uX2xhdCA9IHBhc3RlKGxvbiwgbGF0KSkNCg0KIyBGdW5jdGlvbiBvcHBvc2l0ZSBvZiAlaW4lDQonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKSANCg0KbWlzc2luZ19jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICUhaW4lIGNvbWJpbmVkX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FsbCRsb25fbGF0LF0NCm1pc3NpbmdfY29vcmQNCm1pc3NpbmdfY29vcmRfcm93X251bWJlcnMgPC0gZGF0YS5mcmFtZShyb3dfbiA9IHdoaWNoKGRpc3RpbmN0X2Nvb3JkJGxvbl9sYXQgJSFpbiUgY29tYmluZWRfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYWxsJGxvbl9sYXQpKQ0KbWlzc2luZ19jb29yZF9yb3dfbnVtYmVycw0KDQojIyMgDQpjaGVja19kdXA8LSBncm91cF9ieShjb21iaW5lZF9kYWlseV90ZW1wX2FsbCwgbG9uLCBsYXQsIFlFQVIsIERPWSkgJT4lIHN1bW1hcmlzZShuPW4oKSkNCmxvY193aXRoX21vcmVfdGhhbl9vbmU8LSBmaWx0ZXIoY2hlY2tfZHVwLCBuPjEpDQpsb2Nfd2l0aF9tb3JlX3RoYW5fb25lPC0gbXV0YXRlKGxvY193aXRoX21vcmVfdGhhbl9vbmUsIGxvbl9sYXQgPSBwYXN0ZShsb24sIGxhdCkpDQpyb3dfbl9kdXA8LSBkYXRhLmZyYW1lKHJvd19uID0gd2hpY2goZGlzdGluY3RfY29vcmQkbG9uX2xhdCAlaW4lIGxvY193aXRoX21vcmVfdGhhbl9vbmUkbG9uX2xhdCkpDQpyb3dfbl9kdXANCmR1cF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZFtkaXN0aW5jdF9jb29yZCRsb25fbGF0ICVpbiUgbG9jX3dpdGhfbW9yZV90aGFuX29uZSRsb25fbGF0LF0NCmR1cF9jb29yZA0KDQojIFNhdmUgdGhlIGNvbWJpbmVkIGRhdGENCnNhdmVSRFMobWlzc2luZ19jb29yZCwgZmlsZT0gIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC80Qy9taXNzaW5nX2Nvb3JkaW5hdGVzXzRDLnJkcyIpDQpzYXZlUkRTKG1pc3NpbmdfY29vcmRfcm93X251bWJlcnMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC80Qy9taXNzaW5nX2Nvb3JkaW5hdGVzX3Jvd19uXzRDLnJkcyIpDQpzYXZlUkRTKHJvd19uX2R1cCwgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzRDL3Jvd19uX2R1cGxpY2F0ZWRfY29vcmRpbmF0ZXNfNEMucmRzIikNCnNhdmVSRFMoZHVwX2Nvb3JkLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvZHVwbGljYXRlZF9jb29yZGluYXRlc180Qy5yZHMiKQ0KYGBgDQoNCiMjDQoNCg0KIyAqKkRhdGEgaW1wdXRhdGlvbioqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpIZXJlLCB0aGUgZGF0YSB3YXMgaW1wdXRlZCBhc3N1bWluZyB0aGF0IGFuaW1hbHMgd2VyZSBhY2NsaW1hdGVkIHRvIGVpdGhlciB0aGUgbWVkaWFuLCA1JSBvciA5NSUgcGVyY2VudGlsZSBtZWFuIG1heGltdW0gdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQgYWNyb3NzIHRoZWlyIHJhbmdlIG9mIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd2FybWVzdCB0aHJlZS1tb250aHMgb2YgZWFjaCB5ZWFyLiANCg0KIyMgKipBZGQgZWNvbG9naWNhbGwtcmVsZXZhbnQgdGVtcGVyYXR1cmVzIHRvIHRoZSB0cmFpbmluZyBkYXRhKiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0RhdGFfd3JhbmdsaW5nL0FkZGluZ190ZW1wZXJhdHVyZXNfdG9fZGF0YV9mb3JfaW1wdXRhdGlvbi5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9EYXRhX3dyYW5nbGluZy9BZGRpbmdfdGVtcGVyYXR1cmVzX3RvX2RhdGFfZm9yX2ltcHV0YXRpb24ucGJzKiogDQoNCg0KYGBge3IsIGV2YWw9Rn0NCiMjIExvYWQgcHJlbGltaW5hcnkgZGF0YSBmb3IgaW1wdXRhdGlvbg0KZGF0YV9mb3JfaW1wIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMjIExvYWQgb2NjdXJlbmNlIGRhdGENCnNwZWNpZXNfb2NjdXJyZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQojIENvbWJpbmUgdGVtcGVyYXR1cmUgZGF0YSANCg0KIyMjIE1heGltdW0gdGVtcGVyYXR1cmUNCg0Kb3ZlcmFsbF90ZW1wPC1yZWFkUkRTKCJSZGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvb3ZlcmFsbF90ZW1wX3dhcm1lc3RfZGF5c19zdWJzdHJhdGUucmRzIikNCg0Kb3ZlcmFsbF90ZW1wJGxvbiA8LSBhcy5udW1lcmljKG92ZXJhbGxfdGVtcCRsb24pDQpvdmVyYWxsX3RlbXAkbGF0IDwtIGFzLm51bWVyaWMob3ZlcmFsbF90ZW1wJGxhdCkNCg0KIyBNZXJnZSBjb29yZGluYXRlcyB3aXRoIHRoZSBtZWFuIG1heGltdW0gdGVtcGVyYXR1cmUgb2YgdGhlIHdhcm1lc3QgZGF5cyBhY3Jvc3MgdGhlIHNwZWNpZXMgZGlzdHJpYnV0aW9uDQpzcGVjaWVzX29jY3VycmVuY2VfdGVtcCA8LSBtZXJnZShzcGVjaWVzX29jY3VycmVuY2UsIG92ZXJhbGxfdGVtcCwgYnkueCA9IGMoImxhdCIsICJsb24iKSwgYnkueSA9IGMoImxhdCIsICJsb24iKSkNCg0KIyBHcm91cCBieSBzcGVjaWVzIGFuZCBjYWxjdWxhdGUgbWVhbiBmb3IgZWFjaCB2YXJpYWJsZQ0Kc3BlY2llc190ZW1wX3ZhbHVlcyA8LSBzcGVjaWVzX29jY3VycmVuY2VfdGVtcCAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIG1lYW5fbWVhbiA9IG1lYW4obWVhbiksDQogICAgbWVhbl9tZWRpYW4gPSBtZWFuKG1lZGlhbiksDQogICAgbWVhbl9maWZ0aF9wZXJjZW50aWxlID0gbWVhbihmaWZ0aF9wZXJjZW50aWxlKSwNCiAgICBtZWFuX2ZpcnN0X3F1YXJ0aWxlID0gbWVhbihmaXJzdF9xdWFydGlsZSksDQogICAgbWVhbl90aGlyZF9xdWFydGlsZSA9IG1lYW4odGhpcmRfcXVhcnRpbGUpLA0KICAgIG1lYW5fbmluZXR5ZmlmdGhfcGVyY2VudGlsZSA9IG1lYW4obmluZXR5ZmlmdGhfcGVyY2VudGlsZSksDQogICAgbWVhbl9taW4gPSBtZWFuKG1pbiksDQogICAgbWVhbl9tYXggPSBtZWFuKG1heCksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCg0KIyBGaWx0ZXIgdGhlIHJlbGV2YW50IGNvbHVtbnMgKGhlcmUgYWRkaW5nIGRhdGEgZnJvbSB0aGUgNXRoIGFuZCA5NXRoIHBlcmNlbnRpbGVzKQ0Kc3BlY2llc190ZW1wX3ZhbHVlc19maWx0ZXJlZCA8LSBzcGVjaWVzX3RlbXBfdmFsdWVzICU+JSANCiAgZHBseXI6OnNlbGVjdCh0aXAubGFiZWwsIG1lYW5fbWVkaWFuLCBtZWFuX2ZpZnRoX3BlcmNlbnRpbGUsIG1lYW5fbmluZXR5ZmlmdGhfcGVyY2VudGlsZSkNCg0KIyBQaXZvdCB0aGUgZGF0YSBmcmFtZSBpbnRvIGxvbmcgZm9ybWF0DQpzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmcgPC0gc3BlY2llc190ZW1wX3ZhbHVlc19maWx0ZXJlZCAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhtZWFuX21lZGlhbiwgbWVhbl9maWZ0aF9wZXJjZW50aWxlLCBtZWFuX25pbmV0eWZpZnRoX3BlcmNlbnRpbGUpLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGVtcF9yYW5nZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiYWNjbGltYXRpb25fdGVtcCIpICU+JSANCiAgbXV0YXRlKHRpcC5sYWJlbCA9IGdzdWIoIlxcLiIsICJfIiwgdGlwLmxhYmVsKSwgIyByZXBsYWNlIGRvdHMgd2l0aCB1bmRlcnNjb3Jlcw0KICAgICAgICAgdGVtcF9yYW5nZSA9IGdzdWIoIl5tZWFuXyIsICIiLCB0ZW1wX3JhbmdlKSkgIyByZW1vdmUgIm1lYW5fIiBmcm9tIHRlbXBfcmFuZ2UNCg0KIyBSZW9yZGVyIHRoZSBjb2x1bW5zDQpzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmcgPC0gc3BlY2llc190ZW1wX3ZhbHVlc19sb25nICU+JSANCiAgZHBseXI6OnNlbGVjdCh0aXAubGFiZWwsIHRlbXBfcmFuZ2UsIGFjY2xpbWF0aW9uX3RlbXApDQoNCiMgUmVuYW1lIHRoZSAibWVhbl9tZWRpYW4iIGNvbHVtbiB0byAibWVkaWFuIiwgZXRjLg0KbmFtZXMoc3BlY2llc190ZW1wX3ZhbHVlc19sb25nKVsyOjNdIDwtIGMoInRlbXBfcmFuZ2UiLCAiYWNjbGltYXRpb25fdGVtcCIpDQpzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmckdGlwLmxhYmVsIDwtICBnc3ViKCJfIiwgIiAiLCBzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmckdGlwLmxhYmVsKQ0KDQojIEpvaW4gd2l0aCBkYXRhIGZvciBpbXB1dGF0aW9uDQoNCnNwZWNpZXNfdGVtcF92YWx1ZXNfbG9uZyR0aXAubGFiZWxbc3BlY2llc190ZW1wX3ZhbHVlc19sb25nJHRpcC5sYWJlbD09IlNjaW5heCB4IHNpZ25hdHVzIl0gPC0gIlNjaW5heCB4LXNpZ25hdHVzIiAjIFJlbmFtZQ0Kc3BlY2llc190ZW1wX3ZhbHVlc19sb25nJHRpcC5sYWJlbFtzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmckdGlwLmxhYmVsPT0iUHJpc3RpbWFudGlzIHcgbmlncnVtIl0gPC0gIlByaXN0aW1hbnRpcyB3LW5pZ3J1bSIgIyBSZW5hbWUNCg0KIyBTcGxpdCBkYXRhX2Zvcl9pbXAgaW50byB0d28gZGF0YSBmcmFtZXMNCmRhdGFfZm9yX2ltcF9ub25OQSA8LSBkYXRhX2Zvcl9pbXAgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFjY2xpbWF0aW9uX3RlbXApKQ0KDQpkYXRhX2Zvcl9pbXBfTkEgPC0gZGF0YV9mb3JfaW1wICU+JSANCiAgZmlsdGVyKGlzLm5hKGFjY2xpbWF0aW9uX3RlbXApKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWFjY2xpbWF0aW9uX3RlbXApICAjIFJlbW92ZSB0aGUgTkEgYWNjbGltYXRpb25fdGVtcCBjb2x1bW4NCg0KDQojIFBlcmZvcm0gYSBmdWxsIGpvaW4gb24gZGF0YV9mb3JfaW1wX05BIGFuZCBzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmcNCmRhdGFfZm9yX2ltcF9OQSA8LSBmdWxsX2pvaW4oZGF0YV9mb3JfaW1wX05BLCBzcGVjaWVzX3RlbXBfdmFsdWVzX2xvbmcsIGJ5ID0gInRpcC5sYWJlbCIpDQoNCiMgQ29tYmluZSB0aGUgdHdvIGRhdGEgZnJhbWVzDQpkYXRhX2Zvcl9pbXBfd2l0aF90ZW1wIDwtIGJpbmRfcm93cyhkYXRhX2Zvcl9pbXBfbm9uTkEsIGRhdGFfZm9yX2ltcF9OQSkNCg0KDQpzYXZlUkRTKGRhdGFfZm9yX2ltcF93aXRoX3RlbXAsIGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9kYXRhX2Zvcl9pbXB1dGF0aW9uX3dpdGhfdGVtcC5yZHMiKQ0KDQpgYGANCg0KDQojIyAqKkZ1bmN0aW9uIHRvIHBlcmZvbSB0aGUgaW1wdXRhdGlvbioqIA0KDQpUaGUgLlIgZmlsZSBmb3IgdGhpcyBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvSW1wdXRhdGlvbi9GdW5jdGlvbnNfQkFDRS5SKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAgc3VwcG9ydGluZyBmdW5jdGlvbnMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyB0aGVzZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0aGlhc3NwZWlkZWwvaG1pDQoNCiMnIFN0YW5kYXJkaXppbmcgZnVuY3Rpb24NCiMnDQojJyBGdW5jdGlvbiB0byBzdGFuZGFyZGl6ZSB2YXJpYWJsZXMgdGhhdCBhcmUgbnVtZXJpYyAoY29udGludW91cyBhbmQgY291bnQgdmFyaWFibGVzKSBidXQgbm8gcm91bmRlZCBjb250aW51b3VzLCBzZW1pY29udGludW91cywgaW50ZXJjZXB0cyBvciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuDQojJyBAcGFyYW0gWCBBIG4gdGltZXMgcCBkYXRhLmZyYW1lIHdpdGggcCBmaXhlZCAob3IgcmFuZG9tKSBlZmZlY3RzIHZhcmlhYmxlcy4NCiMnIEByZXR1cm4gQSBuIHRpbWVzIHAgZGF0YS5mcmFtZSB3aXRoIHRoZSBzdGFuZGFyZGl6ZWQgdmVyc2lvbnMgb2YgdGhlIG51bWVyaWMgdmFyaWFibGVzLg0KIycgQGV4cG9ydA0Kc3RhbmQgPC0gZnVuY3Rpb24oWCl7DQogICMgaWYoIWlzLmRhdGEuZnJhbWUoWCkpIHN0b3AoIlggaGFzIHRvIGJlIGEgZGF0YS5mcmFtZS4iKQ0KICAjIGlmKG5jb2woWCkgPT0gMCkgcmV0dXJuKFgpDQogICMgdHlwZXMgPC0gYXJyYXkoTkEsIGRpbSA9IG5jb2woWCkpDQogICMgZm9yKGkgaW4gMTpsZW5ndGgodHlwZXMpKXsNCiAgIyAgIHR5cGVzW2ldIDwtIGdldF90eXBlKFhbLCBpXSkNCiAgIyB9DQogICMgbmVlZF9zdGFuZF9YIDwtIHR5cGVzICVpbiUgYygiY29udCIsICJjb3VudCIsICJyb3VuZGVkY29udCIsICJzZW1pY29udCIpDQogIFhfc3RhbmQgPC0gWA0KICB0bXAgPC0gc2NhbGUoWCkNCiAgWF9zdGFuZCA8LSBtYXRyaXgodG1wLCBuY29sID0gbmNvbCh0bXApKSAjIHRoaXMgYXZvaWRzIGhhdmluZyBhdHRyaWJ1dGVzIGRlbGl2ZXJlZCBieSBzY2FsZSgpLg0KICByZXR1cm4oWF9zdGFuZCkNCn0NCg0KIycgU2FtcGxlIGltcHV0YXRpb24uDQojJw0KIycgRnVuY3Rpb24gdG8gc2FtcGxlIHZhbHVlcyBpbiBhIHZhcmlhYmxlIGZyb20gb3RoZXIgKG9ic2VydmVkKSB2YWx1ZXMgaW4gdGhpcyB2YXJpYWJsZS4NCiMnIFNvIHRoaXMgaW1wdXRhdGlvbiBkb2VzIG5vdCB1c2UgZnVydGhlciBjb3ZhcmlhdGVzLg0KIycgQHBhcmFtIHZhcmlhYmxlIEEgdmVjdG9yIG9mIHNpemUgXGNvZGV7bn0gd2l0aCBtaXNzaW5nIHZhbHVlcy4NCiMnIEByZXR1cm4gQSBsaXN0IHdpdGggYSBuIHRpbWVzIDEgZGF0YS5mcmFtZSB3aXRob3V0IG1pc3NpbmcgdmFsdWVzIGFuZA0KIycgIGEgbGlzdCB3aXRoIHRoZSBjaGFpbnMgb2YgdGhlIEdpYmJzLXNhbXBsZXMgZm9yIHRoZSBmaXhlZCBlZmZlY3RzIGFuZCB2YXJpYW5jZSBwYXJhbWV0ZXJzLg0KIycgQGV4YW1wbGVzDQojJyBzZXQuc2VlZCgxMjMpDQojJyBzYW1wbGVfaW1wKGMoMSwgTkEsIDMsIE5BLCA1KSkNCiMnIEBleHBvcnQNCnNhbXBsZV9pbXAgPC0gZnVuY3Rpb24odmFyaWFibGUpew0KICANCiAgaWYoaXMuZGF0YS5mcmFtZSh2YXJpYWJsZSkpew0KICAgIHN0b3AoIllvdSBwYXNzZWQgYSBkYXRhLmZyYW1lIGluc3RlYWQgb2YgYSB2ZWN0b3IgdG8gc2FtcGxlX2ltcC4iKQ0KICB9DQogIGlmKGFsbChpcy5uYSh2YXJpYWJsZSkpKSBzdG9wKCJWYXJpYWJsZSBjb25zaXN0cyBvbmx5IG9mIE5Bcy4iKQ0KICANCiAgcmV0IDwtIGRhdGEuZnJhbWUodGFyZ2V0ID0gdmFyaWFibGUpDQogIA0KICANCiAgDQogIG5lZWRfcmVwbGFjZW1lbnQgPC0gaXMubmEodmFyaWFibGUpIHwgaXMuaW5maW5pdGUodmFyaWFibGUpDQogIHJldFtuZWVkX3JlcGxhY2VtZW50LCAxXSA8LSBzYW1wbGUoc2l6ZSA9IHN1bShuZWVkX3JlcGxhY2VtZW50KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVshbmVlZF9yZXBsYWNlbWVudF0sIHJlcGxhY2UgPSBUUlVFKQ0KICByZXR1cm4ocmV0KQ0KfQ0KDQoNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBpbXB1dGF0aW9uIGZ1bmN0aW9uDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBpbnRlciA9IG11aXRwbGllciBmb3IgaXRlcmF0aW9uIA0KYl9taWNlIDwtIGZ1bmN0aW9uKGN5Y2xlID0gMSwgDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCwgDQogICAgICAgICAgICAgICAgICAgQWludiA9IEFpbnYsDQogICAgICAgICAgICAgICAgICAgaXRlcjEgPSAxMCwgDQogICAgICAgICAgICAgICAgICAgaXRlcjIgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgaXRlcjMgPSA2MCl7DQogIA0KICANCg0KDQogIA0KICAjIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGVybWFsIHRvbGVyYW5jZSBlc3RpbWF0ZXMgKHNkX1VUTCkNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgZm9ybXVsYQ0KICBmb3Jtc19zZF9VVEwgPC0gYXMuZm9ybXVsYShwYXN0ZSgibG5fc2RfVVRMIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZCArIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2NsaW1hdGlvbl90ZW1wIiwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kcG9pbnQyIiwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjbGltYXRlZCIsICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kIiwgIGN5Y2xlKSwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIm1lZGl1bV90ZXN0X3RlbXAyX2ZpbGwiLCBjeWNsZSksICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJyYW1waW5nX3N0YW5kIiwgY3ljbGUpLCAiKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibWVhbl9VVExfc3RhbmQiLCBjeWNsZSkpKQ0KICANCiAgcHJpb3Jfc2RfVVRMPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgICAgICAgIEcgPSBsaXN0KCBHMSA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSkpDQogICMgbW9kZWwNCiAgbW9kX3NkX1VUTCA8LSBNQ01DZ2xtbShmb3Jtc19zZF9VVEwsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHBsID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBwciA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgbml0dD0xMzAwMCppdGVyMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGhpbj0xMCppdGVyMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYnVybmluPTMwMDAqaXRlcjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3Jfc2RfVVRMLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KICAjIHByb2Nlc3NpbmcNCiAgcHJlX3NkX1VUTCA8LSBhcy52ZWN0b3IocHJlZGljdChtb2Rfc2RfVVRMLCBtYXJnaW5hbCA9IE5VTEwpKSAjIHByZWRpY3Rpb24NCiAgIyBjcmVhdGluZyBhIG5ldyB2YXJpYWJsZQ0KICBkYXRhW1twYXN0ZTAoImxuX3NkX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSldXSA8LSANCiAgICBkYXRhJGxuX3NkX1VUTA0KICAjIGZpbGxpbmcgaW4gd2l0aCBwcmVkaWN0ZWQgdmFsdWVzDQogIGRhdGFbW3Bhc3RlMCgibG5fc2RfVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dW3NkX1VUTF9tcG9zXSA8LSANCiAgICBwcmVfc2RfVVRMW3NkX1VUTF9tcG9zXQ0KICBkYXRhW1twYXN0ZTAoImxuX3NkX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSldXSA8LQ0KICAgIHN0YW5kKGRhdGFbW3Bhc3RlMCgibG5fc2RfVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dKVssMV0NCiAgDQogICMgQWRkaW5nIHZhcmlhbmNlIGNvbHVtbiANCiAgZGF0YVtbcGFzdGUwKCJ2YXJfVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtIA0KICAgIChkYXRhW1twYXN0ZTAoImxuX3NkX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSldXSleMg0KICANCiAgDQogIA0KICAjZGF0YQ0KICBwcmludCgiMSBvdXQgb2YgNSBtb2RlbHMgZG9uZSIpDQogIA0KICANCiAgDQogIA0KICAjIEFjY2xpbWF0aW9uIHRpbWUNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgZm9ybXVsYQ0KICBmb3Jtc19hY2NsaW1hdGlvbl90aW1lIDwtIGFzLmZvcm11bGEocGFzdGUoImxuX2FjY2xpbWF0aW9uX3RpbWUgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZCArIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoImxuX3NkX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSksICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibWVhbl9VVExfc3RhbmQiLCBjeWNsZSkpKQ0KICANCiAgcHJpb3JfYWNjbGltYXRpb25fdGltZTwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRyA9IGxpc3QoIEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCkpKQ0KICAjIG1vZGVsDQogIG1vZF9hY2NsaW1hdGlvbl90aW1lIDwtIE1DTUNnbG1tKGZvcm1zX2FjY2xpbWF0aW9uX3RpbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwciA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdHQ9MTMwMDAqaXRlcjEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluPTEwKml0ZXIxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVybmluPTMwMDAqaXRlcjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfYWNjbGltYXRpb25fdGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpDQogICMgcHJvY2Vzc2luZw0KICBwcmVfYWNjbGltYXRpb25fdGltZSA8LSBhcy52ZWN0b3IocHJlZGljdChtb2RfYWNjbGltYXRpb25fdGltZSwgbWFyZ2luYWwgPSBOVUxMKSkgIyBwcmVkaWN0aW9uDQogICMgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUNCiAgZGF0YVtbcGFzdGUwKCJsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtIA0KICAgIGRhdGEkbG5fYWNjbGltYXRpb25fdGltZQ0KICAjIGZpbGxpbmcgaW4gd2l0aCBwcmVkaWN0ZWQgdmFsdWVzDQogIGRhdGFbW3Bhc3RlMCgibG5fYWNjbGltYXRpb25fdGltZV9zdGFuZCIsIGN5Y2xlICsgMSldXVthY2NsaW1hdGlvbl90aW1lX21wb3NdIDwtIA0KICAgIHByZV9hY2NsaW1hdGlvbl90aW1lW2FjY2xpbWF0aW9uX3RpbWVfbXBvc10NCiAgZGF0YVtbcGFzdGUwKCJsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtDQogICAgc3RhbmQoZGF0YVtbcGFzdGUwKCJsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kIiwgY3ljbGUgKyAxKV1dKVssMV0NCiAgDQogICNkYXRhDQogIHByaW50KCIyIG91dCBvZiA1IG1vZGVscyBkb25lIikNCiAgDQogIA0KICAjIFJhbXBpbmcgcmF0ZQ0KICAjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIGZvcm11bGENCiAgZm9ybXNfcmFtcGluZyA8LSBhcy5mb3JtdWxhKHBhc3RlKCJyYW1waW5nIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZCArIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibG5fc2RfVVRMX3N0YW5kIiwgY3ljbGUgKyAxKSwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJtZWFuX1VUTF9zdGFuZCIsIGN5Y2xlKSkpDQogIA0KICAjIHByaW9yDQogIHByaW9yX3JhbXBpbmcgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgRyA9IGxpc3QoIEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSkpDQogICMgbW9kZWwNCiAgbW9kX3JhbXBpbmcgPC0gTUNNQ2dsbW0oZm9ybXNfcmFtcGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwbCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHByID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbml0dD0xMzAwMCppdGVyMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW49MTAqaXRlcjEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW49MzAwMCppdGVyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvcl9yYW1waW5nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCiAgIyBwcm9jZXNzaW5nDQogIHByZV9yYW1waW5nIDwtIGFzLnZlY3RvcihwcmVkaWN0KG1vZF9yYW1waW5nLCBtYXJnaW5hbCA9IE5VTEwpKSAjIHByZWRpY3Rpb24NCiAgIyBjcmVhdGluZyBhIG5ldyB2YXJpYWJsZQ0KICBkYXRhW1twYXN0ZTAoInJhbXBpbmdfc3RhbmQiLCBjeWNsZSArIDEpXV0gPC0gDQogICAgZGF0YSRyYW1waW5nDQogICMgZmlsbGluZyBpbiB3aXRoIHByZWRpY3RlZCB2YWx1ZXMNCiAgZGF0YVtbcGFzdGUwKCJyYW1waW5nX3N0YW5kIiwgY3ljbGUgKyAxKV1dW3JhbXBpbmdfbXBvc10gPC0gDQogICAgcHJlX3JhbXBpbmdbcmFtcGluZ19tcG9zXQ0KICBkYXRhW1twYXN0ZTAoInJhbXBpbmdfc3RhbmQiLCBjeWNsZSArIDEpXV0gPC0NCiAgICBzdGFuZChkYXRhW1twYXN0ZTAoInJhbXBpbmdfc3RhbmQiLCBjeWNsZSArIDEpXV0pWywxXQ0KICANCiAgI2RhdGENCiAgcHJpbnQoIjMgb3V0IG9mIDUgbW9kZWxzIGRvbmUiKQ0KICANCiAgIyBNZWRpdW0gZm9yIG1lYXN1cmluZyBDVG1heCAoYW1iaWVudCwgd2F0ZXIvYm9keSkNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBmb3JtdWxhDQogIGZvcm1zX21lZGl1bSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJtZWRpdW1fdGVzdF90ZW1wMiB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZCArIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibG5fc2RfVVRMX3N0YW5kIiwgY3ljbGUgKyAxKSwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIm1lYW5fVVRMX3N0YW5kIiwgY3ljbGUpKSkNCiAgDQogIGZvcm1zX21lZGl1bV9wcmlvciAgPC0gYXMuZm9ybXVsYShwYXN0ZSgiIH4gbGlmZV9zdGFnZV90ZXN0ZWQgKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoImxuX3NkX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSksICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibWVhbl9VVExfc3RhbmQiLCBjeWNsZSkpKQ0KICANCiAgDQogICMgcHJpb3INCiAgcHJpb3JfbWVkaXVtIDwtbGlzdChCID0gbGlzdChtdSA9IHJlcCgwLDQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWPWdlbG1hbi5wcmlvcihmb3Jtc19tZWRpdW1fcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXNxcnQoMSsxKSkpLA0KICAgICAgICAgICAgICAgICAgICAgIFIgPSBsaXN0KFY9MSwgZml4ID0xKSwgDQogICAgICAgICAgICAgICAgICAgICAgRyA9IGxpc3QoRzEgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApKSkNCiAgIyBtb2RlbA0KICBtb2RfbWVkaXVtIDwtIE1DTUNnbG1tKGZvcm1zX21lZGl1bSwNCiAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBwbCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgcHIgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJ0aHJlc2hvbGQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuaXR0PTEzMDAwKml0ZXIzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGluPTEwKml0ZXIzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW49MzAwMCppdGVyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfbWVkaXVtLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpDQogICMgcHJvY2Vzc2luZw0KICBwcmVfbWVkaXVtIDwtIGFzLnZlY3RvcihwcmVkaWN0KG1vZF9tZWRpdW0sIG1hcmdpbmFsID0gTlVMTCkpICMgcHJlZGljdGlvbg0KICBwcmVfbWVkaXVtX2I8LSBsZXZlbHMoZGF0YSRtZWRpdW1fdGVzdF90ZW1wMilbcm91bmQocHJlX21lZGl1bSwwKSsxXQ0KICAjIGNyZWF0aW5nIGEgbmV3IHZhcmlhYmxlDQogIGRhdGFbW3Bhc3RlMCgibWVkaXVtX3Rlc3RfdGVtcDJfZmlsbCIsIGN5Y2xlICsgMSldXSA8LSANCiAgICBkYXRhJG1lZGl1bV90ZXN0X3RlbXAyDQogICMgZmlsbGluZyBpbiB3aXRoIHByZWRpY3RlZCB2YWx1ZXMNCiAgZGF0YVtbcGFzdGUwKCJtZWRpdW1fdGVzdF90ZW1wMl9maWxsIiwgY3ljbGUgKyAxKV1dW21lZGl1bV90ZXN0X3RlbXAyX21wb3NdIDwtIA0KICAgIHByZV9tZWRpdW1fYlttZWRpdW1fdGVzdF90ZW1wMl9tcG9zXQ0KICANCiAgI2RhdGEgDQogIHByaW50KCI0IG91dCBvZiA1IG1vZGVscyBkb25lIikNCiAgDQogICMgVGhlcm1hbCB0b2xlcmFuY2UgKG1lYW5fVVRMKQ0KICAjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIGZvcm11bGENCiAgZm9ybXNfbWVhbl9VVEwgPC0gYXMuZm9ybXVsYShwYXN0ZSgibWVhbl9VVEwgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjbGltYXRpb25fdGVtcF9zdGFuZCArIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibG5fYWNjbGltYXRpb25fdGltZV9zdGFuZCIsICBjeWNsZSArIDEpLCAiKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgicmFtcGluZ19zdGFuZCIsICBjeWNsZSArIDEpLCAiKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgibWVkaXVtX3Rlc3RfdGVtcDJfZmlsbCIsIGN5Y2xlICsgMSksICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZHBvaW50MiIsICIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2xpbWF0ZWQiICwgIisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlmZV9zdGFnZV90ZXN0ZWQiLCAiKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlY290eXBlIikpDQogIA0KICAjIHByaW9yDQogIHByaW9yX21lYW5fVVRMIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBHID0gbGlzdCggRzEgPSBsaXN0KFYgPSBkaWFnKDIpLzIsIG51ID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IHJlcCgwLDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSBkaWFnKDIpKjEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IGRpYWcoMikvMiwgbnUgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gcmVwKDAsMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IGRpYWcoMikqMTAwMCkpDQogICkNCiAgDQogIA0KICBtZXYgPC0gbm9xdW90ZShwYXN0ZTAoInZhcl9VVExfc3RhbmQiLCBjeWNsZSArIDEpKSAjIFZhcmlhbmNlIGZvciBtZXYgYXJndW1lbnQNCiAgDQogIA0KICAjIG1vZGVsDQogIG1vZF9tZWFuX1VUTCA8LSBNQ01DZ2xtbShmb3Jtc19tZWFuX1VUTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXMoMSthY2NsaW1hdGlvbl90ZW1wX3N0YW5kKTp0aXAubGFiZWwgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXMoMSthY2NsaW1hdGlvbl90ZW1wX3N0YW5kKTpzcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdHQ9MTMwMDAqaXRlcjMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbj0xMCppdGVyMywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW49MzAwMCppdGVyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yX21lYW5fVVRMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldj1kYXRhJG1ldiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KICANCiAgcHJpbnQoIjUgb3V0IG9mIDUgbW9kZWxzIGRvbmUiKQ0KICANCiAgIyBwcm9jZXNzaW5nDQogIHByZWRpY3Rpb25zIDwtIHByZWRpY3QobW9kX21lYW5fVVRMLCBtYXJnaW5hbCA9IE5VTEwsIGludGVydmFsID0gImNvbmZpZGVuY2UiKSAjIHByZWRpY3Rpb24NCiAgcHJlX21lYW5fVVRMIDwtIHByZWRpY3Rpb25zWyAsIDFdDQogIGRhdGFbWyJsb3dlcl9tZWFuX1VUTCJdXSA8LSBwcmVkaWN0aW9uc1sgLCAyXQ0KICBkYXRhW1sidXBwZXJfbWVhbl9VVEwiXV0gPC0gcHJlZGljdGlvbnNbICwgM10NCiAgIyBjcmVhdGluZyBhIG5ldyB2YXJpYWJsZQ0KICBkYXRhW1twYXN0ZTAoIm1lYW5fVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtIA0KICAgIGRhdGEkbWVhbl9VVEwNCiAgIyBmaWxsaW5nIGluIHdpdGggcHJlZGljdGVkIHZhbHVlcw0KICBkYXRhW1twYXN0ZTAoIm1lYW5fVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dW21lYW5fVVRMX21wb3NdIDwtIA0KICAgIHByZV9tZWFuX1VUTFttZWFuX1VUTF9tcG9zXQ0KICBkYXRhW1twYXN0ZTAoIm1lYW5fVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtDQogICAgZGF0YVtbcGFzdGUwKCJtZWFuX1VUTF9zdGFuZCIsIGN5Y2xlICsgMSldXQ0KICBkYXRhW1twYXN0ZTAoImZpbGxlZF9tZWFuX1VUTCIsIGN5Y2xlKV1dIDwtIA0KICAgIGRhdGFbW3Bhc3RlMCgibWVhbl9VVExfc3RhbmQiLCBjeWNsZSArIDEpXV0gIyByb3cgZXN0aW1hdGlvbg0KICBkYXRhW1twYXN0ZTAoIm1lYW5fVVRMX3N0YW5kIiwgY3ljbGUgKyAxKV1dIDwtIA0KICAgIHN0YW5kKGRhdGFbW3Bhc3RlMCgibWVhbl9VVExfc3RhbmQiLCBjeWNsZSArIDEpXV0pWywxXQ0KICANCiAgZGF0YQ0KfSAgDQoNCmBgYA0KDQoNCiMjICoqRGF0YSBwcm9jZXNzaW5nKiogDQoNClRoaXMgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0ltcHV0YXRpb24vUnVubmluZ19pbXB1dGF0aW9uLlIqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBmdW5jdGlvbnMgZm9yIHRoZSBCYXllc2lhbiBBdWdtZW50YXRpb24gd2l0aCBDaGFpbiBFcXVhdGlvbnMgKEJBQ0UpDQpzb3VyY2UoIlIvRnVuY3Rpb25zX0JBQ0UuUiIpDQoNCiMgTG9hZCBkYXRhIGFuZCB0cmVlDQp0cmVlPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KIyBMb2FkIGRhdGENCmRhdGFfZm9yX2ltcDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kYXRhX2Zvcl9pbXB1dGF0aW9uX3dpdGhfdGVtcC5yZHMiKQ0KDQoNCiMgVHJhbnNmb3JtIHZhcmlhYmxlcw0KDQpkYXRhX2Zvcl9pbXAgPC0gZGF0YV9mb3JfaW1wICU+JSANCiAgbXV0YXRlKA0KICAgIGFjY2xpbWF0ZWQgPSBmYWN0b3IoYWNjbGltYXRlZCksDQogICAgbGlmZV9zdGFnZV90ZXN0ZWQgPSBmYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQpLA0KICAgIGxuX2FjY2xpbWF0aW9uX3RpbWUgPSBsb2coYWNjbGltYXRpb25fdGltZSksDQogICAgbG5fc2RfVVRMID0gbG9nKHNkX1VUTCksDQogICAgbG5fYm9keV9tYXNzID0gbG9nKGJvZHlfbWFzcyksDQogICAgbWVkaXVtX3Rlc3RfdGVtcDIgPSBmYWN0b3IobWVkaXVtX3Rlc3RfdGVtcCksDQogICAgbGlmZV9zdGFnZV90ZXN0ZWQ9ZmFjdG9yKGxpZmVfc3RhZ2VfdGVzdGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiYWR1bHQiLCAiYWR1bHRzIiwgImxhcnZhZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiYWR1bHRzIiwgImFkdWx0cyIsICJsYXJ2YWUiKSksICMgQ29ycmVjdCB0eXBvDQogICAgZW5kcG9pbnQyID0gZmFjdG9yKGVuZHBvaW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIkxSUiIsICJPUyIsICJMT0UiLCAicHJvZGRpbmciLCAib3RoZXIiLCAiZGVhdGgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkxSUiIsICJPUyIsICJMUlIiLCAib3RoZXIiLCAib3RoZXIiLCAib3RoZXIiKSkgIyBUYWtlIExPRSBhcyBMUlIgDQogICkNCg0KZGF0YV9mb3JfaW1wPC0gZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIC1mYW1pbHkpICMgUmVtb3ZlIGZhbWlseSB0byBydW4gTUNNQ2dsbW0NCg0KIyBNYWtlIHN1cmUgZXZlcnl0aGluZyBtYXRjaGVzDQoNCm1hdGNocG9zIDwtIG1hdGNoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKQ0KDQpkYXRhX2Zvcl9pbXAkbWF0Y2hwb3MgPC0gbWF0Y2hwb3MNCg0KZGF0IDwtIGRhdGFfZm9yX2ltcCAlPiUgZmlsdGVyKGlzLm5hKG1hdGNocG9zKSA9PSBGKSANCg0KdHJlZV9pbXB1dGF0aW9uIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChkYXQkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAjIFBydW5lZCB0cmVlIHRoYXQgb25seSBjb250YWlucyBzcGVjaWVzIGluIHRoZSBkYXRhIA0KDQp0cmVlX2ltcHV0YXRpb248LWZvcmNlLnVsdHJhbWV0cmljKHRyZWVfaW1wdXRhdGlvbiwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCiMgUGh5bG9nZW5ldGljIGNvLXZhcmlhbmNlIG1hdHJpeA0KQWludjwtaW52ZXJzZUEodHJlZV9pbXB1dGF0aW9uKSRBaW52DQoNCiMgU3RhbmRhcmRpemUgdmFyaWFibGVzDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIGFjY2xpbWF0aW9uX3RlbXANCmRhdCRhY2NsaW1hdGlvbl90ZW1wX3N0YW5kPC0gc3RhbmQoZGF0JGFjY2xpbWF0aW9uX3RlbXApWywxXQ0KDQojIG1lYW5fVVRMDQptZWFuX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRtZWFuX1VUTCkgDQpkYXQkbWVhbl9VVExfc3RhbmQxIDwtIHN0YW5kKGRhdCRtZWFuX1VUTClbLDFdDQpkYXQkbWVhbl9VVExfc3RhbmQxW21lYW5fVVRMX21wb3NdIDwtIDANCg0KDQojIGFjY2xpbWF0aW9uX3RpbWUNCmFjY2xpbWF0aW9uX3RpbWVfbXBvcyA8LSBpcy5uYShkYXQkbG5fYWNjbGltYXRpb25fdGltZSkNCmRhdCRsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fYWNjbGltYXRpb25fdGltZSlbLDFdDQpkYXQkbG5fYWNjbGltYXRpb25fdGltZV9zdGFuZDFbYWNjbGltYXRpb25fdGltZV9tcG9zXSA8LSAwDQoNCiMgcmFtcGluZw0KcmFtcGluZ19tcG9zIDwtIGlzLm5hKGRhdCRyYW1waW5nKSANCmRhdCRyYW1waW5nX3N0YW5kMSA8LSBzdGFuZChkYXQkcmFtcGluZylbLDFdDQpkYXQkcmFtcGluZ19zdGFuZDFbcmFtcGluZ19tcG9zXSA8LSAwDQoNCiMgbWVkaXVtX3Rlc3RfdGVtcDIgDQptZWRpdW1fdGVzdF90ZW1wMl9tcG9zIDwtIGlzLm5hKGRhdCRtZWRpdW1fdGVzdF90ZW1wMikNCmRhdCRtZWRpdW1fdGVzdF90ZW1wMl9maWxsMSA8LSBzYW1wbGVfaW1wKGRhdCRtZWRpdW1fdGVzdF90ZW1wMilbWzFdXQ0KDQojIHNkX1VUTCANCnNkX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRsbl9zZF9VVEwpDQpkYXQkbG5fc2RfVVRMX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fc2RfVVRMKVssMV0NCmRhdCRsbl9zZF9VVExfc3RhbmQxW3NkX1VUTF9tcG9zXSA8LSAwDQoNCiMgYm9keV9tYXNzDQpib2R5X21hc3NfbXBvcyA8LSBpcy5uYShkYXQkbG5fYm9keV9tYXNzKQ0KZGF0JGxuX2JvZHlfbWFzc19zdGFuZDEgPC0gc3RhbmQoZGF0JGxuX2JvZHlfbWFzcylbLDFdDQpkYXQkbG5fYm9keV9tYXNzX3N0YW5kMVtib2R5X21hc3NfbXBvc10gPC0gMA0KYGBgDQoNCiMjICoqUnVuIGltcHV0YXRpb24qKg0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9JbXB1dGF0aW9uL1J1bm5pbmdfaW1wdXRhdGlvbi5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9JbXB1dGF0aW9uL1J1bm5pbmdfaW1wdXRhdGlvbi5wYnMqKiANCg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDeWNsZSAxDQpzeXN0ZW0udGltZShkYXQxIDwtIGJfbWljZShjeWNsZSA9IDEsIGRhdGEgPSBkYXQsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQxLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy9pbXB1dGF0aW9uXzFzdF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIyMNCg0KIyBDeWNsZSAyDQpzeXN0ZW0udGltZShkYXQyIDwtIGJfbWljZShjeWNsZSA9IDIsIGRhdGEgPSBkYXQxLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0MiwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvaW1wdXRhdGlvbl8ybmRfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMNCg0KIyBDeWNsZSAzDQpzeXN0ZW0udGltZShkYXQzIDwtIGJfbWljZShjeWNsZSA9IDMsIGRhdGEgPSBkYXQyLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0MywgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvaW1wdXRhdGlvbl8zcmRfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMjDQoNCiMgQ3ljbGUgNA0Kc3lzdGVtLnRpbWUoZGF0NCA8LSBiX21pY2UoY3ljbGUgPSA0LCBkYXRhID0gZGF0MywgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDQsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNHRoX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgQ3ljbGUgNQ0Kc3lzdGVtLnRpbWUoZGF0NSA8LSBiX21pY2UoY3ljbGUgPSA1LCBkYXRhID0gZGF0NCwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDUsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpDQpgYGANCg0KIyMgKipSdW4gaW1wdXRhdGlvbiBjcm9zcy12YWxpZGF0aW9uKiogDQoNCiMjIyAqKlByZXBhcmUgZGF0YXNldHMgZm9yIHRoZSBjcm9zcy12YWxpZGF0aW9uKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCkhlcmUsIHdlIGNyZWF0ZWQgZml2ZSBkYXRhc2V0cyBpbiB3aGljaCB3ZSByZW1vdmVkIGhlYXQgdG9sZXJhbmNlIGVzdGltYXRlcyBmb3IgNSUgb2YgdGhlIHNwZWNpZXMgaW4gdGhlIGV4cGVyaW1lbnRhbCBkYXRhc2V0ICgxNiBzcGVjaWVzKSwgYW5kIDUlIG9mIHRoZSBkYXRhLWRlZmljaWVudCBzcGVjaWVzICgyMzQgc3BlY2llcyk7IG1haW50YWluaW5nIHRoZSBzYW1lIHByb3BvcnRpb24gb2YgbWlzc2luZyBkYXRhLg0KDQpXZSBzcGVjaWZpY2FsbHkgcmVtb3ZlZCBvcmlnaW5hbCBkYXRhIHRoYXQgZml0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGRhdGEgdG8gYmUgaW1wdXRlZCwgaS5lLiwgcmFtcGluZz0xLCAjIG1vc3QgY29tbW9uIGhlYXRpbmcgcmF0ZQ0KICAgICAgYWNjbGltYXRlZD0iYWNjbGltYXRlZCIsICMgYWNjbGltYXRlZCBhbmltYWxzDQogICAgICBlbmRwb2ludD0iT1MiLCAjIE1vc3QgY29tbW9uIGVuZHBvaW50OyBtb3N0IHByZWNpc2Ugb25lIHRvbw0KICAgICAgbGlmZV9zdGFnZV90ZXN0ZWQ9PSJhZHVsdHMiICMgYWR1bHQgYW5pbWFscw0KDQpUaGlzIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9EYXRhX3dyYW5nbGluZy9HZW5lcmF0aW5nX2RhdGFfZm9yX2ltcHV0YXRpb24uUm1kKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCmRhdGFfZm9yX2ltcDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kYXRhX2Zvcl9pbXB1dGF0aW9uX3dpdGhfdGVtcC5yZHMiKQ0KDQojIE9ubHkgY29uc2lkZXIgb2JzZXJ2YXRpb25zIHRoYXQgYXJlIGNvbXBhcmFibGUgdG8gdGhlIGRhdGEgd2UgaW1wdXRlDQp0cmFpbmluZ19kYXRhX2Zvcl9jcm9zc1YgPC0gZmlsdGVyKGRhdGFfZm9yX2ltcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHV0ZWQ9PSJubyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtcGluZz09IjEiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjbGltYXRlZD09ImFjY2xpbWF0ZWQiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ9PSJPUyImDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkPT0iYWR1bHRzIikgDQoNCnRyYWluaW5nX3NwZWNpZXNfY3Jvc3NWPC0gZGlzdGluY3QoZGF0YS5mcmFtZSh0aXAubGFiZWw9dHJhaW5pbmdfZGF0YV9mb3JfY3Jvc3NWJHRpcC5sYWJlbCkpICMgNzcgc3BlY2llcyANCg0KaW1wX2RhdGFfZm9yX2Nyb3NzViA8LSBmaWx0ZXIoZGF0YV9mb3JfaW1wLCBpbXB1dGVkPT0ieWVzIikNCmltcF9kYXRhX2Zvcl9jcm9zc1YgPC0gaW1wX2RhdGFfZm9yX2Nyb3NzVltpbXBfZGF0YV9mb3JfY3Jvc3NWJHRpcC5sYWJlbCAlIWluJSB0cmFpbmluZ19kYXRhX2Zvcl9jcm9zc1YkdGlwLmxhYmVsLCBdICMgTWFrZSBzdXJlIHdlIGdldCBzcGVjaWVzIG5vdCBpbiB0aGUgb3JpZ2luYWwgZGF0YQ0KaW1wX3NwZWNpZXNfY3Jvc3NWPC0gZGlzdGluY3QoZGF0YS5mcmFtZSh0aXAubGFiZWw9aW1wX2RhdGFfZm9yX2Nyb3NzViR0aXAubGFiZWwpKSANCg0KYGBgDQoNCg0KIyMjIyAqKkZpcnN0IHNldCoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQojIyMgRmlyc3Qgc2V0DQpzZXQuc2VlZCgxMjMpDQpmaXJzdF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1Y8LWRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZSh0cmFpbmluZ19zcGVjaWVzX2Nyb3NzViR0aXAubGFiZWwsIDE2KSkgIyBTYW1wbGUgb2YgMTYgc3BlY2llcw0KZmlyc3RfaW1wX3NhbXBsZV8yMzRzcF9jcm9zc1Y8LWRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZShpbXBfc3BlY2llc19jcm9zc1YkdGlwLmxhYmVsLCAyMzQpKSAjIFNhbXBsZSBvZiAyMzQgc3BlY2llcw0KDQpmaXJzdF9jcm9zc1YgPC0gbXV0YXRlKGRhdGFfZm9yX2ltcCwgc3BfdG9fdmFsaWRhdGUgPSBpZmVsc2UoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwgJWluJSBmaXJzdF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1YkdGlwLmxhYmVsKSA9PSBUUlVFLCAieWVzIiwgIm5vIikpICMgRmxhZyBzcGVjaWVzIHRvIHZhbGlkYXRlDQoNCmZpcnN0X2Nyb3NzViA8LSBtdXRhdGUoZmlyc3RfY3Jvc3NWLCBkYXRfdG9fdmFsaWRhdGUgPSBpZmVsc2Uoc3BfdG9fdmFsaWRhdGU9PSJ5ZXMiJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1waW5nPT0xJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludD09Ik9TIiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZV9zdGFnZV90ZXN0ZWQ9PSJhZHVsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiwgIm5vIikpICMgRmxhZyBkYXRhIHRvIHZhbGlkYXRlDQoNCmZpcnN0X2Nyb3NzVjwtZmlsdGVyKGZpcnN0X2Nyb3NzViwgIShkYXRfdG9fdmFsaWRhdGU9PSJ5ZXMiICYgaW1wdXRlZD09InllcyIpKSAjIFJlbW92ZSB0aGUgZmFrZSBkYXRhIGZvciBzcGVjaWVzIHdlIHdhbnQgdG8gY3Jvc3MtdmFsaWRhdGUNCg0KZmlyc3RfY3Jvc3NWIDwtIG11dGF0ZShmaXJzdF9jcm9zc1YsIG1lYW5fVVRMID0gaWZlbHNlKGRhdF90b192YWxpZGF0ZSA9PSAieWVzIiwgTkEsIG1lYW5fVVRMKSkgIyBTZXQgdmFsdWVzIGFzIE5BIGZvciB0aGVzZSAxNiBzcGVjaWVzDQoNCmZpcnN0X2Nyb3NzViA8LSBmaXJzdF9jcm9zc1ZbZmlyc3RfY3Jvc3NWJHRpcC5sYWJlbCAlIWluJSBmaXJzdF9pbXBfc2FtcGxlXzIzNHNwX2Nyb3NzViR0aXAubGFiZWwsIF0gIyBSZW1vdmUgdGhlIGRhdGEgZm9yIDIzNCBmdWxseSBpbXB1dGVkIHNwZWNpZXMNCg0Kc2F2ZVJEUyhmaXJzdF9jcm9zc1YsICJSRGF0YS9JbXB1dGF0aW9uL2RhdGEvRGF0YV9jcm9zc1ZfMXN0X3NldC5yZHMiKQ0KYGBgDQoNCiMjIyMgKipTZWNvbmQgc2V0KiogDQoNCmBgYHtyLCBldmFsID0gRn0NCiMjIyBTZWNvbmQgc2V0IA0KcmVtYWluaW5nX3NwPC0gZGF0YS5mcmFtZSh0aXAubGFiZWwgPSB0cmFpbmluZ19zcGVjaWVzX2Nyb3NzVlt0cmFpbmluZ19zcGVjaWVzX2Nyb3NzViR0aXAubGFiZWwgJSFpbiUgZmlyc3RfdHJhaW5pbmdfc2FtcGxlXzE2c3BfY3Jvc3NWJHRpcC5sYWJlbCxdKQ0KICANCnNldC5zZWVkKDM4NSkNCnNlY29uZF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1Y8LWRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZShyZW1haW5pbmdfc3AkdGlwLmxhYmVsLCAxNikpICMgU2FtcGxlIG9mIDE2IHNwZWNpZXMNCnNlY29uZF9pbXBfc2FtcGxlXzIzNHNwX2Nyb3NzVjwtZGF0YS5mcmFtZSh0aXAubGFiZWw9c2FtcGxlKGltcF9zcGVjaWVzX2Nyb3NzViR0aXAubGFiZWwsIDIzNCkpICMgU2FtcGxlIG9mIDIzNCBzcGVjaWVzDQoNCnNlY29uZF9jcm9zc1YgPC0gbXV0YXRlKGRhdGFfZm9yX2ltcCwgc3BfdG9fdmFsaWRhdGUgPSBpZmVsc2UoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwgJWluJSBzZWNvbmRfdHJhaW5pbmdfc2FtcGxlXzE2c3BfY3Jvc3NWJHRpcC5sYWJlbCkgPT0gVFJVRSwgInllcyIsICJubyIpKSAjIGZsYWcgc3BlY2llcyB0byB2YWxpZGF0ZQ0KDQpzZWNvbmRfY3Jvc3NWIDwtIG11dGF0ZShzZWNvbmRfY3Jvc3NWLCBkYXRfdG9fdmFsaWRhdGUgPSBpZmVsc2Uoc3BfdG9fdmFsaWRhdGU9PSJ5ZXMiJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1waW5nPT0xJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludD09Ik9TIiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZV9zdGFnZV90ZXN0ZWQ9PSJhZHVsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiwgIm5vIikpICMgZmxhZyBkYXRhIHRvIHZhbGlkYXRlDQoNCnNlY29uZF9jcm9zc1Y8LWZpbHRlcihzZWNvbmRfY3Jvc3NWLCAhKGRhdF90b192YWxpZGF0ZT09InllcyImaW1wdXRlZD09InllcyIpKSAjIFJlbW92ZSB0aGUgZmFrZSBkYXRhIGZvciBzcGVjaWVzIHdlIHdhbnQgdG8gY3Jvc3MtdmFsaWRhdGUNCg0Kc2Vjb25kX2Nyb3NzViA8LSBtdXRhdGUoc2Vjb25kX2Nyb3NzViwgbWVhbl9VVEwgPSBpZmVsc2UoZGF0X3RvX3ZhbGlkYXRlID09ICJ5ZXMiLCBOQSwgbWVhbl9VVEwpKSAjIFNldCB2YWx1ZXMgYXMgTkEgZm9yIHRoZXNlIDE2IHNwZWNpZXMNCg0Kc2Vjb25kX2Nyb3NzViA8LSBzZWNvbmRfY3Jvc3NWW3NlY29uZF9jcm9zc1YkdGlwLmxhYmVsICUhaW4lIHNlY29uZF9pbXBfc2FtcGxlXzIzNHNwX2Nyb3NzViR0aXAubGFiZWwsIF0gIyBSZW1vdmUgdGhlIGRhdGEgZm9yIDIzNCBmdWxseSBpbXB1dGVkIHNwZWNpZXMNCg0Kc2F2ZVJEUyhzZWNvbmRfY3Jvc3NWLCAiUkRhdGEvSW1wdXRhdGlvbi9kYXRhL0RhdGFfY3Jvc3NWXzJuZF9zZXQucmRzIikNCg0KYGBgDQoNCiMjIyMgKipUaGlyZCBzZXQqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyMjIFRoaXJkIHNldA0KcmVtYWluaW5nX3NwPC0gZGF0YS5mcmFtZSh0aXAubGFiZWw9cmVtYWluaW5nX3NwW3JlbWFpbmluZ19zcCR0aXAubGFiZWwgJSFpbiUgc2Vjb25kX3RyYWluaW5nX3NhbXBsZV8xNnNwX2Nyb3NzViR0aXAubGFiZWwsXSkNCnNldC5zZWVkKDM5MCkNCnRoaXJkX3RyYWluaW5nX3NhbXBsZV8xNnNwX2Nyb3NzVjwtZGF0YS5mcmFtZSh0aXAubGFiZWw9c2FtcGxlKHJlbWFpbmluZ19zcCR0aXAubGFiZWwsIDE2KSkgIyBTYW1wbGUgb2YgMTYgc3BlY2llcw0KdGhpcmRfaW1wX3NhbXBsZV8yMzRzcF9jcm9zc1Y8LWRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZShpbXBfc3BlY2llc19jcm9zc1YkdGlwLmxhYmVsLCAyMzQpKSAjIFNhbXBsZSBvZiAyMzQgc3BlY2llcw0KDQp0aGlyZF9jcm9zc1YgPC0gbXV0YXRlKGRhdGFfZm9yX2ltcCwgc3BfdG9fdmFsaWRhdGUgPSBpZmVsc2UoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwgJWluJSB0aGlyZF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1YkdGlwLmxhYmVsKSA9PSBUUlVFLCAieWVzIiwgIm5vIikpICMgZmxhZyBzcGVjaWVzIHRvIHZhbGlkYXRlDQoNCnRoaXJkX2Nyb3NzViA8LSBtdXRhdGUodGhpcmRfY3Jvc3NWLCBkYXRfdG9fdmFsaWRhdGUgPSBpZmVsc2Uoc3BfdG9fdmFsaWRhdGU9PSJ5ZXMiJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbXBpbmc9PTEmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ9PSJPUyImDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZV9zdGFnZV90ZXN0ZWQ9PSJhZHVsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiLCAibm8iKSkgIyBmbGFnIGRhdGEgcmVsZXZhbnQgZm9yIHZhbGlkYXRpb24gZm9yIHRoZXNlIHNwZWNpZXMNCg0KdGhpcmRfY3Jvc3NWPC1maWx0ZXIodGhpcmRfY3Jvc3NWLCAhKGRhdF90b192YWxpZGF0ZT09InllcyImaW1wdXRlZD09InllcyIpKSAjIFJlbW92ZSB0aGUgZmFrZSBkYXRhIGZvciBzcGVjaWVzIHdlIHdhbnQgdG8gY3Jvc3MtdmFsaWRhdGUNCg0KdGhpcmRfY3Jvc3NWIDwtIG11dGF0ZSh0aGlyZF9jcm9zc1YsIG1lYW5fVVRMID0gaWZlbHNlKGRhdF90b192YWxpZGF0ZSA9PSAieWVzIiwgTkEsIG1lYW5fVVRMKSkgIyBTZXQgdmFsdWVzIGFzIE5BIGZvciB0aGVzZSAxNSBzcGVjaWVzIDE1IHNwZWNpZXMNCg0KdGhpcmRfY3Jvc3NWIDwtIHRoaXJkX2Nyb3NzViBbdGhpcmRfY3Jvc3NWJHRpcC5sYWJlbCAlIWluJSB0aGlyZF9pbXBfc2FtcGxlXzIzNHNwX2Nyb3NzViR0aXAubGFiZWwsIF0gIyBSZW1vdmUgdGhlIGRhdGEgMjM0IGZ1bGx5LWltcHV0ZWQgc3BlY2llcw0KDQpzYXZlUkRTKHRoaXJkX2Nyb3NzViwgIlJEYXRhL0ltcHV0YXRpb24vZGF0YS9EYXRhX2Nyb3NzVl8zcmRfc2V0LnJkcyIpDQpgYGANCg0KIyMjIyAqKkZvdXJ0aCBzZXQqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyMjIEZvdXJ0aCBzZXQgDQpyZW1haW5pbmdfc3A8LSBkYXRhLmZyYW1lKHRpcC5sYWJlbD1yZW1haW5pbmdfc3BbcmVtYWluaW5nX3NwJHRpcC5sYWJlbCAlIWluJSB0aGlyZF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1YkdGlwLmxhYmVsLF0pDQpzZXQuc2VlZCgzNjkpDQpmb3VydGhfdHJhaW5pbmdfc2FtcGxlXzE2c3BfY3Jvc3NWPC1kYXRhLmZyYW1lKHRpcC5sYWJlbD1zYW1wbGUocmVtYWluaW5nX3NwJHRpcC5sYWJlbCwgMTYpKSAjIFNhbXBsZSBvZiAxNiBzcGVjaWVzDQpmb3VydGhfaW1wX3NhbXBsZV8yMzRzcF9jcm9zc1Y8LWRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZShpbXBfc3BlY2llc19jcm9zc1YkdGlwLmxhYmVsLCAyMzQpKSAjIFNhbXBsZSBvZiAyMzQgc3BlY2llcw0KDQpmb3VydGhfY3Jvc3NWIDwtIG11dGF0ZShkYXRhX2Zvcl9pbXAsIHNwX3RvX3ZhbGlkYXRlID0gaWZlbHNlKChkYXRhX2Zvcl9pbXAkdGlwLmxhYmVsICVpbiUgZm91cnRoX3RyYWluaW5nX3NhbXBsZV8xNnNwX2Nyb3NzViR0aXAubGFiZWwpID09IFRSVUUsICJ5ZXMiLCAibm8iKSkgIyBmbGFnIHNwZWNpZXMgdG8gdmFsaWRhdGUNCg0KZm91cnRoX2Nyb3NzViA8LSBtdXRhdGUoZm91cnRoX2Nyb3NzViwgZGF0X3RvX3ZhbGlkYXRlID0gaWZlbHNlKHNwX3RvX3ZhbGlkYXRlPT0ieWVzIiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbXBpbmc9PTEmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludD09Ik9TIiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkPT0iYWR1bHRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiLCAibm8iKSkgIyBmbGFnIGRhdGEgcmVsZXZhbnQgZm9yIHZhbGlkYXRpb24gZm9yIHRoZXNlIHNwZWNpZXMNCg0KZm91cnRoX2Nyb3NzVjwtZmlsdGVyKGZvdXJ0aF9jcm9zc1YsICEoZGF0X3RvX3ZhbGlkYXRlPT0ieWVzIiZpbXB1dGVkPT0ieWVzIikpICMgUmVtb3ZlIHRoZSBmYWtlIGRhdGEgZm9yIHNwZWNpZXMgd2Ugd2FudCB0byBjcm9zcy12YWxpZGF0ZQ0KDQpmb3VydGhfY3Jvc3NWIDwtIG11dGF0ZShmb3VydGhfY3Jvc3NWLCBtZWFuX1VUTCA9IGlmZWxzZShkYXRfdG9fdmFsaWRhdGUgPT0gInllcyIsIE5BLCBtZWFuX1VUTCkpICMgU2V0IHZhbHVlcyBhcyBOQSBmb3IgdGhlc2UgMTUgc3BlY2llcyAxNSBzcGVjaWVzDQoNCmZvdXJ0aF9jcm9zc1YgPC0gZm91cnRoX2Nyb3NzViBbZm91cnRoX2Nyb3NzViR0aXAubGFiZWwgJSFpbiUgZm91cnRoX2ltcF9zYW1wbGVfMjM0c3BfY3Jvc3NWJHRpcC5sYWJlbCwgXSAjIFJlbW92ZSB0aGUgZGF0YSAyMzQgZnVsbHktaW1wdXRlZCBzcGVjaWVzDQoNCnNhdmVSRFMoZm91cnRoX2Nyb3NzViwgIlJEYXRhL0ltcHV0YXRpb24vZGF0YS9EYXRhX2Nyb3NzVl80dGhfc2V0LnJkcyIpDQpgYGANCg0KIyMjIyAqKkZpZnRoIHNldCoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQoNCiMjIyBGaWZ0aCBzZXQgDQpyZW1haW5pbmdfc3A8LSBkYXRhLmZyYW1lKHRpcC5sYWJlbD1yZW1haW5pbmdfc3BbcmVtYWluaW5nX3NwJHRpcC5sYWJlbCAlIWluJSBmb3VydGhfdHJhaW5pbmdfc2FtcGxlXzE2c3BfY3Jvc3NWJHRpcC5sYWJlbCxdKSAjIDEzDQpzZXQuc2VlZCg1MzYpDQpmaWZ0aF90cmFpbmluZ19zYW1wbGVfMTZzcF9jcm9zc1Y8LXJiaW5kKGRhdGEuZnJhbWUodGlwLmxhYmVsPXNhbXBsZSh0cmFpbmluZ19zcGVjaWVzX2Nyb3NzViR0aXAubGFiZWwsIDMpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19zcCkgIyBTYW1wbGUgb2YgMyBleHRyYSBzcGVjaWVzIHNwZWNpZXMgYmVjYXVzZSB3ZSBoYXZlIG9ubHkgMTMgcmVtYWluaW5nDQoNCmZpZnRoX2ltcF9zYW1wbGVfMjM0c3BfY3Jvc3NWPC1kYXRhLmZyYW1lKHRpcC5sYWJlbD1zYW1wbGUoaW1wX3NwZWNpZXNfY3Jvc3NWJHRpcC5sYWJlbCwgMjM0KSkgIyBTYW1wbGUgb2YgMjM0IHNwZWNpZXMNCg0KZmlmdGhfY3Jvc3NWIDwtIG11dGF0ZShkYXRhX2Zvcl9pbXAsIHNwX3RvX3ZhbGlkYXRlID0gaWZlbHNlKChkYXRhX2Zvcl9pbXAkdGlwLmxhYmVsICVpbiUgZmlmdGhfdHJhaW5pbmdfc2FtcGxlXzE2c3BfY3Jvc3NWJHRpcC5sYWJlbCkgPT0gVFJVRSwgInllcyIsICJubyIpKSAjIGZsYWcgc3BlY2llcyB0byB2YWxpZGF0ZQ0KDQpmaWZ0aF9jcm9zc1YgPC0gbXV0YXRlKGZpZnRoX2Nyb3NzViwgZGF0X3RvX3ZhbGlkYXRlID0gaWZlbHNlKHNwX3RvX3ZhbGlkYXRlPT0ieWVzIiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1waW5nPT0xJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50PT0iT1MiJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkPT0iYWR1bHRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiwgIm5vIikpICMgZmxhZyBkYXRhIHJlbGV2YW50IGZvciB2YWxpZGF0aW9uIGZvciB0aGVzZSBzcGVjaWVzDQoNCmZpZnRoX2Nyb3NzVjwtZmlsdGVyKGZpZnRoX2Nyb3NzViwgIShkYXRfdG9fdmFsaWRhdGU9PSJ5ZXMiJmltcHV0ZWQ9PSJ5ZXMiKSkgIyBSZW1vdmUgdGhlIGZha2UgZGF0YSBmb3Igc3BlY2llcyB3ZSB3YW50IHRvIGNyb3NzLXZhbGlkYXRlDQoNCmZpZnRoX2Nyb3NzViA8LSBtdXRhdGUoZmlmdGhfY3Jvc3NWLCBtZWFuX1VUTCA9IGlmZWxzZShkYXRfdG9fdmFsaWRhdGUgPT0gInllcyIsIE5BLCBtZWFuX1VUTCkpICMgU2V0IHZhbHVlcyBhcyBOQSBmb3IgdGhlc2UgMTUgc3BlY2llcyAxNSBzcGVjaWVzDQoNCmZpZnRoX2Nyb3NzViA8LSBmaWZ0aF9jcm9zc1YgW2ZpZnRoX2Nyb3NzViR0aXAubGFiZWwgJSFpbiUgZmlmdGhfaW1wX3NhbXBsZV8yMzRzcF9jcm9zc1YkdGlwLmxhYmVsLCBdICMgUmVtb3ZlIHRoZSBkYXRhIDIzNCBmdWxseS1pbXB1dGVkIHNwZWNpZXMNCg0Kc2F2ZVJEUyhmaWZ0aF9jcm9zc1YsICJSRGF0YS9JbXB1dGF0aW9uL2RhdGEvRGF0YV9jcm9zc1ZfNXRoX3NldC5yZHMiKQ0KYGBgDQoNCg0KIyMjICoqUnVuIHRoZSBjcm9zcy12YWxpZGF0aW9uKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipGaXJzdCBzZXQqKiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvSW1wdXRhdGlvbi9SdW5uaW5nX2Nyb3NzX3ZhbGlkYXRpb25fMXN0X3NldC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9JbXB1dGF0aW9uL1J1bm5pbmdfY3Jvc3NfdmFsaWRhdGlvbl8xc3Rfc2V0LnBicyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQojIExvYWQgZnVuY3Rpb25zIGZvciB0aGUgQmF5ZXNpYW4gQXVnbWVudGF0aW9uIHdpdGggQ2hhaW4gRXF1YXRpb25zIChCQUNFKQ0Kc291cmNlKCJSL0ltcHV0YXRpb24vRnVuY3Rpb25zX0JBQ0UuUiIpDQoNCiMgTG9hZCBkYXRhIGFuZCB0cmVlDQp0cmVlPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KIyBMb2FkIGRhdGENCmRhdGFfZm9yX2ltcDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vZGF0YS9EYXRhX2Nyb3NzVl8xc3Rfc2V0LnJkcyIpDQoNCiMgVHJhbnNmb3JtIHZhcmlhYmxlcw0KDQpkYXRhX2Zvcl9pbXAgPC0gZGF0YV9mb3JfaW1wICU+JSANCiAgbXV0YXRlKA0KICAgIGFjY2xpbWF0ZWQgPSBmYWN0b3IoYWNjbGltYXRlZCksDQogICAgbGlmZV9zdGFnZV90ZXN0ZWQgPSBmYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQpLA0KICAgIGxuX2FjY2xpbWF0aW9uX3RpbWUgPSBsb2coYWNjbGltYXRpb25fdGltZSksDQogICAgbG5fc2RfVVRMID0gbG9nKHNkX1VUTCksDQogICAgbG5fYm9keV9tYXNzID0gbG9nKGJvZHlfbWFzcyksDQogICAgbWVkaXVtX3Rlc3RfdGVtcDIgPSBmYWN0b3IobWVkaXVtX3Rlc3RfdGVtcCksDQogICAgbGlmZV9zdGFnZV90ZXN0ZWQ9ZmFjdG9yKGxpZmVfc3RhZ2VfdGVzdGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiYWR1bHQiLCAiYWR1bHRzIiwgImxhcnZhZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiYWR1bHRzIiwgImFkdWx0cyIsICJsYXJ2YWUiKSksICMgQ29ycmVjdCB0eXBvDQogICAgZW5kcG9pbnQyID0gZmFjdG9yKGVuZHBvaW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIkxSUiIsICJPUyIsICJMT0UiLCAicHJvZGRpbmciLCAib3RoZXIiLCAiZGVhdGgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkxSUiIsICJPUyIsICJMUlIiLCAib3RoZXIiLCAib3RoZXIiLCAib3RoZXIiKSkgIyBUYWtlIExPRSBhcyBMUlIgDQogICkNCg0KZGF0YV9mb3JfaW1wPC0gZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIC1mYW1pbHkpICMgUmVtb3ZlIGZhbWlseSB0byBydW4gTUNNQ2dsbW0NCg0KbGVuZ3RoKHVuaXF1ZShkYXRhX2Zvcl9pbXAkc3BlY2llcykpDQoNCiMgTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgbWF0Y2hlcw0KDQptYXRjaHBvcyA8LSBtYXRjaChkYXRhX2Zvcl9pbXAkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCkNCg0KZGF0YV9mb3JfaW1wJG1hdGNocG9zIDwtIG1hdGNocG9zDQoNCmRhdCA8LSBkYXRhX2Zvcl9pbXAgJT4lIGZpbHRlcihpcy5uYShtYXRjaHBvcykgPT0gRikgDQoNCnRyZWVfaW1wdXRhdGlvbiA8LSBkcm9wLnRpcCh0cmVlLCB0cmVlJHRpcC5sYWJlbFstbWF0Y2goZGF0JHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIyBQcnVuZWQgdHJlZSB0aGF0IG9ubHkgY29udGFpbnMgc3BlY2llcyBpbiB0aGUgZGF0YSANCg0KdHJlZV9pbXB1dGF0aW9uPC1mb3JjZS51bHRyYW1ldHJpYyh0cmVlX2ltcHV0YXRpb24sIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQojIFBoeWxvZ2VuZXRpYyBjby12YXJpYW5jZSBtYXRyaXgNCkFpbnY8LWludmVyc2VBKHRyZWVfaW1wdXRhdGlvbikkQWludg0KDQojIFN0YW5kYXJkaXplIHZhcmlhYmxlcw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBhY2NsaW1hdGlvbl90ZW1wDQpkYXQkYWNjbGltYXRpb25fdGVtcF9zdGFuZDwtIHN0YW5kKGRhdCRhY2NsaW1hdGlvbl90ZW1wKVssMV0NCg0KIyBtZWFuX1VUTA0KbWVhbl9VVExfbXBvcyA8LSBpcy5uYShkYXQkbWVhbl9VVEwpIA0KZGF0JG1lYW5fVVRMX3N0YW5kMSA8LSBzdGFuZChkYXQkbWVhbl9VVEwpWywxXQ0KZGF0JG1lYW5fVVRMX3N0YW5kMVttZWFuX1VUTF9tcG9zXSA8LSAwDQoNCg0KIyBhY2NsaW1hdGlvbl90aW1lDQphY2NsaW1hdGlvbl90aW1lX21wb3MgPC0gaXMubmEoZGF0JGxuX2FjY2xpbWF0aW9uX3RpbWUpDQpkYXQkbG5fYWNjbGltYXRpb25fdGltZV9zdGFuZDEgPC0gc3RhbmQoZGF0JGxuX2FjY2xpbWF0aW9uX3RpbWUpWywxXQ0KZGF0JGxuX2FjY2xpbWF0aW9uX3RpbWVfc3RhbmQxW2FjY2xpbWF0aW9uX3RpbWVfbXBvc10gPC0gMA0KDQojIHJhbXBpbmcNCnJhbXBpbmdfbXBvcyA8LSBpcy5uYShkYXQkcmFtcGluZykgDQpkYXQkcmFtcGluZ19zdGFuZDEgPC0gc3RhbmQoZGF0JHJhbXBpbmcpWywxXQ0KZGF0JHJhbXBpbmdfc3RhbmQxW3JhbXBpbmdfbXBvc10gPC0gMA0KDQojIG1lZGl1bV90ZXN0X3RlbXAyIA0KbWVkaXVtX3Rlc3RfdGVtcDJfbXBvcyA8LSBpcy5uYShkYXQkbWVkaXVtX3Rlc3RfdGVtcDIpDQpkYXQkbWVkaXVtX3Rlc3RfdGVtcDJfZmlsbDEgPC0gc2FtcGxlX2ltcChkYXQkbWVkaXVtX3Rlc3RfdGVtcDIpW1sxXV0NCg0KIyBzZF9VVEwgDQpzZF9VVExfbXBvcyA8LSBpcy5uYShkYXQkbG5fc2RfVVRMKQ0KZGF0JGxuX3NkX1VUTF9zdGFuZDEgPC0gc3RhbmQoZGF0JGxuX3NkX1VUTClbLDFdDQpkYXQkbG5fc2RfVVRMX3N0YW5kMVtzZF9VVExfbXBvc10gPC0gMA0KDQojIGJvZHlfbWFzcw0KYm9keV9tYXNzX21wb3MgPC0gaXMubmEoZGF0JGxuX2JvZHlfbWFzcykNCmRhdCRsbl9ib2R5X21hc3Nfc3RhbmQxIDwtIHN0YW5kKGRhdCRsbl9ib2R5X21hc3MpWywxXQ0KZGF0JGxuX2JvZHlfbWFzc19zdGFuZDFbYm9keV9tYXNzX21wb3NdIDwtIDANCg0KIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIGN5Y2xlIDENCnN5c3RlbS50aW1lKGRhdDFfY3Jvc3NWIDwtIGJfbWljZShjeWNsZSA9IDEsIGRhdGEgPSBkYXQsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQxX2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMXN0X2Nyb3NzX3ZhbGlkYXRpb25fMXN0X2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjIw0KDQojIGN5Y2xlIDINCnN5c3RlbS50aW1lKGRhdDJfY3Jvc3NWIDwtIGJfbWljZShjeWNsZSA9IDIsIGRhdGEgPSBkYXQxX2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDJfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8xc3RfY3Jvc3NfdmFsaWRhdGlvbl8ybmRfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMNCg0KIyBjeWNsZSAzDQpzeXN0ZW0udGltZShkYXQzX2Nyb3NzVjwtIGJfbWljZShjeWNsZSA9IDMsIGRhdGEgPSBkYXQyX2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDNfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8xc3RfY3Jvc3NfdmFsaWRhdGlvbl8zcmRfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMNCg0KIyBjeWNsZSA0DQpzeXN0ZW0udGltZShkYXQ0X2Nyb3NzVjwtIGJfbWljZShjeWNsZSA9IDQsIGRhdGEgPSBkYXQzX2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDRfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8xc3RfY3Jvc3NfdmFsaWRhdGlvbl80dGhfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMNCg0KIyBjeWNsZSA1DQpzeXN0ZW0udGltZShkYXQ1X2Nyb3NzVjwtIGJfbWljZShjeWNsZSA9IDUsIGRhdGEgPSBkYXQ0X2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDVfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8xc3RfY3Jvc3NfdmFsaWRhdGlvbl81dGhfY3ljbGUuUmRzIikNCg0KYGBgDQoNCiMjIyMgKipTZWNvbmQgc2V0KiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0ltcHV0YXRpb24vUnVubmluZ19jcm9zc192YWxpZGF0aW9uXzJuZF9zZXQuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvSW1wdXRhdGlvbi9SdW5uaW5nX2Nyb3NzX3ZhbGlkYXRpb25fMm5kX3NldC5wYnMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyBMb2FkIGZ1bmN0aW9ucyBmb3IgdGhlIEJheWVzaWFuIEF1Z21lbnRhdGlvbiB3aXRoIENoYWluIEVxdWF0aW9ucyAoQkFDRSkNCnNvdXJjZSgiUi9JbXB1dGF0aW9uL0Z1bmN0aW9uc19CQUNFLlIiKQ0KDQojIExvYWQgZGF0YSBhbmQgdHJlZQ0KdHJlZTwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMgTG9hZCBkYXRhDQpkYXRhX2Zvcl9pbXA8LSByZWFkUkRTKCJSRGF0YS9JbXB1dGF0aW9uL2RhdGEvRGF0YV9jcm9zc1ZfMm5kX3NldC5yZHMiKQ0KDQoNCg0KIyBUcmFuc2Zvcm0gdmFyaWFibGVzDQoNCmRhdGFfZm9yX2ltcCA8LSBkYXRhX2Zvcl9pbXAgJT4lIA0KICBtdXRhdGUoDQogICAgYWNjbGltYXRlZCA9IGZhY3RvcihhY2NsaW1hdGVkKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZCA9IGZhY3RvcihsaWZlX3N0YWdlX3Rlc3RlZCksDQogICAgbG5fYWNjbGltYXRpb25fdGltZSA9IGxvZyhhY2NsaW1hdGlvbl90aW1lKSwNCiAgICBsbl9zZF9VVEwgPSBsb2coc2RfVVRMKSwNCiAgICBsbl9ib2R5X21hc3MgPSBsb2coYm9keV9tYXNzKSwNCiAgICBtZWRpdW1fdGVzdF90ZW1wMiA9IGZhY3RvcihtZWRpdW1fdGVzdF90ZW1wKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZD1mYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJhZHVsdCIsICJhZHVsdHMiLCAibGFydmFlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJhZHVsdHMiLCAiYWR1bHRzIiwgImxhcnZhZSIpKSwgIyBDb3JyZWN0IHR5cG8NCiAgICBlbmRwb2ludDIgPSBmYWN0b3IoZW5kcG9pbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiTFJSIiwgIk9TIiwgIkxPRSIsICJwcm9kZGluZyIsICJvdGhlciIsICJkZWF0aCIpLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTFJSIiwgIk9TIiwgIkxSUiIsICJvdGhlciIsICJvdGhlciIsICJvdGhlciIpKSAjIFRha2UgTE9FIGFzIExSUiANCiAgKQ0KDQpkYXRhX2Zvcl9pbXA8LSBkcGx5cjo6c2VsZWN0KGRhdGFfZm9yX2ltcCwgLWZhbWlseSkgIyBSZW1vdmUgZmFtaWx5IHRvIHJ1biBNQ01DZ2xtbQ0KDQoNCmxlbmd0aCh1bmlxdWUoZGF0YV9mb3JfaW1wJHNwZWNpZXMpKQ0KDQojIE1ha2Ugc3VyZSBldmVyeXRoaW5nIG1hdGNoZXMNCg0KbWF0Y2hwb3MgPC0gbWF0Y2goZGF0YV9mb3JfaW1wJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpDQoNCmRhdGFfZm9yX2ltcCRtYXRjaHBvcyA8LSBtYXRjaHBvcw0KDQpkYXQgPC0gZGF0YV9mb3JfaW1wICU+JSBmaWx0ZXIoaXMubmEobWF0Y2hwb3MpID09IEYpIA0KDQp0cmVlX2ltcHV0YXRpb24gPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGRhdCR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICMgUHJ1bmVkIHRyZWUgdGhhdCBvbmx5IGNvbnRhaW5zIHNwZWNpZXMgaW4gdGhlIGRhdGEgDQoNCnRyZWVfaW1wdXRhdGlvbjwtZm9yY2UudWx0cmFtZXRyaWModHJlZV9pbXB1dGF0aW9uLCBtZXRob2Q9ImV4dGVuZCIpICMgRm9yY2UgdGhlIHRyZWUgdG8gYmUgdWx0cmFtZXRyaWMNCg0KIyBQaHlsb2dlbmV0aWMgY28tdmFyaWFuY2UgbWF0cml4DQpBaW52PC1pbnZlcnNlQSh0cmVlX2ltcHV0YXRpb24pJEFpbnYNCg0KIyBTdGFuZGFyZGl6ZSB2YXJpYWJsZXMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgYWNjbGltYXRpb25fdGVtcA0KZGF0JGFjY2xpbWF0aW9uX3RlbXBfc3RhbmQ8LSBzdGFuZChkYXQkYWNjbGltYXRpb25fdGVtcClbLDFdDQoNCiMgbWVhbl9VVEwNCm1lYW5fVVRMX21wb3MgPC0gaXMubmEoZGF0JG1lYW5fVVRMKSANCmRhdCRtZWFuX1VUTF9zdGFuZDEgPC0gc3RhbmQoZGF0JG1lYW5fVVRMKVssMV0NCmRhdCRtZWFuX1VUTF9zdGFuZDFbbWVhbl9VVExfbXBvc10gPC0gMA0KDQoNCiMgYWNjbGltYXRpb25fdGltZQ0KYWNjbGltYXRpb25fdGltZV9tcG9zIDwtIGlzLm5hKGRhdCRsbl9hY2NsaW1hdGlvbl90aW1lKQ0KZGF0JGxuX2FjY2xpbWF0aW9uX3RpbWVfc3RhbmQxIDwtIHN0YW5kKGRhdCRsbl9hY2NsaW1hdGlvbl90aW1lKVssMV0NCmRhdCRsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kMVthY2NsaW1hdGlvbl90aW1lX21wb3NdIDwtIDANCg0KIyByYW1waW5nDQpyYW1waW5nX21wb3MgPC0gaXMubmEoZGF0JHJhbXBpbmcpIA0KZGF0JHJhbXBpbmdfc3RhbmQxIDwtIHN0YW5kKGRhdCRyYW1waW5nKVssMV0NCmRhdCRyYW1waW5nX3N0YW5kMVtyYW1waW5nX21wb3NdIDwtIDANCg0KIyBtZWRpdW1fdGVzdF90ZW1wMiANCm1lZGl1bV90ZXN0X3RlbXAyX21wb3MgPC0gaXMubmEoZGF0JG1lZGl1bV90ZXN0X3RlbXAyKQ0KZGF0JG1lZGl1bV90ZXN0X3RlbXAyX2ZpbGwxIDwtIHNhbXBsZV9pbXAoZGF0JG1lZGl1bV90ZXN0X3RlbXAyKVtbMV1dDQoNCiMgc2RfVVRMIA0Kc2RfVVRMX21wb3MgPC0gaXMubmEoZGF0JGxuX3NkX1VUTCkNCmRhdCRsbl9zZF9VVExfc3RhbmQxIDwtIHN0YW5kKGRhdCRsbl9zZF9VVEwpWywxXQ0KZGF0JGxuX3NkX1VUTF9zdGFuZDFbc2RfVVRMX21wb3NdIDwtIDANCg0KIyBib2R5X21hc3MNCmJvZHlfbWFzc19tcG9zIDwtIGlzLm5hKGRhdCRsbl9ib2R5X21hc3MpDQpkYXQkbG5fYm9keV9tYXNzX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fYm9keV9tYXNzKVssMV0NCmRhdCRsbl9ib2R5X21hc3Nfc3RhbmQxW2JvZHlfbWFzc19tcG9zXSA8LSAwDQoNCiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjeWNsZSAxDQpzeXN0ZW0udGltZShkYXQxX2Nyb3NzViA8LSBiX21pY2UoY3ljbGUgPSAxLCBkYXRhID0gZGF0LCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0MV9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzJuZF9jcm9zc192YWxpZGF0aW9uXzFzdF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIyMNCg0KIyBjeWNsZSAyDQpzeXN0ZW0udGltZShkYXQyX2Nyb3NzViA8LSBiX21pY2UoY3ljbGUgPSAyLCBkYXRhID0gZGF0MV9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQyX2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMm5kX2Nyb3NzX3ZhbGlkYXRpb25fMm5kX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgMw0Kc3lzdGVtLnRpbWUoZGF0M19jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSAzLCBkYXRhID0gZGF0Ml9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQzX2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMm5kX2Nyb3NzX3ZhbGlkYXRpb25fM3JkX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgNA0Kc3lzdGVtLnRpbWUoZGF0NF9jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSA0LCBkYXRhID0gZGF0M19jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQ0X2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMm5kX2Nyb3NzX3ZhbGlkYXRpb25fNHRoX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgNQ0Kc3lzdGVtLnRpbWUoZGF0NV9jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSA1LCBkYXRhID0gZGF0NF9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQ1X2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMm5kX2Nyb3NzX3ZhbGlkYXRpb25fNXRoX2N5Y2xlLlJkcyIpDQoNCmBgYA0KDQojIyMjICoqVGhpcmQgc2V0KiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0ltcHV0YXRpb24vUnVubmluZ19jcm9zc192YWxpZGF0aW9uXzNyZF9zZXQuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvSW1wdXRhdGlvbi9SdW5uaW5nX2Nyb3NzX3ZhbGlkYXRpb25fM3JkX3NldC5wYnMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyBMb2FkIGZ1bmN0aW9ucyBmb3IgdGhlIEJheWVzaWFuIEF1Z21lbnRhdGlvbiB3aXRoIENoYWluIEVxdWF0aW9ucyAoQkFDRSkNCnNvdXJjZSgiUi9JbXB1dGF0aW9uL0Z1bmN0aW9uc19CQUNFLlIiKQ0KDQojIExvYWQgZGF0YSBhbmQgdHJlZQ0KdHJlZTwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMgTG9hZCBkYXRhDQpkYXRhX2Zvcl9pbXA8LSByZWFkUkRTKCJSRGF0YS9JbXB1dGF0aW9uL2RhdGEvRGF0YV9jcm9zc1ZfM3JkX3NldC5yZHMiKQ0KDQoNCg0KIyBUcmFuc2Zvcm0gdmFyaWFibGVzDQoNCmRhdGFfZm9yX2ltcCA8LSBkYXRhX2Zvcl9pbXAgJT4lIA0KICBtdXRhdGUoDQogICAgYWNjbGltYXRlZCA9IGZhY3RvcihhY2NsaW1hdGVkKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZCA9IGZhY3RvcihsaWZlX3N0YWdlX3Rlc3RlZCksDQogICAgbG5fYWNjbGltYXRpb25fdGltZSA9IGxvZyhhY2NsaW1hdGlvbl90aW1lKSwNCiAgICBsbl9zZF9VVEwgPSBsb2coc2RfVVRMKSwNCiAgICBsbl9ib2R5X21hc3MgPSBsb2coYm9keV9tYXNzKSwNCiAgICBtZWRpdW1fdGVzdF90ZW1wMiA9IGZhY3RvcihtZWRpdW1fdGVzdF90ZW1wKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZD1mYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJhZHVsdCIsICJhZHVsdHMiLCAibGFydmFlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJhZHVsdHMiLCAiYWR1bHRzIiwgImxhcnZhZSIpKSwgIyBDb3JyZWN0IHR5cG8NCiAgICBlbmRwb2ludDIgPSBmYWN0b3IoZW5kcG9pbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiTFJSIiwgIk9TIiwgIkxPRSIsICJwcm9kZGluZyIsICJvdGhlciIsICJkZWF0aCIpLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTFJSIiwgIk9TIiwgIkxSUiIsICJvdGhlciIsICJvdGhlciIsICJvdGhlciIpKSAjIFRha2UgTE9FIGFzIExSUiANCiAgKQ0KDQpkYXRhX2Zvcl9pbXA8LSBkcGx5cjo6c2VsZWN0KGRhdGFfZm9yX2ltcCwgLWZhbWlseSkgIyBSZW1vdmUgZmFtaWx5IHRvIHJ1biBNQ01DZ2xtbQ0KDQoNCiMgVGFraW5nIG91dCBtaXNzaW5nIHNwZWNpZXMgZnJvbSB0aGUgdHJlZQ0KDQpsZW5ndGgodW5pcXVlKGRhdGFfZm9yX2ltcCRzcGVjaWVzKSkNCg0KIyBNYWtlIHN1cmUgZXZlcnl0aGluZyBtYXRjaGVzDQoNCm1hdGNocG9zIDwtIG1hdGNoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKQ0KDQpkYXRhX2Zvcl9pbXAkbWF0Y2hwb3MgPC0gbWF0Y2hwb3MNCg0KZGF0IDwtIGRhdGFfZm9yX2ltcCAlPiUgZmlsdGVyKGlzLm5hKG1hdGNocG9zKSA9PSBGKSANCg0KdHJlZV9pbXB1dGF0aW9uIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChkYXQkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAjIFBydW5lZCB0cmVlIHRoYXQgb25seSBjb250YWlucyBzcGVjaWVzIGluIHRoZSBkYXRhIA0KDQp0cmVlX2ltcHV0YXRpb248LWZvcmNlLnVsdHJhbWV0cmljKHRyZWVfaW1wdXRhdGlvbiwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCiMgUGh5bG9nZW5ldGljIGNvLXZhcmlhbmNlIG1hdHJpeA0KQWludjwtaW52ZXJzZUEodHJlZV9pbXB1dGF0aW9uKSRBaW52DQoNCiMgU3RhbmRhcmRpemUgdmFyaWFibGVzDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIGFjY2xpbWF0aW9uX3RlbXANCmRhdCRhY2NsaW1hdGlvbl90ZW1wX3N0YW5kPC0gc3RhbmQoZGF0JGFjY2xpbWF0aW9uX3RlbXApWywxXQ0KDQojIG1lYW5fVVRMDQptZWFuX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRtZWFuX1VUTCkgDQpkYXQkbWVhbl9VVExfc3RhbmQxIDwtIHN0YW5kKGRhdCRtZWFuX1VUTClbLDFdDQpkYXQkbWVhbl9VVExfc3RhbmQxW21lYW5fVVRMX21wb3NdIDwtIDANCg0KDQojIGFjY2xpbWF0aW9uX3RpbWUNCmFjY2xpbWF0aW9uX3RpbWVfbXBvcyA8LSBpcy5uYShkYXQkbG5fYWNjbGltYXRpb25fdGltZSkNCmRhdCRsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fYWNjbGltYXRpb25fdGltZSlbLDFdDQpkYXQkbG5fYWNjbGltYXRpb25fdGltZV9zdGFuZDFbYWNjbGltYXRpb25fdGltZV9tcG9zXSA8LSAwDQoNCiMgcmFtcGluZw0KcmFtcGluZ19tcG9zIDwtIGlzLm5hKGRhdCRyYW1waW5nKSANCmRhdCRyYW1waW5nX3N0YW5kMSA8LSBzdGFuZChkYXQkcmFtcGluZylbLDFdDQpkYXQkcmFtcGluZ19zdGFuZDFbcmFtcGluZ19tcG9zXSA8LSAwDQoNCiMgbWVkaXVtX3Rlc3RfdGVtcDIgDQptZWRpdW1fdGVzdF90ZW1wMl9tcG9zIDwtIGlzLm5hKGRhdCRtZWRpdW1fdGVzdF90ZW1wMikNCmRhdCRtZWRpdW1fdGVzdF90ZW1wMl9maWxsMSA8LSBzYW1wbGVfaW1wKGRhdCRtZWRpdW1fdGVzdF90ZW1wMilbWzFdXQ0KDQojIHNkX1VUTCANCnNkX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRsbl9zZF9VVEwpDQpkYXQkbG5fc2RfVVRMX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fc2RfVVRMKVssMV0NCmRhdCRsbl9zZF9VVExfc3RhbmQxW3NkX1VUTF9tcG9zXSA8LSAwDQoNCiMgYm9keV9tYXNzDQpib2R5X21hc3NfbXBvcyA8LSBpcy5uYShkYXQkbG5fYm9keV9tYXNzKQ0KZGF0JGxuX2JvZHlfbWFzc19zdGFuZDEgPC0gc3RhbmQoZGF0JGxuX2JvZHlfbWFzcylbLDFdDQpkYXQkbG5fYm9keV9tYXNzX3N0YW5kMVtib2R5X21hc3NfbXBvc10gPC0gMA0KDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY3ljbGUgMQ0Kc3lzdGVtLnRpbWUoZGF0MV9jcm9zc1YgPC0gYl9taWNlKGN5Y2xlID0gMSwgZGF0YSA9IGRhdCwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDFfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8zcmRfY3Jvc3NfdmFsaWRhdGlvbl8xc3RfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMjDQoNCiMgY3ljbGUgMg0Kc3lzdGVtLnRpbWUoZGF0Ml9jcm9zc1YgPC0gYl9taWNlKGN5Y2xlID0gMiwgZGF0YSA9IGRhdDFfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0Ml9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzNyZF9jcm9zc192YWxpZGF0aW9uXzJuZF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIw0KDQojIGN5Y2xlIDMNCnN5c3RlbS50aW1lKGRhdDNfY3Jvc3NWPC0gYl9taWNlKGN5Y2xlID0gMywgZGF0YSA9IGRhdDJfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0M19jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzNyZF9jcm9zc192YWxpZGF0aW9uXzNyZF9jeWNsZS5SZHMiKQ0KDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgNA0Kc3lzdGVtLnRpbWUoZGF0NF9jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSA0LCBkYXRhID0gZGF0M19jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQ0X2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvM3JkX2Nyb3NzX3ZhbGlkYXRpb25fNHRoX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgNQ0Kc3lzdGVtLnRpbWUoZGF0NV9jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSA1LCBkYXRhID0gZGF0NF9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQ1X2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvM3JkX2Nyb3NzX3ZhbGlkYXRpb25fNXRoX2N5Y2xlLlJkcyIpDQpgYGANCg0KIyMjIyAqKkZvdXJ0aCBzZXQqKiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvSW1wdXRhdGlvbi9SdW5uaW5nX2Nyb3NzX3ZhbGlkYXRpb25fNHRoX3NldC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9JbXB1dGF0aW9uL1J1bm5pbmdfY3Jvc3NfdmFsaWRhdGlvbl80dGhfc2V0LnBicyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQojIExvYWQgZnVuY3Rpb25zIGZvciB0aGUgQmF5ZXNpYW4gQXVnbWVudGF0aW9uIHdpdGggQ2hhaW4gRXF1YXRpb25zIChCQUNFKQ0Kc291cmNlKCJSL0ltcHV0YXRpb24vRnVuY3Rpb25zX0JBQ0UuUiIpDQoNCiMgTG9hZCBkYXRhIGFuZCB0cmVlDQp0cmVlPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KIyBMb2FkIGRhdGENCmRhdGFfZm9yX2ltcDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vZGF0YS9EYXRhX2Nyb3NzVl80dGhfc2V0LnJkcyIpDQoNCg0KDQojIFRyYW5zZm9ybSB2YXJpYWJsZXMNCg0KZGF0YV9mb3JfaW1wIDwtIGRhdGFfZm9yX2ltcCAlPiUgDQogIG11dGF0ZSgNCiAgICBhY2NsaW1hdGVkID0gZmFjdG9yKGFjY2xpbWF0ZWQpLA0KICAgIGxpZmVfc3RhZ2VfdGVzdGVkID0gZmFjdG9yKGxpZmVfc3RhZ2VfdGVzdGVkKSwNCiAgICBsbl9hY2NsaW1hdGlvbl90aW1lID0gbG9nKGFjY2xpbWF0aW9uX3RpbWUpLA0KICAgIGxuX3NkX1VUTCA9IGxvZyhzZF9VVEwpLA0KICAgIGxuX2JvZHlfbWFzcyA9IGxvZyhib2R5X21hc3MpLA0KICAgIG1lZGl1bV90ZXN0X3RlbXAyID0gZmFjdG9yKG1lZGl1bV90ZXN0X3RlbXApLA0KICAgIGxpZmVfc3RhZ2VfdGVzdGVkPWZhY3RvcihsaWZlX3N0YWdlX3Rlc3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoImFkdWx0IiwgImFkdWx0cyIsICJsYXJ2YWUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoImFkdWx0cyIsICJhZHVsdHMiLCAibGFydmFlIikpLCAjIENvcnJlY3QgdHlwbw0KICAgIGVuZHBvaW50MiA9IGZhY3RvcihlbmRwb2ludCwgDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJMUlIiLCAiT1MiLCAiTE9FIiwgInByb2RkaW5nIiwgIm90aGVyIiwgImRlYXRoIiksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJMUlIiLCAiT1MiLCAiTFJSIiwgIm90aGVyIiwgIm90aGVyIiwgIm90aGVyIikpICMgVGFrZSBMT0UgYXMgTFJSIA0KICApDQoNCmRhdGFfZm9yX2ltcDwtIGRwbHlyOjpzZWxlY3QoZGF0YV9mb3JfaW1wLCAtZmFtaWx5KSAjIFJlbW92ZSBmYW1pbHkgdG8gcnVuIE1DTUNnbG1tDQoNCmxlbmd0aCh1bmlxdWUoZGF0YV9mb3JfaW1wJHNwZWNpZXMpKQ0KDQojIE1ha2Ugc3VyZSBldmVyeXRoaW5nIG1hdGNoZXMNCg0KbWF0Y2hwb3MgPC0gbWF0Y2goZGF0YV9mb3JfaW1wJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpDQoNCmRhdGFfZm9yX2ltcCRtYXRjaHBvcyA8LSBtYXRjaHBvcw0KDQpkYXQgPC0gZGF0YV9mb3JfaW1wICU+JSBmaWx0ZXIoaXMubmEobWF0Y2hwb3MpID09IEYpIA0KDQp0cmVlX2ltcHV0YXRpb24gPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGRhdCR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICMgUHJ1bmVkIHRyZWUgdGhhdCBvbmx5IGNvbnRhaW5zIHNwZWNpZXMgaW4gdGhlIGRhdGEgDQoNCnRyZWVfaW1wdXRhdGlvbjwtZm9yY2UudWx0cmFtZXRyaWModHJlZV9pbXB1dGF0aW9uLCBtZXRob2Q9ImV4dGVuZCIpICMgRm9yY2UgdGhlIHRyZWUgdG8gYmUgdWx0cmFtZXRyaWMNCg0KIyBQaHlsb2dlbmV0aWMgY28tdmFyaWFuY2UgbWF0cml4DQpBaW52PC1pbnZlcnNlQSh0cmVlX2ltcHV0YXRpb24pJEFpbnYNCg0KIyBTdGFuZGFyZGl6ZSB2YXJpYWJsZXMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgYWNjbGltYXRpb25fdGVtcA0KZGF0JGFjY2xpbWF0aW9uX3RlbXBfc3RhbmQ8LSBzdGFuZChkYXQkYWNjbGltYXRpb25fdGVtcClbLDFdDQoNCiMgbWVhbl9VVEwNCm1lYW5fVVRMX21wb3MgPC0gaXMubmEoZGF0JG1lYW5fVVRMKSANCmRhdCRtZWFuX1VUTF9zdGFuZDEgPC0gc3RhbmQoZGF0JG1lYW5fVVRMKVssMV0NCmRhdCRtZWFuX1VUTF9zdGFuZDFbbWVhbl9VVExfbXBvc10gPC0gMA0KDQoNCiMgYWNjbGltYXRpb25fdGltZQ0KYWNjbGltYXRpb25fdGltZV9tcG9zIDwtIGlzLm5hKGRhdCRsbl9hY2NsaW1hdGlvbl90aW1lKQ0KZGF0JGxuX2FjY2xpbWF0aW9uX3RpbWVfc3RhbmQxIDwtIHN0YW5kKGRhdCRsbl9hY2NsaW1hdGlvbl90aW1lKVssMV0NCmRhdCRsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kMVthY2NsaW1hdGlvbl90aW1lX21wb3NdIDwtIDANCg0KIyByYW1waW5nDQpyYW1waW5nX21wb3MgPC0gaXMubmEoZGF0JHJhbXBpbmcpIA0KZGF0JHJhbXBpbmdfc3RhbmQxIDwtIHN0YW5kKGRhdCRyYW1waW5nKVssMV0NCmRhdCRyYW1waW5nX3N0YW5kMVtyYW1waW5nX21wb3NdIDwtIDANCg0KIyBtZWRpdW1fdGVzdF90ZW1wMiANCm1lZGl1bV90ZXN0X3RlbXAyX21wb3MgPC0gaXMubmEoZGF0JG1lZGl1bV90ZXN0X3RlbXAyKQ0KZGF0JG1lZGl1bV90ZXN0X3RlbXAyX2ZpbGwxIDwtIHNhbXBsZV9pbXAoZGF0JG1lZGl1bV90ZXN0X3RlbXAyKVtbMV1dDQoNCiMgc2RfVVRMIA0Kc2RfVVRMX21wb3MgPC0gaXMubmEoZGF0JGxuX3NkX1VUTCkNCmRhdCRsbl9zZF9VVExfc3RhbmQxIDwtIHN0YW5kKGRhdCRsbl9zZF9VVEwpWywxXQ0KZGF0JGxuX3NkX1VUTF9zdGFuZDFbc2RfVVRMX21wb3NdIDwtIDANCg0KIyBib2R5X21hc3MNCmJvZHlfbWFzc19tcG9zIDwtIGlzLm5hKGRhdCRsbl9ib2R5X21hc3MpDQpkYXQkbG5fYm9keV9tYXNzX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fYm9keV9tYXNzKVssMV0NCmRhdCRsbl9ib2R5X21hc3Nfc3RhbmQxW2JvZHlfbWFzc19tcG9zXSA8LSAwDQoNCiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBjeWNsZSAxDQpzeXN0ZW0udGltZShkYXQxX2Nyb3NzViA8LSBiX21pY2UoY3ljbGUgPSAxLCBkYXRhID0gZGF0LCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0MV9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzR0aF9jcm9zc192YWxpZGF0aW9uXzFzdF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIyMNCg0KIyBjeWNsZSAyDQpzeXN0ZW0udGltZShkYXQyX2Nyb3NzViA8LSBiX21pY2UoY3ljbGUgPSAyLCBkYXRhID0gZGF0MV9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQyX2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvNHRoX2Nyb3NzX3ZhbGlkYXRpb25fMm5kX2N5Y2xlLlJkcyIpDQoNCiMjIyMjIyMjDQoNCiMgY3ljbGUgMw0Kc3lzdGVtLnRpbWUoZGF0M19jcm9zc1Y8LSBiX21pY2UoY3ljbGUgPSAzLCBkYXRhID0gZGF0Ml9jcm9zc1YsIEFpbnYgPSBBaW52KSkNCg0Kc2F2ZVJEUyhkYXQzX2Nyb3NzViwgZmlsZSA9ICJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvNHRoX2Nyb3NzX3ZhbGlkYXRpb25fM3JkX2N5Y2xlLlJkcyIpDQoNCg0KIyMjIyMjIyMNCg0KIyBjeWNsZSA0DQpzeXN0ZW0udGltZShkYXQ0X2Nyb3NzVjwtIGJfbWljZShjeWNsZSA9IDQsIGRhdGEgPSBkYXQzX2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDRfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy80dGhfY3Jvc3NfdmFsaWRhdGlvbl80dGhfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMNCg0KIyBjeWNsZSA1DQpzeXN0ZW0udGltZShkYXQ1X2Nyb3NzVjwtIGJfbWljZShjeWNsZSA9IDUsIGRhdGEgPSBkYXQ0X2Nyb3NzViwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDVfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy80dGhfY3Jvc3NfdmFsaWRhdGlvbl81dGhfY3ljbGUuUmRzIikNCmBgYA0KDQojIyMjICoqRmlmdGggc2V0KiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0ltcHV0YXRpb24vUnVubmluZ19jcm9zc192YWxpZGF0aW9uXzV0aF9zZXQuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvSW1wdXRhdGlvbi9SdW5uaW5nX2Nyb3NzX3ZhbGlkYXRpb25fNXRoX3NldC5wYnMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyBMb2FkIGZ1bmN0aW9ucyBmb3IgdGhlIEJheWVzaWFuIEF1Z21lbnRhdGlvbiB3aXRoIENoYWluIEVxdWF0aW9ucyAoQkFDRSkNCnNvdXJjZSgiUi9JbXB1dGF0aW9uL0Z1bmN0aW9uc19CQUNFLlIiKQ0KDQojIExvYWQgZGF0YSBhbmQgdHJlZQ0KdHJlZTwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMgTG9hZCBkYXRhDQpkYXRhX2Zvcl9pbXA8LSByZWFkUkRTKCJSRGF0YS9JbXB1dGF0aW9uL2RhdGEvRGF0YV9jcm9zc1ZfNXRoX3NldC5yZHMiKQ0KDQoNCg0KIyBUcmFuc2Zvcm0gdmFyaWFibGVzDQoNCmRhdGFfZm9yX2ltcCA8LSBkYXRhX2Zvcl9pbXAgJT4lIA0KICBtdXRhdGUoDQogICAgYWNjbGltYXRlZCA9IGZhY3RvcihhY2NsaW1hdGVkKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZCA9IGZhY3RvcihsaWZlX3N0YWdlX3Rlc3RlZCksDQogICAgbG5fYWNjbGltYXRpb25fdGltZSA9IGxvZyhhY2NsaW1hdGlvbl90aW1lKSwNCiAgICBsbl9zZF9VVEwgPSBsb2coc2RfVVRMKSwNCiAgICBsbl9ib2R5X21hc3MgPSBsb2coYm9keV9tYXNzKSwNCiAgICBtZWRpdW1fdGVzdF90ZW1wMiA9IGZhY3RvcihtZWRpdW1fdGVzdF90ZW1wKSwNCiAgICBsaWZlX3N0YWdlX3Rlc3RlZD1mYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJhZHVsdCIsICJhZHVsdHMiLCAibGFydmFlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJhZHVsdHMiLCAiYWR1bHRzIiwgImxhcnZhZSIpKSwgIyBDb3JyZWN0IHR5cG8NCiAgICBlbmRwb2ludDIgPSBmYWN0b3IoZW5kcG9pbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiTFJSIiwgIk9TIiwgIkxPRSIsICJwcm9kZGluZyIsICJvdGhlciIsICJkZWF0aCIpLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTFJSIiwgIk9TIiwgIkxSUiIsICJvdGhlciIsICJvdGhlciIsICJvdGhlciIpKSAjIFRha2UgTE9FIGFzIExSUiANCiAgKQ0KDQpkYXRhX2Zvcl9pbXA8LSBkcGx5cjo6c2VsZWN0KGRhdGFfZm9yX2ltcCwgLWZhbWlseSkgIyBSZW1vdmUgZmFtaWx5IHRvIHJ1biBNQ01DZ2xtbQ0KDQpsZW5ndGgodW5pcXVlKGRhdGFfZm9yX2ltcCRzcGVjaWVzKSkNCg0KIyBNYWtlIHN1cmUgZXZlcnl0aGluZyBtYXRjaGVzDQoNCm1hdGNocG9zIDwtIG1hdGNoKGRhdGFfZm9yX2ltcCR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKQ0KDQpkYXRhX2Zvcl9pbXAkbWF0Y2hwb3MgPC0gbWF0Y2hwb3MNCg0KZGF0IDwtIGRhdGFfZm9yX2ltcCAlPiUgZmlsdGVyKGlzLm5hKG1hdGNocG9zKSA9PSBGKSANCg0KdHJlZV9pbXB1dGF0aW9uIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChkYXQkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAjIFBydW5lZCB0cmVlIHRoYXQgb25seSBjb250YWlucyBzcGVjaWVzIGluIHRoZSBkYXRhIA0KDQp0cmVlX2ltcHV0YXRpb248LWZvcmNlLnVsdHJhbWV0cmljKHRyZWVfaW1wdXRhdGlvbiwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCiMgUGh5bG9nZW5ldGljIGNvLXZhcmlhbmNlIG1hdHJpeA0KQWludjwtaW52ZXJzZUEodHJlZV9pbXB1dGF0aW9uKSRBaW52DQoNCiMgU3RhbmRhcmRpemUgdmFyaWFibGVzDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIGFjY2xpbWF0aW9uX3RlbXANCmRhdCRhY2NsaW1hdGlvbl90ZW1wX3N0YW5kPC0gc3RhbmQoZGF0JGFjY2xpbWF0aW9uX3RlbXApWywxXQ0KDQojIG1lYW5fVVRMDQptZWFuX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRtZWFuX1VUTCkgDQpkYXQkbWVhbl9VVExfc3RhbmQxIDwtIHN0YW5kKGRhdCRtZWFuX1VUTClbLDFdDQpkYXQkbWVhbl9VVExfc3RhbmQxW21lYW5fVVRMX21wb3NdIDwtIDANCg0KDQojIGFjY2xpbWF0aW9uX3RpbWUNCmFjY2xpbWF0aW9uX3RpbWVfbXBvcyA8LSBpcy5uYShkYXQkbG5fYWNjbGltYXRpb25fdGltZSkNCmRhdCRsbl9hY2NsaW1hdGlvbl90aW1lX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fYWNjbGltYXRpb25fdGltZSlbLDFdDQpkYXQkbG5fYWNjbGltYXRpb25fdGltZV9zdGFuZDFbYWNjbGltYXRpb25fdGltZV9tcG9zXSA8LSAwDQoNCiMgcmFtcGluZw0KcmFtcGluZ19tcG9zIDwtIGlzLm5hKGRhdCRyYW1waW5nKSANCmRhdCRyYW1waW5nX3N0YW5kMSA8LSBzdGFuZChkYXQkcmFtcGluZylbLDFdDQpkYXQkcmFtcGluZ19zdGFuZDFbcmFtcGluZ19tcG9zXSA8LSAwDQoNCiMgbWVkaXVtX3Rlc3RfdGVtcDIgDQptZWRpdW1fdGVzdF90ZW1wMl9tcG9zIDwtIGlzLm5hKGRhdCRtZWRpdW1fdGVzdF90ZW1wMikNCmRhdCRtZWRpdW1fdGVzdF90ZW1wMl9maWxsMSA8LSBzYW1wbGVfaW1wKGRhdCRtZWRpdW1fdGVzdF90ZW1wMilbWzFdXQ0KDQojIHNkX1VUTCANCnNkX1VUTF9tcG9zIDwtIGlzLm5hKGRhdCRsbl9zZF9VVEwpDQpkYXQkbG5fc2RfVVRMX3N0YW5kMSA8LSBzdGFuZChkYXQkbG5fc2RfVVRMKVssMV0NCmRhdCRsbl9zZF9VVExfc3RhbmQxW3NkX1VUTF9tcG9zXSA8LSAwDQoNCiMgYm9keV9tYXNzDQpib2R5X21hc3NfbXBvcyA8LSBpcy5uYShkYXQkbG5fYm9keV9tYXNzKQ0KZGF0JGxuX2JvZHlfbWFzc19zdGFuZDEgPC0gc3RhbmQoZGF0JGxuX2JvZHlfbWFzcylbLDFdDQpkYXQkbG5fYm9keV9tYXNzX3N0YW5kMVtib2R5X21hc3NfbXBvc10gPC0gMA0KDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgY3ljbGUgMQ0Kc3lzdGVtLnRpbWUoZGF0MV9jcm9zc1YgPC0gYl9taWNlKGN5Y2xlID0gMSwgZGF0YSA9IGRhdCwgQWludiA9IEFpbnYpKQ0KDQpzYXZlUkRTKGRhdDFfY3Jvc3NWLCBmaWxlID0gIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy81dGhfY3Jvc3NfdmFsaWRhdGlvbl8xc3RfY3ljbGUuUmRzIikNCg0KIyMjIyMjIyMjDQoNCiMgY3ljbGUgMg0Kc3lzdGVtLnRpbWUoZGF0Ml9jcm9zc1YgPC0gYl9taWNlKGN5Y2xlID0gMiwgZGF0YSA9IGRhdDFfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0Ml9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzV0aF9jcm9zc192YWxpZGF0aW9uXzJuZF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIw0KDQojIGN5Y2xlIDMNCnN5c3RlbS50aW1lKGRhdDNfY3Jvc3NWPC0gYl9taWNlKGN5Y2xlID0gMywgZGF0YSA9IGRhdDJfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0M19jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzV0aF9jcm9zc192YWxpZGF0aW9uXzNyZF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIw0KDQojIGN5Y2xlIDQNCnN5c3RlbS50aW1lKGRhdDRfY3Jvc3NWPC0gYl9taWNlKGN5Y2xlID0gNCwgZGF0YSA9IGRhdDNfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0NF9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzV0aF9jcm9zc192YWxpZGF0aW9uXzR0aF9jeWNsZS5SZHMiKQ0KDQojIyMjIyMjIw0KDQojIGN5Y2xlIDUNCnN5c3RlbS50aW1lKGRhdDVfY3Jvc3NWPC0gYl9taWNlKGN5Y2xlID0gNSwgZGF0YSA9IGRhdDRfY3Jvc3NWLCBBaW52ID0gQWludikpDQoNCnNhdmVSRFMoZGF0NV9jcm9zc1YsIGZpbGUgPSAiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzV0aF9jcm9zc192YWxpZGF0aW9uXzV0aF9jeWNsZS5SZHMiKQ0KYGBgDQoNCiMgKipQcmVkaWN0IENUbWF4IGFjcm9zcyB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlIG9mIGVhY2ggc3BlY2llcyoqIA0KDQojIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KIyMjICoqQ29tYmluZSBzcGVjaWVzIGRhdGEgd2l0aCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgbWVyZ2UgdGhlIGRpc3RyaWJ1dGlvbiBkYXRhIG9mIGVhY2ggc3BlY2llcyB3aXRoIHRoZSBkYWlseSB0ZW1wZXJhdHVyZXMgdGhleSBleHBlcmllbmNlIGluIGVhY2ggY29vcmRpbmF0ZSBkdXJpbmcgdGhlIHdhcm1lc3QgMy1tb250aCBwZXJpb2Qgb2YgZWFjaCB5ZWFyDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlLyoqIA0KDQpUaGVzZSBmaWxlcyBhcmUgbmFtZWQgYXMgKipDb21iaW5pbmdfc3BlY2llc19kYXRhX3dpdGhfdGVtcF9kYXRhX3N1YnN0cmF0ZSoqIGFuZCB0aGUgZmlsZSBzdWZmaXggZGVub3RlcyB0aGUgY2xpbWF0aWMgc2NlbmFyaW8gKCoqX2N1cnJlbnQqKiBmb3IgMjAwNi0yMDE1OyAqKl9mdXR1cmUyQyoqIGZvciArMiBkZWdyZWVzIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzOyBvciAqKl9mdXR1cmVfNEMqKiBmb3IgKzQgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscykuDQoNCiMjIyMgKipDdXJyZW50IGNsaW1hdGUqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyMjIERhaWx5IHRlbXBlcmF0dXJlIG9mIHRoZSB3YXJtZXN0IGRheXMNCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS9jdXJyZW50L2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZS5yZHMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KDQojIyMgUmVtb3ZlIHNwZWNpZXMgdGhhdCBhcmUgcGFlZG9tb3JwaGljIGFzIHRoZXkgbGl2ZSBleGNsdXNpdmVseSBpbiB3YXRlciANCnByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24gPC0gZHBseXI6OnNlbGVjdChwcmVfZGF0YV9mb3JfaW1wdXRhdGlvbiwgdGlwLmxhYmVsLCBzdHJhdGVneSkNCnBhZWRvbW9ycGhpY19zcGVjaWVzIDwtIGZpbHRlcihwcmVfZGF0YV9mb3JfaW1wdXRhdGlvbiwgc3RyYXRlZ3k9PSJQYWVkb21vcnBoaWMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2UgPC0gYW50aV9qb2luKHNwZWNpZXNfb2NjdXJyZW5jZSwgcGFlZG9tb3JwaGljX3NwZWNpZXMsIGJ5ID0gInRpcC5sYWJlbCIpDQoNCiMjIyBDb21iaW5lIGRhdGFzZXRzIA0Kc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cyA8LSBtZXJnZShkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgc3BlY2llc19vY2N1cnJlbmNlLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCg0Kc2F2ZVJEUyhzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KDQpgYGANCg0KIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCg0KYGBge3IsIGV2YWw9Rn0NCiMjIyBEYWlseSB0ZW1wZXJhdHVyZSBvZiB0aGUgd2FybWVzdCBkYXlzDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5czwtIHJlYWRSRFMoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvMkMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlXzJDLnJkcyIpDQoNCnNwZWNpZXNfb2NjdXJyZW5jZSA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQoNCiMjIyBSZW1vdmUgc3BlY2llcyB0aGF0IGFyZSBwYWVkb21vcnBoaWMgYXMgdGhleSBsaXZlIGV4Y2x1c2l2ZWx5IGluIHdhdGVyIA0KcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQpwcmVfZGF0YV9mb3JfaW1wdXRhdGlvbiA8LSBkcGx5cjo6c2VsZWN0KHByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLCB0aXAubGFiZWwsIHN0cmF0ZWd5KQ0KcGFlZG9tb3JwaGljX3NwZWNpZXMgPC0gZmlsdGVyKHByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLCBzdHJhdGVneT09IlBhZWRvbW9ycGhpYyIpDQoNCnNwZWNpZXNfb2NjdXJyZW5jZSA8LSBhbnRpX2pvaW4oc3BlY2llc19vY2N1cnJlbmNlLCBwYWVkb21vcnBoaWNfc3BlY2llcywgYnkgPSAidGlwLmxhYmVsIikNCg0KIyMjIENvbWJpbmUgZGF0YXNldHMgDQpzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzIDwtIG1lcmdlKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCBzcGVjaWVzX29jY3VycmVuY2UsIGJ5ID0gYygibG9uIiwgImxhdCIpKQ0KDQpzYXZlUkRTKHNwZWNpZXNfdGVtcF93YXJtZXN0X2RheXMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvMkMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCg0KYGBgDQoNCiMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQoNCmBgYHtyLCBldmFsPUZ9DQojIyMgRGFpbHkgdGVtcGVyYXR1cmUgb2YgdGhlIHdhcm1lc3QgZGF5cw0KZGFpbHlfdGVtcF93YXJtZXN0X2RheXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV80Qy5yZHMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2UgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KDQojIyMgUmVtb3ZlIHNwZWNpZXMgdGhhdCBhcmUgcGFlZG9tb3JwaGljIGFzIHRoZXkgbGl2ZSBleGNsdXNpdmVseSBpbiB3YXRlciANCnByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24gPC0gZHBseXI6OnNlbGVjdChwcmVfZGF0YV9mb3JfaW1wdXRhdGlvbiwgdGlwLmxhYmVsLCBzdHJhdGVneSkNCnBhZWRvbW9ycGhpY19zcGVjaWVzIDwtIGZpbHRlcihwcmVfZGF0YV9mb3JfaW1wdXRhdGlvbiwgc3RyYXRlZ3k9PSJQYWVkb21vcnBoaWMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2UgPC0gYW50aV9qb2luKHNwZWNpZXNfb2NjdXJyZW5jZSwgcGFlZG9tb3JwaGljX3NwZWNpZXMsIGJ5ID0gInRpcC5sYWJlbCIpDQoNCiMjIyBDb21iaW5lIGRhdGFzZXRzIA0Kc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cyA8LSBtZXJnZShkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgc3BlY2llc19vY2N1cnJlbmNlLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCg0Kc2F2ZVJEUyhzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQojIyMgKipQcmVkaWN0IENUbWF4IGFjcm9zcyB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlIG9mIGVhY2ggc3BlY2llcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpIZXJlLCB3ZSBydW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgZm9yIGVhY2ggc3BlY2llcyB0byBlc3RpbWF0ZSB0aGUgbW9kZWwgcGFyYW1ldGVycywgYW5kIHVzZSBtb2RlbCBwcmVkaWN0aW9ucyB0byBwcm9qZWN0IHRoZWlyIENUbWF4IGFjcm9zcyB0aGVpciByYW5nZSBvZiBkaXN0cmlidXRpb24uIFRoZXNlIHByZWRpY3Rpb25zIGFyZSBtYWRlIGFzc3VtaW5nIHRoYXQgYW5pbWFscyBhcmUgYWNjbGltYXRlZCB0byB0aGUgbWVhbiBvciBtYXhpbXVtIHdlZWtseSB0ZW1wZXJhdHVyZSBpbiBlYWNoIGRheSBzdXJ2ZXllZC4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlLyoqIA0KDQpUaGVzZSBmaWxlcyBhcmUgbmFtZWQgYXMgKipQcmVkaWN0aW5nX0NUbWF4X2Fjcm9zc19jb29yZGluYXRlc19zdWJzdHJhdGUqKiBhbmQgdGhlIGZpbGUgc3VmZml4IGRlbm90ZXMgdGhlIGNsaW1hdGljIHNjZW5hcmlvICgqKl9jdXJyZW50KiogZm9yIDIwMDYtMjAxNTsgKipfZnV0dXJlMkMqKiBmb3IgKzIgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVsczsgb3IgKipfZnV0dXJlXzRDKiogZm9yICs0IGRlZ3JlZXMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMpLg0KDQojIyMjICoqRnVuY3Rpb24gdG8gcnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIFJ1biBtZXRhLWFuYWx5dGljIG1vZGVscyB0byBjYWxjdWxhdGUgc3BlY2llcy1sZXZlbCBBUlIgYW5kIGludGVyY2VwdDsgYW5kIHByZWRpY3QgdGhlIENUbWF4IG9mIGVhY2ggZGF5IG9uY2UgYWNjbGltYXRlZCB0byB0aGUgbWVhbiBvciBtYXhpbXVtIHdlZWtseSB0ZW1wZXJhdHVyZQ0KDQpzcGVjaWVzX21ldGEgPC0gZnVuY3Rpb24oc3BlY2llc19uYW1lLCBzcGVjaWVzX2RhdGEsIHRlbXBfc3BlY2llcykgew0KICANCiAgY2F0KCJQcm9jZXNzaW5nOiIsIHNwZWNpZXNfbmFtZSwgIlxuIikNCiAgDQogIGRhdCA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsID09IHNwZWNpZXNfbmFtZSkNCiAgZGF0MiA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsID09IHNwZWNpZXNfbmFtZSkNCiAgDQogICMgRml0IGEgbWV0YS1hbmFseXRpYyBtb2RlbA0KICBmaXQgPC0gbWV0YWZvcjo6cm1hKHlpID0gQ1RtYXgsIA0KICAgICAgICAgICAgICAgICAgICAgIHNlaSA9IHNlLCANCiAgICAgICAgICAgICAgICAgICAgICBtb2QgPSB+IGFjY2xpbWF0aW9uX3RlbXAsIA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpDQogIA0KICBpbnRfc2xvcGUgPC0gY29lZihmaXQpDQogIHNlIDwtIGZpdCRzZQ0KICANCiAgY2F0KCJHZXQgbW9kZWwgY29lZmZpY2llbnRzOlxuIikNCiAgY29lZnMgPC0gZGF0YS5mcmFtZSh0aXAubGFiZWwgPSBkYXQkdGlwLmxhYmVsLA0KICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdCA9IGNvZWYoZml0KVsxXSwNCiAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRfc2UgPSBmaXQkc2VbMV0sDQogICAgICAgICAgICAgICAgICAgICAgc2xvcGUgPSBjb2VmKGZpdClbMl0sDQogICAgICAgICAgICAgICAgICAgICAgc2xvcGVfc2UgPSBmaXQkc2VbMl0pDQogIHByaW50KGhlYWQoY29lZnMpKQ0KICANCiAgDQogIHByZWRpY3Rpb25fbWVhbiA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhdDIkbWVhbl93ZWVrbHlfdGVtcCkNCiAgcHJlZGljdGlvbl9tYXggPC0gcHJlZGljdChmaXQsIG5ld21vZHMgPSBkYXQyJG1heF93ZWVrbHlfdGVtcCkNCiAgDQogIGNhdCgiR2VuZXJhdGUgcHJlZGljdGlvbnMsIG1lYW4gdGVtcDpcbiIpDQogIHByaW50KGhlYWQocHJlZGljdGlvbl9tZWFuKSkNCiAgY2F0KCJHZW5lcmF0ZSBwcmVkaWN0aW9ucywgbWF4IHRlbXA6XG4iKQ0KICBwcmludChoZWFkKHByZWRpY3Rpb25fbWF4KSkNCiAgDQogIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhdDIsIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fbWVhbiRwcmVkLCBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX21lYW4kc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQogIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQgPC0gZHBseXI6OnNlbGVjdCgoY2JpbmQoZGF0MiwgY2JpbmQocHJlZGljdGVkX0NUbWF4ID0gcHJlZGljdGlvbl9tYXgkcHJlZCwgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9tYXgkc2UpKSksIC1tZWFuX3dlZWtseV90ZW1wKQ0KICANCiAgcmV0dXJuKGxpc3QoY29lZnMsIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LCBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50KSkNCiAgDQp9DQoNCmBgYA0KDQojIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCiMjIyMjICoqTG9hZCBkYXRhKioNCmBgYHtyLCBldmFsPUZ9DQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpICANCg0KQ1RtYXhfZGF0YTwtIGRwbHlyOjpzZWxlY3QocmVzdWx0c19pbXB1dGF0aW9uLCBDVG1heD1maWxsZWRfbWVhbl9VVEw1LCBsb3dlckNJID0gbG93ZXJfbWVhbl9VVEwsIHVwcGVyQ0k9dXBwZXJfbWVhbl9VVEwsIGFjY2xpbWF0aW9uX3RlbXAsIHRpcC5sYWJlbCwgaW1wdXRlZCkgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJubyIpICMgT3JpZ2luYWwgZXhwZXJpbWVudGFsIGRhdGENCmltcHV0ZWRfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ieWVzIikgIyBJbXB1dGVkIGRhdGENCg0KIyBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3Igb2YgZWFjaCBvYnNlcnZhdGlvbg0KaW1wdXRlZF9kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUgDQogIG11dGF0ZShzZT0gKHVwcGVyQ0ktQ1RtYXgpLzEuOTYpDQoNCiMgR3JvdXAgZGF0YSBieSBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llczwtIHJlYWRSRFMoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9TdWJzdHJhdGUvY3VycmVudC9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsIDwtIGdzdWIoIl8iLCAiICIsIHRlbXBfc3BlY2llcyR0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJTY2luYXggeCBzaWduYXR1cyJdIDwtICJTY2luYXggeC1zaWduYXR1cyINCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJQcmlzdGltYW50aXMgdyBuaWdydW0iXSA8LSAiUHJpc3RpbWFudGlzIHctbmlncnVtIg0KDQojIEZpbmQgY29tbW9uIHNwZWNpZXMgYmV0d2VlbiBzcGVjaWVzX2RhdGEgYW5kIHRlbXBfc3BlY2llcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBwYWVkb21vcnBoaWMgc3BlY2llcyB3ZXJlIHRha2VuIG91dCBmcm9tIHN1YnN0cmF0ZSB0ZW1wZXJhdHVyZSBkYXRhDQpjb21tb25fc3BlY2llcyA8LSBpbnRlcnNlY3QodW5pcXVlKHNwZWNpZXNfZGF0YSR0aXAubGFiZWwpLCB1bmlxdWUodGVtcF9zcGVjaWVzJHRpcC5sYWJlbCkpDQoNCiMgRmlsdGVyIGJvdGggZGF0YXNldHMgdG8gaW5jbHVkZSBvbmx5IHRoZSBtYXRjaGluZyBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gc3BlY2llc19kYXRhICU+JSBmaWx0ZXIodGlwLmxhYmVsICVpbiUgY29tbW9uX3NwZWNpZXMpDQp0ZW1wX3NwZWNpZXMgPC0gdGVtcF9zcGVjaWVzICU+JSBmaWx0ZXIodGlwLmxhYmVsICVpbiUgY29tbW9uX3NwZWNpZXMpDQoNCnNhdmVSRFModGVtcF9zcGVjaWVzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlL2N1cnJlbnQvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19zdWJzdHJhdGVfY3VycmVudF9hZGoucmRzIikNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnRlbXBfc3BlY2llcyA8LSB0ZW1wX3NwZWNpZXMgJT4lIGRwbHlyOjpzZWxlY3QodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUiwgRE9ZLCBtYXhfdGVtcCwgbWVhbl93ZWVrbHlfdGVtcCwgbWF4X3dlZWtseV90ZW1wKQ0KYGBgDQoNCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyBpbiBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgQ3JlYXRlIGNodW5rcyBvZiAzIHNwZWNpZXMgYXQgYSB0aW1lDQpzcGVjaWVzX2xpc3QgPC0gdW5pcXVlKHNwZWNpZXNfZGF0YSR0aXAubGFiZWwpDQpjaHVua19zaXplIDwtIDMgDQpudW1fY2h1bmtzIDwtIGNlaWxpbmcobGVuZ3RoKHNwZWNpZXNfbGlzdCkgLyBjaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBzcGVjaWVzIGxpc3QgaW50byBjaHVua3MNCmNodW5rX3NwZWNpZXNfbGlzdCA8LSBzcGxpdChzcGVjaWVzX2xpc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCgxOmxlbmd0aChzcGVjaWVzX2xpc3QpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnVtX2NodW5rcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gRkFMU0UpKQ0KDQojIE5vdywgY3JlYXRlIGxhcmdlciBjaHVua3Mgb2Ygc21hbGwgY2h1bmtzDQojIFJ1bm5pbmcgYWxsIGNodW5rcyBhdCBvbmNlIHdpbGwgcmVxdWlyZSBhbiBlbm9ybW91cyBhbW91bnQgb2YgUkFNLCBzbyB3ZSBwcm9jZWVkIHdpdGggMTc1IGNodW5rcyBhdCBhIHRpbWUgaW4gMTAgYmF0Y2hlcy4NCmxhcmdlcl9jaHVua19zaXplIDwtIDE3NQ0KbnVtX2xhcmdlcl9jaHVua3MgPC0gY2VpbGluZyhudW1fY2h1bmtzIC8gbGFyZ2VyX2NodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIGNodW5rIGxpc3QgaW50byBsYXJnZXIgY2h1bmtzDQpsYXJnZXJfY2h1bmtfbGlzdCA8LSBzcGxpdChjaHVua19zcGVjaWVzX2xpc3QsIGN1dCgxOmxlbmd0aChjaHVua19zcGVjaWVzX2xpc3QpLCBicmVha3MgPSBudW1fbGFyZ2VyX2NodW5rcywgbGFiZWxzID0gRkFMU0UpKQ0KDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcgDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCg0KIyBMb2FkIHBhY2thZ2VzIG9uIG5vZGVzDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeShkcGx5cikNCiAgbGlicmFyeShtZXRhZm9yKQ0KfSkNCg0KIyBDaGVjayBwcm9jZXNzaW5nIHRpbWUNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBmaXJzdCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1sxXV0NCnJlc3VsdF9saXN0XzEgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMSA8LSBjKHJlc3VsdF9saXN0XzEsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF8xc3RfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1syXV0NCnJlc3VsdF9saXN0XzIgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMiA8LSBjKHJlc3VsdF9saXN0XzIsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzIpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF8ybmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzNdXQ0KcmVzdWx0X2xpc3RfMyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8zIDwtIGMocmVzdWx0X2xpc3RfMywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzNyZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNF1dDQpyZXN1bHRfbGlzdF80IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzQgPC0gYyhyZXN1bHRfbGlzdF80LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF80IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF80IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF80KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF80LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF80dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF80LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfNHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s1XV0NCnJlc3VsdF9saXN0XzUgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNSA8LSBjKHJlc3VsdF9saXN0XzUsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzUgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzUsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzUgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzUsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzUpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF81LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzV0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF81dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzZdXQ0KcmVzdWx0X2xpc3RfNiA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF82IDwtIGMocmVzdWx0X2xpc3RfNiwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF82IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfNiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNiwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfNiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNiwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNikNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzYsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF82dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfNnRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzZ0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbN11dDQpyZXN1bHRfbGlzdF83IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzcgPC0gYyhyZXN1bHRfbGlzdF83LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF83IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF83LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF83IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF83LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF83KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50Xzd0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF83LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF83dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF83LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfN3RoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s4XV0NCnJlc3VsdF9saXN0XzggPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfOCA8LSBjKHJlc3VsdF9saXN0XzgsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzggPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzgsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzggPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzgsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzgpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF84LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfOHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50Xzh0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF84dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzldXQ0KcmVzdWx0X2xpc3RfOSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF85IDwtIGMocmVzdWx0X2xpc3RfOSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF85IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfOSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfOSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfOSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzksIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF85dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfOXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50Xzl0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMTBdXQ0KcmVzdWx0X2xpc3RfMTAgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMTAgPC0gYyhyZXN1bHRfbGlzdF8xMCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF8xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEwIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xMCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMTApDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzEwdGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfMTAsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzEwdGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF8xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEwdGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KZ2MoKQ0KYGBgDQoNCiMjIyMjICoqQ29tYmluZSBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgQ29tYmluZSByZXN1bHRzIGZyb20gYWxsIGNodW5rcyBhbmQgc2F2ZSANCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnQgPC0gZGlzdGluY3QocmJpbmQoc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF8zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF82LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9jdXJyZW50XzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudF85LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnRfMTApKQ0KDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudCA8LSByYmluZChkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF8xLA0KICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzIsDQogICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfMywNCiAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF80LA0KICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzUsDQogICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfNiwNCiAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF83LA0KICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50XzgsDQogICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfOSwNCiAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF8xMCkNCg0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudCA8LSByYmluZChkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEsDQogICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfMiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF8zLA0KICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzQsDQogICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfNSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF82LA0KICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzcsDQogICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnRfOCwNCiAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF85LA0KICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50XzEwKQ0KDQoNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQoNCiMjIyMjICoqTG9hZCBkYXRhKioNCg0KYGBge3IsIGV2YWw9Rn0NCnJlc3VsdHNfaW1wdXRhdGlvbiA8LSByZWFkUkRTKCJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvaW1wdXRhdGlvbl81dGhfY3ljbGUuUmRzIikgIA0KDQpDVG1heF9kYXRhPC0gZHBseXI6OnNlbGVjdChyZXN1bHRzX2ltcHV0YXRpb24sIENUbWF4PWZpbGxlZF9tZWFuX1VUTDUsIGxvd2VyQ0kgPSBsb3dlcl9tZWFuX1VUTCwgdXBwZXJDST11cHBlcl9tZWFuX1VUTCwgYWNjbGltYXRpb25fdGVtcCwgdGlwLmxhYmVsLCBpbXB1dGVkKSAjIFNlbGVjdCByZWxldmFudCBjb2x1bW5zDQoNCm9yaWdpbmFsX2RhdGE8LWRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZD09Im5vIikgIyBPcmlnaW5hbCBleHBlcmltZW50YWwgZGF0YQ0KaW1wdXRlZF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJ5ZXMiKSAjIEltcHV0ZWQgZGF0YQ0KDQojIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiBlYWNoIG9ic2VydmF0aW9uDQppbXB1dGVkX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JSANCiAgbXV0YXRlKHNlPSAodXBwZXJDSS1DVG1heCkvMS45NikNCg0KIyBHcm91cCBkYXRhIGJ5IHNwZWNpZXMNCnNwZWNpZXNfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCkNCg0KdGVtcF9zcGVjaWVzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA8LSBnc3ViKCJfIiwgIiAiLCB0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iU2NpbmF4IHggc2lnbmF0dXMiXSA8LSAiU2NpbmF4IHgtc2lnbmF0dXMiDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iUHJpc3RpbWFudGlzIHcgbmlncnVtIl0gPC0gIlByaXN0aW1hbnRpcyB3LW5pZ3J1bSINCg0KIyBGaW5kIGNvbW1vbiBzcGVjaWVzIGJldHdlZW4gc3BlY2llc19kYXRhIGFuZCB0ZW1wX3NwZWNpZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcGFlZG9tb3JwaGljIHNwZWNpZXMgd2VyZSB0YWtlbiBvdXQgZnJvbSBzdWJzdHJhdGUgdGVtcGVyYXR1cmUgZGF0YQ0KY29tbW9uX3NwZWNpZXMgPC0gaW50ZXJzZWN0KHVuaXF1ZShzcGVjaWVzX2RhdGEkdGlwLmxhYmVsKSwgdW5pcXVlKHRlbXBfc3BlY2llcyR0aXAubGFiZWwpKQ0KDQojIEZpbHRlciBib3RoIGRhdGFzZXRzIHRvIGluY2x1ZGUgb25seSB0aGUgbWF0Y2hpbmcgc3BlY2llcw0Kc3BlY2llc19kYXRhIDwtIHNwZWNpZXNfZGF0YSAlPiUgZmlsdGVyKHRpcC5sYWJlbCAlaW4lIGNvbW1vbl9zcGVjaWVzKQ0KdGVtcF9zcGVjaWVzIDwtIHRlbXBfc3BlY2llcyAlPiUgZmlsdGVyKHRpcC5sYWJlbCAlaW4lIGNvbW1vbl9zcGVjaWVzKQ0KDQpzYXZlUkRTKHRlbXBfc3BlY2llcywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1N1YnN0cmF0ZS8yQy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3N1YnN0cmF0ZV9mdXR1cmUyQ19hZGoucmRzIikNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnRlbXBfc3BlY2llcyA8LSB0ZW1wX3NwZWNpZXMgJT4lIGRwbHlyOjpzZWxlY3QodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUiwgRE9ZLCBtYXhfdGVtcCwgbWVhbl93ZWVrbHlfdGVtcCwgbWF4X3dlZWtseV90ZW1wKQ0KYGBgDQoNCiMjIyMjICoqUnVuIHRoZSBtb2RlbHMgaW4gY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENyZWF0ZSBjaHVua3Mgb2YgMyBzcGVjaWVzIGF0IGEgdGltZQ0Kc3BlY2llc19saXN0IDwtIHVuaXF1ZShzcGVjaWVzX2RhdGEkdGlwLmxhYmVsKQ0KY2h1bmtfc2l6ZSA8LSAzIA0KbnVtX2NodW5rcyA8LSBjZWlsaW5nKGxlbmd0aChzcGVjaWVzX2xpc3QpIC8gY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgc3BlY2llcyBsaXN0IGludG8gY2h1bmtzDQpjaHVua19zcGVjaWVzX2xpc3QgPC0gc3BsaXQoc3BlY2llc19saXN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQoMTpsZW5ndGgoc3BlY2llc19saXN0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG51bV9jaHVua3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IEZBTFNFKSkNCg0KIyBOb3csIGNyZWF0ZSBsYXJnZXIgY2h1bmtzIG9mIHNtYWxsIGNodW5rcw0KIyBSdW5uaW5nIGFsbCBjaHVua3MgYXQgb25jZSB3aWxsIHJlcXVpcmUgYW4gZW5vcm1vdXMgYW1vdW50IG9mIFJBTSwgc28gd2UgcHJvY2VlZCB3aXRoIDE3NSBjaHVua3MgYXQgYSB0aW1lIGluIDEwIGJhdGNoZXMuDQpsYXJnZXJfY2h1bmtfc2l6ZSA8LSAxNzUNCm51bV9sYXJnZXJfY2h1bmtzIDwtIGNlaWxpbmcobnVtX2NodW5rcyAvIGxhcmdlcl9jaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBjaHVuayBsaXN0IGludG8gbGFyZ2VyIGNodW5rcw0KbGFyZ2VyX2NodW5rX2xpc3QgPC0gc3BsaXQoY2h1bmtfc3BlY2llc19saXN0LCBjdXQoMTpsZW5ndGgoY2h1bmtfc3BlY2llc19saXN0KSwgYnJlYWtzID0gbnVtX2xhcmdlcl9jaHVua3MsIGxhYmVscyA9IEZBTFNFKSkNCg0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nIA0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQoNCiMgTG9hZCBwYWNrYWdlcyBvbiBub2Rlcw0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkoZHBseXIpDQogIGxpYnJhcnkobWV0YWZvcikNCn0pDQoNCiMgQ2hlY2sgcHJvY2Vzc2luZyB0aW1lDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3IgZmlyc3QgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMV1dDQpyZXN1bHRfbGlzdF8xIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEgPC0gYyhyZXN1bHRfbGlzdF8xLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8xKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfMXN0X2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMl1dDQpyZXN1bHRfbGlzdF8yIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzIgPC0gYyhyZXN1bHRfbGlzdF8yLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8yKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfMm5kX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1szXV0NCnJlc3VsdF9saXN0XzMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMyA8LSBjKHJlc3VsdF9saXN0XzMsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzMpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18zcmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzRdXQ0KcmVzdWx0X2xpc3RfNCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF80IDwtIGMocmVzdWx0X2xpc3RfNCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ180IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ180dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzR0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNV1dDQpyZXN1bHRfbGlzdF81IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzUgPC0gYyhyZXN1bHRfbGlzdF81LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ181IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzUgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzUsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ181IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF81KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzV0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfNSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ181dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfNSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfNXRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s2XV0NCnJlc3VsdF9saXN0XzYgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNiA8LSBjKHJlc3VsdF9saXN0XzYsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfNiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNiwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzYpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfNnRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ182LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzZ0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ182LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ182dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzddXQ0KcmVzdWx0X2xpc3RfNyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF83IDwtIGMocmVzdWx0X2xpc3RfNywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ183IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF83LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ183dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzcsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfN3RoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzcsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzd0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbOF1dDQpyZXN1bHRfbGlzdF84IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzggPC0gYyhyZXN1bHRfbGlzdF84LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ184IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzggPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzgsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ184IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF84KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzh0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfOCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ184dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfOCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfOHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s5XV0NCnJlc3VsdF9saXN0XzkgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfOSA8LSBjKHJlc3VsdF9saXN0XzksIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfOSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzkpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfOXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ185LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzl0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ185LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ185dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzEwXV0NCnJlc3VsdF9saXN0XzEwIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEwIDwtIGMocmVzdWx0X2xpc3RfMTAsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzEwIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xMCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEwKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzEwLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzEwLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCmdjKCkNCg0KDQpgYGANCg0KIyMjIyMgKipDb21iaW5lIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDb21iaW5lIHJlc3VsdHMgZnJvbSBhbGwgY2h1bmtzIGFuZCBzYXZlIA0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDIDwtIGRpc3RpbmN0KHJiaW5kKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ180LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ183LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlMkNfOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQ18xMCkpDQoNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQyA8LSByYmluZChkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ181LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ184LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfMTApDQoNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDIDwtIHJiaW5kKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDXzEwKQ0KDQoNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCmBgYA0KDQoNCg0KIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCg0KIyMjIyMgKipMb2FkIGRhdGEqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpICANCg0KQ1RtYXhfZGF0YTwtIGRwbHlyOjpzZWxlY3QocmVzdWx0c19pbXB1dGF0aW9uLCBDVG1heD1maWxsZWRfbWVhbl9VVEw1LCBsb3dlckNJID0gbG93ZXJfbWVhbl9VVEwsIHVwcGVyQ0k9dXBwZXJfbWVhbl9VVEwsIGFjY2xpbWF0aW9uX3RlbXAsIHRpcC5sYWJlbCwgaW1wdXRlZCkgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJubyIpICMgT3JpZ2luYWwgZXhwZXJpbWVudGFsIGRhdGENCmltcHV0ZWRfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ieWVzIikgIyBJbXB1dGVkIGRhdGENCg0KIyBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3Igb2YgZWFjaCBvYnNlcnZhdGlvbg0KaW1wdXRlZF9kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUgDQogIG11dGF0ZShzZSA9ICh1cHBlckNJLUNUbWF4KS8xLjk2KQ0KDQojIEdyb3VwIGRhdGEgYnkgc3BlY2llcw0Kc3BlY2llc19kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsIDwtIGdzdWIoIl8iLCAiICIsIHRlbXBfc3BlY2llcyR0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJTY2luYXggeCBzaWduYXR1cyJdIDwtICJTY2luYXggeC1zaWduYXR1cyINCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJQcmlzdGltYW50aXMgdyBuaWdydW0iXSA8LSAiUHJpc3RpbWFudGlzIHctbmlncnVtIg0KDQojIEZpbmQgY29tbW9uIHNwZWNpZXMgYmV0d2VlbiBzcGVjaWVzX2RhdGEgYW5kIHRlbXBfc3BlY2llcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBwYWVkb21vcnBoaWMgc3BlY2llcyB3ZXJlIHRha2VuIG91dCBmcm9tIHN1YnN0cmF0ZSB0ZW1wZXJhdHVyZSBkYXRhDQpjb21tb25fc3BlY2llcyA8LSBpbnRlcnNlY3QodW5pcXVlKHNwZWNpZXNfZGF0YSR0aXAubGFiZWwpLCB1bmlxdWUodGVtcF9zcGVjaWVzJHRpcC5sYWJlbCkpDQoNCiMgRmlsdGVyIGJvdGggZGF0YXNldHMgdG8gaW5jbHVkZSBvbmx5IHRoZSBtYXRjaGluZyBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gc3BlY2llc19kYXRhICU+JSBmaWx0ZXIodGlwLmxhYmVsICVpbiUgY29tbW9uX3NwZWNpZXMpDQp0ZW1wX3NwZWNpZXMgPC0gdGVtcF9zcGVjaWVzICU+JSBmaWx0ZXIodGlwLmxhYmVsICVpbiUgY29tbW9uX3NwZWNpZXMpDQoNCnNhdmVSRFModGVtcF9zcGVjaWVzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvU3Vic3RyYXRlLzRDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDX2Fkai5yZHMiKQ0KDQojIFJ1biBtZXRhLWFuYWx5dGljIG1vZGVscyB0byBjYWxjdWxhdGUgc3BlY2llcy1sZXZlbCBBUlIgYW5kIGludGVyY2VwdDsgYW5kIHByZWRpY3QgdGhlIENUbWF4IG9mIGVhY2ggZGF5IG9uY2UgYWNjbGltYXRlZCB0byB0aGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCg0KdGVtcF9zcGVjaWVzIDwtIHRlbXBfc3BlY2llcyAlPiUgZHBseXI6OnNlbGVjdCh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSLCBET1ksIG1heF90ZW1wLCBtZWFuX3dlZWtseV90ZW1wLCBtYXhfd2Vla2x5X3RlbXApDQoNCmBgYA0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzIGluIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDcmVhdGUgY2h1bmtzIG9mIDMgc3BlY2llcyBhdCBhIHRpbWUNCnNwZWNpZXNfbGlzdCA8LSB1bmlxdWUoc3BlY2llc19kYXRhJHRpcC5sYWJlbCkNCmNodW5rX3NpemUgPC0gMyANCm51bV9jaHVua3MgPC0gY2VpbGluZyhsZW5ndGgoc3BlY2llc19saXN0KSAvIGNodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIHNwZWNpZXMgbGlzdCBpbnRvIGNodW5rcw0KY2h1bmtfc3BlY2llc19saXN0IDwtIHNwbGl0KHNwZWNpZXNfbGlzdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0KDE6bGVuZ3RoKHNwZWNpZXNfbGlzdCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBudW1fY2h1bmtzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBGQUxTRSkpDQoNCiMgTm93LCBjcmVhdGUgbGFyZ2VyIGNodW5rcyBvZiBzbWFsbCBjaHVua3MNCiMgUnVubmluZyBhbGwgY2h1bmtzIGF0IG9uY2Ugd2lsbCByZXF1aXJlIGFuIGVub3Jtb3VzIGFtb3VudCBvZiBSQU0sIHNvIHdlIHByb2NlZWQgd2l0aCAxNzUgY2h1bmtzIGF0IGEgdGltZSBpbiAxMCBiYXRjaGVzLg0KbGFyZ2VyX2NodW5rX3NpemUgPC0gMTc1DQpudW1fbGFyZ2VyX2NodW5rcyA8LSBjZWlsaW5nKG51bV9jaHVua3MgLyBsYXJnZXJfY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgY2h1bmsgbGlzdCBpbnRvIGxhcmdlciBjaHVua3MNCmxhcmdlcl9jaHVua19saXN0IDwtIHNwbGl0KGNodW5rX3NwZWNpZXNfbGlzdCwgY3V0KDE6bGVuZ3RoKGNodW5rX3NwZWNpZXNfbGlzdCksIGJyZWFrcyA9IG51bV9sYXJnZXJfY2h1bmtzLCBsYWJlbHMgPSBGQUxTRSkpDQoNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZyANCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KDQojIExvYWQgcGFja2FnZXMgb24gbm9kZXMNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KGRwbHlyKQ0KICBsaWJyYXJ5KG1ldGFmb3IpDQp9KQ0KDQojIENoZWNrIHByb2Nlc3NpbmcgdGltZQ0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIGZpcnN0IGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzFdXQ0KcmVzdWx0X2xpc3RfMSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8xIDwtIGMocmVzdWx0X2xpc3RfMSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzFzdF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzJdXQ0KcmVzdWx0X2xpc3RfMiA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8yIDwtIGMocmVzdWx0X2xpc3RfMiwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMikNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzJuZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbM11dDQpyZXN1bHRfbGlzdF8zIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzMgPC0gYyhyZXN1bHRfbGlzdF8zLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8zKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfM3JkX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s0XV0NCnJlc3VsdF9saXN0XzQgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNCA8LSBjKHJlc3VsdF9saXN0XzQsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzQpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q180dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzVdXQ0KcmVzdWx0X2xpc3RfNSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF81IDwtIGMocmVzdWx0X2xpc3RfNSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q181IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q181LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q181dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfNXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzV0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNl1dDQpyZXN1bHRfbGlzdF82IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzYgPC0gYyhyZXN1bHRfbGlzdF82LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF82KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzYsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzZ0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q182dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfNnRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s3XV0NCnJlc3VsdF9saXN0XzcgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNyA8LSBjKHJlc3VsdF9saXN0XzcsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzcpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfNywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfN3RoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzd0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q183dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzhdXQ0KcmVzdWx0X2xpc3RfOCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF84IDwtIGMocmVzdWx0X2xpc3RfOCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q184IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfOCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q184LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q184dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfOHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzh0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbOV1dDQpyZXN1bHRfbGlzdF85IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzkgPC0gYyhyZXN1bHRfbGlzdF85LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDXzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF85KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzksIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzl0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q185dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfOXRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1sxMF1dDQpyZXN1bHRfbGlzdF8xMCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8xMCA8LSBjKHJlc3VsdF9saXN0XzEwLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMTAgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEwLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMTAgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEwLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8xMCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3N1YnN0cmF0ZV9mdXR1cmU0Q18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNENfMTB0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMTAsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfMTB0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMTB0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQpnYygpDQpgYGANCg0KIyMjIyMgKipDb21iaW5lIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDb21iaW5lIHJlc3VsdHMgZnJvbSBhbGwgY2h1bmtzIGFuZCBzYXZlIA0KDQpzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNEMgPC0gZGlzdGluY3QocmJpbmQoc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDXzEwKSkNCg0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDIDwtIHJiaW5kKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q180LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q181LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q182LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q183LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q184LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q185LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q18xMCkNCg0KZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q182LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTRDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Q185LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfMTApDQoNCg0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9zdWJzdHJhdGVfZnV0dXJlNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvc3BlY2llc19BUlJfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCiMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCiMjIyAqKkNvbWJpbmUgc3BlY2llcyBkYXRhIHdpdGggb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCkhlcmUsIHdlIG1lcmdlIHRoZSBkaXN0cmlidXRpb24gZGF0YSBvZiBlYWNoIHNwZWNpZXMgd2l0aCB0aGUgZGFpbHkgdGVtcGVyYXR1cmVzIHRoZXkgZXhwZXJpZW5jZSBpbiBlYWNoIGNvb3JkaW5hdGUgZHVyaW5nIHRoZSB3YXJtZXN0IDMtbW9udGggcGVyaW9kIG9mIGVhY2ggeWVhcg0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC8qKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kLyoqIA0KDQpUaGVzZSBmaWxlcyBhcmUgbmFtZWQgYXMgKipDb21iaW5pbmdfc3BlY2llc19kYXRhX3dpdGhfdGVtcF9kYXRhX3BvbmQqKiBhbmQgdGhlIGZpbGUgc3VmZml4IGRlbm90ZXMgdGhlIGNsaW1hdGljIHNjZW5hcmlvICgqKl9jdXJyZW50KiogZm9yIDIwMDYtMjAxNTsgKipfZnV0dXJlMkMqKiBmb3IgKzIgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVsczsgb3IgKipfZnV0dXJlXzRDKiogZm9yICs0IGRlZ3JlZXMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMpLg0KDQojIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIyMgRGFpbHkgdGVtcGVyYXR1cmUgb2YgdGhlIHdhcm1lc3QgZGF5cw0KZGFpbHlfdGVtcF93YXJtZXN0X2RheXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC9jdXJyZW50L2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmQucmRzIikNCg0Kc3BlY2llc19vY2N1cnJlbmNlIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCg0Kc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cyA8LSBtZXJnZShkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgc3BlY2llc19vY2N1cnJlbmNlLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCg0Kc2F2ZVJEUyhzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC9jdXJyZW50L3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF9jdXJyZW50LnJkcyIpDQoNCmBgYA0KDQojIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyMjIERhaWx5IHRlbXBlcmF0dXJlIG9mIHRoZSB3YXJtZXN0IGRheXMNCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF8yQy5yZHMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2U8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQoNCnNwZWNpZXNfdGVtcF93YXJtZXN0X2RheXMgPC0gbWVyZ2UoZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIHNwZWNpZXNfb2NjdXJyZW5jZSwgYnkgPSBjKCJsb24iLCAibGF0IikpDQoNCnNhdmVSRFMoc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvMkMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kX2Z1dHVyZTJDLnJkcyIpDQoNCmBgYA0KDQojIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyMjIERhaWx5IHRlbXBlcmF0dXJlIG9mIHRoZSB3YXJtZXN0IGRheXMNCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF80Qy5yZHMiKQ0KDQpzcGVjaWVzX29jY3VycmVuY2U8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQoNCnNwZWNpZXNfdGVtcF93YXJtZXN0X2RheXMgPC0gbWVyZ2UoZGFpbHlfdGVtcF93YXJtZXN0X2RheXMsIHNwZWNpZXNfb2NjdXJyZW5jZSwgYnkgPSBjKCJsb24iLCAibGF0IikpDQoNCnNhdmVSRFMoc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvNEMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kX2Z1dHVyZTRDLnJkcyIpDQpgYGANCg0KIyMjICoqUHJlZGljdCBDVG1heCBhY3Jvc3MgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZSBvZiBlYWNoIHNwZWNpZXMqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCkhlcmUsIHdlIHJ1biBtZXRhLWFuYWx5dGljIG1vZGVscyBmb3IgZWFjaCBzcGVjaWVzIHRvIGVzdGltYXRlIHRoZSBtb2RlbCBwYXJhbWV0ZXJzLCBhbmQgdXNlIG1vZGVsIHByZWRpY3Rpb25zIHRvIHByb2plY3QgdGhlaXIgQ1RtYXggYWNyb3NzIHRoZWlyIHJhbmdlIG9mIGRpc3RyaWJ1dGlvbi4gVGhlc2UgcHJlZGljdGlvbnMgYXJlIG1hZGUgYXNzdW1pbmcgdGhhdCBhbmltYWxzIGFyZSBhY2NsaW1hdGVkIHRvIHRoZSBtZWFuIG9yIG1heGltdW0gd2Vla2x5IHRlbXBlcmF0dXJlIGluIGVhY2ggZGF5IHN1cnZleWVkLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC8qKiANCg0KVGhlc2UgZmlsZXMgYXJlIG5hbWVkIGFzICoqUHJlZGljdGluZ19DVG1heF9hY3Jvc3NfY29vcmRpbmF0ZXNfcG9uZCoqIGFuZCB0aGUgZmlsZSBzdWZmaXggZGVub3RlcyB0aGUgY2xpbWF0aWMgc2NlbmFyaW8gKCoqX2N1cnJlbnQqKiBmb3IgMjAwNi0yMDE1OyAqKl9mdXR1cmUyQyoqIGZvciArMiBkZWdyZWVzIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzOyBvciAqKl9mdXR1cmVfNEMqKiBmb3IgKzQgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscykuDQoNCiMjIyMgKipGdW5jdGlvbiB0byBydW4gbWV0YS1hbmFseXRpYyBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgUnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzIHRvIGNhbGN1bGF0ZSBzcGVjaWVzLWxldmVsIEFSUiBhbmQgaW50ZXJjZXB0OyBhbmQgcHJlZGljdCB0aGUgQ1RtYXggb2YgZWFjaCBkYXkgb25jZSBhY2NsaW1hdGVkIHRvIHRoZSBtZWFuIG9yIG1heGltdW0gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnNwZWNpZXNfbWV0YSA8LSBmdW5jdGlvbihzcGVjaWVzX25hbWUsIHNwZWNpZXNfZGF0YSwgdGVtcF9zcGVjaWVzKSB7DQogIA0KICBjYXQoIlByb2Nlc3Npbmc6Iiwgc3BlY2llc19uYW1lLCAiXG4iKQ0KICANCiAgZGF0IDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgPT0gc3BlY2llc19uYW1lKQ0KICBkYXQyIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgPT0gc3BlY2llc19uYW1lKQ0KICANCiAgIyBGaXQgYSBtZXRhLWFuYWx5dGljIG1vZGVsDQogIGZpdCA8LSBtZXRhZm9yOjpybWEoeWkgPSBDVG1heCwgDQogICAgICAgICAgICAgICAgICAgICAgc2VpID0gc2UsIA0KICAgICAgICAgICAgICAgICAgICAgIG1vZCA9IH4gYWNjbGltYXRpb25fdGVtcCwgDQogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkNCiAgDQogIGludF9zbG9wZSA8LSBjb2VmKGZpdCkNCiAgc2UgPC0gZml0JHNlDQogIA0KICBjYXQoIkdldCBtb2RlbCBjb2VmZmljaWVudHM6XG4iKQ0KICBjb2VmcyA8LSBkYXRhLmZyYW1lKHRpcC5sYWJlbCA9IGRhdCR0aXAubGFiZWwsDQogICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0ID0gY29lZihmaXQpWzFdLA0KICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdF9zZSA9IGZpdCRzZVsxXSwNCiAgICAgICAgICAgICAgICAgICAgICBzbG9wZSA9IGNvZWYoZml0KVsyXSwNCiAgICAgICAgICAgICAgICAgICAgICBzbG9wZV9zZSA9IGZpdCRzZVsyXSkNCiAgcHJpbnQoaGVhZChjb2VmcykpDQogIA0KICANCiAgcHJlZGljdGlvbl9tZWFuIDwtIHByZWRpY3QoZml0LCBuZXdtb2RzID0gZGF0MiRtZWFuX3dlZWtseV90ZW1wKQ0KICBwcmVkaWN0aW9uX21heCA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhdDIkbWF4X3dlZWtseV90ZW1wKQ0KICANCiAgY2F0KCJHZW5lcmF0ZSBwcmVkaWN0aW9ucywgbWVhbiB0ZW1wOlxuIikNCiAgcHJpbnQoaGVhZChwcmVkaWN0aW9uX21lYW4pKQ0KICBjYXQoIkdlbmVyYXRlIHByZWRpY3Rpb25zLCBtYXggdGVtcDpcbiIpDQogIHByaW50KGhlYWQocHJlZGljdGlvbl9tYXgpKQ0KICANCiAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhdDIsIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fbWVhbiRwcmVkLCBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX21lYW4kc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQogIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhdDIsIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fbWF4JHByZWQsIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb25fbWF4JHNlKSkpLCAtbWVhbl93ZWVrbHlfdGVtcCkNCiAgDQogIHJldHVybihsaXN0KGNvZWZzLCBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnQsIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50KSkNCiAgDQp9DQpgYGANCg0KIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQojIyMjIyAqKkxvYWQgZGF0YSoqDQpgYGB7ciwgZXZhbD1GfQ0KcmVzdWx0c19pbXB1dGF0aW9uIDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy9pbXB1dGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAgDQoNCkNUbWF4X2RhdGE8LSBkcGx5cjo6c2VsZWN0KHJlc3VsdHNfaW1wdXRhdGlvbiwgQ1RtYXg9ZmlsbGVkX21lYW5fVVRMNSwgbG93ZXJDSSA9IGxvd2VyX21lYW5fVVRMLCB1cHBlckNJPXVwcGVyX21lYW5fVVRMLCBhY2NsaW1hdGlvbl90ZW1wLCB0aXAubGFiZWwsIGltcHV0ZWQpICMgU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMNCg0Kb3JpZ2luYWxfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ibm8iKSAjIE9yaWdpbmFsIGV4cGVyaW1lbnRhbCBkYXRhDQppbXB1dGVkX2RhdGE8LWRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZD09InllcyIpICMgSW1wdXRlZCBkYXRhDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGVhY2ggb2JzZXJ2YXRpb24NCmltcHV0ZWRfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lIA0KICBtdXRhdGUoc2U9ICh1cHBlckNJLUNUbWF4KS8xLjk2KQ0KDQojIEdyb3VwIGRhdGEgYnkgc3BlY2llcw0Kc3BlY2llc19kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC9jdXJyZW50L3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF9jdXJyZW50LnJkcyIpDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsIDwtIGdzdWIoIl8iLCAiICIsIHRlbXBfc3BlY2llcyR0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJTY2luYXggeCBzaWduYXR1cyJdIDwtICJTY2luYXggeC1zaWduYXR1cyINCnRlbXBfc3BlY2llcyR0aXAubGFiZWxbdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA9PSJQcmlzdGltYW50aXMgdyBuaWdydW0iXSA8LSAiUHJpc3RpbWFudGlzIHctbmlncnVtIg0KDQpzYXZlUkRTKHRlbXBfc3BlY2llcywgZmlsZT0iUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL1BvbmQvY3VycmVudC9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfY3VycmVudF9hZGoucmRzIikNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnRlbXBfc3BlY2llcyA8LSB0ZW1wX3NwZWNpZXMgJT4lIGRwbHlyOjpzZWxlY3QodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUiwgRE9ZLCBtYXhfdGVtcCwgbWVhbl93ZWVrbHlfdGVtcCwgbWF4X3dlZWtseV90ZW1wKQ0KDQpgYGANCg0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzIGluIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDcmVhdGUgY2h1bmtzIG9mIDMgc3BlY2llcyBhdCBhIHRpbWUNCnNwZWNpZXNfbGlzdCA8LSB1bmlxdWUoc3BlY2llc19kYXRhJHRpcC5sYWJlbCkNCmNodW5rX3NpemUgPC0gMyANCm51bV9jaHVua3MgPC0gY2VpbGluZyhsZW5ndGgoc3BlY2llc19saXN0KSAvIGNodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIHNwZWNpZXMgbGlzdCBpbnRvIGNodW5rcw0KY2h1bmtfc3BlY2llc19saXN0IDwtIHNwbGl0KHNwZWNpZXNfbGlzdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0KDE6bGVuZ3RoKHNwZWNpZXNfbGlzdCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBudW1fY2h1bmtzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBGQUxTRSkpDQoNCiMgTm93LCBjcmVhdGUgbGFyZ2VyIGNodW5rcyBvZiBzbWFsbCBjaHVua3MNCiMgUnVubmluZyBhbGwgY2h1bmtzIGF0IG9uY2Ugd2lsbCByZXF1aXJlIGFuIGVub3Jtb3VzIGFtb3VudCBvZiBSQU0sIHNvIHdlIHByb2NlZWQgd2l0aCAxNzUgY2h1bmtzIGF0IGEgdGltZSBpbiAxMCBiYXRjaGVzLg0KbGFyZ2VyX2NodW5rX3NpemUgPC0gMTc1DQpudW1fbGFyZ2VyX2NodW5rcyA8LSBjZWlsaW5nKG51bV9jaHVua3MgLyBsYXJnZXJfY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgY2h1bmsgbGlzdCBpbnRvIGxhcmdlciBjaHVua3MNCmxhcmdlcl9jaHVua19saXN0IDwtIHNwbGl0KGNodW5rX3NwZWNpZXNfbGlzdCwgY3V0KDE6bGVuZ3RoKGNodW5rX3NwZWNpZXNfbGlzdCksIGJyZWFrcyA9IG51bV9sYXJnZXJfY2h1bmtzLCBsYWJlbHMgPSBGQUxTRSkpDQoNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZyANCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KDQojIExvYWQgcGFja2FnZXMgb24gbm9kZXMNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KGRwbHlyKQ0KICBsaWJyYXJ5KG1ldGFmb3IpDQp9KQ0KDQojIENoZWNrIHByb2Nlc3NpbmcgdGltZQ0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIGZpcnN0IGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzFdXQ0KcmVzdWx0X2xpc3RfMSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8xIDwtIGMocmVzdWx0X2xpc3RfMSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF8xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzFzdF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzJdXQ0KcmVzdWx0X2xpc3RfMiA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8yIDwtIGMocmVzdWx0X2xpc3RfMiwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF8yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMikNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzJuZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbM11dDQpyZXN1bHRfbGlzdF8zIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzMgPC0gYyhyZXN1bHRfbGlzdF8zLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF8zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8zKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF8zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfM3JkX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s0XV0NCnJlc3VsdF9saXN0XzQgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNCA8LSBjKHJlc3VsdF9saXN0XzQsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzQpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF80LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF80LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF80dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzVdXQ0KcmVzdWx0X2xpc3RfNSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF81IDwtIGMocmVzdWx0X2xpc3RfNSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF81IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF81LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfY3VycmVudF81dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzV0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNl1dDQpyZXN1bHRfbGlzdF82IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzYgPC0gYyhyZXN1bHRfbGlzdF82LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF82IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF82IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF82KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzYsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzZ0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF82dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfNnRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s3XV0NCnJlc3VsdF9saXN0XzcgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNyA8LSBjKHJlc3VsdF9saXN0XzcsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzcpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfNywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfN3RoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF83LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50Xzd0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF83LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF83dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzhdXQ0KcmVzdWx0X2xpc3RfOCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF84IDwtIGMocmVzdWx0X2xpc3RfOCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF84IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfOCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF84LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfY3VycmVudF84dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfOHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50Xzh0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbOV1dDQpyZXN1bHRfbGlzdF85IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzkgPC0gYyhyZXN1bHRfbGlzdF85LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF85IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF85IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF85KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzksIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9jdXJyZW50Xzl0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF85dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfOXRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1sxMF1dDQpyZXN1bHRfbGlzdF8xMCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8xMCA8LSBjKHJlc3VsdF9saXN0XzEwLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMTAgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEwLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfMTAgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEwLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8xMCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfMTB0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMTAsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMTB0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudF8xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2N1cnJlbnRfMTB0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQpnYygpDQoNCg0KYGBgDQoNCiMjIyMjICoqQ29tYmluZSBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCg0KIyBDb21iaW5lIHJlc3VsdHMgZnJvbSBhbGwgY2h1bmtzIGFuZCBzYXZlIA0Kc3BlY2llc19BUlJfcG9uZF9jdXJyZW50IDwtIGRpc3RpbmN0KHJiaW5kKHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF80LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF83LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9jdXJyZW50XzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2N1cnJlbnRfOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfY3VycmVudF8xMCkpDQoNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudCA8LSByYmluZChkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF8yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF81LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfY3VycmVudF84LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50XzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnRfMTApDQoNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50IDwtIHJiaW5kKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50XzEwKQ0KDQoNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3NwZWNpZXNfQVJSX3BvbmRfY3VycmVudC5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQoNCiMjIyMjICoqTG9hZCBkYXRhKioNCg0KYGBge3IsIGV2YWw9Rn0NCg0KcmVzdWx0c19pbXB1dGF0aW9uIDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy9pbXB1dGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAgDQoNCkNUbWF4X2RhdGE8LSBkcGx5cjo6c2VsZWN0KHJlc3VsdHNfaW1wdXRhdGlvbiwgQ1RtYXg9ZmlsbGVkX21lYW5fVVRMNSwgbG93ZXJDSSA9IGxvd2VyX21lYW5fVVRMLCB1cHBlckNJPXVwcGVyX21lYW5fVVRMLCBhY2NsaW1hdGlvbl90ZW1wLCB0aXAubGFiZWwsIGltcHV0ZWQpICMgU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMNCg0Kb3JpZ2luYWxfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ibm8iKSAjIE9yaWdpbmFsIGV4cGVyaW1lbnRhbCBkYXRhDQppbXB1dGVkX2RhdGE8LWRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZD09InllcyIpICMgSW1wdXRlZCBkYXRhDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGVhY2ggb2JzZXJ2YXRpb24NCmltcHV0ZWRfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lIA0KICBtdXRhdGUoc2U9ICh1cHBlckNJLUNUbWF4KS8xLjk2KQ0KDQojIEdyb3VwIGRhdGEgYnkgc3BlY2llcw0Kc3BlY2llc19kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfZnV0dXJlMkMucmRzIikNCnRlbXBfc3BlY2llcyR0aXAubGFiZWwgPC0gZ3N1YigiXyIsICIgIiwgdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCkNCg0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbFt0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsID09IlNjaW5heCB4IHNpZ25hdHVzIl0gPC0gIlNjaW5heCB4LXNpZ25hdHVzIg0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbFt0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsID09IlByaXN0aW1hbnRpcyB3IG5pZ3J1bSJdIDwtICJQcmlzdGltYW50aXMgdy1uaWdydW0iDQoNCnNhdmVSRFModGVtcF9zcGVjaWVzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvUG9uZC8yQy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfZnV0dXJlMkNfYWRqLnJkcyIpDQoNCiMgUnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzIHRvIGNhbGN1bGF0ZSBzcGVjaWVzLWxldmVsIEFSUiBhbmQgaW50ZXJjZXB0OyBhbmQgcHJlZGljdCB0aGUgQ1RtYXggb2YgZWFjaCBkYXkgb25jZSBhY2NsaW1hdGVkIHRvIHRoZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KDQp0ZW1wX3NwZWNpZXMgPC0gdGVtcF9zcGVjaWVzICU+JSBkcGx5cjo6c2VsZWN0KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIsIERPWSwgbWF4X3RlbXAsIG1lYW5fd2Vla2x5X3RlbXAsIG1heF93ZWVrbHlfdGVtcCkNCg0KYGBgDQoNCiMjIyMjICoqUnVuIHRoZSBtb2RlbHMgaW4gY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENyZWF0ZSBjaHVua3Mgb2YgMyBzcGVjaWVzIGF0IGEgdGltZQ0Kc3BlY2llc19saXN0IDwtIHVuaXF1ZShzcGVjaWVzX2RhdGEkdGlwLmxhYmVsKQ0KY2h1bmtfc2l6ZSA8LSAzIA0KbnVtX2NodW5rcyA8LSBjZWlsaW5nKGxlbmd0aChzcGVjaWVzX2xpc3QpIC8gY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgc3BlY2llcyBsaXN0IGludG8gY2h1bmtzDQpjaHVua19zcGVjaWVzX2xpc3QgPC0gc3BsaXQoc3BlY2llc19saXN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQoMTpsZW5ndGgoc3BlY2llc19saXN0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG51bV9jaHVua3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IEZBTFNFKSkNCg0KIyBOb3csIGNyZWF0ZSBsYXJnZXIgY2h1bmtzIG9mIHNtYWxsIGNodW5rcw0KIyBSdW5uaW5nIGFsbCBjaHVua3MgYXQgb25jZSB3aWxsIHJlcXVpcmUgYW4gZW5vcm1vdXMgYW1vdW50IG9mIFJBTSwgc28gd2UgcHJvY2VlZCB3aXRoIDE3NSBjaHVua3MgYXQgYSB0aW1lIGluIDEwIGJhdGNoZXMuDQpsYXJnZXJfY2h1bmtfc2l6ZSA8LSAxNzUNCm51bV9sYXJnZXJfY2h1bmtzIDwtIGNlaWxpbmcobnVtX2NodW5rcyAvIGxhcmdlcl9jaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBjaHVuayBsaXN0IGludG8gbGFyZ2VyIGNodW5rcw0KbGFyZ2VyX2NodW5rX2xpc3QgPC0gc3BsaXQoY2h1bmtfc3BlY2llc19saXN0LCBjdXQoMTpsZW5ndGgoY2h1bmtfc3BlY2llc19saXN0KSwgYnJlYWtzID0gbnVtX2xhcmdlcl9jaHVua3MsIGxhYmVscyA9IEZBTFNFKSkNCg0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nIA0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQoNCiMgTG9hZCBwYWNrYWdlcyBvbiBub2Rlcw0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkoZHBseXIpDQogIGxpYnJhcnkobWV0YWZvcikNCn0pDQoNCiMgQ2hlY2sgcHJvY2Vzc2luZyB0aW1lDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3IgZmlyc3QgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMV1dDQpyZXN1bHRfbGlzdF8xIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEgPC0gYyhyZXN1bHRfbGlzdF8xLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8xKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfMXN0X2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMl1dDQpyZXN1bHRfbGlzdF8yIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzIgPC0gYyhyZXN1bHRfbGlzdF8yLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8yKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfMm5kX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1szXV0NCnJlc3VsdF9saXN0XzMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMyA8LSBjKHJlc3VsdF9saXN0XzMsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzMpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18zcmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzRdXQ0KcmVzdWx0X2xpc3RfNCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF80IDwtIGMocmVzdWx0X2xpc3RfNCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ180dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzR0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNV1dDQpyZXN1bHRfbGlzdF81IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzUgPC0gYyhyZXN1bHRfbGlzdF81LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ181IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF81KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ181LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzV0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ181dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfNXRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s2XV0NCnJlc3VsdF9saXN0XzYgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNiA8LSBjKHJlc3VsdF9saXN0XzYsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzYpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzYsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfNnRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzZ0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ182dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzddXQ0KcmVzdWx0X2xpc3RfNyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF83IDwtIGMocmVzdWx0X2xpc3RfNywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfNywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ183dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfN3RoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzd0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbOF1dDQpyZXN1bHRfbGlzdF84IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzggPC0gYyhyZXN1bHRfbGlzdF84LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ184IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF84KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ184LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzh0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ184dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfOHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s5XV0NCnJlc3VsdF9saXN0XzkgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfOSA8LSBjKHJlc3VsdF9saXN0XzksIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzkpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzksIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfOXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzl0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ185dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzEwXV0NCnJlc3VsdF9saXN0XzEwIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEwIDwtIGMocmVzdWx0X2xpc3RfMTAsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzEwIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEwKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfMTAsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xMHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCmdjKCkNCmBgYA0KDQojIyMjIyAqKkNvbWJpbmUgY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENvbWJpbmUgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3MgYW5kIHNhdmUgDQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkMgPC0gZGlzdGluY3QocmJpbmQoc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ180LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ183LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkNfOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTJDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmUyQ18xMCkpDQoNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ180LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ183LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ18xMCkNCg0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDIDwtIHJiaW5kKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ180LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ183LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkNfOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQ18xMCkNCg0KDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlMkMucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQoNCmBgYA0KDQoNCg0KIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCg0KIyMjIyMgKipMb2FkIGRhdGEqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpICANCg0KQ1RtYXhfZGF0YTwtIGRwbHlyOjpzZWxlY3QocmVzdWx0c19pbXB1dGF0aW9uLCBDVG1heD1maWxsZWRfbWVhbl9VVEw1LCBsb3dlckNJID0gbG93ZXJfbWVhbl9VVEwsIHVwcGVyQ0k9dXBwZXJfbWVhbl9VVEwsIGFjY2xpbWF0aW9uX3RlbXAsIHRpcC5sYWJlbCwgaW1wdXRlZCkgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJubyIpICMgT3JpZ2luYWwgZXhwZXJpbWVudGFsIGRhdGENCmltcHV0ZWRfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ieWVzIikgIyBJbXB1dGVkIGRhdGENCg0KIyBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3Igb2YgZWFjaCBvYnNlcnZhdGlvbg0KaW1wdXRlZF9kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUgDQogIG11dGF0ZShzZT0gKHVwcGVyQ0ktQ1RtYXgpLzEuOTYpDQoNCiMgR3JvdXAgZGF0YSBieSBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llczwtIHJlYWRSRFMoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzRDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF9mdXR1cmU0Qy5yZHMiKQ0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA8LSBnc3ViKCJfIiwgIiAiLCB0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iU2NpbmF4IHggc2lnbmF0dXMiXSA8LSAiU2NpbmF4IHgtc2lnbmF0dXMiDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iUHJpc3RpbWFudGlzIHcgbmlncnVtIl0gPC0gIlByaXN0aW1hbnRpcyB3LW5pZ3J1bSINCg0Kc2F2ZVJEUyh0ZW1wX3NwZWNpZXMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9Qb25kLzRDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF9mdXR1cmU0Q19hZGoucmRzIikNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnRlbXBfc3BlY2llcyA8LSB0ZW1wX3NwZWNpZXMgJT4lIGRwbHlyOjpzZWxlY3QodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUiwgRE9ZLCBtYXhfdGVtcCwgbWVhbl93ZWVrbHlfdGVtcCwgbWF4X3dlZWtseV90ZW1wKQ0KYGBgDQoNCiMjIyMjICoqUnVuIHRoZSBtb2RlbHMgaW4gY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENyZWF0ZSBjaHVua3Mgb2YgMyBzcGVjaWVzIGF0IGEgdGltZQ0Kc3BlY2llc19saXN0IDwtIHVuaXF1ZShzcGVjaWVzX2RhdGEkdGlwLmxhYmVsKQ0KY2h1bmtfc2l6ZSA8LSAzIA0KbnVtX2NodW5rcyA8LSBjZWlsaW5nKGxlbmd0aChzcGVjaWVzX2xpc3QpIC8gY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgc3BlY2llcyBsaXN0IGludG8gY2h1bmtzDQpjaHVua19zcGVjaWVzX2xpc3QgPC0gc3BsaXQoc3BlY2llc19saXN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQoMTpsZW5ndGgoc3BlY2llc19saXN0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG51bV9jaHVua3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IEZBTFNFKSkNCg0KIyBOb3csIGNyZWF0ZSBsYXJnZXIgY2h1bmtzIG9mIHNtYWxsIGNodW5rcw0KIyBSdW5uaW5nIGFsbCBjaHVua3MgYXQgb25jZSB3aWxsIHJlcXVpcmUgYW4gZW5vcm1vdXMgYW1vdW50IG9mIFJBTSwgc28gd2UgcHJvY2VlZCB3aXRoIDE3NSBjaHVua3MgYXQgYSB0aW1lIGluIDEwIGJhdGNoZXMuDQpsYXJnZXJfY2h1bmtfc2l6ZSA8LSAxNzUNCm51bV9sYXJnZXJfY2h1bmtzIDwtIGNlaWxpbmcobnVtX2NodW5rcyAvIGxhcmdlcl9jaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBjaHVuayBsaXN0IGludG8gbGFyZ2VyIGNodW5rcw0KbGFyZ2VyX2NodW5rX2xpc3QgPC0gc3BsaXQoY2h1bmtfc3BlY2llc19saXN0LCBjdXQoMTpsZW5ndGgoY2h1bmtfc3BlY2llc19saXN0KSwgYnJlYWtzID0gbnVtX2xhcmdlcl9jaHVua3MsIGxhYmVscyA9IEZBTFNFKSkNCg0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nIA0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQoNCiMgTG9hZCBwYWNrYWdlcyBvbiBub2Rlcw0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkoZHBseXIpDQogIGxpYnJhcnkobWV0YWZvcikNCn0pDQoNCiMgQ2hlY2sgcHJvY2Vzc2luZyB0aW1lDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3IgZmlyc3QgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMV1dDQpyZXN1bHRfbGlzdF8xIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEgPC0gYyhyZXN1bHRfbGlzdF8xLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8xKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q18xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfMXN0X2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbMl1dDQpyZXN1bHRfbGlzdF8yIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzIgPC0gYyhyZXN1bHRfbGlzdF8yLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8yKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q18ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfMm5kX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1szXV0NCnJlc3VsdF9saXN0XzMgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMyA8LSBjKHJlc3VsdF9saXN0XzMsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzMpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18zcmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzRdXQ0KcmVzdWx0X2xpc3RfNCA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF80IDwtIGMocmVzdWx0X2xpc3RfNCwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNCkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q180dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzR0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNV1dDQpyZXN1bHRfbGlzdF81IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzUgPC0gYyhyZXN1bHRfbGlzdF81LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfNSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q181IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF81LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF81KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q181LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzV0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q181dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzUsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNXRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s2XV0NCnJlc3VsdF9saXN0XzYgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNiA8LSBjKHJlc3VsdF9saXN0XzYsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q182IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF82LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzYsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzYpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzYsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNnRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzZ0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q182dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzddXQ0KcmVzdWx0X2xpc3RfNyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF83IDwtIGMocmVzdWx0X2xpc3RfNywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzcgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzcsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfNykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q183dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfN3RoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q183LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzd0aF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbOF1dDQpyZXN1bHRfbGlzdF84IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzggPC0gYyhyZXN1bHRfbGlzdF84LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfOCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfOCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q184IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF84LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF84KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q184LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzh0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q184dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzgsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfOHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s5XV0NCnJlc3VsdF9saXN0XzkgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfOSA8LSBjKHJlc3VsdF9saXN0XzksIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q185IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF85LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzksIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzkpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzksIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfOXRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzl0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfOSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q185dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzEwXV0NCnJlc3VsdF9saXN0XzEwIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzEwIDwtIGMocmVzdWx0X2xpc3RfMTAsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzEwIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18xMCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMTAsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEwKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMTAsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q18xMHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18xMCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18xMHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCmdjKCkNCmBgYA0KDQojIyMjIyAqKkNvbWJpbmUgY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENvbWJpbmUgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3MgYW5kIHNhdmUgDQpzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDIDwtIGRpc3RpbmN0KHJiaW5kKHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q182LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfcG9uZF9mdXR1cmU0Q185LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX3BvbmRfZnV0dXJlNENfMTApKQ0KDQpkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDIDwtIHJiaW5kKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q182LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTRDXzgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q185LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfMTApDQoNCmRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0QyA8LSByYmluZChkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q181LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X3BvbmRfbWF4X2FjY19mdXR1cmU0Q184LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDXzksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNENfMTApDQoNCg0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9zcGVjaWVzX0FSUl9wb25kX2Z1dHVyZTRDLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9kYWlseV9DVG1heF9wb25kX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCiMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KIyMjICoqQ29tYmluZSBzcGVjaWVzIGRhdGEgd2l0aCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgbWVyZ2UgdGhlIGRpc3RyaWJ1dGlvbiBkYXRhIG9mIGVhY2ggc3BlY2llcyB3aXRoIHRoZSBkYWlseSB0ZW1wZXJhdHVyZXMgdGhleSBleHBlcmllbmNlIGluIGVhY2ggY29vcmRpbmF0ZSBkdXJpbmcgdGhlIHdhcm1lc3QgMy1tb250aCBwZXJpb2Qgb2YgZWFjaCB5ZWFyDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC8qKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC8qKiANCg0KVGhlc2UgZmlsZXMgYXJlIG5hbWVkIGFzICoqQ29tYmluaW5nX3NwZWNpZXNfZGF0YV93aXRoX3RlbXBfZGF0YV9hcmJvcmVhbCoqIGFuZCB0aGUgZmlsZSBzdWZmaXggZGVub3RlcyB0aGUgY2xpbWF0aWMgc2NlbmFyaW8gKCoqX2N1cnJlbnQqKiBmb3IgMjAwNi0yMDE1OyAqKl9mdXR1cmUyQyoqIGZvciArMiBkZWdyZWVzIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzOyBvciAqKl9mdXR1cmVfNEMqKiBmb3IgKzQgZGVncmVlcyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscykuDQoNCiMjIyMgKipDdXJyZW50IGNsaW1hdGUqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyMjIERhaWx5IHRlbXBlcmF0dXJlIG9mIHRoZSB3YXJtZXN0IGRheXMNCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsL2N1cnJlbnQvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWwucmRzIikNCg0Kc3BlY2llc19vY2N1cnJlbmNlIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCg0Kc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cyA8LSBtZXJnZShkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgc3BlY2llc19vY2N1cnJlbmNlLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCg0Kc2F2ZVJEUyhzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvY3VycmVudC9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYm9yZWFsX2N1cnJlbnQucmRzIikNCg0KYGBgDQoNCiMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQoNCmBgYHtyLCBldmFsPUZ9DQojIyMgRGFpbHkgdGVtcGVyYXR1cmUgb2YgdGhlIHdhcm1lc3QgZGF5cw0KZGFpbHlfdGVtcF93YXJtZXN0X2RheXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfMkMucmRzIikNCg0Kc3BlY2llc19vY2N1cnJlbmNlPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KDQpzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzIDwtIG1lcmdlKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCBzcGVjaWVzX29jY3VycmVuY2UsIGJ5ID0gYygibG9uIiwgImxhdCIpKQ0KDQpzYXZlUkRTKHNwZWNpZXNfdGVtcF93YXJtZXN0X2RheXMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC8yQy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQoNCmBgYA0KDQojIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KIyMjIERhaWx5IHRlbXBlcmF0dXJlIG9mIHRoZSB3YXJtZXN0IGRheXMNCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzRDL2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYm9yZWFsXzRDLnJkcyIpDQoNCnNwZWNpZXNfb2NjdXJyZW5jZTwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCg0Kc3BlY2llc190ZW1wX3dhcm1lc3RfZGF5cyA8LSBtZXJnZShkYWlseV90ZW1wX3dhcm1lc3RfZGF5cywgc3BlY2llc19vY2N1cnJlbmNlLCBieSA9IGMoImxvbiIsICJsYXQiKSkNCg0Kc2F2ZVJEUyhzcGVjaWVzX3RlbXBfd2FybWVzdF9kYXlzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqUHJlZGljdCBDVG1heCBhY3Jvc3MgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZSBvZiBlYWNoIHNwZWNpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgcnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzIGZvciBlYWNoIHNwZWNpZXMgdG8gZXN0aW1hdGUgdGhlIG1vZGVsIHBhcmFtZXRlcnMsIGFuZCB1c2UgbW9kZWwgcHJlZGljdGlvbnMgdG8gcHJvamVjdCB0aGVpciBDVG1heCBhY3Jvc3MgdGhlaXIgcmFuZ2Ugb2YgZGlzdHJpYnV0aW9uLiBUaGVzZSBwcmVkaWN0aW9ucyBhcmUgbWFkZSBhc3N1bWluZyB0aGF0IGFuaW1hbHMgYXJlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gb3IgbWF4aW11bSB3ZWVrbHkgdGVtcGVyYXR1cmUgaW4gZWFjaCBkYXkgc3VydmV5ZWQuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvKiogDQoNClRoZXNlIGZpbGVzIGFyZSBuYW1lZCBhcyAqKlByZWRpY3RpbmdfQ1RtYXhfYWNyb3NzX2Nvb3JkaW5hdGVzX2FyYm9yZWFsKiogYW5kIHRoZSBmaWxlIHN1ZmZpeCBkZW5vdGVzIHRoZSBjbGltYXRpYyBzY2VuYXJpbyAoKipfY3VycmVudCoqIGZvciAyMDA2LTIwMTU7ICoqX2Z1dHVyZTJDKiogZm9yICsyIGRlZ3JlZXMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHM7IG9yICoqX2Z1dHVyZV80QyoqIGZvciArNCBkZWdyZWVzIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzKS4NCg0KIyMjIyAqKkZ1bmN0aW9uIHRvIHJ1biBtZXRhLWFuYWx5dGljIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gb3IgbWF4aW11bSB3ZWVrbHkgdGVtcGVyYXR1cmUNCg0KIyMgQ3JlYXRlIGZ1bmN0aW9uDQpzcGVjaWVzX21ldGEgPC0gZnVuY3Rpb24oc3BlY2llc19uYW1lLCBzcGVjaWVzX2RhdGEsIHRlbXBfc3BlY2llcykgew0KICANCiAgY2F0KCJQcm9jZXNzaW5nOiIsIHNwZWNpZXNfbmFtZSwgIlxuIikNCiAgDQogIGRhdCA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsID09IHNwZWNpZXNfbmFtZSkNCiAgZGF0MiA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsID09IHNwZWNpZXNfbmFtZSkNCiAgDQogICMgRml0IGEgbWV0YS1hbmFseXRpYyBtb2RlbA0KICBmaXQgPC0gbWV0YWZvcjo6cm1hKHlpID0gQ1RtYXgsIA0KICAgICAgICAgICAgICAgICAgICAgIHNlaSA9IHNlLCANCiAgICAgICAgICAgICAgICAgICAgICBtb2QgPSB+IGFjY2xpbWF0aW9uX3RlbXAsIA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpDQogIA0KICBpbnRfc2xvcGUgPC0gY29lZihmaXQpDQogIHNlIDwtIGZpdCRzZQ0KICANCiAgY2F0KCJHZXQgbW9kZWwgY29lZmZpY2llbnRzOlxuIikNCiAgY29lZnMgPC0gZGF0YS5mcmFtZSh0aXAubGFiZWwgPSBkYXQkdGlwLmxhYmVsLA0KICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdCA9IGNvZWYoZml0KVsxXSwNCiAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRfc2UgPSBmaXQkc2VbMV0sDQogICAgICAgICAgICAgICAgICAgICAgc2xvcGUgPSBjb2VmKGZpdClbMl0sDQogICAgICAgICAgICAgICAgICAgICAgc2xvcGVfc2UgPSBmaXQkc2VbMl0pDQogIHByaW50KGhlYWQoY29lZnMpKQ0KICANCiAgDQogIHByZWRpY3Rpb25fbWVhbiA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhdDIkbWVhbl93ZWVrbHlfdGVtcCkNCiAgcHJlZGljdGlvbl9tYXggPC0gcHJlZGljdChmaXQsIG5ld21vZHMgPSBkYXQyJG1heF93ZWVrbHlfdGVtcCkNCiAgDQogIGNhdCgiR2VuZXJhdGUgcHJlZGljdGlvbnMsIG1lYW4gdGVtcDpcbiIpDQogIHByaW50KGhlYWQocHJlZGljdGlvbl9tZWFuKSkNCiAgY2F0KCJHZW5lcmF0ZSBwcmVkaWN0aW9ucywgbWF4IHRlbXA6XG4iKQ0KICBwcmludChoZWFkKHByZWRpY3Rpb25fbWF4KSkNCiAgDQogIGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQgPC0gZHBseXI6OnNlbGVjdCgoY2JpbmQoZGF0MiwgY2JpbmQocHJlZGljdGVkX0NUbWF4ID0gcHJlZGljdGlvbl9tZWFuJHByZWQsIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb25fbWVhbiRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCiAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhdDIsIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fbWF4JHByZWQsIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb25fbWF4JHNlKSkpLCAtbWVhbl93ZWVrbHlfdGVtcCkNCiAgDQogIHJldHVybihsaXN0KGNvZWZzLCBkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LCBkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQpKQ0KICANCn0NCmBgYA0KDQojIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCiMjIyMjICoqTG9hZCBkYXRhKioNCmBgYHtyLCBldmFsPUZ9DQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpICANCg0KQ1RtYXhfZGF0YTwtIGRwbHlyOjpzZWxlY3QocmVzdWx0c19pbXB1dGF0aW9uLCBDVG1heD1maWxsZWRfbWVhbl9VVEw1LCBsb3dlckNJID0gbG93ZXJfbWVhbl9VVEwsIHVwcGVyQ0k9dXBwZXJfbWVhbl9VVEwsIGFjY2xpbWF0aW9uX3RlbXAsIHRpcC5sYWJlbCwgaW1wdXRlZCkgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJubyIpICMgT3JpZ2luYWwgZXhwZXJpbWVudGFsIGRhdGENCmltcHV0ZWRfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ieWVzIikgIyBJbXB1dGVkIGRhdGENCg0KIyBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3Igb2YgZWFjaCBvYnNlcnZhdGlvbg0KaW1wdXRlZF9kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUgDQogIG11dGF0ZShzZT0gKHVwcGVyQ0ktQ1RtYXgpLzEuOTYpDQoNCiMgR3JvdXAgZGF0YSBieSBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwpDQoNCnRlbXBfc3BlY2llczwtIHJlYWRSRFMoIlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA8LSBnc3ViKCJfIiwgIiAiLCB0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iU2NpbmF4IHggc2lnbmF0dXMiXSA8LSAiU2NpbmF4IHgtc2lnbmF0dXMiDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iUHJpc3RpbWFudGlzIHcgbmlncnVtIl0gPC0gIlByaXN0aW1hbnRpcyB3LW5pZ3J1bSINCg0Kc2F2ZVJEUyh0ZW1wX3NwZWNpZXMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC9jdXJyZW50L3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfY3VycmVudF9hZGoucmRzIikNCg0Kc3BlY2llc19kYXRhIDwtIGZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIHRlbXBfc3BlY2llcyR0aXAubGFiZWwpDQoNCiMgUnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzIHRvIGNhbGN1bGF0ZSBzcGVjaWVzLWxldmVsIEFSUiBhbmQgaW50ZXJjZXB0OyBhbmQgcHJlZGljdCB0aGUgQ1RtYXggb2YgZWFjaCBkYXkgb25jZSBhY2NsaW1hdGVkIHRvIHRoZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KDQp0ZW1wX3NwZWNpZXMgPC0gdGVtcF9zcGVjaWVzICU+JSBkcGx5cjo6c2VsZWN0KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIsIERPWSwgbWF4X3RlbXAsIG1lYW5fd2Vla2x5X3RlbXAsIG1heF93ZWVrbHlfdGVtcCkNCg0KYGBgDQoNCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyBpbiBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgQ3JlYXRlIGNodW5rcyBvZiAzIHNwZWNpZXMgYXQgYSB0aW1lDQpzcGVjaWVzX2xpc3QgPC0gdW5pcXVlKHNwZWNpZXNfZGF0YSR0aXAubGFiZWwpDQpjaHVua19zaXplIDwtIDMgDQpudW1fY2h1bmtzIDwtIGNlaWxpbmcobGVuZ3RoKHNwZWNpZXNfbGlzdCkgLyBjaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBzcGVjaWVzIGxpc3QgaW50byBjaHVua3MNCmNodW5rX3NwZWNpZXNfbGlzdCA8LSBzcGxpdChzcGVjaWVzX2xpc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCgxOmxlbmd0aChzcGVjaWVzX2xpc3QpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnVtX2NodW5rcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gRkFMU0UpKQ0KDQojIE5vdywgY3JlYXRlIGxhcmdlciBjaHVua3Mgb2Ygc21hbGwgY2h1bmtzDQojIFJ1bm5pbmcgYWxsIGNodW5rcyBhdCBvbmNlIHdpbGwgcmVxdWlyZSBhbiBlbm9ybW91cyBhbW91bnQgb2YgUkFNLCBzbyB3ZSBwcm9jZWVkIHdpdGggMTc1IGNodW5rcyBhdCBhIHRpbWUgaW4gMTAgYmF0Y2hlcy4NCmxhcmdlcl9jaHVua19zaXplIDwtIDE3NQ0KbnVtX2xhcmdlcl9jaHVua3MgPC0gY2VpbGluZyhudW1fY2h1bmtzIC8gbGFyZ2VyX2NodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIGNodW5rIGxpc3QgaW50byBsYXJnZXIgY2h1bmtzDQpsYXJnZXJfY2h1bmtfbGlzdCA8LSBzcGxpdChjaHVua19zcGVjaWVzX2xpc3QsIGN1dCgxOmxlbmd0aChjaHVua19zcGVjaWVzX2xpc3QpLCBicmVha3MgPSBudW1fbGFyZ2VyX2NodW5rcywgbGFiZWxzID0gRkFMU0UpKQ0KDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcgDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCg0KIyBMb2FkIHBhY2thZ2VzIG9uIG5vZGVzDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeShkcGx5cikNCiAgbGlicmFyeShtZXRhZm9yKQ0KfSkNCg0KIyBDaGVjayBwcm9jZXNzaW5nIHRpbWUNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBmaXJzdCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1sxXV0NCnJlc3VsdF9saXN0XzEgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMSA8LSBjKHJlc3VsdF9saXN0XzEsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfYXJib3JlYWxfY3VycmVudF8xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50XzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50XzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfY3VycmVudF8xc3RfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1syXV0NCnJlc3VsdF9saXN0XzIgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMiA8LSBjKHJlc3VsdF9saXN0XzIsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfYXJib3JlYWxfY3VycmVudF8yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzIpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50XzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50XzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfY3VycmVudF8ybmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzNdXQ0KcmVzdWx0X2xpc3RfMyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8zIDwtIGMocmVzdWx0X2xpc3RfMywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50XzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50XzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfYXJib3JlYWxfY3VycmVudF8zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfY3VycmVudF8zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzNyZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNF1dDQpyZXN1bHRfbGlzdF80IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzQgPC0gYyhyZXN1bHRfbGlzdF80LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfY3VycmVudF80IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF80KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfYXJib3JlYWxfY3VycmVudF80LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50XzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50XzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF80dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfNHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCmdjKCkNCmBgYA0KDQojIyMjIyAqKkNvbWJpbmUgY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENvbWJpbmUgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3MgYW5kIHNhdmUgDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50IDwtIGRpc3RpbmN0KHJiaW5kKHNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX2FyYm9yZWFsX2N1cnJlbnRfNCkpDQoNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF8zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF80KQ0KDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfY3VycmVudF8yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50XzQpDQoNCg0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9zcGVjaWVzX0FSUl9hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCmBgYA0KDQoNCiMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQoNCiMjIyMjICoqTG9hZCBkYXRhKioNCg0KYGBge3IsIGV2YWw9Rn0NCnJlc3VsdHNfaW1wdXRhdGlvbiA8LSByZWFkUkRTKCJSRGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvaW1wdXRhdGlvbl81dGhfY3ljbGUuUmRzIikgIA0KDQpDVG1heF9kYXRhPC0gZHBseXI6OnNlbGVjdChyZXN1bHRzX2ltcHV0YXRpb24sIENUbWF4PWZpbGxlZF9tZWFuX1VUTDUsIGxvd2VyQ0kgPSBsb3dlcl9tZWFuX1VUTCwgdXBwZXJDST11cHBlcl9tZWFuX1VUTCwgYWNjbGltYXRpb25fdGVtcCwgdGlwLmxhYmVsLCBpbXB1dGVkKSAjIFNlbGVjdCByZWxldmFudCBjb2x1bW5zDQoNCm9yaWdpbmFsX2RhdGE8LWRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZD09Im5vIikgIyBPcmlnaW5hbCBleHBlcmltZW50YWwgZGF0YQ0KaW1wdXRlZF9kYXRhPC1kcGx5cjo6ZmlsdGVyKENUbWF4X2RhdGEsIGltcHV0ZWQ9PSJ5ZXMiKSAjIEltcHV0ZWQgZGF0YQ0KDQojIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiBlYWNoIG9ic2VydmF0aW9uDQppbXB1dGVkX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JSANCiAgbXV0YXRlKHNlPSAodXBwZXJDSS1DVG1heCkvMS45NikNCg0KIyBHcm91cCBkYXRhIGJ5IHNwZWNpZXMNCnNwZWNpZXNfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCkNCg0KdGVtcF9zcGVjaWVzPC0gcmVhZFJEUygiUkRhdGEvQmlvcGh5c2ljYWxfbW9kZWxsaW5nL0FyYm9yZWFsLzJDL3NwZWNpZXNfZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnRlbXBfc3BlY2llcyR0aXAubGFiZWwgPC0gZ3N1YigiXyIsICIgIiwgdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCkNCg0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbFt0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsID09IlNjaW5heCB4IHNpZ25hdHVzIl0gPC0gIlNjaW5heCB4LXNpZ25hdHVzIg0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbFt0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsID09IlByaXN0aW1hbnRpcyB3IG5pZ3J1bSJdIDwtICJQcmlzdGltYW50aXMgdy1uaWdydW0iDQoNCnNhdmVSRFModGVtcF9zcGVjaWVzLCBmaWxlPSJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvMkMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJvcmVhbF9mdXR1cmUyQ19hZGoucmRzIikNCg0Kc3BlY2llc19kYXRhIDwtIGZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIHRlbXBfc3BlY2llcyR0aXAubGFiZWwpDQoNCiMgUnVuIG1ldGEtYW5hbHl0aWMgbW9kZWxzIHRvIGNhbGN1bGF0ZSBzcGVjaWVzLWxldmVsIEFSUiBhbmQgaW50ZXJjZXB0OyBhbmQgcHJlZGljdCB0aGUgQ1RtYXggb2YgZWFjaCBkYXkgb25jZSBhY2NsaW1hdGVkIHRvIHRoZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KDQp0ZW1wX3NwZWNpZXMgPC0gdGVtcF9zcGVjaWVzICU+JSBkcGx5cjo6c2VsZWN0KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIsIERPWSwgbWF4X3RlbXAsIG1lYW5fd2Vla2x5X3RlbXAsIG1heF93ZWVrbHlfdGVtcCkNCmBgYA0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzIGluIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDcmVhdGUgY2h1bmtzIG9mIDMgc3BlY2llcyBhdCBhIHRpbWUNCnNwZWNpZXNfbGlzdCA8LSB1bmlxdWUoc3BlY2llc19kYXRhJHRpcC5sYWJlbCkNCmNodW5rX3NpemUgPC0gMyANCm51bV9jaHVua3MgPC0gY2VpbGluZyhsZW5ndGgoc3BlY2llc19saXN0KSAvIGNodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIHNwZWNpZXMgbGlzdCBpbnRvIGNodW5rcw0KY2h1bmtfc3BlY2llc19saXN0IDwtIHNwbGl0KHNwZWNpZXNfbGlzdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0KDE6bGVuZ3RoKHNwZWNpZXNfbGlzdCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBudW1fY2h1bmtzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBGQUxTRSkpDQoNCiMgTm93LCBjcmVhdGUgbGFyZ2VyIGNodW5rcyBvZiBzbWFsbCBjaHVua3MNCiMgUnVubmluZyBhbGwgY2h1bmtzIGF0IG9uY2Ugd2lsbCByZXF1aXJlIGFuIGVub3Jtb3VzIGFtb3VudCBvZiBSQU0sIHNvIHdlIHByb2NlZWQgd2l0aCAxNzUgY2h1bmtzIGF0IGEgdGltZSBpbiAxMCBiYXRjaGVzLg0KbGFyZ2VyX2NodW5rX3NpemUgPC0gMTc1DQpudW1fbGFyZ2VyX2NodW5rcyA8LSBjZWlsaW5nKG51bV9jaHVua3MgLyBsYXJnZXJfY2h1bmtfc2l6ZSkNCg0KIyBTcGxpdCB0aGUgY2h1bmsgbGlzdCBpbnRvIGxhcmdlciBjaHVua3MNCmxhcmdlcl9jaHVua19saXN0IDwtIHNwbGl0KGNodW5rX3NwZWNpZXNfbGlzdCwgY3V0KDE6bGVuZ3RoKGNodW5rX3NwZWNpZXNfbGlzdCksIGJyZWFrcyA9IG51bV9sYXJnZXJfY2h1bmtzLCBsYWJlbHMgPSBGQUxTRSkpDQoNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZyANCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KDQojIExvYWQgcGFja2FnZXMgb24gbm9kZXMNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KGRwbHlyKQ0KICBsaWJyYXJ5KG1ldGFmb3IpDQp9KQ0KDQojIENoZWNrIHByb2Nlc3NpbmcgdGltZQ0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIGZpcnN0IGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzFdXQ0KcmVzdWx0X2xpc3RfMSA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8xIDwtIGMocmVzdWx0X2xpc3RfMSwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ18xIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8xLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMSkNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTJDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ18xc3RfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfMSwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDXzFzdF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzJdXQ0KcmVzdWx0X2xpc3RfMiA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8yIDwtIGMocmVzdWx0X2xpc3RfMiwgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ18yIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8yLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMikNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTJDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ18ybmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfMiwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDXzJuZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbM11dDQpyZXN1bHRfbGlzdF8zIDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzMgPC0gYyhyZXN1bHRfbGlzdF8zLCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTJDXzMgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF8zKQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkNfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTJDXzNyZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ18zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ18zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ18zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfM3JkX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1s0XV0NCnJlc3VsdF9saXN0XzQgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfNCA8LSBjKHJlc3VsdF9saXN0XzQsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkNfNCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfNCwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzQpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkNfNHRoX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDXzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDXzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDXzQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ180dGhfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyMgKipDb21iaW5lIGNodW5rcyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBDb21iaW5lIHJlc3VsdHMgZnJvbSBhbGwgY2h1bmtzIGFuZCBzYXZlIA0Kc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkMgPC0gZGlzdGluY3QocmJpbmQoc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkNfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQ18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTJDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkNfNCkpDQoNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDIDwtIHJiaW5kKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDXzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDXzQpDQoNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkMgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ18zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQ180KQ0KDQoNCnNhdmVSRFMoc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9zcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCmBgYA0KDQoNCg0KIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCg0KIyMjIyMgKipMb2FkIGRhdGEqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KcmVzdWx0c19pbXB1dGF0aW9uIDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy9pbXB1dGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAgDQoNCkNUbWF4X2RhdGE8LSBkcGx5cjo6c2VsZWN0KHJlc3VsdHNfaW1wdXRhdGlvbiwgQ1RtYXg9ZmlsbGVkX21lYW5fVVRMNSwgbG93ZXJDSSA9IGxvd2VyX21lYW5fVVRMLCB1cHBlckNJPXVwcGVyX21lYW5fVVRMLCBhY2NsaW1hdGlvbl90ZW1wLCB0aXAubGFiZWwsIGltcHV0ZWQpICMgU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMNCg0Kb3JpZ2luYWxfZGF0YTwtZHBseXI6OmZpbHRlcihDVG1heF9kYXRhLCBpbXB1dGVkPT0ibm8iKSAjIE9yaWdpbmFsIGV4cGVyaW1lbnRhbCBkYXRhDQppbXB1dGVkX2RhdGE8LWRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZD09InllcyIpICMgSW1wdXRlZCBkYXRhDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGVhY2ggb2JzZXJ2YXRpb24NCmltcHV0ZWRfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lIA0KICBtdXRhdGUoc2U9ICh1cHBlckNJLUNUbWF4KS8xLjk2KQ0KDQojIEdyb3VwIGRhdGEgYnkgc3BlY2llcw0Kc3BlY2llc19kYXRhIDwtIGltcHV0ZWRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXM8LSByZWFkUkRTKCJSRGF0YS9CaW9waHlzaWNhbF9tb2RlbGxpbmcvQXJib3JlYWwvNEMvc3BlY2llc19kYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCA8LSBnc3ViKCJfIiwgIiAiLCB0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsKQ0KDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iU2NpbmF4IHggc2lnbmF0dXMiXSA8LSAiU2NpbmF4IHgtc2lnbmF0dXMiDQp0ZW1wX3NwZWNpZXMkdGlwLmxhYmVsW3RlbXBfc3BlY2llcyR0aXAubGFiZWwgPT0iUHJpc3RpbWFudGlzIHcgbmlncnVtIl0gPC0gIlByaXN0aW1hbnRpcyB3LW5pZ3J1bSINCg0Kc2F2ZVJEUyh0ZW1wX3NwZWNpZXMsIGZpbGU9IlJEYXRhL0Jpb3BoeXNpY2FsX21vZGVsbGluZy9BcmJvcmVhbC80Qy9zcGVjaWVzX2RhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYm9yZWFsX2Z1dHVyZTRDX2Fkai5yZHMiKQ0KDQpzcGVjaWVzX2RhdGEgPC0gZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgdGVtcF9zcGVjaWVzJHRpcC5sYWJlbCkNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbHMgdG8gY2FsY3VsYXRlIHNwZWNpZXMtbGV2ZWwgQVJSIGFuZCBpbnRlcmNlcHQ7IGFuZCBwcmVkaWN0IHRoZSBDVG1heCBvZiBlYWNoIGRheSBvbmNlIGFjY2xpbWF0ZWQgdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQoNCnRlbXBfc3BlY2llcyA8LSB0ZW1wX3NwZWNpZXMgJT4lIGRwbHlyOjpzZWxlY3QodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUiwgRE9ZLCBtYXhfdGVtcCwgbWVhbl93ZWVrbHlfdGVtcCwgbWF4X3dlZWtseV90ZW1wKQ0KDQpgYGANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyBpbiBjaHVua3MqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgQ3JlYXRlIGNodW5rcyBvZiAzIHNwZWNpZXMgYXQgYSB0aW1lDQpzcGVjaWVzX2xpc3QgPC0gdW5pcXVlKHNwZWNpZXNfZGF0YSR0aXAubGFiZWwpDQpjaHVua19zaXplIDwtIDMgDQpudW1fY2h1bmtzIDwtIGNlaWxpbmcobGVuZ3RoKHNwZWNpZXNfbGlzdCkgLyBjaHVua19zaXplKQ0KDQojIFNwbGl0IHRoZSBzcGVjaWVzIGxpc3QgaW50byBjaHVua3MNCmNodW5rX3NwZWNpZXNfbGlzdCA8LSBzcGxpdChzcGVjaWVzX2xpc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCgxOmxlbmd0aChzcGVjaWVzX2xpc3QpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnVtX2NodW5rcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gRkFMU0UpKQ0KDQojIE5vdywgY3JlYXRlIGxhcmdlciBjaHVua3Mgb2Ygc21hbGwgY2h1bmtzDQojIFJ1bm5pbmcgYWxsIGNodW5rcyBhdCBvbmNlIHdpbGwgcmVxdWlyZSBhbiBlbm9ybW91cyBhbW91bnQgb2YgUkFNLCBzbyB3ZSBwcm9jZWVkIHdpdGggMTc1IGNodW5rcyBhdCBhIHRpbWUgaW4gMTAgYmF0Y2hlcy4NCmxhcmdlcl9jaHVua19zaXplIDwtIDE3NQ0KbnVtX2xhcmdlcl9jaHVua3MgPC0gY2VpbGluZyhudW1fY2h1bmtzIC8gbGFyZ2VyX2NodW5rX3NpemUpDQoNCiMgU3BsaXQgdGhlIGNodW5rIGxpc3QgaW50byBsYXJnZXIgY2h1bmtzDQpsYXJnZXJfY2h1bmtfbGlzdCA8LSBzcGxpdChjaHVua19zcGVjaWVzX2xpc3QsIGN1dCgxOmxlbmd0aChjaHVua19zcGVjaWVzX2xpc3QpLCBicmVha3MgPSBudW1fbGFyZ2VyX2NodW5rcywgbGFiZWxzID0gRkFMU0UpKQ0KDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcgDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCg0KIyBMb2FkIHBhY2thZ2VzIG9uIG5vZGVzDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeShkcGx5cikNCiAgbGlicmFyeShtZXRhZm9yKQ0KfSkNCg0KIyBDaGVjayBwcm9jZXNzaW5nIHRpbWUNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBmaXJzdCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1sxXV0NCnJlc3VsdF9saXN0XzEgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMSA8LSBjKHJlc3VsdF9saXN0XzEsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfMSA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMSwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzEgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzEsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzEpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q18xLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfMXN0X2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzFzdF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzEsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Q18xc3RfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3lzLnRpbWUoKQ0KDQojIFByb2Nlc3NpbmcgZm9yIHNlY29uZCBsYXJnZXIgY2h1bmsNCmN1cnJlbnRfbGFyZ2VyX2NodW5rIDwtIGxhcmdlcl9jaHVua19saXN0W1syXV0NCnJlc3VsdF9saXN0XzIgPC0gbGlzdCgpDQoNCiMgTG9vcCBvdmVyIHRoZSBzbWFsbCBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGxhcmdlciBjaHVuaw0KZm9yIChpIGluIHNlcV9hbG9uZyhjdXJyZW50X2xhcmdlcl9jaHVuaykpIHsNCiAgY3VycmVudF9zcGVjaWVzIDwtIGN1cnJlbnRfbGFyZ2VyX2NodW5rW1tpXV0NCiAgDQogICMgRmlsdGVyIGRhdGEgZm9yIG9ubHkgdGhlIHNwZWNpZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsNCiAgY2h1bmtfc3BlY2llc19kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoc3BlY2llc19kYXRhLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIGNodW5rX3RlbXBfc3BlY2llcyA8LSBkcGx5cjo6ZmlsdGVyKHRlbXBfc3BlY2llcywgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICANCiAgIyBFeHBvcnQgb25seSB0aGUgZmlsdGVyZWQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgc3BlY2llcyBsaXN0IHRvIHRoZSBjbHVzdGVyDQogIGNsdXN0ZXJFeHBvcnQoY2wsIGMoImNodW5rX3NwZWNpZXNfZGF0YSIsICJjaHVua190ZW1wX3NwZWNpZXMiLCAiY3VycmVudF9zcGVjaWVzIiwgInNwZWNpZXNfbWV0YSIpKQ0KICANCiAgIyBDYWxsIHNwZWNpZXNfbWV0YSBmb3IgZWFjaCBzcGVjaWVzIGluIHRoZSBjaHVuaw0KICByZXN1bHRfY2h1bmsgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgY3VycmVudF9zcGVjaWVzLCBmdW5jdGlvbih4KSBzcGVjaWVzX21ldGEoeCwgY2h1bmtfc3BlY2llc19kYXRhLCBjaHVua190ZW1wX3NwZWNpZXMpKQ0KICANCiAgcmVzdWx0X2xpc3RfMiA8LSBjKHJlc3VsdF9saXN0XzIsIHJlc3VsdF9jaHVuaykNCn0NCg0Kc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfMiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMiwgZnVuY3Rpb24oeCkgeFtbMV1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzJdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzIgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzIsIGZ1bmN0aW9uKHgpIHhbWzNdXSkpDQoNCnJtKGNodW5rX3NwZWNpZXNfZGF0YSkNCnJtKGNodW5rX3RlbXBfc3BlY2llcykNCnJtKHJlc3VsdF9jaHVuaykNCnJtKHJlc3VsdF9saXN0XzIpDQoNClN5cy50aW1lKCkNCg0KIyBTYXZlIHRoZSByZXN1bHRzIGZvciBmaXJzdCBjaHVuaw0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q18yLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvdGVtcF9maWxlc19BUlIvc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfMm5kX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21lYW5fYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzJuZF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzIsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX21heF9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Q18ybmRfY2h1bmsucmRzIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpTeXMudGltZSgpDQoNCiMgUHJvY2Vzc2luZyBmb3Igc2Vjb25kIGxhcmdlciBjaHVuaw0KY3VycmVudF9sYXJnZXJfY2h1bmsgPC0gbGFyZ2VyX2NodW5rX2xpc3RbWzNdXQ0KcmVzdWx0X2xpc3RfMyA8LSBsaXN0KCkNCg0KIyBMb29wIG92ZXIgdGhlIHNtYWxsIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgbGFyZ2VyIGNodW5rDQpmb3IgKGkgaW4gc2VxX2Fsb25nKGN1cnJlbnRfbGFyZ2VyX2NodW5rKSkgew0KICBjdXJyZW50X3NwZWNpZXMgPC0gY3VycmVudF9sYXJnZXJfY2h1bmtbW2ldXQ0KICANCiAgIyBGaWx0ZXIgZGF0YSBmb3Igb25seSB0aGUgc3BlY2llcyBpbiB0aGUgY3VycmVudCBjaHVuaw0KICBjaHVua19zcGVjaWVzX2RhdGEgPC0gZHBseXI6OmZpbHRlcihzcGVjaWVzX2RhdGEsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgY2h1bmtfdGVtcF9zcGVjaWVzIDwtIGRwbHlyOjpmaWx0ZXIodGVtcF9zcGVjaWVzLCB0aXAubGFiZWwgJWluJSBjdXJyZW50X3NwZWNpZXMpDQogIA0KICAjIEV4cG9ydCBvbmx5IHRoZSBmaWx0ZXJlZCBkYXRhIGFuZCB0aGUgY3VycmVudCBzcGVjaWVzIGxpc3QgdG8gdGhlIGNsdXN0ZXINCiAgY2x1c3RlckV4cG9ydChjbCwgYygiY2h1bmtfc3BlY2llc19kYXRhIiwgImNodW5rX3RlbXBfc3BlY2llcyIsICJjdXJyZW50X3NwZWNpZXMiLCAic3BlY2llc19tZXRhIikpDQogIA0KICAjIENhbGwgc3BlY2llc19tZXRhIGZvciBlYWNoIHNwZWNpZXMgaW4gdGhlIGNodW5rDQogIHJlc3VsdF9jaHVuayA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBjdXJyZW50X3NwZWNpZXMsIGZ1bmN0aW9uKHgpIHNwZWNpZXNfbWV0YSh4LCBjaHVua19zcGVjaWVzX2RhdGEsIGNodW5rX3RlbXBfc3BlY2llcykpDQogIA0KICByZXN1bHRfbGlzdF8zIDwtIGMocmVzdWx0X2xpc3RfMywgcmVzdWx0X2NodW5rKQ0KfQ0KDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q18zIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF8zLCBmdW5jdGlvbih4KSB4W1sxXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbMl1dKSkNCmRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNENfMyA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkocmVzdWx0X2xpc3RfMywgZnVuY3Rpb24oeCkgeFtbM11dKSkNCg0Kcm0oY2h1bmtfc3BlY2llc19kYXRhKQ0Kcm0oY2h1bmtfdGVtcF9zcGVjaWVzKQ0Kcm0ocmVzdWx0X2NodW5rKQ0Kcm0ocmVzdWx0X2xpc3RfMykNCg0KU3lzLnRpbWUoKQ0KDQojIFNhdmUgdGhlIHJlc3VsdHMgZm9yIGZpcnN0IGNodW5rDQpzYXZlUkRTKHNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTRDXzMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy90ZW1wX2ZpbGVzX0FSUi9zcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q18zcmRfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWVhbl9hY2MvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfM3JkX2NodW5rLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNENfMywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3RlbXBfZmlsZXNfbWF4X2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzNyZF9jaHVuay5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNClN5cy50aW1lKCkNCg0KIyBQcm9jZXNzaW5nIGZvciBzZWNvbmQgbGFyZ2VyIGNodW5rDQpjdXJyZW50X2xhcmdlcl9jaHVuayA8LSBsYXJnZXJfY2h1bmtfbGlzdFtbNF1dDQpyZXN1bHRfbGlzdF80IDwtIGxpc3QoKQ0KDQojIExvb3Agb3ZlciB0aGUgc21hbGwgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBsYXJnZXIgY2h1bmsNCmZvciAoaSBpbiBzZXFfYWxvbmcoY3VycmVudF9sYXJnZXJfY2h1bmspKSB7DQogIGN1cnJlbnRfc3BlY2llcyA8LSBjdXJyZW50X2xhcmdlcl9jaHVua1tbaV1dDQogIA0KICAjIEZpbHRlciBkYXRhIGZvciBvbmx5IHRoZSBzcGVjaWVzIGluIHRoZSBjdXJyZW50IGNodW5rDQogIGNodW5rX3NwZWNpZXNfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKHNwZWNpZXNfZGF0YSwgdGlwLmxhYmVsICVpbiUgY3VycmVudF9zcGVjaWVzKQ0KICBjaHVua190ZW1wX3NwZWNpZXMgPC0gZHBseXI6OmZpbHRlcih0ZW1wX3NwZWNpZXMsIHRpcC5sYWJlbCAlaW4lIGN1cnJlbnRfc3BlY2llcykNCiAgDQogICMgRXhwb3J0IG9ubHkgdGhlIGZpbHRlcmVkIGRhdGEgYW5kIHRoZSBjdXJyZW50IHNwZWNpZXMgbGlzdCB0byB0aGUgY2x1c3Rlcg0KICBjbHVzdGVyRXhwb3J0KGNsLCBjKCJjaHVua19zcGVjaWVzX2RhdGEiLCAiY2h1bmtfdGVtcF9zcGVjaWVzIiwgImN1cnJlbnRfc3BlY2llcyIsICJzcGVjaWVzX21ldGEiKSkNCiAgDQogICMgQ2FsbCBzcGVjaWVzX21ldGEgZm9yIGVhY2ggc3BlY2llcyBpbiB0aGUgY2h1bmsNCiAgcmVzdWx0X2NodW5rIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIGN1cnJlbnRfc3BlY2llcywgZnVuY3Rpb24oeCkgc3BlY2llc19tZXRhKHgsIGNodW5rX3NwZWNpZXNfZGF0YSwgY2h1bmtfdGVtcF9zcGVjaWVzKSkNCiAgDQogIHJlc3VsdF9saXN0XzQgPC0gYyhyZXN1bHRfbGlzdF80LCByZXN1bHRfY2h1bmspDQp9DQoNCnNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTRDXzQgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHJlc3VsdF9saXN0XzQsIGZ1bmN0aW9uKHgpIHhbWzFdXSkpDQpkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q180IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1syXV0pKQ0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Q180IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShyZXN1bHRfbGlzdF80LCBmdW5jdGlvbih4KSB4W1szXV0pKQ0KDQpybShjaHVua19zcGVjaWVzX2RhdGEpDQpybShjaHVua190ZW1wX3NwZWNpZXMpDQpybShyZXN1bHRfY2h1bmspDQpybShyZXN1bHRfbGlzdF80KQ0KDQpTeXMudGltZSgpDQoNCiMgU2F2ZSB0aGUgcmVzdWx0cyBmb3IgZmlyc3QgY2h1bmsNCnNhdmVSRFMoc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfNCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3RlbXBfZmlsZXNfQVJSL3NwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTRDXzR0aF9jaHVuay5yZHMiKQ0Kc2F2ZVJEUyhkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvdGVtcF9maWxlc19tZWFuX2FjYy9kYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q180dGhfY2h1bmsucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Q180LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvdGVtcF9maWxlc19tYXhfYWNjL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNENfNHRoX2NodW5rLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCmdjKCkNCmBgYA0KDQojIyMjIyAqKkNvbWJpbmUgY2h1bmtzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIENvbWJpbmUgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3MgYW5kIHNhdmUgDQpzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0QyA8LSBkaXN0aW5jdChyYmluZChzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q18xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llc19BUlJfYXJib3JlYWxfZnV0dXJlNENfMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0Q180KSkNCg0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMgPC0gcmJpbmQoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q18yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfNCkNCg0KZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0QyA8LSByYmluZChkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDXzQpDQoNCg0Kc2F2ZVJEUyhzcGVjaWVzX0FSUl9hcmJvcmVhbF9mdXR1cmU0QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3NwZWNpZXNfQVJSX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQpzYXZlUkRTKGRhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCnNhdmVSRFMoZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCg0KIyAqKkNsaW1hdGUgdnVsbmVyYWJpbGl0eSBhc3Nlc3NtZW50KiogDQoNCiMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgYXNzdW1lIHRoYXQgYW5pbWFscyBhcmUgYWNjbGltYXRlZCBkYWlseSB0byB0aGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQgcHJpb3IgdG8gZWFjaCBkYXkuDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3Nfc3Vic3RyYXRlLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3Nfc3Vic3RyYXRlLnBicyoqIA0KDQpXZWlnaHRlZCBtZWFucyBhbmQgc3RhbmRhcmQgZXJyb3JzIHdlcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gRm9ybXVsYSAyMiBpbiBIaWdnaW5zICYgVGhvbXBzb24gKDIwMDIpLiBRdWFudGlmeWluZyBoZXRlcm9nZW5laXR5IGluIGEgbWV0YS1hbmFseXNpcy4gU3RhdCBNZWQgMjE6MTUzOeKAkzE1NTgNCg0KIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCmBgYHtyLCBldmFsPUZ9DQoNCmRhaWx5X0NUbWF4X21lYW5fY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCkNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50KQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KYGBgDQoNCiMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tZWFuXzJDKQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQyA8LSBkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzJDICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzJDKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KZGFpbHlfQ1RtYXhfbWVhbl80QyA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGRhaWx5X0NUbWF4X21lYW5fNEMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fNEMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fNEMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fNEMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQojIyMgKipDbGlwIGdyaWQgY2VsbHMgdG8gbWF0Y2ggbGFuZCBtYXNzZXMqKg0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL0NsaXBwaW5nX2dyaWRfY2VsbHNfc3Vic3RyYXRlLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2xpcHBpbmdfZ3JpZF9jZWxsc19zdWJzdHJhdGUucGJzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tZWFuX2N1cnJlbnQiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50KSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21lYW5fY3VycmVudFtpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERvIHRoZSBzYW1lIGZvciBtZWFuIGZ1dHVyZSAyQyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlMkMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTJDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERvIHRoZSBzYW1lIGZvciBtZWFuIGZ1dHVyZSA0QyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlNEMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmU0QyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqU3Vic2V0IG9mIGFyYm9yZWFsIHNwZWNpZXMqKiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19zdWJzdHJhdGVfYXJib3JlYWxfc3BlY2llcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX3N1YnN0cmF0ZV9hcmJvcmVhbF9zcGVjaWVzLnBicyoqIA0KDQpUaGUgY29kZSB0byBjbGlwIHRoZSBncmlkIGNlbGxzIHRvIG1hdGNoIGxhbmQgbWFzc2VzIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9DbGlwcGluZ19ncmlkX2NlbGxzX3N1YnN0cmF0ZV9hcmJvcmVhbF9zcGVjaWVzLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2xpcHBpbmdfZ3JpZF9jZWxsc19zdWJzdHJhdGVfYXJib3JlYWxfc3BlY2llcy5wYnMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMgQWNjbGltYXRpb24gdG8gbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUgb24gc3Vic3RyYXRlLCBjdXJyZW50IGNsaW1hdGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X2FyYiA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQojIEZpbHRlciB0byBhcmJvcmVhbCBzcGVjaWVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50W3BvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCR0aXAubGFiZWwgJWluJSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfYXJiJHRpcC5sYWJlbCxdDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfYXJib3JlYWxfc3AucmRzIikNCg0Kcm0oY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50KQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMgQWNjbGltYXRpb24gdG8gbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUgb24gc3Vic3RyYXRlLCBmdXR1cmUgY2xpbWF0ZSAoKzJDKSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX2FyYiA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgRmlsdGVyIHRvIGFyYm9yZWFsIHNwZWNpZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ1twb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDJHRpcC5sYWJlbCAlaW4lIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfYXJiJHRpcC5sYWJlbCxdDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfYXJib3JlYWxfc3AucmRzIikNCg0Kcm0oY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIEFjY2xpbWF0aW9uIHRvIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlIG9uIHN1YnN0cmF0ZSwgZnV0dXJlIGNsaW1hdGUgKCs0QykgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19hcmIgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEZpbHRlciB0byBhcmJvcmVhbCBzcGVjaWVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENbcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyR0aXAubGFiZWwgJWluJSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX2FyYiR0aXAubGFiZWwsXQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2FyYm9yZWFsX3NwLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIENsaXBwaW5nIGdyaWQgY2VsbHMgdG8gbWF0Y2ggbGFuZCBtYXNzZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ3VycmVudCBjbGltYXRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9hcmJvcmVhbF9zcC5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tZWFuX2N1cnJlbnQiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50KSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21lYW5fY3VycmVudFtpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzX2FyYm9yZWFsX3NwLnJkcyIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZ1dHVyZSBjbGltYXRlICgrMkMpICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19hcmJvcmVhbF9zcC5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTJDIiwgImxhbmRfcG9seWdvbiIsICJjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24iKSkNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGhoaXJlcykNCiAgbGlicmFyeShsd2dlb20pDQogIGxpYnJhcnkoZ2dzcGF0aWFsKQ0KfSkNCg0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gcGFyTGFwcGx5KGNsLCAxOm5yb3coY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlMkMpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQ1tpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHNfYXJib3JlYWxfc3AucmRzIikNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGdXR1cmUgY2xpbWF0ZSAoKzRDKSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2FyYm9yZWFsX3NwLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlNEMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmU0QyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxsc19hcmJvcmVhbF9zcC5yZHMiKQ0KDQpgYGANCg0KDQojIyAqKlBvbmQgb3Igd2V0bGFuZCoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpIZXJlLCB3ZSBhc3N1bWUgdGhhdCBhbmltYWxzIGFyZSBhY2NsaW1hdGVkIGRhaWx5IHRvIHRoZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZSBleHBlcmllbmNlZCBwcmlvciB0byBlYWNoIGRheS4NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfcG9uZC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19wb25kLnBicyoqIA0KDQpXZWlnaHRlZCBtZWFucyBhbmQgc3RhbmRhcmQgZXJyb3JzIHdlcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gRm9ybXVsYSAyMiBpbiBIaWdnaW5zICYgVGhvbXBzb24gKDIwMDIpLiBRdWFudGlmeWluZyBoZXRlcm9nZW5laXR5IGluIGEgbWV0YS1hbmFseXNpcy4gU3RhdCBNZWQgMjE6MTUzOeKAkzE1NTgNCg0KIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCmBgYHtyLCBldmFsPUZ9DQoNCmRhaWx5X0NUbWF4X21lYW5fY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50ICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21lYW5fY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50KQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50KQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCA8LSBkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fY3VycmVudCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCwgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50KQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KYGBgDQoNCiMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fMkMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KZGFpbHlfQ1RtYXhfbWVhbl80QyA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2RhaWx5X0NUbWF4X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfQ1RtYXhfbWVhbl80QyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWVhbl80QykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQojIyMgKipDbGlwIGdyaWQgY2VsbHMgdG8gbWF0Y2ggbGFuZCBtYXNzZXMqKg0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9DbGlwcGluZ19ncmlkX2NlbGxzX3BvbmQuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2xpcHBpbmdfZ3JpZF9jZWxsc19wb25kLnBicyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fY3VycmVudCIsICJsYW5kX3BvbHlnb24iLCAiY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIikpDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQogIGxpYnJhcnkoc2YpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoaGlyZXMpDQogIGxpYnJhcnkobHdnZW9tKQ0KICBsaWJyYXJ5KGdnc3BhdGlhbCkNCn0pDQoNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIHBhckxhcHBseShjbCwgMTpucm93KGNvbW11bml0eV9kZl9tZWFuX2N1cnJlbnQpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50W2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEbyB0aGUgc2FtZSBmb3IgbWVhbiBmdXR1cmUgMkMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlMkMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTJDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRG8gdGhlIHNhbWUgZm9yIG1lYW4gZnV0dXJlIDRDICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDIiwgImxhbmRfcG9seWdvbiIsICJjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24iKSkNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGhoaXJlcykNCiAgbGlicmFyeShsd2dlb20pDQogIGxpYnJhcnkoZ2dzcGF0aWFsKQ0KfSkNCg0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gcGFyTGFwcGx5KGNsLCAxOm5yb3coY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlNEMpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmU0Q1tpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KDQojIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCg0KSGVyZSwgd2UgYXNzdW1lIHRoYXQgYW5pbWFscyBhcmUgYWNjbGltYXRlZCBkYWlseSB0byB0aGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQgcHJpb3IgdG8gZWFjaCBkYXkuDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19hcmJvcmVhbC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfYXJib3JlYWwucGJzKiogDQoNCldlaWdodGVkIG1lYW5zIGFuZCBzdGFuZGFyZCBlcnJvcnMgd2VyZSBjYWxjdWxhdGVkIGFjY29yZGluZyB0byBGb3JtdWxhIDIyIGluIEhpZ2dpbnMgJiBUaG9tcHNvbiAoMjAwMikuIFF1YW50aWZ5aW5nIGhldGVyb2dlbmVpdHkgaW4gYSBtZXRhLWFuYWx5c2lzLiBTdGF0IE1lZCAyMToxNTM54oCTMTU1OA0KDQojIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50IDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50IDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fY3VycmVudCAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50KQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50LCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCkNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmBgYA0KDQojIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQoNCmBgYHtyLCBldmFsPUZ9DQpkYWlseV9DVG1heF9tZWFuXzJDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fMkMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0KYGBgDQoNCiMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fNEMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfQ1RtYXhfbWVhbl80QyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWVhbl80QykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqQ2xpcCBncmlkIGNlbGxzIHRvIG1hdGNoIGxhbmQgbWFzc2VzKioNCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL0NsaXBwaW5nX2dyaWRfY2VsbHNfYXJib3JlYWwuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL0NsaXBwaW5nX2dyaWRfY2VsbHNfYXJib3JlYWwucGJzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWVhbl9jdXJyZW50IiwgImxhbmRfcG9seWdvbiIsICJjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24iKSkNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGhoaXJlcykNCiAgbGlicmFyeShsd2dlb20pDQogIGxpYnJhcnkoZ2dzcGF0aWFsKQ0KfSkNCg0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gcGFyTGFwcGx5KGNsLCAxOm5yb3coY29tbXVuaXR5X2RmX21lYW5fY3VycmVudCksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2N1cnJlbnRbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2NsaXBwZWRfY2VsbHMucmRzIikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRG8gdGhlIHNhbWUgZm9yIG1lYW4gZnV0dXJlIDJDICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlMkMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmUyQyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTJDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEbyB0aGUgc2FtZSBmb3IgbWVhbiBmdXR1cmUgNEMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWVhbl9mdXR1cmU0QyIsICJsYW5kX3BvbHlnb24iLCAiY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIikpDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQogIGxpYnJhcnkoc2YpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoaGlyZXMpDQogIGxpYnJhcnkobHdnZW9tKQ0KICBsaWJyYXJ5KGdnc3BhdGlhbCkNCn0pDQoNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIHBhckxhcHBseShjbCwgMTpucm93KGNvbW11bml0eV9kZl9tZWFuX2Z1dHVyZTRDKSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21lYW5fZnV0dXJlNENbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KIyAqKkRhdGEgZXhwbG9yYXRpb24gYW5kIHN1bW1hcmllcyoqIA0KDQojIyAqKlBvcHVsYXRpb24tbGV2ZWwgZGF0YSoqIA0KDQojIyMgKipPdmVydmlldyBvZiB0aGUgZGF0YXNldHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0Ka2FibGUoaGVhZChwb3Bfc3ViX2N1cnJlbnQpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQprYWJsZShoZWFkKHBvcF9zdWJfZnV0dXJlMkMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQprYWJsZShoZWFkKHBvcF9zdWJfZnV0dXJlNEMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpwb3BfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQprYWJsZShoZWFkKHBvcF9wb25kX2N1cnJlbnQpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQprYWJsZShoZWFkKHBvcF9wb25kX2Z1dHVyZTJDKSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI1MDBweCIpIA0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0Ka2FibGUoaGVhZChwb3BfcG9uZF9mdXR1cmU0QyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCmthYmxlKGhlYWQocG9wX2FyYl9jdXJyZW50KSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI1MDBweCIpIA0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCmthYmxlKGhlYWQocG9wX2FyYl9mdXR1cmUyQyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQprYWJsZShoZWFkKHBvcF9hcmJfZnV0dXJlNEMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KDQojIyMgKipOdW1iZXIgb2YgcG9wdWxhdGlvbnMgcHJlZGljdGVkIHRvIG92ZXJoZWF0Kiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDb3VudHMgZm9yIGVhY2ggY2xpbWF0aWMgc2NlbmFyaW8NCm5fcG9wX2N1cnJlbnQgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2N1cnJlbnRbcG9wX3N1Yl9jdXJyZW50JG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0Kbl9wb3BfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2Z1dHVyZTJDW3BvcF9zdWJfZnV0dXJlMkMkb3ZlcmhlYXRpbmdfcmlzaz4wLF0pDQpuX3BvcF9mdXR1cmU0QyA8LSBuX2Rpc3RpbmN0KHBvcF9zdWJfZnV0dXJlNENbcG9wX3N1Yl9mdXR1cmU0QyRvdmVyaGVhdGluZ19yaXNrPjAsXSkNCg0KcmVzdWx0c19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIGBDbGltYXRlX1NjZW5hcmlvYCA9IGMoIkN1cnJlbnQgQ2xpbWF0ZSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzJDKSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzRDKSIpLA0KICBgTnVtYmVyX3BvcF9vdmVyaGVhdGluZ2AgPSBjKG5fcG9wX2N1cnJlbnQsIG5fcG9wX2Z1dHVyZTJDLCBuX3BvcF9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikgDQoNCmBgYA0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCnBvcF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDb3VudHMgZm9yIGVhY2ggY2xpbWF0aWMgc2NlbmFyaW8NCm5fcG9wX2N1cnJlbnQgPC0gbl9kaXN0aW5jdChwb3BfcG9uZF9jdXJyZW50W3BvcF9wb25kX2N1cnJlbnQkb3ZlcmhlYXRpbmdfcmlzaz4wLF0pDQpuX3BvcF9mdXR1cmUyQyA8LSBuX2Rpc3RpbmN0KHBvcF9wb25kX2Z1dHVyZTJDW3BvcF9wb25kX2Z1dHVyZTJDJG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0Kbl9wb3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3BfcG9uZF9mdXR1cmU0Q1twb3BfcG9uZF9mdXR1cmU0QyRvdmVyaGVhdGluZ19yaXNrPjAsXSkNCg0KcmVzdWx0c19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIGBDbGltYXRlX1NjZW5hcmlvYCA9IGMoIkN1cnJlbnQgQ2xpbWF0ZSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzJDKSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzRDKSIpLA0KICBgTnVtYmVyX3BvcF9vdmVyaGVhdGluZ2AgPSBjKG5fcG9wX2N1cnJlbnQsIG5fcG9wX2Z1dHVyZTJDLCBuX3BvcF9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQoNCiMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQ291bnRzIGZvciBlYWNoIGNsaW1hdGljIHNjZW5hcmlvDQpuX3BvcF9jdXJyZW50IDwtIG5fZGlzdGluY3QocG9wX2FyYl9jdXJyZW50W3BvcF9hcmJfY3VycmVudCRvdmVyaGVhdGluZ19yaXNrPjAsXSkNCm5fcG9wX2Z1dHVyZTJDIDwtIG5fZGlzdGluY3QocG9wX2FyYl9mdXR1cmUyQ1twb3BfYXJiX2Z1dHVyZTJDJG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0Kbl9wb3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3BfYXJiX2Z1dHVyZTRDW3BvcF9hcmJfZnV0dXJlNEMkb3ZlcmhlYXRpbmdfcmlzaz4wLF0pDQoNCnJlc3VsdHNfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBgQ2xpbWF0ZV9TY2VuYXJpb2AgPSBjKCJDdXJyZW50IENsaW1hdGUiLCAiRnV0dXJlIENsaW1hdGUgKCsyQykiLCAiRnV0dXJlIENsaW1hdGUgKCs0QykiKSwNCiAgYE51bWJlcl9wb3Bfb3ZlcmhlYXRpbmdgID0gYyhuX3BvcF9jdXJyZW50LCBuX3BvcF9mdXR1cmUyQywgbl9wb3BfZnV0dXJlNEMpDQopDQoNCmthYmxlKHJlc3VsdHNfc3VtbWFyeSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIyNTBweCIpDQpgYGANCg0KIyMjIyAqKkFyYm9yZWFsIHNwZWNpZXMgb24gc3Vic3RyYXRlIGNvbmRpdGlvbnMqKiANCg0KYGBge3J9DQojIEZpbHRlciBzdWJzdHJhdGUgZGF0YSB0byBvbmx5IGFyYm9yZWFsIHNwZWNpZXMNCnBvcF9zdWJfY3VycmVudF9hcmJfc3Vic2V0IDwtIGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIHRpcC5sYWJlbCAlaW4lIHBvcF9hcmJfY3VycmVudCR0aXAubGFiZWwpDQpwb3Bfc3ViX2Z1dHVyZTJDX2FyYl9zdWJzZXQgPC0gZmlsdGVyKHBvcF9zdWJfZnV0dXJlMkMsIHRpcC5sYWJlbCAlaW4lIHBvcF9hcmJfZnV0dXJlMkMkdGlwLmxhYmVsKQ0KcG9wX3N1Yl9mdXR1cmU0Q19hcmJfc3Vic2V0IDwtIGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTRDLCB0aXAubGFiZWwgJWluJSBwb3BfYXJiX2Z1dHVyZTRDJHRpcC5sYWJlbCkNCg0KDQojIENvdW50cyBmb3IgZWFjaCBjbGltYXRpYyBzY2VuYXJpbw0Kbl9wb3BfY3VycmVudCA8LSBuX2Rpc3RpbmN0KHBvcF9zdWJfY3VycmVudF9hcmJfc3Vic2V0W3BvcF9zdWJfY3VycmVudF9hcmJfc3Vic2V0JG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0Kbl9wb3BfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2Z1dHVyZTJDX2FyYl9zdWJzZXRbcG9wX3N1Yl9mdXR1cmUyQ19hcmJfc3Vic2V0JG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0Kbl9wb3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2Z1dHVyZTRDX2FyYl9zdWJzZXRbcG9wX3N1Yl9mdXR1cmU0Q19hcmJfc3Vic2V0JG92ZXJoZWF0aW5nX3Jpc2s+MCxdKQ0KDQpyZXN1bHRzX3N1bW1hcnkgPC0gZGF0YS5mcmFtZSgNCiAgYENsaW1hdGVfU2NlbmFyaW9gID0gYygiQ3VycmVudCBDbGltYXRlIiwgIkZ1dHVyZSBDbGltYXRlICgrMkMpIiwgIkZ1dHVyZSBDbGltYXRlICgrNEMpIiksDQogIGBOdW1iZXJfcG9wX292ZXJoZWF0aW5nYCA9IGMobl9wb3BfY3VycmVudCwgbl9wb3BfZnV0dXJlMkMsIG5fcG9wX2Z1dHVyZTRDKQ0KKQ0KDQprYWJsZShyZXN1bHRzX3N1bW1hcnksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KDQpgYGANCg0KDQojIyMgKipOdW1iZXIgb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQpgYGB7cn0NCiMgQ291bnRzIGZvciBlYWNoIGNsaW1hdGljIHNjZW5hcmlvDQpuX3NwX2N1cnJlbnQgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2N1cnJlbnQkdGlwLmxhYmVsW3BvcF9zdWJfY3VycmVudCRvdmVyaGVhdGluZ19yaXNrPjBdKQ0Kbl9zcF9mdXR1cmUyQyA8LSBuX2Rpc3RpbmN0KHBvcF9zdWJfZnV0dXJlMkMkdGlwLmxhYmVsW3BvcF9zdWJfZnV0dXJlMkMkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCm5fc3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2Z1dHVyZTRDJHRpcC5sYWJlbFtwb3Bfc3ViX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX3Jpc2s+MF0pDQoNCnJlc3VsdHNfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBgQ2xpbWF0ZV9TY2VuYXJpb2AgPSBjKCJDdXJyZW50IENsaW1hdGUiLCAiRnV0dXJlIENsaW1hdGUgKCsyQykiLCAiRnV0dXJlIENsaW1hdGUgKCs0QykiKSwNCiAgYE51bWJlcl9zcF9vdmVyaGVhdGluZ2AgPSBjKG5fc3BfY3VycmVudCwgbl9zcF9mdXR1cmUyQywgbl9zcF9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQoNCiMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCmBgYHtyfQ0KIyBDb3VudHMgZm9yIGVhY2ggY2xpbWF0aWMgc2NlbmFyaW8NCm5fc3BfY3VycmVudCA8LSBuX2Rpc3RpbmN0KHBvcF9wb25kX2N1cnJlbnQkdGlwLmxhYmVsW3BvcF9wb25kX2N1cnJlbnQkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCm5fc3BfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChwb3BfcG9uZF9mdXR1cmUyQyR0aXAubGFiZWxbcG9wX3BvbmRfZnV0dXJlMkMkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCm5fc3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3BfcG9uZF9mdXR1cmU0QyR0aXAubGFiZWxbcG9wX3BvbmRfZnV0dXJlNEMkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCg0KcmVzdWx0c19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIGBDbGltYXRlX1NjZW5hcmlvYCA9IGMoIkN1cnJlbnQgQ2xpbWF0ZSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzJDKSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzRDKSIpLA0KICBgTnVtYmVyX3NwX292ZXJoZWF0aW5nYCA9IGMobl9zcF9jdXJyZW50LCBuX3NwX2Z1dHVyZTJDLCBuX3NwX2Z1dHVyZTRDKQ0KKQ0KDQprYWJsZShyZXN1bHRzX3N1bW1hcnksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KYGBgDQoNCg0KIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQpgYGB7cn0NCiMgQ291bnRzIGZvciBlYWNoIGNsaW1hdGljIHNjZW5hcmlvDQpuX3NwX2N1cnJlbnQgPC0gbl9kaXN0aW5jdChwb3BfYXJiX2N1cnJlbnQkdGlwLmxhYmVsW3BvcF9hcmJfY3VycmVudCRvdmVyaGVhdGluZ19yaXNrPjBdKQ0Kbl9zcF9mdXR1cmUyQyA8LSBuX2Rpc3RpbmN0KHBvcF9hcmJfZnV0dXJlMkMkdGlwLmxhYmVsW3BvcF9hcmJfZnV0dXJlMkMkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCm5fc3BfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChwb3BfYXJiX2Z1dHVyZTRDJHRpcC5sYWJlbFtwb3BfYXJiX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX3Jpc2s+MF0pDQoNCnJlc3VsdHNfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBgQ2xpbWF0ZV9TY2VuYXJpb2AgPSBjKCJDdXJyZW50IENsaW1hdGUiLCAiRnV0dXJlIENsaW1hdGUgKCsyQykiLCAiRnV0dXJlIENsaW1hdGUgKCs0QykiKSwNCiAgYE51bWJlcl9zcF9vdmVyaGVhdGluZ2AgPSBjKG5fc3BfY3VycmVudCwgbl9zcF9mdXR1cmUyQywgbl9zcF9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQojIyMjICoqQXJib3JlYWwgc3BlY2llcyBvbiBzdWJzdHJhdGUgY29uZGl0aW9ucyoqIA0KDQpgYGB7cn0NCiMgQ291bnRzIGZvciBlYWNoIGNsaW1hdGljIHNjZW5hcmlvDQpuX3NwX2N1cnJlbnQgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2N1cnJlbnRfYXJiX3N1YnNldCR0aXAubGFiZWxbcG9wX3N1Yl9jdXJyZW50X2FyYl9zdWJzZXQkb3ZlcmhlYXRpbmdfcmlzaz4wXSkNCm5fc3BfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChwb3Bfc3ViX2Z1dHVyZTJDX2FyYl9zdWJzZXQkdGlwLmxhYmVsW3BvcF9zdWJfZnV0dXJlMkNfYXJiX3N1YnNldCRvdmVyaGVhdGluZ19yaXNrPjBdKQ0Kbl9zcF9mdXR1cmU0QyA8LSBuX2Rpc3RpbmN0KHBvcF9zdWJfZnV0dXJlNENfYXJiX3N1YnNldCR0aXAubGFiZWxbcG9wX3N1Yl9mdXR1cmU0Q19hcmJfc3Vic2V0JG92ZXJoZWF0aW5nX3Jpc2s+MF0pDQoNCnJlc3VsdHNfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBgQ2xpbWF0ZV9TY2VuYXJpb2AgPSBjKCJDdXJyZW50IENsaW1hdGUiLCAiRnV0dXJlIENsaW1hdGUgKCsyQykiLCAiRnV0dXJlIENsaW1hdGUgKCs0QykiKSwNCiAgYE51bWJlcl9zcF9vdmVyaGVhdGluZ2AgPSBjKG5fc3BfY3VycmVudCwgbl9zcF9mdXR1cmUyQywgbl9zcF9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQoNCiMjIyAqKkRhdGEgc3VtbWFyaWVzKiogIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KYGBge3J9DQprYWJsZShzdW1tYXJ5KHBvcF9zdWJfY3VycmVudCksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KDQprYWJsZShzdW1tYXJ5KHBvcF9zdWJfZnV0dXJlMkMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCg0Ka2FibGUoc3VtbWFyeShwb3Bfc3ViX2Z1dHVyZTRDKSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIyNTBweCIpDQoNCmBgYA0KDQoNCiMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCmBgYHtyfQ0Ka2FibGUoc3VtbWFyeShwb3BfcG9uZF9jdXJyZW50KSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIyNTBweCIpDQoNCmthYmxlKHN1bW1hcnkocG9wX3BvbmRfZnV0dXJlMkMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCg0Ka2FibGUoc3VtbWFyeShwb3BfcG9uZF9mdXR1cmU0QyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KYGBgDQoNCg0KIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQpgYGB7cn0NCmthYmxlKHN1bW1hcnkocG9wX2FyYl9jdXJyZW50KSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIyNTBweCIpDQoNCmthYmxlKHN1bW1hcnkocG9wX2FyYl9mdXR1cmUyQyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KDQprYWJsZShzdW1tYXJ5KHBvcF9hcmJfZnV0dXJlNEMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQoNCg0KIyMgKipDb21tdW5pdHktbGV2ZWwgZGF0YSoqIA0KDQojIyMgKipPdmVydmlldyBvZiB0aGUgZGF0YXNldHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KDQprYWJsZShoZWFkKGNvbW11bml0eV9zdWJfY3VycmVudCksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCmNvbW11bml0eV9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0Ka2FibGUoaGVhZChjb21tdW5pdHlfc3ViX2Z1dHVyZTJDKSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI1MDBweCIpIA0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQprYWJsZShoZWFkKGNvbW11bml0eV9zdWJfZnV0dXJlNEMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpjb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCmthYmxlKGhlYWQoY29tbXVuaXR5X3BvbmRfY3VycmVudCksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCmNvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0Ka2FibGUoaGVhZChjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKiogDQoNCmBgYHtyfQ0KIyBMb2FkIGRhdGENCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0Ka2FibGUoaGVhZChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKSANCmBgYA0KDQojIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0Ka2FibGUoaGVhZChjb21tdW5pdHlfYXJiX2N1cnJlbnQpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQprYWJsZShoZWFkKGNvbW11bml0eV9hcmJfZnV0dXJlMkMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQprYWJsZShoZWFkKGNvbW11bml0eV9hcmJfZnV0dXJlNEMpLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQpgYGANCg0KDQoNCiMjIyAqKk51bWJlciBvZiBjb21tdW5pdGllcyB3aXRoIG92ZXJoZWF0aW5nIHNwZWNpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KYGBge3J9DQojIExvYWQgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIENvdW50cyBmb3IgZWFjaCBjbGltYXRpYyBzY2VuYXJpbw0Kbl9jb21tdV9jdXJyZW50IDwtIG5fZGlzdGluY3QoY29tbXVuaXR5X3N1Yl9jdXJyZW50W2NvbW11bml0eV9zdWJfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCxdKQ0Kbl9jb21tdV9mdXR1cmUyQyA8LSBuX2Rpc3RpbmN0KGNvbW11bml0eV9zdWJfZnV0dXJlMkNbY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCxdKQ0Kbl9jb21tdV9mdXR1cmU0QyA8LSBuX2Rpc3RpbmN0KGNvbW11bml0eV9zdWJfZnV0dXJlNENbY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCxdKQ0KDQpyZXN1bHRzX3N1bW1hcnkgPC0gZGF0YS5mcmFtZSgNCiAgYENsaW1hdGVfU2NlbmFyaW9gID0gYygiQ3VycmVudCBDbGltYXRlIiwgIkZ1dHVyZSBDbGltYXRlICgrMkMpIiwgIkZ1dHVyZSBDbGltYXRlICgrNEMpIiksDQogIGBOdW1iZXJfc3Bfb3ZlcmhlYXRpbmdgID0gYyhuX2NvbW11X2N1cnJlbnQsIG5fY29tbXVfZnV0dXJlMkMsIG5fY29tbXVfZnV0dXJlNEMpDQopDQoNCmthYmxlKHJlc3VsdHNfc3VtbWFyeSwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIyNTBweCIpDQoNCmBgYA0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQpjb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQ291bnRzIGZvciBlYWNoIGNsaW1hdGljIHNjZW5hcmlvDQpuX2NvbW11X2N1cnJlbnQgPC0gbl9kaXN0aW5jdChjb21tdW5pdHlfcG9uZF9jdXJyZW50W2NvbW11bml0eV9wb25kX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nPjAsXSkNCm5fY29tbXVfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChjb21tdW5pdHlfcG9uZF9mdXR1cmUyQ1tjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCxdKQ0Kbl9jb21tdV9mdXR1cmU0QyA8LSBuX2Rpc3RpbmN0KGNvbW11bml0eV9wb25kX2Z1dHVyZTRDW2NvbW11bml0eV9wb25kX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZz4wLF0pDQoNCnJlc3VsdHNfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBgQ2xpbWF0ZV9TY2VuYXJpb2AgPSBjKCJDdXJyZW50IENsaW1hdGUiLCAiRnV0dXJlIENsaW1hdGUgKCsyQykiLCAiRnV0dXJlIENsaW1hdGUgKCs0QykiKSwNCiAgYE51bWJlcl9zcF9vdmVyaGVhdGluZ2AgPSBjKG5fY29tbXVfY3VycmVudCwgbl9jb21tdV9mdXR1cmUyQywgbl9jb21tdV9mdXR1cmU0QykNCikNCg0Ka2FibGUocmVzdWx0c19zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjI1MHB4IikNCmBgYA0KDQoNCiMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KYGBge3J9DQojIExvYWQgZGF0YSANCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDb3VudHMgZm9yIGVhY2ggY2xpbWF0aWMgc2NlbmFyaW8NCm5fY29tbXVfY3VycmVudCA8LSBuX2Rpc3RpbmN0KGNvbW11bml0eV9hcmJfY3VycmVudFtjb21tdW5pdHlfYXJiX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nPjAsXSkNCm5fY29tbXVfZnV0dXJlMkMgPC0gbl9kaXN0aW5jdChjb21tdW5pdHlfYXJiX2Z1dHVyZTJDW2NvbW11bml0eV9hcmJfZnV0dXJlMkMkbl9zcGVjaWVzX292ZXJoZWF0aW5nPjAsXSkNCm5fY29tbXVfZnV0dXJlNEMgPC0gbl9kaXN0aW5jdChjb21tdW5pdHlfYXJiX2Z1dHVyZTRDW2NvbW11bml0eV9hcmJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nPjAsXSkNCg0KcmVzdWx0c19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIGBDbGltYXRlX1NjZW5hcmlvYCA9IGMoIkN1cnJlbnQgQ2xpbWF0ZSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzJDKSIsICJGdXR1cmUgQ2xpbWF0ZSAoKzRDKSIpLA0KICBgTnVtYmVyX3NwX292ZXJoZWF0aW5nYCA9IGMobl9jb21tdV9jdXJyZW50LCBuX2NvbW11X2Z1dHVyZTJDLCBuX2NvbW11X2Z1dHVyZTRDKQ0KKQ0KDQprYWJsZShyZXN1bHRzX3N1bW1hcnksICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMjUwcHgiKQ0KYGBgDQoNCg0KIyMjICoqRGF0YSBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCmBgYHtyfQ0Kc3VtbWFyeShjb21tdW5pdHlfc3ViX2N1cnJlbnQpDQpzdW1tYXJ5KGNvbW11bml0eV9zdWJfZnV0dXJlMkMpDQpzdW1tYXJ5KGNvbW11bml0eV9zdWJfZnV0dXJlNEMpDQpgYGANCg0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQpgYGB7cn0NCnN1bW1hcnkoY29tbXVuaXR5X3BvbmRfY3VycmVudCkNCnN1bW1hcnkoY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMpDQpzdW1tYXJ5KGNvbW11bml0eV9wb25kX2Z1dHVyZTRDKQ0KYGBgDQoNCg0KIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQpgYGB7cn0NCnN1bW1hcnkoY29tbXVuaXR5X2FyYl9jdXJyZW50KQ0Kc3VtbWFyeShjb21tdW5pdHlfYXJiX2Z1dHVyZTJDKQ0Kc3VtbWFyeShjb21tdW5pdHlfYXJiX2Z1dHVyZTRDKQ0KYGBgDQoNCg0KDQojIyAqKlByZWRpY3RlZCBDVG1heCBvZiBlYWNoIHNwZWNpZXMqKiANCg0KYGBge3J9DQojIExvYWQgaW1wdXRlZCBkYXRhDQppbXB1dGVkX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpDQoNCiMgRmlsdGVyIHRvIGltcHV0ZWQgZGF0YSBhbmQgc2VsZWN0IHJlbGV2YW50IGNvbHVtbnMNCmltcHV0ZWRfZGF0YSA8LSBmaWx0ZXIoaW1wdXRlZF9kYXRhLCBpbXB1dGVkPT0ieWVzIikNCg0KaW1wdXRlZF9kYXRhIDwtIGRwbHlyOjpzZWxlY3QoaW1wdXRlZF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVUNOX3N0YXR1cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3R5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NsaW1hdGlvbl90ZW1wZXJhdHVyZSA9IGFjY2xpbWF0aW9uX3RlbXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXggPSBmaWxsZWRfbWVhbl9VVEw1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfOTVDSSA9IGxvd2VyX21lYW5fVVRMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfOTVDSSA9IHVwcGVyX21lYW5fVVRMKQ0KDQojIERpc3BsYXkgZGF0YQ0Ka2FibGUoaW1wdXRlZF9kYXRhLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQoNCiMgU3VtbWFyaXNlIGRhdGEgYXQgdGhlIHNwZWNpZXMgbGV2ZWwgDQpkYXRhX3N1bW1hcnkgPC0gaW1wdXRlZF9kYXRhICU+JSANCiAgICAgIGdyb3VwX2J5KHNwZWNpZXMsIG9yZGVyLCBJVUNOX3N0YXR1cywgZWNvdHlwZSkgJT4lIA0KICAgICAgc3VtbWFyaXNlKGFjY2xpbWF0aW9uX3RlbXBlcmF0dXJlID0gbWVhbihhY2NsaW1hdGlvbl90ZW1wZXJhdHVyZSksDQogICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4ID0gbWVhbihwcmVkaWN0ZWRfQ1RtYXgpKQ0KDQojIERpc3BsYXkgZGF0YQ0Ka2FibGUoZGF0YV9zdW1tYXJ5LCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikNCmBgYA0KDQoNCiMjICoqUHJlZGljdGVkIHBsYXN0aWNpdHkgb2YgZWFjaCBzcGVjaWVzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDE1fQ0KIyBMb2FkIGVzdGltYXRlZCBpbnRlcmNlcHRzIGFuZCBhY2NsaW1hdGlvbiByZXNwb25zZSByYXRpb3MNCnNwZWNpZXNfQVJSIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvc3BlY2llc19BUlJfcG9uZF9jdXJyZW50LnJkcyIpDQoNCiMgRGlzcGxheSBkYXRhDQprYWJsZShzcGVjaWVzX0FSUiwgImh0bWwiKSAlPiUgDQogIHJvd19zcGVjKDAsIGJhY2tncm91bmQgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI1MDBweCIpIA0KDQojIFN1bW1hcnkgc3RhdGlzdGljcyANCnN1bW1hcnkoc3BlY2llc19BUlIkc2xvcGUpDQoNCnNwZWNpZXNfQVJSICU+JSBzdW1tYXJpc2UoQVJSID0gbWVhbihzbG9wZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNsb3BlKSkNCg0KIyBGaWd1cmUNCmdncGxvdChzcGVjaWVzX0FSUikgKyANCiAgZ2VvbV9kZW5zaXR5KGFlcyhzbG9wZSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjQ0U1Qjk3IiwNCiAgICAgICAgICAgICAgIGFscGhhID0gMSkgKyANCiAgeGxhYigiQWNjbGltYXRpb24gUmVzcG9uc2UgUmF0aW8gKEFSUikiKSArIA0KICB5bGFiKCJOdW1iZXIgb2Ygc3BlY2llcyIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gNDAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDQwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAyMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBzaXplID0gMikpDQoNCmdnc2F2ZShmaWxlID0gImZpZy9GaWd1cmVfUzMucG5nIiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTUsIGRwaSA9IDUwMCkNCmBgYA0KDQoNCiMjICoqSWRlbnRpdHkgb2Ygb3ZlcmhlYXRpbmcgc3BlY2llcyoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCiMgUmV0dXJuIGEgbGlzdCBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdA0Kc3Bfb3ZlcmhlYXRpbmcgPC0gcG9wX3N1Yl9mdXR1cmU0QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCkgJT4lIA0KICBmaWx0ZXIob3ZlcmhlYXRpbmdfcmlzayA+MCkgJT4lIA0KICBzdW1tYXJpc2Uob3ZlcmhlYXRpbmdfZGF5cyA9IG1lYW4ob3ZlcmhlYXRpbmdfZGF5cykpIA0KDQojIElkZW50aWZ5IHdoZXRoZXIgb3ZlcmhlYXRpbmcgc3BlY2llcyB3ZXJlIHN0dWRpZWQgcHJldmlvdXNseSANCg0KIyMgTG9hZCB0cmFpbmluZyBkYXRhIHVzZWQgZm9yIHRoZSBpbXB1dGF0aW9uDQogdHJhaW5pbmdfZGF0YSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCiANCiMgRmlsdGVyIHRvIGV4cGVyaW1lbnRhbCBkYXRhDQp0cmFpbmluZ19kYXRhIDwtIGZpbHRlcih0cmFpbmluZ19kYXRhLCBpbXB1dGVkPT0ibm8iKQ0KDQojIElkZW50aWZ5IGlmIHRoZSBvdmVyaGVhdGluZyBzcGVjaWVzIHdlcmUgaW4gdGhlIG9yaWdpbmFsIGRhdGFzZXQNCnNwX292ZXJoZWF0aW5nIDwtIHNwX292ZXJoZWF0aW5nICU+JSANCiAgbXV0YXRlKHByZXZpb3VzbHlfc3R1ZGllZCA9IGlmZWxzZSh0aXAubGFiZWwgJWluJSB0cmFpbmluZ19kYXRhJHRpcC5sYWJlbCwgInllcyIsICJubyIpKQ0KDQojIERpc3BsYXkgZGF0YQ0Ka2FibGUoc3Bfb3ZlcmhlYXRpbmcsICJodG1sIikgJT4lIA0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siLCBib2xkID0gVFJVRSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgICBzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiNTAwcHgiKQ0KDQpzcF9vdmVyaGVhdGluZyRwcmV2aW91c2x5X3N0dWRpZWQ9YXMuZmFjdG9yKHNwX292ZXJoZWF0aW5nJHByZXZpb3VzbHlfc3R1ZGllZCkNCg0Kc3VtbWFyeShzcF9vdmVyaGVhdGluZykNCg0KIyA3My42NiUgKDI4OC8zOTEpIG9mIHRoZSBzcGVjaWVzIGlkZW50aWZpZWQgd2l0aCBhIHBvc2l0aXZlIG92ZXJoZWF0aW5nIHJpc2sgd2VyZSBub3QgYXNzZXNzZWQgZXhwZXJpbWVudGFsbHkuDQoNCmdncGxvdChzcF9vdmVyaGVhdGluZywgYWVzKHggPSBwcmV2aW91c2x5X3N0dWRpZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxvZyhvdmVyaGVhdGluZ19kYXlzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IHByZXZpb3VzbHlfc3R1ZGllZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBwcmV2aW91c2x5X3N0dWRpZWQpKSsNCiAgIHN0YXRfaGFsZmV5ZSgNCiAgICBhZGp1c3QgPSAxLA0KICAgIGp1c3RpZmljYXRpb24gPSAtMC41LA0KICAgIC53aWR0aCA9IDAsDQogICAgcG9pbnRfY29sb3VyID0gTkEsDQogICAgYWxwaGEgPSAwLjUsDQogICAgd2lkdGggPSAwLjUNCiAgKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4xNSwgYWxwaGEgPSAwLjg1KSArDQogIGdlb21fYm94cGxvdCgNCiAgICB3aWR0aCA9IDAuNCwNCiAgICBvdXRsaWVyLmNvbG9yID0gTkEsDQogICAgYWxwaGEgPSAwLjksDQogICAgY29sb3IgPSAiYmxhY2siLA0KICAgIGx3ZCA9IDEuMTUsDQogICAgbm90Y2ggPSBUUlVFLA0KICAgIGZpbGwgPSBOQQ0KICApICsgICANCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgeWxhYigiT3ZlcmhlYXRpbmcgZGF5cyAobG9nIHNjYWxlKSIpKyANCiAgeGxhYigiRXhwZXJpbWVudGFsbHkgYXNzZXNzZWQgaW4gcHJldmlvdXMgc3R1ZGllcyIpICsgDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCAoc2l6ZSA9IDIwLCB2anVzdCA9IC0wLjIpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQgKHNpemUgPSAyMCwgaGp1c3QgPSAwLjUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCAoc2l6ZSA9IDE1KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQgKHNpemUgPSAxNSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpIA0KYGBgDQoNCkZpZ3VyZSBBMTogTWVhbiBudW1iZXIgb2YgcHJlZGljdGVkIG92ZXJoZWF0aW5nIGRheXMgaW4gdGVycmVzdHJpYWwgY29uZGl0aW9ucyBmb3Igc3BlY2llcyB0aGF0IHdlcmUgYXNzZXNzZWQgZXhwZXJpbWVudGFsbHkgcHJldmlvdXNseSAoYmx1ZSksIG9yIHdlcmUgZnVsbHkgaW1wdXRlZCAocGluaykuIA0KDQojIyAqKlBlcmZvcm1hbmNlIG9mIHRoZSBpbXB1dGF0aW9uKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9DQojIExvYWQgZGF0YSB0aGF0IHdhcyB1c2VkIGZvciB0aGUgaW1wdXRhdGlvbg0KZGF0YV9mb3JfaW1wIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQojIExvYWQgZGF0YXNldHMgZnJvbSB0aGUgY3Jvc3MtdmFsaWRhdGlvbg0KZmlyc3RfY3Jvc3NWIDwtIHJlYWRSRFMoZmlsZSA9ICJSZGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMXN0X2Nyb3NzX3ZhbGlkYXRpb25fNXRoX2N5Y2xlLlJkcyIpICU+JSBtdXRhdGUoY3Jvc3NWID0gIjEiKQ0Kc2Vjb25kX2Nyb3NzViA8LSByZWFkUkRTKGZpbGUgPSAiUmRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzJuZF9jcm9zc192YWxpZGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAlPiUgbXV0YXRlKGNyb3NzViA9ICIyIikNCnRoaXJkX2Nyb3NzViA8LSByZWFkUkRTKGZpbGUgPSAiUmRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzNyZF9jcm9zc192YWxpZGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAlPiUgbXV0YXRlKGNyb3NzViA9ICIzIikNCmZvdXJ0aF9jcm9zc1YgPC0gcmVhZFJEUyhmaWxlID0gIlJkYXRhL0ltcHV0YXRpb24vcmVzdWx0cy80dGhfY3Jvc3NfdmFsaWRhdGlvbl81dGhfY3ljbGUuUmRzIikgJT4lIG11dGF0ZShjcm9zc1YgPSAiNCIpDQpmaWZ0aF9jcm9zc1YgPC0gcmVhZFJEUyhmaWxlID0gIlJkYXRhL0ltcHV0YXRpb24vcmVzdWx0cy81dGhfY3Jvc3NfdmFsaWRhdGlvbl81dGhfY3ljbGUuUmRzIikgJT4lIG11dGF0ZShjcm9zc1YgPSAiNSIpDQoNCmFsbF9pbXB1dGVkX2RhdDwtIGJpbmRfcm93cyhmaXJzdF9jcm9zc1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2Nyb3NzViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlyZF9jcm9zc1YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91cnRoX2Nyb3NzViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWZ0aF9jcm9zc1YpDQoNCiMgRmlsdGVyIHRvIGRhdGEgdGhhdCB3YXMgdXNlZCBmb3IgdGhlIGNyb3NzLXZhbGlkYXRpb24NCmltcF9kYXRhIDwtIGFsbF9pbXB1dGVkX2RhdFthbGxfaW1wdXRlZF9kYXQkZGF0X3RvX3ZhbGlkYXRlPT0ieWVzIixdDQppbXBfZGF0YSA8LSBkcGx5cjo6ZmlsdGVyKGltcF9kYXRhLGlzLm5hKHRpcC5sYWJlbCk9PUZBTFNFKSANCg0KIyBBZGQgcm93IG51bWJlcg0Kcm93X25faW1wIDwtIGRhdGEuZnJhbWUocm93X24gPSBpbXBfZGF0YSRyb3dfbikNCg0KIyBGaWx0ZXIgdG8gb3JpZ2luYWwgZGF0YQ0Kb3JpZ2luYWxfZGF0YSA8LSBkYXRhX2Zvcl9pbXBbZGF0YV9mb3JfaW1wJHJvd19uICVpbiUgcm93X25faW1wJHJvd19uLF0NCm9yaWdpbmFsX2RhdGE8LSBkcGx5cjo6OnNlbGVjdChvcmlnaW5hbF9kYXRhLCByb3dfbiwgbWVhbl9VVEwpDQoNCiMgQ29tYmluZSBkYXRhZnJhbWVzDQpkYXRhPC0gZHBseXI6OmxlZnRfam9pbihvcmlnaW5hbF9kYXRhLCBpbXBfZGF0YSwgYnk9InJvd19uIikNCmRhdGEgPC0gcmVuYW1lKGRhdGEsIG9yaWdpbmFsX0NUbWF4ID0gbWVhbl9VVEwueCwNCiAgICAgICAgICAgICAgICAgICAgIGltcHV0ZWRfQ1RtYXggPSBmaWxsZWRfbWVhbl9VVEw1KQ0KDQojIFJlbW92ZSBvYnNlcnZhdGlvbnMgdGhhdCB3ZXJlIGNyb3NzLXZhbGlkYXRlZCB0d2ljZQ0KZHVwbGljYXRlcyA8LSBkYXRhICU+JSANCiAgZ3JvdXBfYnkocm93X24pICU+JSANCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgDQogIGZpbHRlcihuPjEpIA0KZHVwbGljYXRlcyA8LSBkdXBsaWNhdGVzJHJvd19uDQoNCmRhdGEgPC0gZGF0YVshKGRhdGEkcm93X24gJWluJSBkdXBsaWNhdGVzICYgZGF0YSRjcm9zc1YgPT0gIjUiKSwgXQ0KDQoNCmRhdGEgJT4lIHN1bW1hcmlzZShtZWFuPW1lYW4ob3JpZ2luYWxfQ1RtYXgpLCANCiAgICAgICAgICAgICAgICAgICBzZD1zZChvcmlnaW5hbF9DVG1heCksIA0KICAgICAgICAgICAgICAgICAgIG49bigpKQ0KDQpkYXRhICU+JSBzdW1tYXJpc2UobWVhbj1tZWFuKGltcHV0ZWRfQ1RtYXgpLCANCiAgICAgICAgICAgICAgICAgICBzZD1zZChpbXB1dGVkX0NUbWF4KSwgDQogICAgICAgICAgICAgICAgICAgbj1uKCkpDQoNCmdncGxvdChkYXRhKSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gYWNjbGltYXRpb25fdGVtcCwgeSA9IG9yaWdpbmFsX0NUbWF4KSwgDQogICAgICAgICAgICAgZmlsbCA9ICJvcmFuZ2UiLA0KICAgICAgICAgICAgIGNvbCA9ICJibGFjayIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwNCiAgICAgICAgICAgICBzaXplID0gNCwNCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBhY2NsaW1hdGlvbl90ZW1wLCB5ID0gaW1wdXRlZF9DVG1heCksIA0KICAgICAgICAgICAgIGZpbGwgPSIjMkE3ODhFRkYiLA0KICAgICAgICAgICAgIGNvbCA9ICJibGFjayIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwNCiAgICAgICAgICAgICBzaXplID0gNCwNCiAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsgDQogIGdlb21fc21vb3RoKGFlcyh4ID0gYWNjbGltYXRpb25fdGVtcCwgeSA9IG9yaWdpbmFsX0NUbWF4KSwgDQogICAgICAgICAgICAgIGNvbD0ib3JhbmdlIiwgDQogICAgICAgICAgICAgIGZpbGwgPSAib3JhbmdlIiwgDQogICAgICAgICAgICAgIG1ldGhvZD0ibG0iLA0KICAgICAgICAgICAgICBsaW5ld2lkdGggPSAyKSArDQogIGdlb21fc21vb3RoKGFlcyh4ID0gYWNjbGltYXRpb25fdGVtcCwgeSA9IGltcHV0ZWRfQ1RtYXgpLCANCiAgICAgICAgICAgICAgY29sID0gIiMyQTc4OEVGRiIsIA0KICAgICAgICAgICAgICBmaWxsID0gIiMyQTc4OEVGRiIsDQogICAgICAgICAgICAgIG1ldGhvZD0ibG0iLA0KICAgICAgICAgICAgICBsaW5ld2lkdGggPSAyKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHhsYWIoIkFjY2xpbWF0aW9uIHRlbXBlcmF0dXJlIikgKyANCiAgeWxhYigiQ1RtYXgiKSArIA0KICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpDQpgYGANCg0KRmlndXJlIEEyOiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBhY2NsaW1hdGlvbiB0ZW1wZXJhdHVyZSBhbmQgQ1RtYXggaW4gdGhlIG9yaWdpbmFsIChvcmFuZ2UpIGFuZCBpbXB1dGVkIChibHVlKSBjcm9zcy12YWxpZGF0ZWQgZGF0YS4gDQoNCiMgKipTdGF0aXN0aWNhbCBhbmFseXNlcyoqIA0KDQojIyAqKlRoZXJtYWwgc2FmZXR5IG1hcmdpbioqIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvUnVubmluZ19tb2RlbHNfVFNNLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9SdW5uaW5nX21vZGVsc19UU00ucGJzKiogDQoNCiMjIyAqKlBvcHVsYXRpb24tbGV2ZWwgcGF0dGVybnMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCioqTG9hZCB0aGUgZGF0YSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCg0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIFBvbmQNCnBvcF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCmBgYA0KDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gVFNNIHVzaW5nIGdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVscy4gVGhlc2UgbW9kZWxzIGRvIG5vdCBhY2NvdW50IGZvciB0aGUgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzIGJldHdlZW4gc3BlY2llcywgeWV0IHRoZXkgYXJlIGJldHRlciBhdCBjYXB0dXJpbmcgbm9uLWxpbmVhciBwYXR0ZXJucyBpbiBUU00gd2l0aCBsYXRpdHVkZS4gV2hpbGUgd2UgY291bGQgaGF2ZSBmaXR0ZWQgbW9kZWxzIHdpdGggc21vb3RoIHRlcm1zIHVzaW5nIGJybXMgb3Igc3RhbiwgdGhlc2UgbW9kZWxzIGV4Y2VlZGVkIG91ciBjb21wdXRhdGlvbmFsIGNhcGFjaXRpZXMuIA0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCg0KIyBGdW5jdGlvbiB0byBydW4gcG9wdWxhdGlvbi1sZXZlbCBUU00gbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX1RTTV9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KFRTTSB+IHMobGF0LCBicyA9ICJ0cCIpLCANCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAoMSB8IGdlbnVzL3NwZWNpZXMpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IDEvKGRhdGEkVFNNX3NlXjIpLA0KICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgICAgICAgICAgICAgICAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICBUU00gPSBOQSwgDQogICAgICAgICAgICAgICAgICAgICBUU01fc2UgPSBOQSwgDQogICAgICAgICAgICAgICAgICAgICBnZW51cyA9IE5BLCANCiAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRUU01fcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRUU01fcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IFRTTV9wcmVkICsgMS45NiAqIFRTTV9wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBUU01fcHJlZCAtIDEuOTYgKiBUU01fcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KfQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBwb25kX2N1cnJlbnQgPSBwb3BfcG9uZF9jdXJyZW50LA0KICBwb25kX2Z1dHVyZTJDID0gcG9wX3BvbmRfZnV0dXJlMkMsDQogIHBvbmRfZnV0dXJlNEMgPSBwb3BfcG9uZF9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMsDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDDQopIA0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKSANCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHNfcG9wPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fVFNNX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fcG9uZF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fcG9uZF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMgKipWaXN1YWxpemUgdGhlIHJlc3VsdHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCmBgYHtyfQ0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KdHNtX21pbiA8LSBtaW4obWluKHBvcF9zdWJfY3VycmVudCRUU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKHBvcF9zdWJfZnV0dXJlNEMkVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1pbihwb3BfYXJiX2N1cnJlbnQkVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1pbihwb3BfYXJiX2Z1dHVyZTRDJFRTTSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4ocG9wX3BvbmRfY3VycmVudCRUU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKHBvcF9wb25kX2Z1dHVyZTRDJFRTTSwgbmEucm0gPSBUUlVFKSkNCg0KdHNtX21heCA8LSBtYXgobWF4KHBvcF9zdWJfY3VycmVudCRUU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KHBvcF9zdWJfZnV0dXJlNEMkVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2N1cnJlbnQkVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2Z1dHVyZTRDJFRTTSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgocG9wX3BvbmRfY3VycmVudCRUU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KHBvcF9wb25kX2Z1dHVyZTRDJFRTTSwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCnByZWRfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX1RTTV9zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSksIA0KICAgICAgICAgICAgIGNvbG91cj0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiVFNNIikgKw0KICB5bGltKDAsIHRzbV9tYXgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KDQpwb3BfVFNNX3N1Yg0KYGBgDQoNCkZpZ3VyZSBBMzogTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIHRoZXJtYWwgc2FmZXR5IG1hcmdpbiBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zLiBUaGVybWFsIHNhZmV0eSBtYXJnaW5zIChUU00pIHdlcmUgY2FsY3VsYXRlZCBhcyB0aGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ1RtYXggYW5kIHRoZSBwcmVkaWN0ZWQgb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgZHVyaW5nIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNS4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IFRTTSBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IFRTTSBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IFRTTSBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIGdlbmVyYWxpc2VkIGFkZGl0aXZlIG1peGVkIG1vZGVscy4gDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDExfQ0KIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zDQpwcmVkX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNX3BvbmRfY3VycmVudC5yZHMiKQ0KcHJlZF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fcG9uZF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fcG9uZF9mdXR1cmU0Qy5yZHMiKQ0KDQoNCnBvcF9UU01fcG9uZCA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00pLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJUU00iKSArDQogIHlsaW0oMCwgdHNtX21heCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQoNCnBvcF9UU01fcG9uZA0KYGBgDQpGaWd1cmUgQTQ6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiB0aGVybWFsIHNhZmV0eSBtYXJnaW4gZm9yIGFtcGhpYmlhbnMgaW4gcG9uZHMgb3Igd2V0bGFuZHMuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1LiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGlzZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiANCg0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDExfQ0KIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zDQpwcmVkX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQoNCnBvcF9UU01fYXJiIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00pLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00pLCANCiAgICAgICAgICAgICBjb2xvdXI9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIlRoZXJtYWwgc2FmZXR5IG1hcmdpbiIpICsNCiAgeWxpbSgwLCB0c21fbWF4KSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KcG9wX1RTTV9hcmINCmBgYA0KDQpGaWd1cmUgQTU6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiB0aGVybWFsIHNhZmV0eSBtYXJnaW4gZm9yIGFtcGhpYmlhbnMgaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24uIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1LiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGlzZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiANCg0KIyMjIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MTB9DQphbGxfaGFiaXRhdHMgPC0gKHBvcF9UU01fc3ViIC8NCiAgICAgICAgICAgICAgICAgcG9wX1RTTV9wb25kIC8NCiAgICAgICAgICAgICAgICAgcG9wX1RTTV9hcmIgLw0KICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gMSkpDQoNCmFsbF9oYWJpdGF0cw0KYGBgDQoNCkZpZ3VyZSBBNjogTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIHRoZXJtYWwgc2FmZXR5IG1hcmdpbiBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zICh0b3AgcGFuZWwpLCBpbiB3YXRlciBib2RpZXMgKG1pZGRsZSBwYW5lbCkgb3IgaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24gKGJvdHRvbSBwYW5lbCkuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1LiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgVFNNIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSZWQgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBUU00gaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSB1c2VkIEJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMgdG8gZXN0aW1hdGUgdGhlIG1lYW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGRlY29tcG9zZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiBhbW9uZyBzcGVjaWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKg0KYGBge3IsIGV2YWwgPUZ9DQojIFJ1biBhbmFseXNlcyB3aXRoIE1DTUNnbG1tIHRvIGVzdGltYXRlIG1lYW4gVFNNIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBzY2VuYXJpbw0KDQojIENvbWJpbmUgZGF0YXNldHMNCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIiksIA0KICBwb3BfcG9uZF9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2N1cnJlbnQiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTJDIiksIA0KICBwb3BfcG9uZF9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmU0QyIpDQopDQoNCiMgRHVwbGljYXRlIHRpcC5sYWJlbCBjb2x1bW4gdmFsdWVzDQphbGxfZGF0YSRzcGVjaWVzIDwtIGFsbF9kYXRhJHRpcC5sYWJlbCANCg0KIyBNYXRjaCBwaHlsb2dlbnkgdG8gZGF0YXNldA0KdHJlZSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQp0cmVlIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChhbGxfZGF0YSR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICANCg0KIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KdHJlZSA8LSBmb3JjZS51bHRyYW1ldHJpYyh0cmVlLCBtZXRob2Q9ImV4dGVuZCIpIA0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQoNCiMgQ29udmVydCB0aWJibGUgdG8gZGF0YWZyYW1lIChuZWVkZWQgZm9yIE1DTUNnbG1tKQ0KYWxsX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfZGF0YSkNCg0KIyBTZXQgcHJpb3INCnByaW9yICA8LSBsaXN0KFIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyKSwgDQogICAgICAgICAgICAgICBHID0gbGlzdChHMSA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEczID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwsIHZhcmlhdGlvbiBiZXR3ZWVuIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0ZSBzY2VuYXJpb3MNCm1vZGVsX01DTUMgPC0gTUNNQ2dsbW0oVFNNIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV9zZSk6dW5pdHMsICMgR2VudXMsIHNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICBnaW52ZXJzZT1saXN0KHRpcC5sYWJlbCA9IEFpbnYpLA0KICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9NQ01DLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVzcG9uc2UiKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShwcmVkaWN0aW9uID0gZW1tZWFuKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9NQ01DLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vbW9kZWxfTUNNQ2dsbW1fVFNNLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfTUNNQ2dsbW1fVFNNLnJkcyIpDQoNCg0KIyBDb250cmFzdHMNCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX01DTUNfY29udHJhc3QgPC0gTUNNQ2dsbW0oVFNNIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgIyBzdWJzdHJhdGVfY3VycmVudCBhcyB0aGUgcmVmZXJlbmNlIGxldmVsDQogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChUU01fc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9tb2RlbF9NQ01DZ2xtbV9UU01fY29udHJhc3QucmRzIikNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgcG9wdWxhdGlvbnMqKiANCg0KSGVyZSwgd2Ugb25seSBmb2N1cyBvbiB0aGUgcG9wdWxhdGlvbnMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0LiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIFJlbG9hZCBkYXRhc2V0IHdpdGhvdXQgcG9uZCBkYXRhDQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgRmlsdGVyIHRvIHBvcHVsYXRpb25zIHByZWRpY3RlZCB0byBvdmVyaGVhdA0KYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsDQphbGxfZGF0YSA8LSBmaWx0ZXIoYWxsX2RhdGEsIG92ZXJoZWF0aW5nX3Jpc2sgPiAwKQ0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQoNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9UU00gPC0gTUNNQ2dsbW0oVFNNIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV9zZSk6dW5pdHMsICMgU3BlY2llcywgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzLCBhbmQgd2VpZ2h0cw0KICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgbml0dCA9IDYwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICB0aGluID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgIGJ1cm5pbiA9IDEwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpIA0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX1RTTSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfVFNNLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vbW9kZWxfTUNNQ2dsbW1fVFNNX292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX01DTUNnbG1tX1RTTV9vdmVyaGVhdGluZ19wb3AucmRzIikNCmBgYA0KDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogDQoNCiMjIyMjIyAqKkZ1bGwgZGF0YXNldCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9tb2RlbF9NQ01DZ2xtbV9UU00ucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU00pDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19NQ01DZ2xtbV9UU00ucmRzIikNCikNCg0KIyBNb2RlbCBkaWFnbm9zdGljcw0KcGxvdChtb2RlbF9NQ01DX1RTTSkNCmBgYA0KDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeSAoY29udHJhc3RzKQ0KbW9kZWxfTUNNQ19UU01fY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9tb2RlbF9NQ01DZ2xtbV9UU01fY29udHJhc3QucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU01fY29udHJhc3QpDQpgYGANCg0KIyMjIyMjICoqU3Vic2V0IG9mIG92ZXJoZWF0aW5nIHBvcHVsYXRpb25zKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9tb2RlbF9NQ01DZ2xtbV9UU01fb3ZlcmhlYXRpbmdfcG9wLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfVFNNKQ0KDQojIE1vZGVsIHByZWRpY3Rpb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfTUNNQ2dsbW1fVFNNX292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0KKQ0KDQojIE1vZGVsIGRpYWdub3N0aWNzDQpwbG90KG1vZGVsX01DTUNfVFNNKQ0KYGBgDQoNCg0KIyMjICoqQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQoqKkxvYWQgdGhlIGRhdGEqKiANCg0KYGBge3J9DQpjb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmNvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIGNvbW11bml0eS1sZXZlbCBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBUU00gdXNpbmcgZ2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWxzLg0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCiMgRnVuY3Rpb24gdG8gcnVuIGNvbW11bml0eS1sZXZlbCBUU00gbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX2NvbW11bml0eV9UU01fYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQoY29tbXVuaXR5X1RTTSB+IHMobGF0LCBicyA9ICJ0cCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gMS8oZGF0YSRjb21tdW5pdHlfVFNNX3NlXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgICAgICAgICAgICAgICAgICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgY29tbXVuaXR5X1RTTSA9IE5BLCANCiAgICAgICAgICAgICAgICAgICAgIGNvbW11bml0eV9UU01fc2UgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRUU01fcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRUU01fcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IFRTTV9wcmVkICsgMS45NiAqIFRTTV9wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBUU01fcHJlZCAtIDEuOTYgKiBUU01fcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIA0KICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgDQogICAgICAgICAgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCANCiAgICAgICAgICBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQp9DQoNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgcG9uZF9jdXJyZW50ID0gY29tbXVuaXR5X3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDDQopDQoNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fY29tbXVuaXR5X1RTTV9hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9UU01fcG9uZF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfVFNNX3BvbmRfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X1RTTV9wb25kX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfVFNNX3BvbmRfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9UU01fcG9uZF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X1RTTV9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfVFNNX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9UU01fYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KTG9hZCBkYXRhDQpgYGB7cn0NCiMgU3Vic3RyYXRlIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBQb25kIGRhdGENCmNvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCiMgVXBsb2FkIGhpZ2ggcmVzb2x1dGlvbiBFYXJ0aCBkYXRhDQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZCA8LSB3b3JsZCAlPiUNCiAgICBmaWx0ZXIoIWdyZXBsKCJBbnRhcmN0aWNhIiwgbmFtZSkpDQpzdF9jcnMod29ybGQpIDwtIHN0X2Nycyhjb21tdW5pdHlfcG9uZF9jdXJyZW50KQ0KDQoNCiMgRmluZCBsaW1pdHMgZm9yIGNvbG91cnMgb2YgdGhlIHBsb3QNCnRzbV9taW4gPC0gbWluKG1pbihjb21tdW5pdHlfc3ViX2N1cnJlbnQkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfc3ViX2Z1dHVyZTRDJGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSkNCg0KdHNtX21heCA8LSBtYXgobWF4KGNvbW11bml0eV9zdWJfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9zdWJfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3N1Yl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJUU00iLA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA0MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX3N1Yl9UU01fZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA0MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikNCg0KbGF0X3N1Yl9hbGwgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEgKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiVFNNIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX1RTTV9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X3N1Yl9hbGwgKyANCiAgICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQoNCnN1YnN0cmF0ZV9wbG90DQpgYGANCg0KRmlndXJlIEE3OiBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGluIGVhY2ggY29tbXVuaXR5ICgxLWRlZ3JlZSBncmlkIGNlbGwpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gVFNNIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3BvbmRfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQoNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX3BvbmRfVFNNX2Z1dHVyZTJDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRkFBNDNBIikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX3BvbmRfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCnByZWRfY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCmxhdF9wb25kX2FsbCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKDAsIDQwKSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJUU00iKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpwb25kX3Bsb3QgPC0gKG1hcF9wb25kX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgbWFwX3BvbmRfVFNNX2Z1dHVyZTJDICsNCiAgICAgICAgICAgICAgICBtYXBfcG9uZF9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICBsYXRfcG9uZF9hbGwgKyANCiAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQoNCnBvbmRfcGxvdA0KYGBgDQoNCkZpZ3VyZSBBODogQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zIGluIHRoZXJtYWwgc2FmZXR5IG1hcmdpbiBmb3IgYW1waGliaWFucyBpbiB3YXRlciBib2RpZXMuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGluIGVhY2ggY29tbXVuaXR5ICgxLWRlZ3JlZSBncmlkIGNlbGwpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gVFNNIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA2fQ0KIyBDdXJyZW50DQptYXBfYXJiX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQojIEZ1dHVyZSArMkMgDQptYXBfYXJiX1RTTV9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRkFBNDNBIikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX2FyYl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCnByZWRfY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQoNCmxhdF9hcmJfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiVFNNIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KYXJib3JlYWxfcGxvdCA8LSAobWFwX2FyYl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlMkMgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICBsYXRfYXJiX2FsbCArIA0KICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDQpKQ0KDQphcmJvcmVhbF9wbG90DQpgYGANCg0KRmlndXJlIEE5OiBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGZvciBhbXBoaWJpYW5zIGluIGFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uLiBUaGVybWFsIHNhZmV0eSBtYXJnaW5zIChUU00pIHdlcmUgY2FsY3VsYXRlZCBhcyB0aGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ1RtYXggYW5kIHRoZSBwcmVkaWN0ZWQgb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgZHVyaW5nIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNSBpbiBlYWNoIGNvbW11bml0eSAoMS1kZWdyZWUgZ3JpZCBjZWxsKS4gVGhlIGZpcnN0IGNvbHVtbiByZWZlciB0byBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgdGhlIG1pZGRsZSBjb2x1bW4gYXNzdW1lICsyQyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAob3JhbmdlKSwgYW5kIHRoZSByaWdodCBjb2x1bW4gYXNzdW1lICs0QyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIFRTTSBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCg0KIyMjIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQoNCmFsbF9oYWJpdGF0cyA8LSAoc3Vic3RyYXRlX3Bsb3QvcG9uZF9wbG90L2FyYm9yZWFsX3Bsb3QvcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCmBgYA0KDQpGaWd1cmUgQTEwOiBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMgKHRvcCByb3cpLCBpbiB3YXRlciBib2RpZXMgKG1pZGRsZSByb3cpLCBvciBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbiAoYm90dG9tIHJvdykuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGluIGVhY2ggY29tbXVuaXR5ICgxLWRlZ3JlZSBncmlkIGNlbGwpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gVFNNIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSB1c2VkIEJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMgdG8gZXN0aW1hdGUgdGhlIG1lYW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGRlY29tcG9zZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiBhbW9uZyBzcGVjaWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIGNvbW11bml0eV9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBjb21tdW5pdHlfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfY29tbXVuaXR5X2RhdGEpDQoNCnByaW9yX2NvbW11bml0eSAgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIEcgPSBsaXN0KEc0ID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfTUNNQ19jb21tdW5pdHkgPC0gTUNNQ2dsbW0oY29tbXVuaXR5X1RTTSB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBpZGgoY29tbXVuaXR5X1RTTV9zZSk6dW5pdHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfY29tbXVuaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfTUNNQ19jb21tdW5pdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9jb21tdW5pdHlfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVzcG9uc2UiKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShwcmVkaWN0aW9uID0gZW1tZWFuKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbW11bml0eSwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvVFNNL21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9UU00ucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfVFNNLnJkcyIpDQoNCg0KIyBDb250cmFzdCANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KbW9kZWxfTUNNQ19jb21tdW5pdHlfY29udHJhc3QgPC0gTUNNQ2dsbW0oY29tbXVuaXR5X1RTTSB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgQ29udHJhc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gaWRoKGNvbW11bml0eV9UU01fc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yX2NvbW11bml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29tbXVuaXR5X2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X1RTTV9jb250cmFzdC5yZHMiKQ0KDQpgYGANCg0KIyMjIyMjICoqU3Vic2V0IG9mIG92ZXJoZWF0aW5nIGNvbW11bml0aWVzKiogDQoNCkhlcmUsIHdlIG9ubHkgZm9jdXMgb24gdGhlIGNvbW11bml0aWVzIHRoYXQgYXJlIHByZWRpY3RlZCB0byBvdmVyaGVhdC4gDQoNCmBgYHtyLCBldmFsID1GfQ0KIyBSZWxvYWQgZGF0YXNldCB3aXRob3V0IHBvbmQgZGF0YQ0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGJpbmRfcm93cygNCiAgY29tbXVuaXR5X3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIGNvbW11bml0eV9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIikNCikNCg0KIyBGaWx0ZXIgdG8gb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMgDQphbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5jaGFyYWN0ZXIoYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBmaWx0ZXIoYWxsX2NvbW11bml0eV9kYXRhLCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPiAwKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfVFNNX2NvbW11bml0eSA8LSBNQ01DZ2xtbShjb21tdW5pdHlfVFNNIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGlkaChjb21tdW5pdHlfVFNNX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfY29tbXVuaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXR0ID0gNjAwMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW4gPSAxMDAwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfVFNNX2NvbW11bml0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2NvbW11bml0eV9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX1RTTV9jb21tdW5pdHksIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9tb2RlbF9NQ01DZ2xtbV9jb21tdW5pdHlfVFNNX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfTUNNQ2dsbW1fY29tbXVuaXR5X1RTTV9vdmVyaGVhdGluZ19jb21tdW5pdGllcy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9NQ01DX1RTTSA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9UU00ucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU00pDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfVFNNLnJkcyIpDQopDQoNCiMgTW9kZWwgZGlhZ25vc3RpY3MNCnBsb3QobW9kZWxfTUNNQ19UU00pDQpgYGANCg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkgKGNvbnRyYXN0cykNCm1vZGVsX01DTUNfVFNNX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X1RTTV9jb250cmFzdC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX1RTTV9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9NQ01DX1RTTSA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9UU01fb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU00pDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfVFNNX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQopDQoNCiMgTW9kZWwgZGlhZ25vc3RpY3MNCnBsb3QobW9kZWxfTUNNQ19UU00pDQpgYGANCg0KDQoNCiMjICoqQ1RtYXgqKiANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgdGhlIHZhcmlhdGlvbiBpbiBDVG1heCBhY3Jvc3MgaGFiaXRhdHMgYW5kIHdhcm1pbmcgc2NlbmFyaW9zLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX0NUbWF4LlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9SdW5uaW5nX21vZGVsc19DVG1heC5wYnMqKiANCg0KIyMjICoqUG9wdWxhdGlvbi1sZXZlbCBwYXR0ZXJucyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KICoqTG9hZCB0aGUgZGF0YSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCg0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIFBvbmQNCnBvcF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCmBgYA0KDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gQ1RtYXggdXNpbmcgZ2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWxzLiBUaGVzZSBtb2RlbHMgZG8gbm90IGFjY291bnQgZm9yIHRoZSBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYmV0d2VlbiBzcGVjaWVzLCB5ZXQgdGhleSBhcmUgYmV0dGVyIGF0IGNhcHR1cmluZyBub24tbGluZWFyIHBhdHRlcm5zIGluIENUbWF4IHdpdGggbGF0aXR1ZGUuIFdoaWxlIHdlIGNvdWxkIGhhdmUgZml0dGVkIG1vZGVscyB3aXRoIHNtb290aCB0ZXJtcyB1c2luZyBicm1zIG9yIHN0YW4sIHRoZXNlIG1vZGVscyBleGNlZWRlZCBvdXIgY29tcHV0YXRpb25hbCBjYXBhY2l0aWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIENUbWF4IG1vZGVscyBpbiBwYXJhbGxlbCANCnJ1bl9DVG1heF9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldCANCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChDVG1heCB+IHMobGF0LCBicyA9ICJ0cCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKDEgfCBnZW51cy9zcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IDEvKGRhdGEkQ1RtYXhfc2VeMiksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIENUbWF4ID0gTkEsIA0KICAgIENUbWF4X3NlID0gTkEsIA0KICAgIGdlbnVzID0gTkEsIA0KICAgIHNwZWNpZXMgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRDVG1heF9wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJENUbWF4X3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBDVG1heF9wcmVkICsgMS45NiAqIENUbWF4X3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IENUbWF4X3ByZWQgLSAxLjk2ICogQ1RtYXhfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KfQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBwb25kX2N1cnJlbnQgPSBwb3BfcG9uZF9jdXJyZW50LA0KICBwb25kX2Z1dHVyZTJDID0gcG9wX3BvbmRfZnV0dXJlMkMsDQogIHBvbmRfZnV0dXJlNEMgPSBwb3BfcG9uZF9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMsDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDDQopIA0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKSANCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHNfcG9wPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fQ1RtYXhfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X01FUl9wb3BfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9wb25kX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X3BvbmRfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KDQojIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KYGBge3J9DQojIEZpbmQgbGltaXRzIGZvciBjb2xvdXJzIG9mIHRoZSBwbG90DQpDVG1heF9taW4gPC0gbWluKG1pbihwb3Bfc3ViX2N1cnJlbnQkQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtaW4ocG9wX3N1Yl9mdXR1cmU0QyRDVG1heCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1pbihwb3BfYXJiX2N1cnJlbnQkQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtaW4ocG9wX2FyYl9mdXR1cmU0QyRDVG1heCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1pbihwb3BfcG9uZF9jdXJyZW50JENUbWF4LCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWluKHBvcF9wb25kX2Z1dHVyZTRDJENUbWF4LCBuYS5ybSA9IFRSVUUpKQ0KDQpDVG1heF9tYXggPC0gbWF4KG1heChwb3Bfc3ViX2N1cnJlbnQkQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtYXgocG9wX3N1Yl9mdXR1cmU0QyRDVG1heCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2N1cnJlbnQkQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtYXgocG9wX2FyYl9mdXR1cmU0QyRDVG1heCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1heChwb3BfcG9uZF9jdXJyZW50JENUbWF4LCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWF4KHBvcF9wb25kX2Z1dHVyZTRDJENUbWF4LCBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMX0NCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikNCg0KDQpwb3BfQ1RtYXhfc3ViIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4KSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4KSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgpLCANCiAgICAgICAgICAgICBjb2xvdXI9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIkNUbWF4IikgKw0KICB5bGltKENUbWF4X21pbiwgQ1RtYXhfbWF4KSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KcG9wX0NUbWF4X3N1Yg0KYGBgDQoNCkZpZ3VyZSBBMTE6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBDVG1heCBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zLiBDVG1heCBpcyB0aGUgbWVhbiBwcmVkaWN0ZWQgQ1RtYXggYWNyb3NzIHRoZSB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBDVG1heCBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IENUbWF4IGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgQ1RtYXggaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMX0NCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfcG9uZF9jdXJyZW50LnJkcyIpDQpwcmVkX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X3BvbmRfZnV0dXJlNEMucmRzIikNCg0KDQpwb3BfQ1RtYXhfcG9uZCA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgpLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4KSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4KSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJDVG1heCIpICsNCiAgeWxpbShDVG1heF9taW4sIENUbWF4X21heCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQoNCnBvcF9DVG1heF9wb25kDQpgYGANCkZpZ3VyZSBBMTI6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBDVG1heCBmb3IgYW1waGliaWFucyBpbiB3YXRlciBib2RpZXMuIENUbWF4IGlzIHRoZSBtZWFuIHByZWRpY3RlZCBDVG1heCBhY3Jvc3MgdGhlIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNS4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IENUbWF4IGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgQ1RtYXggaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBDVG1heCBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIGdlbmVyYWxpc2VkIGFkZGl0aXZlIG1peGVkIG1vZGVscy4gDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX0NUbWF4X2FyYiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBDVG1heCksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBDVG1heCksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4KSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJDVG1heCIpICsNCiAgeWxpbShDVG1heF9taW4sIENUbWF4X21heCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQoNCnBvcF9DVG1heF9hcmINCmBgYA0KDQpGaWd1cmUgQTEzOiBMYXRpdHVkaW5hbCB2YXJpYXRpb24gaW4gQ1RtYXggZm9yIGFtcGhpYmlhbnMgaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24uIENUbWF4IGlzIHRoZSBtZWFuIHByZWRpY3RlZCBDVG1heCBhY3Jvc3MgdGhlIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNS4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IENUbWF4IGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgQ1RtYXggaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBDVG1heCBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIGdlbmVyYWxpc2VkIGFkZGl0aXZlIG1peGVkIG1vZGVscy4gDQoNCiMjIyMjIyAqKkFsbCBoYWJpdGF0cyoqIA0KDQpgYGB7ciwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTEwfQ0KYWxsX2hhYml0YXRzIDwtIChwb3BfQ1RtYXhfc3ViIC8NCiAgICAgICAgICAgICAgICAgcG9wX0NUbWF4X3BvbmQgLw0KICAgICAgICAgICAgICAgICBwb3BfQ1RtYXhfYXJiIC8NCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCmBgYA0KDQoNCkZpZ3VyZSBBMTQ6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBDVG1heCBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zICh0b3AgcGFuZWwpLCBpbiB3YXRlciBib2RpZXMgKG1pZGRsZSBwYW5lbCkgb3IgaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24gKGJvdHRvbSBwYW5lbCkuIENUbWF4IGlzIHRoZSBtZWFuIHByZWRpY3RlZCBDVG1heCBhY3Jvc3MgdGhlIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNS4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IENUbWF4IGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgQ1RtYXggaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBDVG1heCBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIGdlbmVyYWxpc2VkIGFkZGl0aXZlIG1peGVkIG1vZGVscy4gDQoNCg0KIyMjIyAqKkJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgdXNlZCBCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzIHRvIGVzdGltYXRlIHRoZSBtZWFuIENUbWF4IGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGRlY29tcG9zZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiBhbW9uZyBzcGVjaWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgcG9wX3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBwb3BfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgcG9wX3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfZGF0YSRzcGVjaWVzIDwtIGFsbF9kYXRhJHRpcC5sYWJlbA0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQoNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCiMgUnVuIG1vZGVscyB3aXRoIE1DTUNnbG1tIA0KcHJpb3IgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzMgPSBsaXN0KFYgPSAxLCBmaXggPSAxKSkpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCwgdmFyaWF0aW9uIGJldHdlZW4gbWljcm9oYWJpdGF0IGFuZCBjbGltYXRlIHNjZW5hcmlvcw0KbW9kZWxfTUNNQyA8LSBNQ01DZ2xtbShDVG1heCB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgoQ1RtYXhfc2UpOnVuaXRzLCAjIFNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L21vZGVsX01DTUNnbG1tX0NUbWF4LnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9DVG1heC5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIFRoZSBjb250cmFzdCBtb2RlbCBjb3VsZCBub3QgZXN0aW1hdGUgdGhlIHBoeWxvZ2VuZXRpYyBlZmZlY3QgKGxpa2VseSBiZWNhdXNlIENUbWF4IHZhbHVlcyBhcmUgcmF0aGVyIGNsb3NlKS4NCiMgVGhlcmVmb3JlLCBvbmx5IGEgdGhlIHNwZWNpZXMtbGV2ZWwgcmFuZG9tIGVmZmVjdCB3YXMga2VwdA0KDQpwcmlvcjIgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIGZpeCA9IDEpKSkNCg0KbW9kZWxfTUNNQ19jb250cmFzdCA8LSBNQ01DZ2xtbShDVG1heCB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyBpZGgoQ1RtYXhfc2UpOnVuaXRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L21vZGVsX01DTUNnbG1tX0NUbWF4X2NvbnRyYXN0LnJkcyIpDQpgYGANCg0KIyMjIyMjICoqU3Vic2V0IG9mIG92ZXJoZWF0aW5nIHBvcHVsYXRpb25zKiogDQoNCkhlcmUsIHdlIG9ubHkgZm9jdXMgb24gdGhlIHBvcHVsYXRpb25zIHRoYXQgYXJlIHByZWRpY3RlZCB0byBvdmVyaGVhdC4gDQoNCmBgYHtyLCBldmFsID1GfQ0KIyBSZWxvYWQgZGF0YXNldCB3aXRob3V0IHBvbmQgZGF0YQ0KYWxsX2RhdGEgPC0gYmluZF9yb3dzKA0KICBwb3Bfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBwb3Bfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIHBvcF9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgcG9wX2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBwb3BfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgcG9wX2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQojIEZpbHRlciB0byBwb3B1bGF0aW9ucyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQNCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuY2hhcmFjdGVyKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQphbGxfZGF0YSRzcGVjaWVzIDwtIGFsbF9kYXRhJHRpcC5sYWJlbA0KYWxsX2RhdGEgPC0gZmlsdGVyKGFsbF9kYXRhLCBvdmVyaGVhdGluZ19yaXNrID4gMCkNCg0KIyBNYXRjaCBwaHlsb2dlbnkgdG8gZGF0YXNldA0KdHJlZSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQp0cmVlIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChhbGxfZGF0YSR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICANCg0KdHJlZSA8LSBmb3JjZS51bHRyYW1ldHJpYyh0cmVlLCBtZXRob2Q9ImV4dGVuZCIpICMgRm9yY2UgdGhlIHRyZWUgdG8gYmUgdWx0cmFtZXRyaWMNCg0KQWludjwtaW52ZXJzZUEodHJlZSkkQWludg0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfQ1RtYXggPC0gTUNNQ2dsbW0oQ1RtYXggfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChDVG1heF9zZSk6dW5pdHMsICMgU3BlY2llcywgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzLCBhbmQgd2VpZ2h0cw0KICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5pdHQgPSA2MDAwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICB0aGluID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgYnVybmluID0gMTAwMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKSANCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9DVG1heCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfQ1RtYXgsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L21vZGVsX01DTUNnbG1tX0NUbWF4X292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfTUNNQ2dsbW1fQ1RtYXhfb3ZlcmhlYXRpbmdfcG9wLnJkcyIpDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiANCg0KIyMjIyMjICoqRnVsbCBkYXRhc2V0KioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9NQ01DX0NUbWF4IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9tb2RlbF9NQ01DZ2xtbV9DVG1heC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4KQ0KDQojIE1vZGVsIHByZWRpY3Rpb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9DVG1heC5yZHMiKSkNCg0KIyBNb2RlbCBkaWFnbm9zdGljcw0KcGxvdChtb2RlbF9NQ01DX0NUbWF4KQ0KYGBgDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5IChjb250cmFzdHMpDQptb2RlbF9NQ01DX0NUbWF4X2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9tb2RlbF9NQ01DZ2xtbV9DVG1heF9jb250cmFzdC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4X2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjIyAqKlN1YnNldCBvZiBvdmVyaGVhdGluZyBwb3B1bGF0aW9ucyoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfTUNNQ19DVG1heCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvbW9kZWxfTUNNQ2dsbW1fQ1RtYXhfb3ZlcmhlYXRpbmdfcG9wLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfQ1RtYXgpDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX01DTUNnbG1tX0NUbWF4X292ZXJoZWF0aW5nX3BvcC5yZHMiKSkNCg0KIyBNb2RlbCBkaWFnbm9zdGljcw0KcGxvdChtb2RlbF9NQ01DX0NUbWF4KQ0KYGBgDQoNCg0KIyMjICoqQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zKiogIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KKipMb2FkIHRoZSBkYXRhKiogDQoNCmBgYHtyfQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpjb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSBjb21tdW5pdHktbGV2ZWwgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gQ1RtYXggdXNpbmcgZ2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWxzLg0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCiMgRnVuY3Rpb24gdG8gcnVuIGNvbW11bml0eS1sZXZlbCBDVG1heCBtb2RlbHMgaW4gcGFyYWxsZWwgDQpydW5fY29tbXVuaXR5X0NUbWF4X2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIGRhdGEgPC0gZGF0YXNldCANCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChjb21tdW5pdHlfQ1RtYXggfiBzKGxhdCwgYnMgPSAidHAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IDEvKGRhdGEkY29tbXVuaXR5X0NUbWF4X3NlXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBOQSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkQ1RtYXhfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRDVG1heF9wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gQ1RtYXhfcHJlZCArIDEuOTYgKiBDVG1heF9wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBDVG1heF9wcmVkIC0gMS45NiAqIENUbWF4X3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KfQ0KDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgYXJib3JlYWxfY3VycmVudCA9IGNvbW11bml0eV9hcmJfY3VycmVudCwNCiAgYXJib3JlYWxfZnV0dXJlMkMgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLA0KICBhcmJvcmVhbF9mdXR1cmU0QyA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsDQogIHBvbmRfY3VycmVudCA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsDQogIHBvbmRfZnV0dXJlMkMgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywNCiAgcG9uZF9mdXR1cmU0QyA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IGNvbW11bml0eV9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0Qw0KKQ0KDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzIDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX2NvbW11bml0eV9DVG1heF9hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X0NUbWF4X3BvbmRfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfQ1RtYXhfcG9uZF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9DVG1heF9wb25kX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9wb25kX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9DVG1heF9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9DVG1heF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9DVG1heF9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9DVG1heF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KTG9hZCBkYXRhDQpgYGB7cn0NCiMgU3Vic3RyYXRlIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBQb25kIGRhdGENCmNvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCiMgVXBsb2FkIGhpZ2ggcmVzb2x1dGlvbiBFYXJ0aCBkYXRhDQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZCA8LSB3b3JsZCAlPiUNCiAgICBmaWx0ZXIoIWdyZXBsKCJBbnRhcmN0aWNhIiwgbmFtZSkpDQpzdF9jcnMod29ybGQpIDwtIHN0X2Nycyhjb21tdW5pdHlfc3ViX2N1cnJlbnQpDQoNCg0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KQ1RtYXhfbWluIDwtIG1pbihtaW4oY29tbXVuaXR5X3N1Yl9jdXJyZW50JGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfc3ViX2Z1dHVyZTRDJGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9jdXJyZW50JGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRjb21tdW5pdHlfQ1RtYXgsIG5hLnJtID0gVFJVRSkpDQoNCkNUbWF4X21heCA8LSBtYXgobWF4KGNvbW11bml0eV9zdWJfY3VycmVudCRjb21tdW5pdHlfQ1RtYXgsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRjb21tdW5pdHlfQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9hcmJfY3VycmVudCRjb21tdW5pdHlfQ1RtYXgsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRjb21tdW5pdHlfQ1RtYXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9wb25kX2N1cnJlbnQkY29tbXVuaXR5X0NUbWF4LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJGNvbW11bml0eV9DVG1heCwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3N1Yl9DVG1heF9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9DVG1heCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkNUbWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjUsIDUwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKENUbWF4X21pbiwgQ1RtYXhfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX3N1Yl9DVG1heF9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjUsIDUwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKENUbWF4X21pbiwgQ1RtYXhfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNGQUE0M0EiKSkNCg0KIyBGdXR1cmUgKzRDDQptYXBfc3ViX0NUbWF4X2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfQ1RtYXgpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAiaW5mZXJubyIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgyNSwgNTAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoQ1RtYXhfbWluLCBDVG1heF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfc3ViX2FsbCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfQ1RtYXgpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfQ1RtYXgpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oQ1RtYXhfbWluLCBDVG1heF9tYXgpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIkNUbWF4IikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfQ1RtYXhfY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfQ1RtYXhfZnV0dXJlMkMgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX0NUbWF4X2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X3N1Yl9hbGwgKyANCiAgICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQoNCnN1YnN0cmF0ZV9wbG90DQpgYGANCg0KRmlndXJlIEExNTogQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zIGluIENUbWF4IGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMuIENUbWF4IGVzdGltYXRlcyB3ZXJlIGF2ZXJhZ2VkIHdpdGhpbiBjb21tdW5pdGllcyAoMS1kZWdyZWUgZ3JpZCBjZWxscykuIFRoZSBmaXJzdCBjb2x1bW4gcmVmZXIgdG8gY3VycmVudCBjbGltYXRlcyAoYmx1ZSksIHRoZSBtaWRkbGUgY29sdW1uIGFzc3VtZSArMkMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKG9yYW5nZSksIGFuZCB0aGUgcmlnaHQgY29sdW1uIGFzc3VtZSArNEMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBDVG1heCBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3BvbmRfQ1RtYXhfY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQ1RtYXgiLA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgyNSwgNTAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoQ1RtYXhfbWluLCBDVG1heF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQoNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX3BvbmRfQ1RtYXhfZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfQ1RtYXgpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAiaW5mZXJubyIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgyNSwgNTAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoQ1RtYXhfbWluLCBDVG1heF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9wb25kX0NUbWF4X2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjUsIDUwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKENUbWF4X21pbiwgQ1RtYXhfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikNCg0KbGF0X3BvbmRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9DVG1heCksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbShDVG1heF9taW4sIENUbWF4X21heCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiQ1RtYXgiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpwb25kX3Bsb3QgPC0gKG1hcF9wb25kX0NUbWF4X2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICBtYXBfcG9uZF9DVG1heF9mdXR1cmUyQyArDQogICAgICAgICAgICAgICAgbWFwX3BvbmRfQ1RtYXhfZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICBsYXRfcG9uZF9hbGwgKyANCiAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQoNCnBvbmRfcGxvdA0KYGBgDQoNCkZpZ3VyZSBBMTY6IENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBDVG1heCBmb3IgYW1waGliaWFucyBpbiB3YXRlciBib2RpZXMuIENUbWF4IGVzdGltYXRlcyB3ZXJlIGF2ZXJhZ2VkIHdpdGhpbiBjb21tdW5pdGllcyAoMS1kZWdyZWUgZ3JpZCBjZWxscykuIFRoZSBmaXJzdCBjb2x1bW4gcmVmZXIgdG8gY3VycmVudCBjbGltYXRlcyAoYmx1ZSksIHRoZSBtaWRkbGUgY29sdW1uIGFzc3VtZSArMkMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKG9yYW5nZSksIGFuZCB0aGUgcmlnaHQgY29sdW1uIGFzc3VtZSArNEMgb2Ygd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBDVG1heCBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX2FyYl9DVG1heF9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9DVG1heCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkNUbWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjUsIDUwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKENUbWF4X21pbiwgQ1RtYXhfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX2FyYl9DVG1heF9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjUsIDUwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKENUbWF4X21pbiwgQ1RtYXhfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNGQUE0M0EiKSkNCg0KIyBGdXR1cmUgKzRDDQptYXBfYXJiX0NUbWF4X2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfQ1RtYXgpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lID0gIkNUbWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDI1LCA1MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhDVG1heF9taW4sIENUbWF4X21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlNEMucmRzIikNCg0KbGF0X2FyYl9hbGwgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9DVG1heCksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X0NUbWF4KSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKENUbWF4X21pbiwgQ1RtYXhfbWF4KSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJDVG1heCIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCmFyYm9yZWFsX3Bsb3QgPC0gKG1hcF9hcmJfQ1RtYXhfY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9DVG1heF9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9DVG1heF9mdXR1cmU0QyArIA0KICAgICAgICAgICAgICAgICAgbGF0X2FyYl9hbGwgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KSkNCg0KYXJib3JlYWxfcGxvdA0KYGBgDQoNCkZpZ3VyZSBBMTc6IENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBDVG1heCBmb3IgYW1waGliaWFucyBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbi4gQ1RtYXggZXN0aW1hdGVzIHdlcmUgYXZlcmFnZWQgd2l0aGluIGNvbW11bml0aWVzICgxLWRlZ3JlZSBncmlkIGNlbGxzKS4gVGhlIGZpcnN0IGNvbHVtbiByZWZlciB0byBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgdGhlIG1pZGRsZSBjb2x1bW4gYXNzdW1lICsyQyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAob3JhbmdlKSwgYW5kIHRoZSByaWdodCBjb2x1bW4gYXNzdW1lICs0QyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIENUbWF4IGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KDQojIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gOH0NCg0KYWxsX2hhYml0YXRzIDwtIChzdWJzdHJhdGVfcGxvdC9wb25kX3Bsb3QvYXJib3JlYWxfcGxvdC9wbG90X2xheW91dChuY29sID0gMSkpDQoNCmFsbF9oYWJpdGF0cw0KYGBgDQoNCkZpZ3VyZSBBMTg6IENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBDVG1heCBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zICh0b3Agcm93KSwgaW4gd2F0ZXIgYm9kaWVzIChtaWRkbGUgcm93KSwgb3IgaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24gKGJvdHRvbSByb3cpLiBDVG1heCBlc3RpbWF0ZXMgd2VyZSBhdmVyYWdlZCB3aXRoaW4gY29tbXVuaXRpZXMgKDEtZGVncmVlIGdyaWQgY2VsbHMpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gQ1RtYXggaW4gY3VycmVudCBjbGltYXRlcyAoYmx1ZSksIG9yIGFzc3VtaW5nICsyQyAob3JhbmdlKSBvciArNEMgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gQmxhY2sgY29sb3VyIGRlcGljdHMgYXJlYXMgd2l0aCBubyBkYXRhLg0KDQoNCiMjIyMgKipCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIHVzZWQgQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyB0byBlc3RpbWF0ZSB0aGUgbWVhbiB0aGVybWFsIHNhZmV0eSBtYXJnaW4gaW4gZWFjaCBtaWNyb2hhYml0YXQgYW5kIGNsaW1hdGljIHNjZW5hcmlvLiBUaGVzZSBtb2RlbHMgYWNjb3VudCBmb3IgdGhlIGRpZmZlcmVudCBkZWdyZWVzIG9mIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcyBhbmQgZGVjb21wb3NlIHNvdXJjZXMgb2YgdmFyaWF0aW9uIGFtb25nIHNwZWNpZXMuIA0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCiMjIyMjIyAqKkZ1bGwgZGF0YXNldCoqIA0KDQpgYGB7ciwgZXZhbCA9Rn0NCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIGNvbW11bml0eV9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBjb21tdW5pdHlfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfY29tbXVuaXR5X2RhdGEpDQoNCnByaW9yX2NvbW11bml0eSAgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIEcgPSBsaXN0KEc0ID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfTUNNQ19jb21tdW5pdHkgPC0gTUNNQ2dsbW0oY29tbXVuaXR5X0NUbWF4IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGlkaChjb21tdW5pdHlfQ1RtYXhfc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yX2NvbW11bml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUNfY29tbXVuaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfY29tbXVuaXR5X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfTUNNQ19jb21tdW5pdHksIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9DVG1heC5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfTUNNQ2dsbW1fY29tbXVuaXR5X0NUbWF4LnJkcyIpDQoNCg0KIyBDb250cmFzdCANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KbW9kZWxfTUNNQ19jb21tdW5pdHlfY29udHJhc3QgPC0gTUNNQ2dsbW0oY29tbXVuaXR5X0NUbWF4IH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgIyBDb250cmFzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBpZGgoY29tbXVuaXR5X0NUbWF4X3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvcl9jb21tdW5pdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbW11bml0eV9jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X0NUbWF4X2NvbnRyYXN0LnJkcyIpDQoNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMqKiANCg0KSGVyZSwgd2Ugb25seSBmb2N1cyBvbiB0aGUgY29tbXVuaXRpZXMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0LiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIFJlbG9hZCBkYXRhc2V0IHdpdGhvdXQgcG9uZCBkYXRhDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQojIEZpbHRlciB0byBvdmVyaGVhdGluZyBjb21tdW5pdGllcyANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmNoYXJhY3RlcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGZpbHRlcihhbGxfY29tbXVuaXR5X2RhdGEsIG5fc3BlY2llc19vdmVyaGVhdGluZyA+IDApDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9DVG1heF9jb21tdW5pdHkgPC0gTUNNQ2dsbW0oY29tbXVuaXR5X0NUbWF4IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGlkaChjb21tdW5pdHlfVFNNX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfY29tbXVuaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXR0ID0gNjAwMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW4gPSAxMDAwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfQ1RtYXhfY29tbXVuaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfY29tbXVuaXR5X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfQ1RtYXhfY29tbXVuaXR5LCBmaWxlID0gIlJEYXRhL01vZGVscy9DVG1heC9tb2RlbF9NQ01DZ2xtbV9jb21tdW5pdHlfQ1RtYXhfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX01DTUNnbG1tX2NvbW11bml0eV9DVG1heF9vdmVyaGVhdGluZ19jb21tdW5pdGllcy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiANCg0KIyMjIyMjICoqRnVsbCBkYXRhc2V0KiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfTUNNQ19DVG1heCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X0NUbWF4LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfQ1RtYXgpDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX01DTUNnbG1tX2NvbW11bml0eV9DVG1heC5yZHMiKSkNCg0KIyBNb2RlbCBkaWFnbm9zdGljcw0KcGxvdChtb2RlbF9NQ01DX0NUbWF4KQ0KYGBgDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5IChjb250cmFzdHMpDQptb2RlbF9NQ01DX0NUbWF4X2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9tb2RlbF9NQ01DZ2xtbV9jb21tdW5pdHlfQ1RtYXhfY29udHJhc3QucmRzIikNCg0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4X2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjIyAqKlN1YnNldCBvZiBvdmVyaGVhdGluZyBjb21tdW5pdGllcyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX01DTUNfQ1RtYXggPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9DVG1heF9vdmVyaGVhdGluZ19jb21tdW5pdGllcy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4KQ0KDQojIE1vZGVsIHByZWRpY3Rpb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfQ1RtYXhfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikpDQoNCiMgTW9kZWwgZGlhZ25vc3RpY3MNCnBsb3QobW9kZWxfTUNNQ19DVG1heCkNCmBgYA0KDQoNCiMjICoqTWF4aW11bSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSoqIA0KDQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgdmFyaWF0aW9uIGluIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzIGFjcm9zcyBoYWJpdGF0cyBhbmQgd2FybWluZyBzY2VuYXJpb3MuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvUnVubmluZ19tb2RlbHNfbWF4X3RlbXAuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX21heF90ZW1wLnBicyoqIA0KDQojIyMgKipQb3B1bGF0aW9uLWxldmVsIHBhdHRlcm5zKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQoqKkxvYWQgdGhlIGRhdGEqKiANCg0KYGBge3J9DQojIExvYWQgcG9wdWxhdGlvbi1sZXZlbCBkYXRhDQoNCiMjIFN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBQb25kDQpwb3BfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQpgYGANCg0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIG1heGltdW0gYm9keSB0ZW1wZXJhdHVyZSB1c2luZyBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbHMuIFRoZXNlIG1vZGVscyBkbyBub3QgYWNjb3VudCBmb3IgdGhlIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcyBiZXR3ZWVuIHNwZWNpZXMsIHlldCB0aGV5IGFyZSBiZXR0ZXIgYXQgY2FwdHVyaW5nIG5vbi1saW5lYXIgcGF0dGVybnMgd2l0aCBsYXRpdHVkZS4gV2hpbGUgd2UgY291bGQgaGF2ZSBmaXR0ZWQgbW9kZWxzIHdpdGggc21vb3RoIHRlcm1zIHVzaW5nIGJybXMgb3Igc3RhbiwgdGhlc2UgbW9kZWxzIGV4Y2VlZGVkIG91ciBjb21wdXRhdGlvbmFsIGNhcGFjaXRpZXMuIA0KDQojIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgbWF4X3RlbXAgbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX21heF90ZW1wX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIHNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihkYXRhc2V0JHRpcC5sYWJlbCksICcgJykNCiAgZGF0YXNldCRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCiAgZGF0YXNldCRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQobWF4X3RlbXAgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJG1heF90ZW1wX3NlXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBtYXhfdGVtcCA9IE5BLCANCiAgICBtYXhfdGVtcF9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkbWF4X3RlbXBfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRtYXhfdGVtcF9wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gbWF4X3RlbXBfcHJlZCArIDEuOTYgKiBtYXhfdGVtcF9wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBtYXhfdGVtcF9wcmVkIC0gMS45NiAqIG1heF90ZW1wX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzX3BvcDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX21heF90ZW1wX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9wb25kX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMgKipWaXN1YWxpemUgdGhlIHJlc3VsdHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCmBgYHtyfQ0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KbWF4X3RlbXBfbWluIDwtIG1pbihtaW4ocG9wX3N1Yl9jdXJyZW50JG1heF90ZW1wLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWluKHBvcF9zdWJfZnV0dXJlNEMkbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtaW4ocG9wX2FyYl9jdXJyZW50JG1heF90ZW1wLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWluKHBvcF9hcmJfZnV0dXJlNEMkbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtaW4ocG9wX3BvbmRfY3VycmVudCRtYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1pbihwb3BfcG9uZF9mdXR1cmU0QyRtYXhfdGVtcCwgbmEucm0gPSBUUlVFKSkNCg0KbWF4X3RlbXBfbWF4IDwtIG1heChtYXgocG9wX3N1Yl9jdXJyZW50JG1heF90ZW1wLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWF4KHBvcF9zdWJfZnV0dXJlNEMkbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtYXgocG9wX2FyYl9jdXJyZW50JG1heF90ZW1wLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgbWF4KHBvcF9hcmJfZnV0dXJlNEMkbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICBtYXgocG9wX3BvbmRfY3VycmVudCRtYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgIG1heChwb3BfcG9uZF9mdXR1cmU0QyRtYXhfdGVtcCwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikNCnByZWRfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX21heF90ZW1wX3N1YiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJCb2R5IHRlbXBlcmF0dXJlIikgKw0KICB5bGltKG1heF90ZW1wX21pbiwgbWF4X3RlbXBfbWF4KSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KcG9wX21heF90ZW1wX3N1Yg0KYGBgDQoNCkZpZ3VyZSBBMTk6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBtYXhpbXVtIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zLiBCb2R5IHRlbXBlcmF0dXJlcyBhcmUgYXZlcmFnZWQgYWNyb3NzIHRoZSB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBib2R5IHRlbXBlcmF0dXJlcyBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IGJvZHkgdGVtcGVyYXR1cmVzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgYm9keSB0ZW1wZXJhdHVyZXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMX0NCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9jdXJyZW50LnJkcyIpDQpwcmVkX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlNEMucmRzIikNCg0KDQpwb3BfbWF4X3RlbXBfcG9uZCA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbWF4X3RlbXApLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJCb2R5IHRlbXBlcmF0dXJlIikgKw0KICB5bGltKG1heF90ZW1wX21pbiwgbWF4X3RlbXBfbWF4KSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KcG9wX21heF90ZW1wX3BvbmQNCmBgYA0KRmlndXJlIEEyMDogTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzIGZvciBhbXBoaWJpYW5zIGluIHdhdGVyIGJvZGllcy4gQm9keSB0ZW1wZXJhdHVyZXMgYXJlIGF2ZXJhZ2VkIGFjcm9zcyB0aGUgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1LiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgYm9keSB0ZW1wZXJhdHVyZXMgaW4gY3VycmVudCBtaWNyb2NsaW1hdGVzLiBPcmFuZ2UgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBib2R5IHRlbXBlcmF0dXJlcyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IGJvZHkgdGVtcGVyYXR1cmVzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGlzZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMX0NCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpwcmVkX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlNEMucmRzIikNCg0KDQpwb3BfbWF4X3RlbXBfYXJiIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbWF4X3RlbXApLCANCiAgICAgICAgICAgICBjb2xvdXI9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIkJvZHkgdGVtcGVyYXR1cmUiKSArDQogIHlsaW0obWF4X3RlbXBfbWluLCBtYXhfdGVtcF9tYXgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KDQpwb3BfbWF4X3RlbXBfYXJiDQpgYGANCg0KRmlndXJlIEEyMTogTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzIGZvciBhbXBoaWJpYW5zIGluIGFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uLiBCb2R5IHRlbXBlcmF0dXJlcyBhcmUgYXZlcmFnZWQgYWNyb3NzIHRoZSB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBib2R5IHRlbXBlcmF0dXJlcyBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IGJvZHkgdGVtcGVyYXR1cmVzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgYm9keSB0ZW1wZXJhdHVyZXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQojIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD0xMH0NCmFsbF9oYWJpdGF0cyA8LSAocG9wX21heF90ZW1wX3N1YiAvDQogICAgICAgICAgICAgICAgIHBvcF9tYXhfdGVtcF9wb25kIC8NCiAgICAgICAgICAgICAgICAgcG9wX21heF90ZW1wX2FyYiAvDQogICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KYWxsX2hhYml0YXRzDQpgYGANCg0KDQpGaWd1cmUgQTIyOiBMYXRpdHVkaW5hbCB2YXJpYXRpb24gaW4gbWF4aW11bSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZXMgZm9yIGFtcGhpYmlhbnMgb24gdGVycmVzdHJpYWwgY29uZGl0aW9ucyAodG9wIHBhbmVsKSwgaW4gd2F0ZXIgYm9kaWVzIChtaWRkbGUgcGFuZWwpIG9yIGluIGFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uIChib3R0b20gcGFuZWwpLiBCb2R5IHRlbXBlcmF0dXJlcyBhcmUgYXZlcmFnZWQgYWNyb3NzIHRoZSB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBib2R5IHRlbXBlcmF0dXJlcyBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IGJvZHkgdGVtcGVyYXR1cmVzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3QgYm9keSB0ZW1wZXJhdHVyZXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQoNCiMjIyMgKipCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIHVzZWQgQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyB0byBlc3RpbWF0ZSB0aGUgbWVhbiBib2R5IHRlbXBlcmF0dXJlIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGRlY29tcG9zZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiBhbW9uZyBzcGVjaWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgcG9wX3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBwb3BfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgcG9wX3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQoNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsDQoNCiMgTWF0Y2ggcGh5bG9nZW55IHRvIGRhdGFzZXQNCnRyZWUgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KdHJlZSA8LSBkcm9wLnRpcCh0cmVlLCB0cmVlJHRpcC5sYWJlbFstbWF0Y2goYWxsX2RhdGEkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAgDQoNCnRyZWUgPC0gZm9yY2UudWx0cmFtZXRyaWModHJlZSwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCkFpbnY8LWludmVyc2VBKHRyZWUpJEFpbnYNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCnBsYW4oc2VxdWVudGlhbCkgDQoNCiMgUnVuIG1vZGVscyB3aXRoIE1DTUNnbG1tIA0KcHJpb3IgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzMgPSBsaXN0KFYgPSAxLCBmaXggPSAxKSkpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCwgdmFyaWF0aW9uIGJldHdlZW4gbWljcm9oYWJpdGF0IGFuZCBjbGltYXRlIHNjZW5hcmlvcw0KbW9kZWxfTUNNQyA8LSBNQ01DZ2xtbShtYXhfdGVtcCB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgobWF4X3RlbXBfc2UpOnVuaXRzLCAjIFNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL21vZGVsX01DTUNnbG1tX21heF90ZW1wLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9tYXhfdGVtcC5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9NQ01DX2NvbnRyYXN0IDwtIE1DTUNnbG1tKG1heF90ZW1wIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgIyBzdWJzdHJhdGVfY3VycmVudCBhcyB0aGUgcmVmZXJlbmNlIGxldmVsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChtYXhfdGVtcF9zZSk6dW5pdHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW52ZXJzZT1saXN0KHRpcC5sYWJlbCA9IEFpbnYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCnNhdmVSRFMobW9kZWxfTUNNQ19jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvbW9kZWxfTUNNQ2dsbW1fbWF4X3RlbXBfY29udHJhc3QucmRzIikNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgcG9wdWxhdGlvbnMqKiANCg0KSGVyZSwgd2Ugb25seSBmb2N1cyBvbiB0aGUgcG9wdWxhdGlvbnMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0LiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIFJlbG9hZCBkYXRhc2V0IHdpdGhvdXQgcG9uZCBkYXRhDQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgRmlsdGVyIHRvIHBvcHVsYXRpb25zIHByZWRpY3RlZCB0byBvdmVyaGVhdA0KYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsDQphbGxfZGF0YSA8LSBmaWx0ZXIoYWxsX2RhdGEsIG92ZXJoZWF0aW5nX3Jpc2sgPiAwKQ0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQoNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9tYXhfdGVtcCA8LSBNQ01DZ2xtbShtYXhfdGVtcCB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKG1heF90ZW1wX3NlKTp1bml0cywgIyBTcGVjaWVzLCBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MsIGFuZCB3ZWlnaHRzDQogICAgICAgICAgICAgICAgICAgICAgICAgICBnaW52ZXJzZT1saXN0KHRpcC5sYWJlbCA9IEFpbnYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbml0dCA9IDYwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW4gPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuaW4gPSAxMDAwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfbWF4X3RlbXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX21heF90ZW1wLCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9tb2RlbF9NQ01DZ2xtbV9tYXhfdGVtcF9vdmVyaGVhdGluZ19wb3AucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX01DTUNnbG1tX21heF90ZW1wX292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogDQoNCiMjIyMjIyAqKkZ1bGwgZGF0YXNldCoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX01DTUNfbWF4X3RlbXAgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL21vZGVsX01DTUNnbG1tX21heF90ZW1wLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfbWF4X3RlbXApDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX01DTUNnbG1tX21heF90ZW1wLnJkcyIpKQ0KDQojIE1vZGVsIGRpYWdub3N0aWNzDQpwbG90KG1vZGVsX01DTUNfbWF4X3RlbXApDQpgYGANCg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkgKGNvbnRyYXN0cykNCm1vZGVsX01DTUNfbWF4X3RlbXBfY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL21vZGVsX01DTUNnbG1tX21heF90ZW1wX2NvbnRyYXN0LnJkcyIpDQoNCnN1bW1hcnkobW9kZWxfTUNNQ19tYXhfdGVtcF9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgcG9wdWxhdGlvbnMqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9NQ01DX21heF90ZW1wIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9tb2RlbF9NQ01DZ2xtbV9tYXhfdGVtcF9vdmVyaGVhdGluZ19wb3AucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19tYXhfdGVtcCkNCg0KIyBNb2RlbCBwcmVkaWN0aW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfTUNNQ2dsbW1fbWF4X3RlbXBfb3ZlcmhlYXRpbmdfcG9wLnJkcyIpKQ0KDQojIE1vZGVsIGRpYWdub3N0aWNzDQpwbG90KG1vZGVsX01DTUNfbWF4X3RlbXApDQpgYGANCg0KIyMjICoqQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQoqKkxvYWQgdGhlIGRhdGEqKiANCg0KYGBge3J9DQpjb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmNvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIGNvbW11bml0eS1sZXZlbCBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBtYXhfdGVtcCB1c2luZyBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbHMuDQoNCiMjIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyBGdW5jdGlvbiB0byBydW4gY29tbXVuaXR5LWxldmVsIG1heF90ZW1wIG1vZGVscyBpbiBwYXJhbGxlbCANCnJ1bl9jb21tdW5pdHlfbWF4X3RlbXBfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0IA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KGNvbW11bml0eV9tYXhfdGVtcCB+IHMobGF0LCBicyA9ICJ0cCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gMS8oZGF0YSRjb21tdW5pdHlfbWF4X3RlbXBfc2VeMiksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IE5BLCANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRtYXhfdGVtcF9wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJG1heF90ZW1wX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBtYXhfdGVtcF9wcmVkICsgMS45NiAqIG1heF90ZW1wX3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IG1heF90ZW1wX3ByZWQgLSAxLjk2ICogbWF4X3RlbXBfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIA0KICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X21heF90ZW1wXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIA0KICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X21heF90ZW1wXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIA0KICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X21heF90ZW1wXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQp9DQoNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgcG9uZF9jdXJyZW50ID0gY29tbXVuaXR5X3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDDQopDQoNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MykpIA0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9jb21tdW5pdHlfbWF4X3RlbXBfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X21heF90ZW1wX3BvbmRfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfcG9uZF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KTG9hZCBkYXRhDQpgYGB7cn0NCiMgU3Vic3RyYXRlIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBQb25kIGRhdGENCmNvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCiMgVXBsb2FkIGhpZ2ggcmVzb2x1dGlvbiBFYXJ0aCBkYXRhDQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZCA8LSB3b3JsZCAlPiUNCiAgICBmaWx0ZXIoIWdyZXBsKCJBbnRhcmN0aWNhIiwgbmFtZSkpDQpzdF9jcnMod29ybGQpIDwtIHN0X2Nycyhjb21tdW5pdHlfc3ViX2N1cnJlbnQpDQoNCg0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KbWF4X3RlbXBfbWluIDwtIG1pbihtaW4oY29tbXVuaXR5X3N1Yl9jdXJyZW50JGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfc3ViX2Z1dHVyZTRDJGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9jdXJyZW50JGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRjb21tdW5pdHlfbWF4X3RlbXAsIG5hLnJtID0gVFJVRSkpDQoNCm1heF90ZW1wX21heCA8LSBtYXgobWF4KGNvbW11bml0eV9zdWJfY3VycmVudCRjb21tdW5pdHlfbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRjb21tdW5pdHlfbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9hcmJfY3VycmVudCRjb21tdW5pdHlfbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRjb21tdW5pdHlfbWF4X3RlbXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9wb25kX2N1cnJlbnQkY29tbXVuaXR5X21heF90ZW1wLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJGNvbW11bml0eV9tYXhfdGVtcCwgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3N1Yl9tYXhfdGVtcF9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJyb2NrZXQiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQm9keSB0ZW1wZXJhdHVyZSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC01LCAzNSwgYnkgPSAxMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMobWF4X3RlbXBfbWluLCBtYXhfdGVtcF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQojIEZ1dHVyZSArMkMgDQptYXBfc3ViX21heF90ZW1wX2Z1dHVyZTJDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfbWF4X3RlbXApLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicm9ja2V0IiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC01LCAzNSwgYnkgPSAxMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMobWF4X3RlbXBfbWluLCBtYXhfdGVtcF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfbWF4X3RlbXBfZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJyb2NrZXQiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTUsIDM1LCBieSA9IDEwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhtYXhfdGVtcF9taW4sIG1heF90ZW1wX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCnByZWRfY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCmxhdF9zdWJfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfbWF4X3RlbXApLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCBtYXhfdGVtcF9tYXgpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIkJvZHkgdGVtcGVyYXR1cmUiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpzdWJzdHJhdGVfcGxvdCA8LSAobWFwX3N1Yl9tYXhfdGVtcF9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgICAgbWFwX3N1Yl9tYXhfdGVtcF9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfbWF4X3RlbXBfZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgICBsYXRfc3ViX2FsbCArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KSkNCg0Kc3Vic3RyYXRlX3Bsb3QNCmBgYA0KDQpGaWd1cmUgQTIzOiBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gbWF4aW11bSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZXMgZm9yIGFtcGhpYmlhbnMgb24gdGVycmVzdHJpYWwgY29uZGl0aW9ucy4gQm9keSB0ZW1wZXJhdHVyZXMgd2VyZSBhdmVyYWdlZCB3aXRoaW4gY29tbXVuaXRpZXMgKDEtZGVncmVlIGdyaWQgY2VsbHMpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gbWF4X3RlbXAgaW4gY3VycmVudCBjbGltYXRlcyAoYmx1ZSksIG9yIGFzc3VtaW5nICsyQyAob3JhbmdlKSBvciArNEMgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gQmxhY2sgY29sb3VyIGRlcGljdHMgYXJlYXMgd2l0aCBubyBkYXRhLg0KDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDZ9DQojIEN1cnJlbnQNCm1hcF9wb25kX21heF90ZW1wX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJyb2NrZXQiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQm9keSB0ZW1wZXJhdHVyZSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC01LCAzNSwgYnkgPSAxMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMobWF4X3RlbXBfbWluLCBtYXhfdGVtcF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQoNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX3BvbmRfbWF4X3RlbXBfZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfbWF4X3RlbXApLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicm9ja2V0IiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC01LCAzNSwgYnkgPSAxMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMobWF4X3RlbXBfbWluLCBtYXhfdGVtcF9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9wb25kX21heF90ZW1wX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInJvY2tldCIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgtNSwgMzUsIGJ5ID0gMTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKG1heF90ZW1wX21pbiwgbWF4X3RlbXBfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikNCg0KbGF0X3BvbmRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCBtYXhfdGVtcF9tYXgpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIkJvZHkgdGVtcGVyYXR1cmUiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpwb25kX3Bsb3QgPC0gKG1hcF9wb25kX21heF90ZW1wX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICBtYXBfcG9uZF9tYXhfdGVtcF9mdXR1cmUyQyArDQogICAgICAgICAgICAgICAgbWFwX3BvbmRfbWF4X3RlbXBfZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICBsYXRfcG9uZF9hbGwgKyANCiAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQoNCnBvbmRfcGxvdA0KYGBgDQoNCkZpZ3VyZSBBMjQ6IENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBtYXhpbXVtIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBmb3IgYW1waGliaWFucyBpbiB3YXRlciBib2RpZXMuIEJvZHkgdGVtcGVyYXR1cmVzIHdlcmUgYXZlcmFnZWQgd2l0aGluIGNvbW11bml0aWVzICgxLWRlZ3JlZSBncmlkIGNlbGxzKS4gVGhlIGZpcnN0IGNvbHVtbiByZWZlciB0byBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgdGhlIG1pZGRsZSBjb2x1bW4gYXNzdW1lICsyQyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAob3JhbmdlKSwgYW5kIHRoZSByaWdodCBjb2x1bW4gYXNzdW1lICs0QyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIG1heF90ZW1wIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA2fQ0KIyBDdXJyZW50DQptYXBfYXJiX21heF90ZW1wX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInJvY2tldCIsIA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJCb2R5IHRlbXBlcmF0dXJlIiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTUsIDM1LCBieSA9IDEwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhtYXhfdGVtcF9taW4sIG1heF90ZW1wX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCiMgRnV0dXJlICsyQyANCm1hcF9hcmJfbWF4X3RlbXBfZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9tYXhfdGVtcCksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJyb2NrZXQiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTUsIDM1LCBieSA9IDEwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhtYXhfdGVtcF9taW4sIG1heF90ZW1wX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRkFBNDNBIikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX2FyYl9tYXhfdGVtcF9mdXR1cmU0QyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInJvY2tldCIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgtNSwgMzUsIGJ5ID0gMTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKG1heF90ZW1wX21pbiwgbWF4X3RlbXBfbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYXJiX2FsbCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X21heF90ZW1wKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfbWF4X3RlbXApLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfbWF4X3RlbXApLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgbWF4X3RlbXBfbWF4KSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJtYXhfdGVtcCIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCmFyYm9yZWFsX3Bsb3QgPC0gKG1hcF9hcmJfbWF4X3RlbXBfY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9tYXhfdGVtcF9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9tYXhfdGVtcF9mdXR1cmU0QyArIA0KICAgICAgICAgICAgICAgICAgbGF0X2FyYl9hbGwgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KSkNCg0KYXJib3JlYWxfcGxvdA0KYGBgDQoNCkZpZ3VyZSBBMjU6IENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBtYXhpbXVtIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBmb3IgYW1waGliaWFucyBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbi4gQm9keSB0ZW1wZXJhdHVyZXMgd2VyZSBhdmVyYWdlZCB3aXRoaW4gY29tbXVuaXRpZXMgKDEtZGVncmVlIGdyaWQgY2VsbHMpLiBUaGUgZmlyc3QgY29sdW1uIHJlZmVyIHRvIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCB0aGUgbWlkZGxlIGNvbHVtbiBhc3N1bWUgKzJDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UpLCBhbmQgdGhlIHJpZ2h0IGNvbHVtbiBhc3N1bWUgKzRDIG9mIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gbWF4X3RlbXAgaW4gY3VycmVudCBjbGltYXRlcyAoYmx1ZSksIG9yIGFzc3VtaW5nICsyQyAob3JhbmdlKSBvciArNEMgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gQmxhY2sgY29sb3VyIGRlcGljdHMgYXJlYXMgd2l0aCBubyBkYXRhLg0KDQoNCiMjIyMjIyAqKkFsbCBoYWJpdGF0cyoqIA0KDQpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDE1fQ0KDQphbGxfaGFiaXRhdHMgPC0gKHN1YnN0cmF0ZV9wbG90L3BvbmRfcGxvdC9hcmJvcmVhbF9wbG90L3Bsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KYWxsX2hhYml0YXRzDQpgYGANCg0KRmlndXJlIEEyNjogQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zIGluIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMgKHRvcCByb3cpLCBpbiB3YXRlciBib2RpZXMgKG1pZGRsZSByb3cpLCBvciBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbiAoYm90dG9tIHJvdykuIEJvZHkgdGVtcGVyYXR1cmVzIHdlcmUgYXZlcmFnZWQgd2l0aGluIGNvbW11bml0aWVzICgxLWRlZ3JlZSBncmlkIGNlbGxzKS4gVGhlIGZpcnN0IGNvbHVtbiByZWZlciB0byBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgdGhlIG1pZGRsZSBjb2x1bW4gYXNzdW1lICsyQyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAob3JhbmdlKSwgYW5kIHRoZSByaWdodCBjb2x1bW4gYXNzdW1lICs0QyBvZiB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIG1heF90ZW1wIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSB1c2VkIEJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMgdG8gZXN0aW1hdGUgdGhlIG1lYW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgZGVncmVlcyBvZiBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGRlY29tcG9zZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiBhbW9uZyBzcGVjaWVzLiANCg0KIyMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQojIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKSwgDQogIGNvbW11bml0eV9wb25kX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfY3VycmVudCIpLCANCiAgY29tbXVuaXR5X3BvbmRfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9wb25kX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTRDIikNCikNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2NvbW11bml0eV9kYXRhKQ0KDQpwcmlvcl9jb21tdW5pdHkgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBHID0gbGlzdChHNCA9IGxpc3QoViA9IDEsIGZpeCA9IDEpKSkNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCANCm1vZGVsX01DTUNfY29tbXVuaXR5IDwtIE1DTUNnbG1tKGNvbW11bml0eV9tYXhfdGVtcCB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBpZGgoY29tbXVuaXR5X21heF90ZW1wX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvcl9jb21tdW5pdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9NQ01DX2NvbW11bml0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2NvbW11bml0eV9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUNfY29tbXVuaXR5LCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9tb2RlbF9NQ01DZ2xtbV9jb21tdW5pdHlfbWF4X3RlbXAucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX01DTUNnbG1tX2NvbW11bml0eV9tYXhfdGVtcC5yZHMiKQ0KDQoNCiMgQ29udHJhc3QgDQphbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX01DTUNfY29tbXVuaXR5X2NvbnRyYXN0IDwtIE1DTUNnbG1tKGNvbW11bml0eV9tYXhfdGVtcCB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgQ29udHJhc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gaWRoKGNvbW11bml0eV9tYXhfdGVtcF9zZSk6dW5pdHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfY29tbXVuaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCnNhdmVSRFMobW9kZWxfTUNNQ19jb21tdW5pdHlfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9tYXhfdGVtcF9jb250cmFzdC5yZHMiKQ0KDQoNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMqKiANCg0KSGVyZSwgd2Ugb25seSBmb2N1cyBvbiB0aGUgY29tbXVuaXRpZXMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0LiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIFJlbG9hZCBkYXRhc2V0IHdpdGhvdXQgcG9uZCBkYXRhDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQojIEZpbHRlciB0byBvdmVyaGVhdGluZyBjb21tdW5pdGllcyANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmNoYXJhY3RlcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGZpbHRlcihhbGxfY29tbXVuaXR5X2RhdGEsIG5fc3BlY2llc19vdmVyaGVhdGluZyA+IDApDQoNCm1vZGVsX21heF90ZW1wX2NvbW11bml0eSA8LSBNQ01DZ2xtbShjb21tdW5pdHlfbWF4X3RlbXAgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGlkaChjb21tdW5pdHlfbWF4X3RlbXBfc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3JfY29tbXVuaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbml0dCA9IDYwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cm5pbiA9IDEwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX21heF90ZW1wX2NvbW11bml0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2NvbW11bml0eV9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX21heF90ZW1wX2NvbW11bml0eSwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X21heF90ZW1wX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfbWF4X3RlbXBfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogDQoNCiMjIyMjIyAqKkZ1bGwgZGF0YXNldCoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX01DTUNfbWF4X3RlbXAgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL21vZGVsX01DTUNnbG1tX2NvbW11bml0eV9tYXhfdGVtcC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX21heF90ZW1wKQ0KDQojIE1vZGVsIHByZWRpY3Rpb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19NQ01DZ2xtbV9jb21tdW5pdHlfbWF4X3RlbXAucmRzIikpDQoNCiMgTW9kZWwgZGlhZ25vc3RpY3MNCnBsb3QobW9kZWxfTUNNQ19tYXhfdGVtcCkNCmBgYA0KDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeSAoY29udHJhc3RzKQ0KbW9kZWxfTUNNQ19tYXhfdGVtcF9jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvbW9kZWxfTUNNQ2dsbW1fY29tbXVuaXR5X21heF90ZW1wX2NvbnRyYXN0LnJkcyIpDQoNCnN1bW1hcnkobW9kZWxfTUNNQ19tYXhfdGVtcF9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9NQ01DX21heF90ZW1wIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9tb2RlbF9NQ01DZ2xtbV9jb21tdW5pdHlfbWF4X3RlbXBfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19tYXhfdGVtcCkNCg0KIyBNb2RlbCBwcmVkaWN0aW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfTUNNQ2dsbW1fY29tbXVuaXR5X21heF90ZW1wX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpKQ0KDQojIE1vZGVsIGRpYWdub3N0aWNzDQpwbG90KG1vZGVsX01DTUNfbWF4X3RlbXApDQpgYGANCg0KDQojIyAqKk92ZXJoZWF0aW5nIHJpc2sqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIHRoZSB2YXJpYXRpb24gaW4gb3ZlcmhlYXRpbmcgcmlzayBhY3Jvc3MgbWljcm9oYWJpdGF0cyBhbmQgY2xpbWF0aWMgc2NlbmFyaW9zLiBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgcG9wdWxhdGlvbnMgd2VyZSBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgaW4gd2F0ZXIgYm9kaWVzLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX3Jpc2suUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX3Jpc2sucGJzKiogDQoNCioqTG9hZCB0aGUgZGF0YSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCg0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBvdmVyaGVhdGluZyByaXNrIHVzaW5nIGdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVscy4gVGhlc2UgbW9kZWxzIGRvIG5vdCBhY2NvdW50IGZvciB0aGUgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzIGJldHdlZW4gc3BlY2llcywgeWV0IHRoZXkgYXJlIGJldHRlciBhdCBjYXB0dXJpbmcgbm9uLWxpbmVhciBwYXR0ZXJucyB3aXRoIGxhdGl0dWRlLiBXaGlsZSB3ZSBjb3VsZCBoYXZlIGZpdHRlZCBtb2RlbHMgd2l0aCBzbW9vdGggdGVybXMgdXNpbmcgYnJtcyBvciBzdGFuLCB0aGVzZSBtb2RlbHMgZXhjZWVkZWQgb3VyIGNvbXB1dGF0aW9uYWwgY2FwYWNpdGllcy4gDQoNCiMjIyMgKipSdW4gdGhlIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQpydW5fb3ZlcmhlYXRpbmdfcmlza19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KG92ZXJoZWF0aW5nX3Jpc2sgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKCksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBOQSwgDQogICAgZ2VudXMgPSBOQSwgDQogICAgc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IHBvcF9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gcG9wX3N1Yl9mdXR1cmU0Qw0KKQ0KDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MikpDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzIDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX292ZXJoZWF0aW5nX3Jpc2tfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX292ZXJoZWF0aW5nX3Jpc2tfc3ViIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuMDI1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuMDI1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICAgICAgICAgIGNvbG91cj0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMC4wMjUpKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIk92ZXJoZWF0aW5nIHJpc2siKSArDQogIHlsaW0oMCwgMSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQoNCnBvcF9vdmVyaGVhdGluZ19yaXNrX3N1Yg0KYGBgDQoNCkZpZ3VyZSBBMjc6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBvdmVyaGVhdGluZyByaXNrIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMuIE92ZXJoZWF0aW5nIHJpc2sgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgKDAtMSkgdGhhdCBhIHBvcHVsYXRpb24gZXhjZWVkcyBpdHMgcGh5c2lvbG9naWNhbCBsaW1pdHMgYXQgbGVhc3Qgb25jZSBpbiB0aGUgOTEwIGRheXMgaW52ZXN0aWdhdGVkLiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfcmlzayBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX3Jpc2sgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19yaXNrIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGlzZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiANCg0KDQojIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQoNCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlNEMucmRzIikNCg0KDQpwb3Bfb3ZlcmhlYXRpbmdfcmlza19hcmIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMC4wMjUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMC4wMjUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwLjAyNSkpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiT3ZlcmhlYXRpbmcgcmlzayIpICsNCiAgeWxpbSgwLCAxKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KcG9wX292ZXJoZWF0aW5nX3Jpc2tfYXJiDQpgYGANCg0KRmlndXJlIEEyODogTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIG92ZXJoZWF0aW5nIHJpc2sgZm9yIGFtcGhpYmlhbnMgaW4gYWJvdmUgZ3JvdW5kIHZlZ2V0YXRpb24uIE92ZXJoZWF0aW5nIHJpc2sgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgKDAtMSkgdGhhdCBhIHBvcHVsYXRpb24gZXhjZWVkcyBpdHMgcGh5c2lvbG9naWNhbCBsaW1pdHMgYXQgbGVhc3Qgb25jZSBpbiB0aGUgOTEwIGRheXMgaW52ZXN0aWdhdGVkLiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfcmlzayBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX3Jpc2sgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19yaXNrIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGlzZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiANCg0KIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0NCmFsbF9oYWJpdGF0cyA8LSAocG9wX292ZXJoZWF0aW5nX3Jpc2tfc3ViIC8NCiAgICAgICAgICAgICAgICAgcG9wX292ZXJoZWF0aW5nX3Jpc2tfYXJiIC8NCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCmBgYA0KDQoNCkZpZ3VyZSBBMjk6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBvdmVyaGVhdGluZyByaXNrIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMgKHRvcCByb3cpIG9yIGluIGFib3ZlIGdyb3VuZCB2ZWdldGF0aW9uIChib3R0b20gcm93KS4gT3ZlcmhlYXRpbmcgcmlzayByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSAoMC0xKSB0aGF0IGEgcG9wdWxhdGlvbiBleGNlZWRzIGl0cyBwaHlzaW9sb2dpY2FsIGxpbWl0cyBhdCBsZWFzdCBvbmNlIGluIHRoZSA5MTAgZGF5cyBpbnZlc3RpZ2F0ZWQuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19yaXNrIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfcmlzayBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX3Jpc2sgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQoNCiMjIyAqKkxpbmVhciBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgdXNlZCBsaW5lYXIgbWl4ZWQgbW9kZWxzIHRvIGVzdGltYXRlIHRoZSBtZWFuIG92ZXJoZWF0aW5nIHJpc2sgaW4gZWFjaCBtaWNyb2hhYml0YXQgYW5kIGNsaW1hdGljIHNjZW5hcmlvLiBOb3RlIHRoYXQgd2UgY291bGQgbm90IHVzZSBiYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzIGJlY2F1c2UgdGhlIG1vZGVscyBmYWlsZWQgdG8gbWl4LCBldmVuIGFmdGVyIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiBpdGVyYXRpb25zLiBUaGVzZSBtb2RlbHMgdGhlcmVmb3JlIGRvIG5vdCBhY2NvdW50IGZvciB2YXJpYXRpb24gZHVlIHRvIHBoeWxvZ2VueSwgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBsaWtlbHkgdG8gYmUgd2lkZXIgdGhhbiBwcmVkaWN0ZWQuIA0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9yaXNrIDwtICBnbG1lcihvdmVyaGVhdGluZ19yaXNrIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcmlzaywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9yaXNrLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfcmlzay5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX3Jpc2sucmRzIikNCg0KIyMjIyBDb250cmFzdHMgDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfcmlza19jb250cmFzdCA8LSAgZ2xtZXIob3ZlcmhlYXRpbmdfcmlzayB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IikgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIFNhdmUgbW9kZWwgDQpzYXZlUkRTKG1vZGVsX3Jpc2tfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19yaXNrX2NvbnRyYXN0LnJkcyIpDQoNCmBgYA0KDQojIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfb3ZlcmhlYXRpbmdfcmlzayA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2sucmRzIikNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfcmlzaykNCg0KIyBNb2RlbCBwcmVkaWN0aW9ucw0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19yaXNrLnJkcyIpKQ0KYGBgDQoNCg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkgKGNvbnRyYXN0cykNCm1vZGVsX292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19yaXNrX2NvbnRyYXN0LnJkcyIpDQoNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfcmlza19jb250cmFzdCkNCmBgYA0KDQoNCg0KIyMgKipPdmVyaGVhdGluZyBkYXlzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgdmFyaWF0aW9uIGluIG92ZXJoZWF0aW5nIGRheXMgYWNyb3NzIG1pY3JvaGFiaXRhdHMgYW5kIGNsaW1hdGljIHNjZW5hcmlvcy4gTm90ZSB0aGF0IG5vbmUgb2YgdGhlIHBvcHVsYXRpb25zIHdlcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIHdhdGVyIGJvZGllcyAoZXhjZXB0IDExIHNwZWNpZXMgaW4gaGlnaCB3YXJtaW5nIHByb2plY3Rpb25zKS4NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX2RheXMuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX2RheXMucGJzKiogDQoNCioqTG9hZCB0aGUgZGF0YSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCg0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQpgYGANCg0KDQojIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gb3ZlcmhlYXRpbmcgZGF5cyB1c2luZyBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbHMuIFRoZXNlIG1vZGVscyBkbyBub3QgYWNjb3VudCBmb3IgdGhlIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcyBiZXR3ZWVuIHNwZWNpZXMsIHlldCB0aGV5IGFyZSBiZXR0ZXIgYXQgY2FwdHVyaW5nIG5vbi1saW5lYXIgcGF0dGVybnMgd2l0aCBsYXRpdHVkZS4gV2hpbGUgd2UgY291bGQgaGF2ZSBmaXR0ZWQgbW9kZWxzIHdpdGggc21vb3RoIHRlcm1zIHVzaW5nIGJybXMgb3Igc3RhbiwgdGhlc2UgbW9kZWxzIGV4Y2VlZGVkIG91ciBjb21wdXRhdGlvbmFsIGNhcGFjaXRpZXMuIA0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KcnVuX292ZXJoZWF0aW5nX2RheXNfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIGRhdGFzZXQkb3ZlcmhlYXRpbmdfZGF5cyA8LSByb3VuZChkYXRhc2V0JG92ZXJoZWF0aW5nX2RheXMpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucyANCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGFzZXQkbGF0KSwgbWF4KGRhdGFzZXQkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IE5BLA0KICAgIGdlbnVzID0gTkEsIA0KICAgIHNwZWNpZXMgPSBOQSkNCiAgDQogICMgQXBwbHkgZmlsdGVyIGZvciBhcmJvcmVhbF9mdXR1cmU0QyBzY2VuYXJpbw0KICBpZiAoaGFiaXRhdF9zY2VuYXJpbyA9PSAiYXJib3JlYWxfZnV0dXJlNEMiKSB7DQogICAgZGF0YXNldCA8LSBkYXRhc2V0ICU+JSBmaWx0ZXIobGF0ID49IC00NSAmIGxhdCA8PSA0NSkgIyBNb2RlbCBkb2VzIG5vdCBydW4gd2l0aCBmdWxsIHJhbmdlIG9mIGxhdGl0dWRlcyBmb3IgdGhpcyBkYXRhc2V0DQogIH0NCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KG92ZXJoZWF0aW5nX2RheXMgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKCksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19kYXlzX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkb3ZlcmhlYXRpbmdfZGF5c19wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gb3ZlcmhlYXRpbmdfZGF5c19wcmVkICsgMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gb3ZlcmhlYXRpbmdfZGF5c19wcmVkIC0gMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQp9DQoNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMNCikNCg0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9vdmVyaGVhdGluZ19kYXlzX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCiMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCiMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipWaXN1YWxpemUgdGhlIHJlc3VsdHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCiMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDExfQ0KIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zDQpwcmVkX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQoNCnBvcF9vdmVyaGVhdGluZ19kYXlzX3N1YiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwLjI1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBjb2xvdXI9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuMjUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwLjI1KSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJPdmVyaGVhdGluZyBkYXlzIikgKw0KICB5bGltKDAsIDEzMSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQoNCnBvcF9vdmVyaGVhdGluZ19kYXlzX3N1Yg0KYGBgDQoNCkZpZ3VyZSBBMzA6IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiBvdmVyaGVhdGluZyBkYXlzIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMuIE92ZXJoZWF0aW5nIGRheXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMgdGhhdCBhIHBvcHVsYXRpb24gZXhjZWVkcyBpdHMgcGh5c2lvbG9naWNhbCBsaW1pdHMgYWNyb3NzIHRoZSA5MTAgZGF5cyBpbnZlc3RpZ2F0ZWQuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQoNCiMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMX0NCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucw0KcHJlZF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlNEMucmRzIikNCg0KDQpwb3Bfb3ZlcmhlYXRpbmdfZGF5c19hcmIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGNvbG91cj0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMC4yNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgY29sb3VyPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwLjI1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGNvbG91cj0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0ID0gMC4yNSkpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiT3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgeWxpbSgwLCAxMzEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KDQpwb3Bfb3ZlcmhlYXRpbmdfZGF5c19hcmINCmBgYA0KDQpGaWd1cmUgQTMxOiBMYXRpdHVkaW5hbCB2YXJpYXRpb24gaW4gb3ZlcmhlYXRpbmcgZGF5cyBmb3IgYW1waGliaWFucyBpbiBhYm92ZSBncm91bmQgdmVnZXRhdGlvbi4gT3ZlcmhlYXRpbmcgZGF5cyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGF5cyB0aGF0IGEgcG9wdWxhdGlvbiBleGNlZWRzIGl0cyBwaHlzaW9sb2dpY2FsIGxpbWl0cyBhY3Jvc3MgdGhlIDkxMCBkYXlzIGludmVzdGlnYXRlZC4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gY3VycmVudCBtaWNyb2NsaW1hdGVzLiBPcmFuZ2UgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIGdlbmVyYWxpc2VkIGFkZGl0aXZlIG1peGVkIG1vZGVscy4gDQoNCiMjIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTB9DQphbGxfaGFiaXRhdHMgPC0gKHBvcF9vdmVyaGVhdGluZ19kYXlzX3N1YiAvDQogICAgICAgICAgICAgICAgIHBvcF9vdmVyaGVhdGluZ19kYXlzX2FyYiAvDQogICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KYWxsX2hhYml0YXRzDQpgYGANCg0KDQpGaWd1cmUgQTMyOiBMYXRpdHVkaW5hbCB2YXJpYXRpb24gaW4gb3ZlcmhlYXRpbmcgZGF5cyBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zICh0b3Agcm93KSBvciBpbiBhYm92ZSBncm91bmQgdmVnZXRhdGlvbiAoYm90dG9tIHJvdykuIE92ZXJoZWF0aW5nIGRheXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMgdGhhdCBhIHBvcHVsYXRpb24gZXhjZWVkcyBpdHMgcGh5c2lvbG9naWNhbCBsaW1pdHMgYWNyb3NzIHRoZSA5MTAgZGF5cyBpbnZlc3RpZ2F0ZWQuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXNlZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIA0KDQoNCiMjIyAqKkxpbmVhciBtaXhlZCBtb2RlbHMqKiANCg0KSGVyZSwgd2UgdXNlZCBsaW5lYXIgbWl4ZWQgbW9kZWxzIHRvIGVzdGltYXRlIHRoZSBtZWFuIG51bWJlciBvZiBvdmVyaGVhdGluZyBkYXlzIGluIGVhY2ggbWljcm9oYWJpdGF0IGFuZCBjbGltYXRpYyBzY2VuYXJpby4gTm90ZSB0aGF0IHdlIGNvdWxkIG5vdCB1c2UgYmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyBiZWNhdXNlIHRoZSBtb2RlbHMgZmFpbGVkIHRvIG1peCwgZXZlbiBhZnRlciBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgaXRlcmF0aW9ucy4gVGhlc2UgbW9kZWxzIHRoZXJlZm9yZSBkbyBub3QgYWNjb3VudCBmb3IgdmFyaWF0aW9uIGR1ZSB0byBwaHlsb2dlbnksIGFuZCBjb25maWRlbmNlIGludGVydmFscyBhcmUgbGlrZWx5IHRvIGJlIHdpZGVyIHRoYW4gcHJlZGljdGVkLg0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KYWxsX2RhdGEkb3ZlcmhlYXRpbmdfZGF5cyA8LSByb3VuZChhbGxfZGF0YSRvdmVyaGVhdGluZ19kYXlzKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQojIyBOb3RlIHRoYXQgdGhpcyBtb2RlbCBmYWlscyBpZiB3ZSBhZGQgYW4gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdA0KbW9kZWxfZGF5cyA8LSAgZ2xtZXIob3ZlcmhlYXRpbmdfZGF5cyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDF8Z2VudXMvc3BlY2llcyksIA0KICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGFzLmRhdGEuZnJhbWUoZ2dwcmVkaWN0KG1vZGVsX2RheXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzaW11bGF0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KDQojIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX2RheXMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19kYXlzLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5cy5yZHMiKQ0KDQojIyMjIENvbnRyYXN0cyANCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX2RheXNfY29udHJhc3QgPC0gIGdsbWVyKG92ZXJoZWF0aW5nX2RheXMgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpICsgKDF8Z2VudXMvc3BlY2llcyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCiMgU2F2ZSBtb2RlbCANCnNhdmVSRFMobW9kZWxfZGF5c19jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfY29udHJhc3QucmRzIikNCmBgYA0KDQojIyMjIyAqKlN1YnNldCBvZiBvdmVyaGVhdGluZyBwb3B1bGF0aW9ucyoqIA0KDQpgYGB7ciwgZXZhbCA9Rn0NCiMgRmlsdGVyIHRvIHBvcHVsYXRpb25zIHByZWRpY3RlZCB0byBvdmVyaGVhdA0KYWxsX2RhdGEgPC0gZmlsdGVyKGFsbF9kYXRhLCBvdmVyaGVhdGluZ19yaXNrID4gMCkNCg0KbW9kZWxfZGF5c19vdmVyaGVhdGluZ19wb3AgPC0gIGdsbWVyKG92ZXJoZWF0aW5nX2RheXMgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSArICgxfGdlbnVzL3NwZWNpZXMvb2JzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zX292ZXJoZWF0aW5nX3BvcCA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9kYXlzX292ZXJoZWF0aW5nX3BvcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9uc19vdmVyaGVhdGluZ19wb3AgPC0gcHJlZGljdGlvbnNfb3ZlcmhlYXRpbmdfcG9wICU+JSByZW5hbWUoaGFiaXRhdF9zY2VuYXJpbyA9IHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyX0NJID0gY29uZi5sb3csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCiMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfZGF5c19vdmVyaGVhdGluZ19wb3AsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19kYXlzX292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9uc19vdmVyaGVhdGluZ19wb3AsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX292ZXJoZWF0aW5nX3BvcC5yZHMiKQ0KDQpgYGANCg0KDQojIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogDQoNCiMjIyMjICoqRnVsbCBkYXRhc2V0KioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQojIE1vZGVsIHN1bW1hcnkgDQptb2RlbF9vdmVyaGVhdGluZ19kYXlzIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5cy5yZHMiKQ0KDQpzdW1tYXJ5KG1vZGVsX292ZXJoZWF0aW5nX2RheXMpDQoNCiMgTW9kZWwgcHJlZGljdGlvbnMNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5cy5yZHMiKSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5IChjb250cmFzdHMpDQptb2RlbF9vdmVyaGVhdGluZ19kYXlzX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdC5yZHMiKQ0KDQpzdW1tYXJ5KG1vZGVsX292ZXJoZWF0aW5nX2RheXNfY29udHJhc3QpDQpgYGANCg0KIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgcG9wdWxhdGlvbnMqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX292ZXJoZWF0aW5nX2RheXNfb3ZlcmhlYXRpbmdfcG9wIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19vdmVyaGVhdGluZ19wb3AucmRzIikNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfZGF5c19vdmVyaGVhdGluZ19wb3ApDQoNCiMgTW9kZWwgcHJlZGljdGlvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX292ZXJoZWF0aW5nX3BvcC5yZHMiKSkNCmBgYA0KDQoNCiMjICoqUmVsYXRpb25zaGlwIGJldHdlZW4gVFNNIGFuZCBvdmVyaGVhdGluZyBldmVudHMqKiAgDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgYW5kIHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyBhY3Jvc3MgbWljcm9oYWJpdGF0cyBhbmQgY2xpbWF0aWMgc2NlbmFyaW9zLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX2RheXNfYnlfVFNNLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9SdW5uaW5nX21vZGVsc19vdmVyaGVhdGluZ19kYXlzX2J5X1RTTS5wYnMqKiANCg0KKipMb2FkIHRoZSBkYXRhKiogDQoNCmBgYHtyfQ0KIyBMb2FkIHBvcHVsYXRpb24tbGV2ZWwgZGF0YQ0KDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCmBgYA0KDQoNCiMjIyAqKkxpbmVhciBtaXhlZCBtb2RlbHMqKiANCg0KTm90ZSB0aGF0IHdlIGNvdWxkIG5vdCB1c2UgYmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyBiZWNhdXNlIHRoZSBtb2RlbHMgZmFpbGVkIHRvIG1peCwgZXZlbiBhZnRlciBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgaXRlcmF0aW9ucy4gVGhlcmVmb3JlLCB0aGVzZSBwcmVkaWN0aW9ucyBkbyBub3QgYWNjb3VudCBmb3IgdmFyaWF0aW9uIGR1ZSB0byBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBsaWtlbHkgd2lkZXIgdGhhbiB0aG9zZSBwcmVkaWN0ZWQuIA0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KIyBGdW5jdGlvbiB0byBydW4gdGhlIE1DTUNnbG1tIGZvciBlYWNoIGhhYml0YXQgc2NlbmFyaW8NCnJ1bl9tb2RlbCA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgZGF0YXNldCRvdmVyaGVhdGluZ19kYXlzIDwtIHJvdW5kKGRhdGFzZXQkb3ZlcmhlYXRpbmdfZGF5cykNCg0KICBkYXRhc2V0IDwtIGRhdGFzZXQgJT4lIG11dGF0ZShvYnMgPSBhcy5jaGFyYWN0ZXIocm93X251bWJlcigpKSkNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBTZXQgdGhlIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQ0KICBzZXQuc2VlZCgxMjMpDQogIA0KICAjIEZpdCB0aGUgbW9kZWwNCiAgbW9kZWwgPC0gIGdsbWVyKG92ZXJoZWF0aW5nX2RheXMgfiBUU00gKyAoMXxnZW51cy9zcGVjaWVzL29icyksIA0KICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksDQogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCiAgDQogICMgR2V0IHByZWRpY3Rpb25zDQogIHByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcyA9ICJUU00iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gbGlzdChUU00gPSBzZXEobWluKGRhdGEkVFNNKSwgbWF4KGRhdGEkVFNNKSwgbGVuZ3RoPTEwMCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQogIA0KICBwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSByYXRlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBzYXZlUkRTKG1vZGVsLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfYnlfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19ieV9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KZGF0YXNldF9saXN0IDwtIGxpc3Qoc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgICAgICAgICAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgICAgICAgICAgICAgICAgICAgIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICAgICAgICAgYXJib3JlYWxfY3VycmVudCA9IHBvcF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgICAgICAgICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogICAgICAgICAgICAgICAgICAgICBhcmJvcmVhbF9mdXR1cmU0QyA9IHBvcF9hcmJfZnV0dXJlNEMpDQoNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MikpDQoNCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseShuYW1lcyhkYXRhc2V0X2xpc3QpLCBmdW5jdGlvbih4KSB7DQogIHJ1bl9tb2RlbChkYXRhc2V0X2xpc3RbW3hdXSwgeCkNCn0sIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImxtZTQiLCAiZW1tZWFucyIsICJnZ2VmZmVjdHMiLCAiZHBseXIiKSkNCmBgYA0KDQojIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQojIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkNCnByaW50KHN1bW1hcnkocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeQ0KcHJpbnQoc3VtbWFyeShyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfYnlfVFNNX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeQ0KcHJpbnQoc3VtbWFyeShyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfYnlfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkpDQpgYGANCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeQ0KcHJpbnQoc3VtbWFyeShyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfYnlfVFNNX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkNCnByaW50KHN1bW1hcnkocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkpDQoNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5DQpwcmludChzdW1tYXJ5KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19ieV9UU01fYXJib3JlYWxfZnV0dXJlNEMucmRzIikpKQ0KYGBgDQoNCg0KIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCnByZWRfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19ieV9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCnBvcF9kYXlzX1RTTV9zdWIgPC0gZ2dwbG90KCkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTRDLA0KICAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeW1pbiA9IGFzeW1wLkxDTCwgeW1heCA9IGFzeW1wLlVDTCksIA0KICAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgbGluZXdpZHRoID0gMC41LA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBUU00sIHltaW4gPSBhc3ltcC5MQ0wsIHltYXggPSBhc3ltcC5VQ0wpLA0KICAgICAgICAgICAgICBmaWxsID0gIiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgbGluZXdpZHRoID0gMC41LA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9jdXJyZW50LA0KICAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeW1pbiA9IGFzeW1wLkxDTCwgeW1heCA9IGFzeW1wLlVDTCksIA0KICAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgbGluZXdpZHRoID0gMC41LA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsNCiAgeGxhYigiVFNNIikgKyANCiAgeWxhYigiT3ZlcmhlYXRpbmcgZGF5cyIpICsgDQogIHhsaW0oMCwgMjApICsgDQogIHlsaW0oLTAuMjUsIDIxMCkgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksIA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksIA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksIA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBzaXplID0gMykpDQoNCnBvcF9kYXlzX1RTTV9zdWINCmBgYA0KDQpGaWd1cmUgQTM0OiBSZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGRheXMgYW5kIFRTTSBpbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zLiBPdmVyaGVhdGluZyBkYXlzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkYXlzIHRoYXQgYSBwb3B1bGF0aW9uIGV4Y2VlZHMgaXRzIHBoeXNpb2xvZ2ljYWwgbGltaXRzIGFjcm9zcyB0aGUgOTEwIGRheXMgaW52ZXN0aWdhdGVkLiBCbHVlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBjdXJyZW50IG1pY3JvY2xpbWF0ZXMuIE9yYW5nZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggMiBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFBpbmsgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDQgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBSaWJib25zIGRlbGltaXQgdGhlIGxvd2VyIGFuZCB1cHBlciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgcHJlZGljdGVkIGZyb20gdGhlIG1vZGVscy4NCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQ0KIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zDQpwcmVkX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19ieV9UU01fYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2J5X1RTTV9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpwb3BfZGF5c19UU01fYXJiIDwtIGdncGxvdCgpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmU0QywNCiAgICAgICAgICAgICAgYWVzKHggPSBUU00sIHltaW4gPSBhc3ltcC5MQ0wsIHltYXggPSBhc3ltcC5VQ0wpLCANCiAgICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IDAuNSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjc1KSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5bWluID0gYXN5bXAuTENMLCB5bWF4ID0gYXN5bXAuVUNMKSwNCiAgICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IDAuNSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjc1KSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfY3VycmVudCwNCiAgICAgICAgICAgICAgYWVzKHggPSBUU00sIHltaW4gPSBhc3ltcC5MQ0wsIHltYXggPSBhc3ltcC5VQ0wpLCANCiAgICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IDAuNSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjc1KSArDQogIHhsYWIoIlRTTSIpICsgDQogIHlsYWIoIk92ZXJoZWF0aW5nIGRheXMiKSArIA0KICB4bGltKDAsIDIwKSArIA0KICB5bGltKC0wLjI1LCAyMTApICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLCANCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLCANCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLCANCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDMpKQ0KDQpwb3BfZGF5c19UU01fYXJiDQpgYGANCg0KRmlndXJlIEEzNTogUmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBkYXlzIGFuZCBUU00gaW4gYWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24uIE92ZXJoZWF0aW5nIGRheXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMgdGhhdCBhIHBvcHVsYXRpb24gZXhjZWVkcyBpdHMgcGh5c2lvbG9naWNhbCBsaW1pdHMgYWNyb3NzIHRoZSA5MTAgZGF5cyBpbnZlc3RpZ2F0ZWQuIEJsdWUgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcy4gT3JhbmdlIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCAyIGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUGluayByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gZnV0dXJlIGNsaW1hdGVzIHdpdGggNCBkZWdyZWVzIENlbHNpdXMgYWJvdmUgcHJlaW5kdXN0cmlhbCBsZXZlbHMuIFJpYmJvbnMgZGVsaW1pdCB0aGUgbG93ZXIgYW5kIHVwcGVyIDk1JSBjb25maWRlbmNlIGludGVydmFscyBwcmVkaWN0ZWQgZnJvbSB0aGUgbW9kZWxzLg0KDQojIyMjIyAqKkFsbCBoYWJpdGF0cyAqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0NCmFsbF9oYWJpdGF0cyA8LSAocG9wX2RheXNfVFNNX3N1YiAvDQogICAgICAgICAgICAgICAgIHBvcF9kYXlzX1RTTV9hcmIgLw0KICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gMSkpDQoNCmFsbF9oYWJpdGF0cw0KYGBgDQoNCkZpZ3VyZSBBMzY6IFJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyBhbmQgVFNNIGluIHRlcnJlc3RyaWFsICh0b3Agcm93KSBvciBhcmJvcmVhbCBjb25kaXRpb25zIChib3R0b20gcm93KS4gT3ZlcmhlYXRpbmcgZGF5cyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGF5cyB0aGF0IGEgcG9wdWxhdGlvbiBleGNlZWRzIGl0cyBwaHlzaW9sb2dpY2FsIGxpbWl0cyBhY3Jvc3MgdGhlIDkxMCBkYXlzIGludmVzdGlnYXRlZC4gQmx1ZSByaWJib25zIGFuZCBwb2ludHMgZGVwaWN0IG92ZXJoZWF0aW5nX2RheXMgaW4gY3VycmVudCBtaWNyb2NsaW1hdGVzLiBPcmFuZ2UgcmliYm9ucyBhbmQgcG9pbnRzIGRlcGljdCBvdmVyaGVhdGluZ19kYXlzIGluIGZ1dHVyZSBjbGltYXRlcyB3aXRoIDIgZGVncmVlcyBDZWxzaXVzIGFib3ZlIHByZWluZHVzdHJpYWwgbGV2ZWxzLiBQaW5rIHJpYmJvbnMgYW5kIHBvaW50cyBkZXBpY3Qgb3ZlcmhlYXRpbmdfZGF5cyBpbiBmdXR1cmUgY2xpbWF0ZXMgd2l0aCA0IGRlZ3JlZXMgQ2Vsc2l1cyBhYm92ZSBwcmVpbmR1c3RyaWFsIGxldmVscy4gUmliYm9ucyBkZWxpbWl0IHRoZSBsb3dlciBhbmQgdXBwZXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByZWRpY3RlZCBmcm9tIHRoZSBtb2RlbHMuDQoNCg0KIyMgKipOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgdGhlIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgcHJlZGljdGVkIHRvIG92ZXJoZWF0aW5nIGluIGVhY2ggY29tbXVuaXR5LiBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgcG9wdWxhdGlvbnMgd2VyZSBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgaW4gd2F0ZXIgYm9kaWVzLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX25fc3BlY2llc19vdmVyaGVhdGluZy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvUnVubmluZ19tb2RlbHNfbl9zcGVjaWVzX292ZXJoZWF0aW5nLnBicyoqIA0KDQoqKkxvYWQgdGhlIGRhdGEqKiANCg0KYGBge3J9DQojIExvYWQgcG9wdWxhdGlvbi1sZXZlbCBkYXRhDQoNCiMgU3Vic3RyYXRlDQpjb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQXJib3JlYWwNCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCg0KIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIGludmVzdGlnYXRlIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBlYWNoIGNvbW11bml0eSB1c2luZyBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbHMuIA0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KcnVuX2NvbW11bml0eV9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcyhsYXQsIGJzID0gInRwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHBvaXNzb24oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCArIDEuOTYgKiBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWQgLSAxLjk2ICogbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KfQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9jb21tdW5pdHlfbl9zcGVjaWVzX292ZXJoZWF0aW5nX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCiMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCiMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipWaXN1YWxpemUgdGhlIHJlc3VsdHMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30gDQoNCmBgYHtyfQ0KIyBTZXQgY29sb3Vycw0KbWFnbWFfc3Vic2V0IDwtIHZpcmlkaXM6Om1hZ21hKDEwMClbNDA6MTAwXQ0KY29sb3JfZnVuYyA8LSBjb2xvclJhbXBQYWxldHRlKGMoImdyYXk5NSIsIG1hZ21hX3N1YnNldCkpDQpjb2xvcnNfbWFnbWEgPC0gY29sb3JfZnVuYygxMDApDQoNCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBBcmJvcmVhbA0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpzcF9taW4gPC0gbWluKG1pbihjb21tdW5pdHlfc3ViX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSkNCg0Kc3BfbWF4IDwtIG1heChtYXgoY29tbXVuaXR5X3N1Yl9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9zdWJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3BvbmRfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQoNCiMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQoNCiMgQ3VycmVudA0KbWFwX3N1Yl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KDQojIEZ1dHVyZSArMkMgDQptYXBfc3ViX1RTTV9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JzX21hZ21hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgODUpKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX1RTTV9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X2FsbCArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KSkNCg0Kc3Vic3RyYXRlX3Bsb3QNCmBgYA0KDQpGaWd1cmUgQTM3OiBOdW1iZXIgb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgaW4gZWFjaCBjb21tdW5pdHkgZm9yIGFtcGhpYmlhbnMgb24gdGVycmVzdHJpYWwgY29uZGl0aW9ucy4gVGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGFzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKDkxMCBkYXlzIGJldHdlZW4gMjAwNiBhbmQgMjAxNSkuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHJlZCkuIEdyYXkgY29sb3VyIGRlcGljdHMgc3BlY2llcyBhcmVhcyB3aGVyZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0LiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQoNCiMgQ3VycmVudA0KbWFwX2FyYl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KDQojIEZ1dHVyZSArMkMgDQptYXBfYXJiX1RTTV9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JzX21hZ21hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9hcmJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnQucmRzIikNCnByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgODUpKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KYXJib3JlYWxfcGxvdCA8LSAobWFwX2FyYl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTJDICsgDQogICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgICBsYXRfYWxsICsgDQogICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDQpKQ0KDQphcmJvcmVhbF9wbG90DQpgYGANCg0KRmlndXJlIEEzODogTnVtYmVyIG9mIHNwZWNpZXMgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIGVhY2ggY29tbXVuaXR5IGZvciBhbXBoaWJpYW5zIGluIGFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uLiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgYXMgYXNzZXNzZWQgYXMgdGhlIHN1bSBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHBlcmlvZCBzdXJ2ZXllZCAoOTEwIGRheXMgYmV0d2VlbiAyMDA2IGFuZCAyMDE1KS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocmVkKS4gR3JheSBjb2xvdXIgZGVwaWN0cyBzcGVjaWVzIGFyZWFzIHdoZXJlIG5vbmUgb2YgdGhlIHNwZWNpZXMgb3ZlcmhlYXQuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoID0gMTV9DQoNCmFsbF9oYWJpdGF0cyA8LSAoc3Vic3RyYXRlX3Bsb3QgLw0KICAgICAgICAgICAgICAgICBhcmJvcmVhbF9wbG90IC8NCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCmBgYA0KDQoNCkZpZ3VyZSBBMzk6IE51bWJlciBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBlYWNoIGNvbW11bml0eSBmb3IgYW1waGliaWFucyBvbiB0ZXJyZXN0cmlhbCBjb25kaXRpb25zICh0b3AgcGFuZWwpIG9yIGluIGFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uIChib3R0b20gcGFuZWwpLiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgYXMgYXNzZXNzZWQgYXMgdGhlIHN1bSBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHBlcmlvZCBzdXJ2ZXllZCAoOTEwIGRheXMgYmV0d2VlbiAyMDA2IGFuZCAyMDE1KS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocmVkKS4gR3JheSBjb2xvdXIgZGVwaWN0cyBzcGVjaWVzIGFyZWFzIHdoZXJlIG5vbmUgb2YgdGhlIHNwZWNpZXMgb3ZlcmhlYXQuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KDQojIyMgKipMaW5lYXIgbWl4ZWQgbW9kZWxzKiogDQoNCkhlcmUsIHdlIHVzZWQgbGluZWFyIG1peGVkIG1vZGVscyB0byBlc3RpbWF0ZSB0aGUgbWVhbiBudW1iZXIgb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgaW4gZWFjaCBtaWNyb2hhYml0YXQgYW5kIGNsaW1hdGljIHNjZW5hcmlvLiBOb3RlIHRoYXQgd2UgY291bGQgbm90IHVzZSBiYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzIGJlY2F1c2UgdGhlIG1vZGVscyBmYWlsZWQgdG8gbWl4LCBldmVuIGFmdGVyIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiBpdGVyYXRpb25zLiANCg0KIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCiMjIyMjICoqRnVsbCBkYXRhc2V0KiogDQoNCmBgYHtyLCBldmFsID1GfQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGJpbmRfcm93cygNCiAgY29tbXVuaXR5X3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIGNvbW11bml0eV9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIikNCikNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGFsbF9jb21tdW5pdHlfZGF0YSAlPiUgbXV0YXRlKG9icyA9IGFzLmNoYXJhY3Rlcihyb3dfbnVtYmVyKCkpKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfY29tbXVuaXR5X2RhdGEpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCANCm1vZGVsX25fc3AgPC0gZ2xtZXIobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMSB8b2JzKSwgDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGFzLmRhdGEuZnJhbWUoZ2dwcmVkaWN0KG1vZGVsX25fc3AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzaW11bGF0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfbl9zcCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmcucmRzIikNCg0KDQojIENvbnRyYXN0IA0KYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9uX3NwX2NvbnRyYXN0IDwtIGdsbWVyKG5fc3BlY2llc19vdmVyaGVhdGluZyB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IikgKyAoMSB8b2JzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCnNhdmVSRFMobW9kZWxfbl9zcF9jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX2NvbnRyYXN0LnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKlN1YnNldCBvZiBvdmVyaGVhdGluZyBjb21tdW5pdGllcyoqIA0KDQpgYGB7ciwgZXZhbCA9Rn0NCiMgRmlsdGVyIHRvIG92ZXJoZWF0aW5nIGNvbW11bml0aWVzIA0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGZpbHRlcihhbGxfY29tbXVuaXR5X2RhdGEsIG5fc3BlY2llc19vdmVyaGVhdGluZyA+IDApDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9uX3NwX292ZXJoZWF0aW5nX2NvbW11bml0aWVzIDwtIGdsbWVyKG5fc3BlY2llc19vdmVyaGVhdGluZyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAicG9pc3NvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uc19vdmVyaGVhdGluZ19jb21tdW5pdGllcyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9uX3NwX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0gImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnNfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMgPC0gcHJlZGljdGlvbnNfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX25fc3Bfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9tb2RlbF9sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19vdmVyaGVhdGluZ19jb21tdW5pdGllcy5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9uc19vdmVyaGVhdGluZ19jb21tdW5pdGllcywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiANCg0KIyMjIyMgKipGdWxsIGRhdGFzZXQqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3BlY2llc19vdmVyaGVhdGluZykNCg0KIyBNb2RlbCBwcmVkaWN0aW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nLnJkcyIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5IChjb250cmFzdHMpDQptb2RlbF9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9tb2RlbF9sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19jb250cmFzdC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3QpDQpgYGANCg0KIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3BlY2llc19vdmVyaGVhdGluZykNCg0KIyBNb2RlbCBwcmVkaWN0aW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpKQ0KYGBgDQoNCg0KDQojIyAqKlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KSGVyZSwgd2UgaW52ZXN0aWdhdGUgdGhlIHZhcmlhdGlvbiBpbiB0aGUgcHJvcG9ydGlvbiBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBlYWNoIGNvbW11bml0eS4gTm90ZSB0aGF0IG5vbmUgb2YgdGhlIHBvcHVsYXRpb25zIHdlcmUgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIHdhdGVyIGJvZGllcy4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9SdW5uaW5nX21vZGVsc19wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1J1bm5pbmdfbW9kZWxzX3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy5wYnMqKiANCg0KKipMb2FkIHRoZSBkYXRhKiogDQoNCmBgYHtyfQ0KIyBMb2FkIHBvcHVsYXRpb24tbGV2ZWwgZGF0YQ0KDQojIFN1YnN0cmF0ZQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFyYm9yZWFsDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgaW4gZWFjaCBjb21tdW5pdHkgdXNpbmcgZ2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWxzLiANCg0KIyMjIyAqKlJ1biB0aGUgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCnJ1bl9jb21tdW5pdHlfcHJvcG9ydGlvbl9vdmVyaGVhdGluZ19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBzKGxhdCwgYnMgPSAidHAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IGRhdGEkbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gTkEsIA0KICAgIG5fc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IGNvbW11bml0eV9zdWJfZnV0dXJlNEMNCikNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0zKSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fY29tbXVuaXR5X3Byb3BvcnRpb25fb3ZlcmhlYXRpbmdfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyAqKlZpc3VhbGl6ZSB0aGUgcmVzdWx0cyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KYGBge3J9DQojIFNldCBjb2xvdXJzDQptYWdtYV9zdWJzZXQgPC0gdmlyaWRpczo6bWFnbWEoMTAwKVs0MDoxMDBdDQpjb2xvcl9mdW5jIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiZ3JheTk1IiwgbWFnbWFfc3Vic2V0KSkNCmNvbG9yc19tYWdtYSA8LSBjb2xvcl9mdW5jKDEwMCkNCg0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIEFyYm9yZWFsDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQoNCiMgQ3VycmVudA0KbWFwX3N1Yl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KDQojIEZ1dHVyZSArMkMgDQptYXBfc3ViX1RTTV9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JzX21hZ21hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDLA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgMSkrDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX1RTTV9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X2FsbCArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KSkNCg0Kc3Vic3RyYXRlX3Bsb3QNCmBgYA0KDQpGaWd1cmUgQTQwOiBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIGVhY2ggY29tbXVuaXR5IGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsIGNvbmRpdGlvbnMuIFRoZSBwcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgd2FzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKDkxMCBkYXlzIGJldHdlZW4gMjAwNiBhbmQgMjAxNSkgZGl2aWRlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHNwZWNpZXMgaW4gYSBnaXZlbiBjb21tdW5pdHkuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHJlZCkuIEdyYXkgY29sb3VyIGRlcGljdHMgc3BlY2llcyBhcmVhcyB3aGVyZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0LiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDh9DQoNCiMgQ3VycmVudA0KbWFwX2FyYl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KDQojIEZ1dHVyZSArMkMgDQptYXBfYXJiX1RTTV9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JzX21hZ21hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9hcmJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcnNfbWFnbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgY29sID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIHNoYXBlID0gIi4iKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGNvbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBzaGFwZSA9ICIuIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBjb2wgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgc2hhcGUgPSAiLiIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgMSkrDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KYXJib3JlYWxfcGxvdCA8LSAobWFwX2FyYl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTJDICsgDQogICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgICBsYXRfYWxsICsgDQogICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDQpKQ0KDQphcmJvcmVhbF9wbG90DQpgYGANCg0KRmlndXJlIEE0MTogUHJvcG9ydGlvbiBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBlYWNoIGNvbW11bml0eSBmb3IgYW1waGliaWFucyBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbi4gVGhlIHByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyB3YXMgYXNzZXNzZWQgYXMgdGhlIHN1bSBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHBlcmlvZCBzdXJ2ZXllZCAoOTEwIGRheXMgYmV0d2VlbiAyMDA2IGFuZCAyMDE1KSBkaXZpZGVkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygc3BlY2llcyBpbiBhIGdpdmVuIGNvbW11bml0eS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpLCBvciBhc3N1bWluZyArMkMgKG9yYW5nZSkgb3IgKzRDIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocmVkKS4gR3JheSBjb2xvdXIgZGVwaWN0cyBzcGVjaWVzIGFyZWFzIHdoZXJlIG5vbmUgb2YgdGhlIHNwZWNpZXMgb3ZlcmhlYXQuIEJsYWNrIGNvbG91ciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4NCg0KIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoID0gMTV9DQoNCmFsbF9oYWJpdGF0cyA8LSAoc3Vic3RyYXRlX3Bsb3QgLw0KICAgICAgICAgICAgICAgICBhcmJvcmVhbF9wbG90IC8NCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCmBgYA0KDQoNCkZpZ3VyZSBBNDI6IFByb3BvcnRpb24gb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgaW4gZWFjaCBjb21tdW5pdHkgZm9yIGFtcGhpYmlhbnMgb24gdGVycmVzdHJpYWwgY29uZGl0aW9ucyAodG9wIHBhbmVsKSBvciBpbiBhYm92ZS1ncm91bmQgdmVnZXRhdGlvbiAoYm90dG9tIHBhbmVsKS4gVFRoZSBwcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgd2FzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKDkxMCBkYXlzIGJldHdlZW4gMjAwNiBhbmQgMjAxNSkgZGl2aWRlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHNwZWNpZXMgaW4gYSBnaXZlbiBjb21tdW5pdHkuIFRoZSByaWdodCBwYW5lbCBkZXBpY3RzIGxhdGl0dWRpbmFsIHBhdHRlcm5zIGluIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSwgb3IgYXNzdW1pbmcgKzJDIChvcmFuZ2UpIG9yICs0QyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHJlZCkuIEdyYXkgY29sb3VyIGRlcGljdHMgc3BlY2llcyBhcmVhcyB3aGVyZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0LiBCbGFjayBjb2xvdXIgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEuDQoNCg0KIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpIZXJlLCB3ZSB1c2VkIGxpbmVhciBtaXhlZCBtb2RlbHMgdG8gZXN0aW1hdGUgdGhlIG1lYW4gcHJvcG9ydGlvbiBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBlYWNoIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0aWMgc2NlbmFyaW8uIE5vdGUgdGhhdCB3ZSBjb3VsZCBub3QgdXNlIGJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMgYmVjYXVzZSB0aGUgbW9kZWxzIGZhaWxlZCB0byBtaXgsIGV2ZW4gYWZ0ZXIgaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIGl0ZXJhdGlvbnMuIA0KDQojIyMjICoqUnVuIHRoZSBtb2RlbHMqKiANCg0KIyMjIyMgKipGdWxsIGRhdGFzZXQqKiANCg0KYGBge3IsIGV2YWwgPUZ9DQojIExvYWQgY29tbXVuaXR5LWxldmVsIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIGNvbW11bml0eV9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBjb21tdW5pdHlfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhbGxfY29tbXVuaXR5X2RhdGEgJT4lIG11dGF0ZShvYnMgPSBhcy5jaGFyYWN0ZXIocm93X251bWJlcigpKSkNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2NvbW11bml0eV9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwgDQptb2RlbF9wcm9wIDwtIGdsbWVyKHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCg0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcHJvcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfcHJvcCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcucmRzIikNCg0KDQojIyMjIyMgQ29udHJhc3RzIA0KYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfcHJvcF9jb250cmFzdCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCiMgU2F2ZSBtb2RlbA0Kc2F2ZVJEUyhtb2RlbF9wcm9wX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3QucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqU3Vic2V0IG9mIG92ZXJoZWF0aW5nIGNvbW11bml0aWVzKiogDQoNCmBgYHtyLCBldmFsID1GfQ0KIyBGaWx0ZXIgdG8gb3ZlcmhlYXRpbmcgY29tbXVuaXRpZXMgDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gZmlsdGVyKGFsbF9jb21tdW5pdHlfZGF0YSwgbl9zcGVjaWVzX292ZXJoZWF0aW5nID4gMCkNCg0KIyBSdW4gbW9kZWwNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwgDQptb2RlbF9wcm9wX292ZXJoZWF0aW5nX2NvbW11bml0aWVzIDwtIGdsbWVyKHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uc19vdmVyaGVhdGluZ19jb21tdW5pdGllcyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9wcm9wX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnNfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMgPC0gcHJlZGljdGlvbnNfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfcHJvcF9vdmVyaGVhdGluZ19jb21tdW5pdGllcywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zX292ZXJoZWF0aW5nX2NvbW11bml0aWVzLCBmaWxlID0gIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikNCg0KYGBgDQoNCg0KIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIA0KDQojIyMjIyAqKkZ1bGwgZGF0YXNldCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KIyBNb2RlbCBzdW1tYXJ5IA0KbW9kZWxfcHJvcF9zcF9vdmVyaGVhdGluZyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nLnJkcyIpDQoNCnN1bW1hcnkobW9kZWxfcHJvcF9zcF9vdmVyaGVhdGluZykNCg0KIyBNb2RlbCBwcmVkaWN0aW9ucw0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9wcmVkaWN0aW9uc19sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy5yZHMiKSkNCmBgYA0KDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeSAoY29udHJhc3RzKQ0KbW9kZWxfcHJvcF9zcF9vdmVyaGVhdGluZ19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX2NvbnRyYXN0LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3QpDQpgYGANCg0KIyMjIyMgKipTdWJzZXQgb2Ygb3ZlcmhlYXRpbmcgcG9wdWxhdGlvbnMqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCiMgTW9kZWwgc3VtbWFyeSANCm1vZGVsX3Byb3Bfc3Bfb3ZlcmhlYXRpbmcgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9tb2RlbF9sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19vdmVyaGVhdGluZ19jb21tdW5pdGllcy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9wcm9wX3NwX292ZXJoZWF0aW5nKQ0KDQojIE1vZGVsIHByZWRpY3Rpb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvcHJlZGljdGlvbnNfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfb3ZlcmhlYXRpbmdfY29tbXVuaXRpZXMucmRzIikpDQpgYGANCg0KIyMgKipQaHlsb2dlbmV0aWMgc2lnbmFsIGluIENUbWF4Kiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9IA0KDQpgYGB7cn0NCiMgTG9hZCB0aGUgZXhwZXJpbWVudGFsIGRhdGENCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCnRyYWluaW5nX2RhdGEgPC0gZmlsdGVyKHRyYWluaW5nX2RhdGEsIGltcHV0ZWQgPT0gIm5vIikNCnRyZWUgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQojIFJlb3JnYW5pc2UgbGV2ZWxzIG9mIHNvbWUgdmFyaWFibGVzDQp0cmFpbmluZ19kYXRhIDwtIHRyYWluaW5nX2RhdGEgJT4lIA0KICBtdXRhdGUoc3BlY2llcyA9IHRpcC5sYWJlbCwNCiAgICAgICAgIGFjY2xpbWF0ZWQsDQogICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZCA9IGZhY3RvcihsaWZlX3N0YWdlX3Rlc3RlZCksDQogICAgICAgICBsaWZlX3N0YWdlX3Rlc3RlZD1mYWN0b3IobGlmZV9zdGFnZV90ZXN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiYWR1bHQiLCAiYWR1bHRzIiwgImxhcnZhZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoImFkdWx0cyIsICJhZHVsdHMiLCAibGFydmFlIikpLA0KICAgICAgICAgZW5kcG9pbnQyID0gZmFjdG9yKGVuZHBvaW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJMUlIiLCAiT1MiLCAiTE9FIiwgInByb2RkaW5nIiwgIm90aGVyIiwgImRlYXRoIiksDQogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTFJSIiwgIk9TIiwgIkxSUiIsICJvdGhlciIsICJvdGhlciIsICJvdGhlciIpKSwNCiAgICAgICAgIGVjb3R5cGUgPSBmYWN0b3IoZWNvdHlwZSkpIA0KDQojIFJlbW92ZSB0aGUgZmFtaWx5IGNvbHVtbiB0byBydW4gTUNNQ2dsbW0NCnRyYWluaW5nX2RhdGEgPC0gZHBseXI6OnNlbGVjdCh0cmFpbmluZ19kYXRhLCAtZmFtaWx5KSANCg0KIyBNYXRjaCBkYXRhIHRvIHBoeWxvZ2VuZXRpYyB0cmVlDQptYXRjaHBvcyA8LSBtYXRjaCh0cmFpbmluZ19kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpDQp0cmFpbmluZ19kYXRhJG1hdGNocG9zIDwtIG1hdGNocG9zDQp0cmFpbmluZ19kYXRhIDwtIHRyYWluaW5nX2RhdGEgJT4lIGZpbHRlcihpcy5uYShtYXRjaHBvcykgPT0gRikgDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKHRyYWluaW5nX2RhdGEkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSANCg0KIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KdHJlZTwtZm9yY2UudWx0cmFtZXRyaWModHJlZSwgbWV0aG9kPSJleHRlbmQiKSANCg0KIyBQaHlsb2dlbmV0aWMgY28tdmFyaWFuY2UgbWF0cml4DQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQoNCiMgU2V0IHBhcmFtYWV0ZXIgZXhwYW5kZWQgcHJpb3INCiBwcmlvcjwtICBsaXN0KFIgPSBsaXN0KFY9MSwgbnU9MC4wMDEpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxPWxpc3QoViA9IDEsIG51ID0gMC4wMDIsIGFscGhhLm11ID0gMCwgYWxwaGEuViA9IDFlNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgRzI9bGlzdChWID0gMSwgbnUgPSAwLjAwMiwgYWxwaGEubXUgPSAwLCBhbHBoYS5WID0gMWU0KSkpDQoNCiMgRml0IG1vZGVsIHdpdGggYWxsIGNvbXBsZXRlIGNhc2UgcHJlZGljdG9ycw0KbW9kZWwgPC0gTUNNQ2dsbW0obWVhbl9VVEwgfiBhY2NsaW1hdGlvbl90ZW1wICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50MiArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NsaW1hdGVkICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3R5cGUsIA0KICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiB0aXAubGFiZWwgKyAjIFBoeWxvZ2VueSArIHNwZWNpZXMgcmFuZG9tIGVmZmVjdHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcywNCiAgICAgICAgICAgICAgICAgIGdpbnZlcnNlID0gbGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgIHBsID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICBwciA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgbml0dCA9IDEzMDAwMCwgDQogICAgICAgICAgICAgICAgICB0aGluID0gMTAwLCANCiAgICAgICAgICAgICAgICAgIGJ1cm5pbiA9IDMwMDAwLCANCiAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLCANCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICBkYXRhID0gdHJhaW5pbmdfZGF0YSkNCnN1bW1hcnkobW9kZWwpDQoNCiMgQ2FsY3VsYXRlIHByb3BvcnRpb24gb2Ygbm9uLXJlc2lkdWFsIHZhcmlhbmNlIGV4cGxhaW5lZCBieSBwaHlsb2dlbnkNCmxhbWJkYSA8LSBtb2RlbCRWQ1ZbLCJ0aXAubGFiZWwiXS8obW9kZWwkVkNWWywidGlwLmxhYmVsIl0gKyBtb2RlbCRWQ1ZbLCJzcGVjaWVzIl0pIA0KcG9zdGVyaW9yLm1vZGUobGFtYmRhKSAjIExhbWJkYQ0KSFBEaW50ZXJ2YWwobGFtYmRhKSAjIEhpZ2hlc3QgcG9zdGVyaW9yIGRlbnNpdHkNCmBgYA0KDQoNCiMgKipTZW5zaXRpdml0eSBhbmFseXNlcyoqIA0KDQojIyAqKkNoYW5naW5nIGJpb3BoeXNpY2FsIG1vZGVsIHBhcmFtZXRlcnMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KSGVyZSwgd2UgY29tcGFyZWQgcHJlZGljdGlvbnMgb2Ygb3ZlcmhlYXRpbmcgcmlzayBmb3IgYSBoaWdoLXJpc2sgc3BlY2llcyBpbiBhIGdpdmVuIGxvY2F0aW9uIGFzc3VtaW5nIGRpZmZlcmVudCBiaW9waHN5aWNhbCBwYXJhbWV0ZXJzLg0KDQpUaGlzIGNvZGUgY2FuIGJlIHJ1biBsb2NhbGx5LCBidXQgbm90ZSB0aGF0IHRoZSBlY3RvdGhlcm0gbW9kZWwgc2ltdWxhdGluZyBwb25kIHBhcmFtZXRlcnMgdGFrZXMgdGltZSB0byBydW4gKH4zMCBtaW4pLiANCg0KDQojIyMgKipUZXJyZXN0cmlhbCBjb25kaXRpb25zKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipTdGFuZGFyZCBwYXJhbWV0ZXJzKiogDQoNCiMjIyMjICoqRmluZCB0aGUgbG9jYXRpb24gYW5kIGJvZHkgbWFzcyBvZiB0aGUgc3BlY2llcyBhdCBoaWdoZXN0IHJpc2sqKiANCmBgYHtyfQ0KIyBJZGVudGlmeSB0aGUgbG9jYXRpb24gYW5kIHNwZWNpZXMgb24gd2hpY2ggdG8gZG8gdGhlIHNlbnNpdGl2aXR5IGFuYWx5c2lzIChzcGVjaWVzIG1vc3QgdnVsbmVyYWJsZSB3YXJtaW5nKQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KcG9wX3N1Yl9jdXJyZW50IDwtIGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIHRpcC5sYWJlbCA9PSAiTm9ibGVsbGEgbXlybWVjb2lkZXMiKSAjIE1vc3QgaGlnaC1yaXNrIHNwZWNpZXMgaW4gdGVycmVzdHJpYWwgY29uZGl0aW9ucw0KaGlnaF9yaXNrIDwtIHBvcF9zdWJfY3VycmVudCAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gb3ZlcmhlYXRpbmdfZGF5cywgbiA9IDEpDQpoaWdoX3Jpc2sgIyBUaGUgbG9jYXRpb24gLTY5LjUsIC05LjUgaXMgYXQgaGlnaGVzdCByaXNrIGZvciB0aGlzIHNwZWNpZXMNCg0KIyBGaW5kIGJvZHkgbWFzcyBvZiB0aGlzIGFzc2VtYmxhZ2UgDQpwcmVzZW5jZSA8LSByZWFkUkRTKGZpbGUgPSAiUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRhdGFfZm9yX2ltcCA8LSByZWFkUkRTKGZpbGUgPSAiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnByZXNlbmNlX2JvZHlfbWFzcyA8LSBtZXJnZShwcmVzZW5jZSwgZHBseXI6OnNlbGVjdChkYXRhX2Zvcl9pbXAsIHRpcC5sYWJlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X21hc3MpLCBieSA9ICJ0aXAubGFiZWwiKQ0KbWVkaWFuX2JvZHlfbWFzcyA8LSBwcmVzZW5jZV9ib2R5X21hc3MgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UobWVkaWFuX21hc3MgPSBtZWRpYW4oYm9keV9tYXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQptZWRpYW5fYm9keV9tYXNzW21lZGlhbl9ib2R5X21hc3MkbG9uID09IC02OS41ICYgbWVkaWFuX2JvZHlfbWFzcyRsYXQgPT0gLTkuNSxdICMgNC4yOCBnDQpgYGANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCiMgUnVuIHRoZSBiaW9waHlzaWNhbCBtb2RlbHMgdXNpbmcgdGhlIHBhcmFtZXRlcnMgdXNlZCBpbiB0aGUgcGFwZXIgDQoNCiMgU2V0IHBhcmFtZXRlcnMNCmRzdGFydCA8LSAiMDEvMDEvMjAwNSINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiDQpjb29yZHM8LSBjKC02OS41LCAtOS41KQ0KDQojIFJ1biB0aGUgbWljcm9jbGltYXRlIG1vZGVsDQptaWNyb19kZWZhdWx0IDwtICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9OQ0VQX3RpbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyYV9zb3VyY2UgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9jbGltYXRpY19kYXRhX1RlcnJhQ2xpbWF0ZS9kYXRhJykNCg0KIyBSdW4gdGhlIGVjdG90aGVybSBtb2RlbA0KbWljcm8gPC0gbWljcm9fZGVmYXVsdA0KZWN0byA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IDQuMjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQplbnZpcm9uIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcCA8LSBlbnZpcm9uICU+JQ0KICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBET1kpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcm9sbGluZyB3ZWVrbHkgdGVtcGVyYXR1cmUNCmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiA8LSBmdW5jdGlvbihkYXRhKSB7DQogIGRhdGEkbWVhbl93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1lYW5fdGVtcCwgd2lkdGggPSA3LCBGVU4gPSBtZWFuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAicmlnaHQiLCBwYXJ0aWFsID0gVFJVRSwgZmlsbCA9IE5BKQ0KICBkYXRhJG1heF93ZWVrbHlfdGVtcCA8LSB6b286OnJvbGxhcHBseShkYXRhJG1heF90ZW1wLCB3aWR0aCA9IDcsIEZVTiA9IG1lYW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gInJpZ2h0IiwgcGFydGlhbCA9IFRSVUUsIGZpbGwgPSBOQSkNCiAgcmV0dXJuKGRhdGEpDQp9DQoNCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXAgPC0gZGFpbHlfdGVtcCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6Z3JvdXBfbW9kaWZ5KH5jYWxjX3llYXJseV9yb2xsaW5nX21lYW4oLikpDQoNCiMgSWRlbnRpZnkgdGhlIHdhcm1lc3QgOTEgZGF5cyAoMyBtb250aHMpIG9mIGVhY2ggeWVhcg0KZGFpbHlfdGVtcF93YXJtZXN0X2RheXMgPC0gZGFpbHlfdGVtcCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIoWUVBUiA+IDIwMDUpDQoNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKiANCg0KYGBge3J9DQojIExvYWQgaW1wdXRlZCBkYXRhDQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpDQoNCkNUbWF4X2RhdGEgPC0gZHBseXI6OnNlbGVjdChyZXN1bHRzX2ltcHV0YXRpb24sIENUbWF4ID0gZmlsbGVkX21lYW5fVVRMNSwgbG93ZXJDSSA9IGxvd2VyX21lYW5fVVRMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyQ0kgPSB1cHBlcl9tZWFuX1VUTCwgYWNjbGltYXRpb25fdGVtcCwgdGlwLmxhYmVsLCBpbXB1dGVkKSAgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZCA9PSAibm8iKSAgIyBPcmlnaW5hbCBleHBlcmltZW50YWwgZGF0YQ0KaW1wdXRlZF9kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZCA9PSAieWVzIikgICMgSW1wdXRlZCBkYXRhDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGVhY2ggb2JzZXJ2YXRpb24NCmltcHV0ZWRfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lDQogIG11dGF0ZShzZSA9ICh1cHBlckNJIC0gQ1RtYXgpLzEuOTYpDQoNCiMgR3JvdXAgZGF0YSBieSBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwpDQoNCiMgRmlsdGVyIHRvIHRoZSBzcGVjaWVzIG9mIGludGVyZXN0IA0Kc3BlY2llc19kYXRhX25fbXlyYyA8LSBzcGVjaWVzX2RhdGEgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKHRpcC5sYWJlbD09Ik5vYmxlbGxhIG15cm1lY29pZGVzIikNCg0KIyBSdW4gbWV0YS1hbmFseXRpYyBtb2RlbA0KZml0IDwtIG1ldGFmb3I6OnJtYSh5aSA9IENUbWF4LCANCiAgICAgICAgICAgICAgICAgICAgc2VpID0gc2UsIA0KICAgICAgICAgICAgICAgICAgICBtb2QgPSB+YWNjbGltYXRpb25fdGVtcCwgDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzcGVjaWVzX2RhdGFfbl9teXJjKQ0KDQpwcmVkaWN0aW9uIDwtIHByZWRpY3QoZml0LCBuZXdtb2RzID0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXMkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb24kcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb24kc2UpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWF4X3dlZWtseV90ZW1wKQ0KDQojIENhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcw0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHk8LSBkYWlseV9DVG1heCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTYXZlIGZpbGUNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eSwgZmlsZSA9ICJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KcG9wX3Z1bG5lcmFiaWxpdHkgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eSAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHkgPC0gcG9wX3Z1bG5lcmFiaWxpdHkgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnBvcF92dWxuZXJhYmlsaXR5ICANCmBgYA0KDQojIyMjICoqU21hbGxlciBib2R5IHNpemUqKiANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCm1pY3JvIDwtIG1pY3JvX2RlZmF1bHQgIyBTYW1lIG1pY3JvY2xpbWF0ZSBtb2RlbCBhcyBhYm92ZQ0KDQojIFJ1biB0aGUgZWN0b3RoZXJtIG1vZGVsDQplY3RvX3NtYWxsIDwtIE5pY2hlTWFwUjo6ZWN0b3RoZXJtKGxpdmU9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gMC41LCAjIFNtYWxsIGJvZHkgbWFzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQplbnZpcm9uX3NtYWxsIDwtIGFzLmRhdGEuZnJhbWUoZWN0b19zbWFsbCRlbnZpcm9uKQ0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9zbWFsbCA8LSBlbnZpcm9uX3NtYWxsICU+JQ0KICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBET1kpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENhbGN1bGF0ZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9zbWFsbCA8LSBkYWlseV90ZW1wX3NtYWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3NtYWxsX3dhcm1lc3RfZGF5cyA8LSBkYWlseV90ZW1wX3NtYWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX3NtYWxsIDwtIHByZWRpY3QoZml0LCBuZXdtb2RzID0gZGFpbHlfdGVtcF9zbWFsbF93YXJtZXN0X2RheXMkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X3NtYWxsIDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfc21hbGxfd2FybWVzdF9kYXlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fc21hbGwkcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb25fc21hbGwkc2UpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWF4X3dlZWtseV90ZW1wKQ0KDQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9zbWFsbCA8LSBkYWlseV9DVG1heF9zbWFsbCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfc21hbGwsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9kYWlseV92dWxuZXJhYmlsaXR5X3NtYWxsX2JvZHlfc2l6ZV9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9zbWFsbCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X3NtYWxsICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCnBvcF92dWxuZXJhYmlsaXR5X3NtYWxsIDwtIHBvcF92dWxuZXJhYmlsaXR5X3NtYWxsICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9zbWFsbCANCmBgYA0KDQojIyMjICoqTGFyZ2VyIGJvZHkgc2l6ZSoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KbWljcm8gPC0gbWljcm9fZGVmYXVsdCAjIFNhbWUgbWljcm9jbGltYXRlIG1vZGVsIGFzIGFib3ZlDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCmVjdG9fbGFyZ2UgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSA1MCwgICMgTGFyZ2UgYm9keSBtYXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCmVudmlyb25fbGFyZ2UgPC0gYXMuZGF0YS5mcmFtZShlY3RvX2xhcmdlJGVudmlyb24pDQoNCiMgQ2FsY3VsYXRlIGRhaWx5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2xhcmdlIDwtIGVudmlyb25fbGFyZ2UgJT4lDQogIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0KSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIERPWSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLCANCiAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICJkcm9wIikgDQoNCiMgQ2FsY3VsYXRlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2xhcmdlIDwtIGRhaWx5X3RlbXBfbGFyZ2UgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KDQojIElkZW50aWZ5IHRoZSB3YXJtZXN0IDkxIGRheXMgKDMgbW9udGhzKSBvZiBlYWNoIHllYXINCmRhaWx5X3RlbXBfbGFyZ2Vfd2FybWVzdF9kYXlzIDwtIGRhaWx5X3RlbXBfbGFyZ2UgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKFlFQVIgPiAyMDA1KQ0KYGBgDQoNCiMjIyMjICoqQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSoqDQpgYGB7cn0NCiMgR2VuZXJhdGUgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25fbGFyZ2UgPC0gcHJlZGljdChmaXQsIG5ld21vZHMgPSBkYWlseV90ZW1wX2xhcmdlX3dhcm1lc3RfZGF5cyRtZWFuX3dlZWtseV90ZW1wKQ0KZGFpbHlfQ1RtYXhfbGFyZ2UgPC0gZHBseXI6OnNlbGVjdCgoY2JpbmQoZGFpbHlfdGVtcF9sYXJnZV93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQocHJlZGljdGVkX0NUbWF4ID0gcHJlZGljdGlvbl9sYXJnZSRwcmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9sYXJnZSRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X2xhcmdlIDwtIGRhaWx5X0NUbWF4X2xhcmdlICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbGFyZ2UsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9kYWlseV92dWxuZXJhYmlsaXR5X2xhcmdlX2JvZHlfc2l6ZV9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9sYXJnZSA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2xhcmdlICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9sYXJnZSA8LSBwb3BfdnVsbmVyYWJpbGl0eV9sYXJnZSAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbGFyZ2UgDQpgYGANCg0KIyMjIyAqKlVuZGVyZ3JvdW5kIGNvbmRpdGlvbnMqKiANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCm1pY3JvIDwtIG1pY3JvX2RlZmF1bHQgIyBTYW1lIG1pY3JvY2xpbWF0ZSBtb2RlbCBhcyBhYm92ZQ0KZWN0byA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IDQuMjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApICMgU2FtZSBlY3RvdGhlcm0gbW9kZWwgYXMgcHJldmlvdXNseQ0KZW52aXJvbiA8LSBhcy5kYXRhLmZyYW1lKGVjdG8kZW52aXJvbikNCg0KZHVtbXlfYnVycm93IDwtIGRwbHlyOjpzZWxlY3QoZW52aXJvbiwgRE9ZLCBZRUFSKSAjIENyZWF0ZSBkdW1teSB2YXJpYWJsZSB0byBzdG9yZSByZXN1bHRzIGF0IGRpZmZlcmVudCBkZXB0aHMNCnNvaWxfdGVtcCA8LSBhcy5kYXRhLmZyYW1lKG1pY3JvJHNvaWwpICMgRXh0cmFjdCBzb2lsIHRlbXBlcmF0dXJlcyBhdCBkaWZmZXJlbnQgZGVwdGhzDQplbnZpcm9uX2J1cnJvdyA8LSBjYmluZChkdW1teV9idXJyb3csIGRwbHlyOjpzZWxlY3Qoc29pbF90ZW1wLCBEMi41Y20sIEQ1Y20sIEQxMGNtLCBEMTVjbSwgRDIwY20pKSAjIEdldCBzb2lsIGRlcHRocyB1cCB0byAyMCBjbQ0KZW52aXJvbl9idXJyb3cgPC0gcGl2b3RfbG9uZ2VyKGVudmlyb25fYnVycm93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzID0gRDIuNWNtOkQyMGNtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkRFUFRIIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gIkQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVEMiKSAjIFBpdm90IGxvbmdlcg0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9idXJyb3cgPC0gZW52aXJvbl9idXJyb3cgJT4lDQogIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0KSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIERPWSwgREVQVEgpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENhbGN1bGF0ZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9idXJyb3cgPC0gZGFpbHlfdGVtcF9idXJyb3cgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBERVBUSCkgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX2J1cnJvd193YXJtZXN0X2RheXMgPC0gZGFpbHlfdGVtcF9idXJyb3cgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBERVBUSCkgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX2J1cnJvdyA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhaWx5X3RlbXBfYnVycm93X3dhcm1lc3RfZGF5cyRtZWFuX3dlZWtseV90ZW1wKQ0KZGFpbHlfQ1RtYXhfYnVycm93IDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfYnVycm93X3dhcm1lc3RfZGF5cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQocHJlZGljdGVkX0NUbWF4ID0gcHJlZGljdGlvbl9idXJyb3ckcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX2J1cnJvdyRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyBDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfYnVycm93IDwtIGRhaWx5X0NUbWF4X2J1cnJvdyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0Kc2F2ZVJEUyhkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdywgZmlsZSA9ICJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfYnVycm93X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X2J1cnJvdyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieShERVBUSCkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYnVycm93IDwtIHBvcF92dWxuZXJhYmlsaXR5X2J1cnJvdyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYnVycm93IA0KDQpgYGANCg0KDQojIyMjICoqT3BlbiBoYWJpdGF0cyoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KIyBSdW4gdGhlIG1pY3JvY2xpbWF0ZSBtb2RlbCB3aXRoIHJlZHVjZWQgc2hhZGUNCm1pY3JvX29wZW4gPC0gIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTUwLCAjIFJlZHVjZWQgc2hhZGUgKDUwJSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9OQ0VQX3RpbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyYV9zb3VyY2UgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9jbGltYXRpY19kYXRhX1RlcnJhQ2xpbWF0ZS9kYXRhJykNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCm1pY3JvIDwtIG1pY3JvX29wZW4NCmVjdG9fb3BlbiA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gNC4yOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQplbnZpcm9uX29wZW4gPC0gYXMuZGF0YS5mcmFtZShlY3RvX29wZW4kZW52aXJvbikNCg0KIyBDYWxjdWxhdGUgZGFpbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfb3BlbjwtIGVudmlyb25fb3BlbiAlPiUNCiAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgRE9ZKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksIA0KICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfb3BlbiA8LSBkYWlseV90ZW1wX29wZW4gJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KDQojIElkZW50aWZ5IHRoZSB3YXJtZXN0IDkxIGRheXMgKDMgbW9udGhzKSBvZiBlYWNoIHllYXINCmRhaWx5X3RlbXBfb3Blbl93YXJtZXN0X2RheXMgPC0gZGFpbHlfdGVtcF9vcGVuICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX29wZW4gPC0gcHJlZGljdChmaXQsIG5ld21vZHMgPSBkYWlseV90ZW1wX29wZW5fd2FybWVzdF9kYXlzJG1lYW5fd2Vla2x5X3RlbXApDQpkYWlseV9DVG1heF9vcGVuIDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfb3Blbl93YXJtZXN0X2RheXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZChwcmVkaWN0ZWRfQ1RtYXggPSBwcmVkaWN0aW9uX29wZW4kcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9vcGVuJHNlKSkpLCAtbWF4X3dlZWtseV90ZW1wKQ0KDQojIENhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9vcGVuIDwtIGRhaWx5X0NUbWF4X29wZW4gJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eV9vcGVuLCBmaWxlID0gIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvZGFpbHlfdnVsbmVyYWJpbGl0eV9vcGVuX2hhYml0YXRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyBBZ2dyZWdhdGUgdG8gbG9jYWwgc3BlY2llcyBvY2N1cnJlbmNlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfb3BlbiA8LSBkYWlseV92dWxuZXJhYmlsaXR5X29wZW4gJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICApICU+JQ0KICB1bmdyb3VwKCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfb3BlbiA8LSBwb3BfdnVsbmVyYWJpbGl0eV9vcGVuICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9vcGVuIA0KYGBgDQoNCiMjIyMgKipDb21wYXJlIHRoZSByZXN1bHRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMjAsIGZpZy53aWR0aCA9IDE2fQ0KIyBPcGVuIGhhYml0YXRzIGFuZCBidXJyb3dzDQpoYWJpdGF0X3NlbGVjdGlvbiA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfb3BlbiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC42LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAicmVkIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBmaWx0ZXIoZGFpbHlfdnVsbmVyYWJpbGl0eV9idXJyb3csIERFUFRIID09ICIyLjVjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICJnb2xkIiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGZpbHRlcihkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdywgREVQVEggPT0gIjVjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjQkE5RTQ5IiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGZpbHRlcihkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdywgREVQVEggPT0gIjEwY20iKSwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya29yYW5nZSIsIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBmaWx0ZXIoZGFpbHlfdnVsbmVyYWJpbGl0eV9idXJyb3csIERFUFRIID09ICIxNWNtIiksIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiNGMUFGNzkiLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZmlsdGVyKGRhaWx5X3Z1bG5lcmFiaWxpdHlfYnVycm93LCBERVBUSCA9PSAiMjBjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjOTk1QzUxIiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHksIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC02LjUsIDUpICsgDQogIHlsaW0oMCwgMS4xKSArDQogIHhsYWIoIkRhaWx5IFRTTSIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDQwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQoNCiMgQm9keSBzaXplDQoNCmJvZHlfc2l6ZSA8LSANCmdncGxvdCgpKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X3NtYWxsLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjNDlCQUFFIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2xhcmdlLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjQkE0OTg5IikgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHksIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC01LCA1KSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJEZW5zaXR5IikgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KDQp0ZXJyZXN0cmlhbF9wYXJhbWV0ZXJzIDwtIGJvZHlfc2l6ZSAvIGhhYml0YXRfc2VsZWN0aW9uIA0KDQp0ZXJyZXN0cmlhbF9wYXJhbWV0ZXJzDQoNCmdnc2F2ZSh0ZXJyZXN0cmlhbF9wYXJhbWV0ZXJzLCBmaWxlID0gImZpZy9GaWd1cmVfUzkucG5nIiwgaGVpZ2h0ID0gMjAsIHdpZHRoPTE2LCBkcGkgPSA1MDApDQpgYGANCg0KDQoNCiMjIyAqKkFxdWF0aWMgY29uZGl0aW9ucyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjICoqU3RhbmRhcmQgcGFyYW1ldGVycyoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KDQptaWNybyA8LSBtaWNyb19kZWZhdWx0ICMgU2FtZSBtaWNyb2NsaW1hdGUgbW9kZWwgYXMgYmVmb3JlDQptaWNybyRtZXRvdXRbLCAxM10gPC0gMCAjIE1ha2Ugc3VyZSB0aGUgcG9uZCBzdGF5cyBpbiB0aGUgc2hhZGUNCg0KZWN0b19wb25kIDwtIGVjdG90aGVybShjb250YWluZXI9MSwgIyBjb250YWluZXIgbW9kZWwNCiAgICAgICAgICAgICAgICAgICAgICAgY29udGg9MTUwMCwgIyBzaGFsbG93IHBvbmQgb2YgMS41bSBkZXB0aA0KICAgICAgICAgICAgICAgICAgICAgICBjb250dz0xMjAwMCwjIHBvbmQgb2YgMTJtIHdpZHRoDQogICAgICAgICAgICAgICAgICAgICAgIGNvbnR5cGU9MSwgIyBjb250YWluZXIgc3VuayBpbnRvIHRoZSBncm91bmQgbGlrZSBhIHBvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgcmFpbm11bHQgPSAxMDAwMDAwMDAwLCAjIHJhaW5mYWxsIG11bHRpcGxpZXIsIHRvIGtlZXAgdGhlIHBvbmQgd2V0DQogICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbml0ID0gMTUwMCwgIyBJbml0aWFsIGNvbnRhaW5lciB3YXRlciBsZXZlbCAoMS41bSkNCiAgICAgICAgICAgICAgICAgICAgICAgY29udGhvbGUgPSAwLCAjIERhaWx5IGxvc3Mgb2YgaGVpZ2h0IChtbSkgZHVlIHRvIGhvbGUgaW4gY29udGFpbmVyIChlLmcuIGluZmlsdHJhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgY29udHdldD0xMDAsICMgMTAwJSBvZiBjb250YWluZXIgc3VyZmFjZSBhcmVhIGFjdGluZyBhcyBmcmVlIHdhdGVyIGV4Y2hhbmdlcg0KICAgICAgICAgICAgICAgICAgICAgICBjb250b25seT0xKQ0KDQplbnZpcm9uX3BvbmQgPC0gYXMuZGF0YS5mcmFtZShlY3RvX3BvbmQkZW52aXJvbikNCg0KIyBDYWxjdWxhdGUgZGFpbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfcG9uZCA8LSBlbnZpcm9uX3BvbmQgJT4lDQogIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0KSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIERPWSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLCANCiAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICJkcm9wIikgDQoNCiMgQ2FsY3VsYXRlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX3BvbmQgPC0gZGFpbHlfdGVtcF9wb25kICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kIDwtIGRhaWx5X3RlbXBfcG9uZCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIoWUVBUiA+IDIwMDUpDQpgYGANCg0KIyMjIyMgKipDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5KiogDQpgYGB7cn0NCiMgR2VuZXJhdGUgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25fcG9uZCA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmQkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X3BvbmQgPC0gZHBseXI6OnNlbGVjdCgoY2JpbmQoZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fcG9uZCRwcmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX3BvbmQkc2UpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtYXhfd2Vla2x5X3RlbXApDQoNCiMgQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzDQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kIDwtIGRhaWx5X0NUbWF4X3BvbmQgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kLCBmaWxlID0gIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfcG9uZF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9wb25kIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfcG9uZCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfcG9uZCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9wb25kICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9wb25kIA0KYGBgDQoNCiMjIyMgKipTaGFsbG93ZXIgcG9uZCoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KbWljcm8gPC0gbWljcm9fZGVmYXVsdCAjIFNhbWUgbWljcm9jbGltYXRlIG1vZGVsIGFzIGJlZm9yZQ0KbWljcm8kbWV0b3V0WywgMTNdIDwtIDAgIyBNYWtlIHN1cmUgdGhlIHBvbmQgc3RheXMgaW4gdGhlIHNoYWRlDQoNCmVjdG9fcG9uZF9zaGFsbG93IDwtIGVjdG90aGVybShjb250YWluZXI9MSwgIyBjb250YWluZXIgbW9kZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aD01MCwgIyBzaGFsbG93IHBvbmQgb2YgNTAgY20gZGVwdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250dz0xMjAwMCwjIHBvbmQgb2YgMTJtIHdpZHRoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHlwZT0xLCAjIGNvbnRhaW5lciBzdW5rIGludG8gdGhlIGdyb3VuZCBsaWtlIGEgcG9uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5tdWx0ID0gMTAwMDAwMDAwMCwgIyByYWluZmFsbCBtdWx0aXBsaWVyLCB0byBrZWVwIHRoZSBwb25kIHdldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbml0ID0gMTUwMCwgIyBJbml0aWFsIGNvbnRhaW5lciB3YXRlciBsZXZlbCAoMS41bSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aG9sZSA9IDAsICMgRGFpbHkgbG9zcyBvZiBoZWlnaHQgKG1tKSBkdWUgdG8gaG9sZSBpbiBjb250YWluZXIgKGUuZy4gaW5maWx0cmF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnR3ZXQ9MTAwLCAjIDEwMCUgb2YgY29udGFpbmVyIHN1cmZhY2UgYXJlYSBhY3RpbmcgYXMgZnJlZSB3YXRlciBleGNoYW5nZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250b25seT0xKQ0KDQplbnZpcm9uX3BvbmRfc2hhbGxvdyA8LSBhcy5kYXRhLmZyYW1lKGVjdG9fcG9uZF9zaGFsbG93JGVudmlyb24pDQoNCiMgQ2FsY3VsYXRlIGRhaWx5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX3BvbmRfc2hhbGxvdyA8LSBlbnZpcm9uX3BvbmRfc2hhbGxvdyAlPiUNCiAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgRE9ZKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksIA0KICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfcG9uZF9zaGFsbG93IDwtIGRhaWx5X3RlbXBfcG9uZF9zaGFsbG93ICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kX3NoYWxsb3cgPC0gZGFpbHlfdGVtcF9wb25kX3NoYWxsb3cgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKFlFQVIgPiAyMDA1KQ0KDQpgYGANCg0KIyMjIyMgKipDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5KioNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbl9wb25kX3NoYWxsb3cgPC0gcHJlZGljdChmaXQsIG5ld21vZHMgPSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kX3NoYWxsb3ckbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X3BvbmRfc2hhbGxvdyA8LSBkcGx5cjo6c2VsZWN0KChjYmluZChkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19wb25kX3NoYWxsb3csIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fcG9uZF9zaGFsbG93JHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF9DVG1heF9zZSA9IHByZWRpY3Rpb25fcG9uZF9zaGFsbG93JHNlKSkpLCAtbWF4X3dlZWtseV90ZW1wKQ0KDQojIENhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kX3NoYWxsb3cgPC0gZGFpbHlfQ1RtYXhfcG9uZF9zaGFsbG93ICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfcG9uZF9zaGFsbG93LCBmaWxlID0gIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfc2hhbGxvd19wb25kX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X3BvbmRfc2hhbGxvdyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfc2hhbGxvdyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfcG9uZF9zaGFsbG93IDwtIHBvcF92dWxuZXJhYmlsaXR5X3BvbmRfc2hhbGxvdyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfcG9uZF9zaGFsbG93IA0KYGBgDQoNCg0KIyMjIyAqKkRlZXBlciBwb25kKiogDQoNCiMjIyMjICoqUnVuIHRoZSBiaW9waHlzaWNhbCBtb2RlbCoqIA0KYGBge3J9DQptaWNybyA8LSBtaWNyb19kZWZhdWx0ICMgU2FtZSBtaWNyb2NsaW1hdGUgbW9kZWwgYXMgYmVmb3JlDQptaWNybyRtZXRvdXRbLCAxM10gPC0gMCAjIE1ha2Ugc3VyZSB0aGUgcG9uZCBzdGF5cyBpbiB0aGUgc2hhZGUNCg0KZWN0b19wb25kX2RlZXAgPC0gZWN0b3RoZXJtKGNvbnRhaW5lcj0xLCAjIGNvbnRhaW5lciBtb2RlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRoPTMwMDAsICMgZGVlcCBwb25kIG9mIDMgbWV0ZXJzIGRlcHRoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHc9MTIwMDAsIyBwb25kIG9mIDEybSB3aWR0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnR5cGU9MSwgIyBjb250YWluZXIgc3VuayBpbnRvIHRoZSBncm91bmQgbGlrZSBhIHBvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlubXVsdCA9IDEwMDAwMDAwMDAsICMgcmFpbmZhbGwgbXVsdGlwbGllciwgdG8ga2VlcCB0aGUgcG9uZCB3ZXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW5pdCA9IDE1MDAsICMgSW5pdGlhbCBjb250YWluZXIgd2F0ZXIgbGV2ZWwgKDEuNW0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGhvbGUgPSAwLCAjIERhaWx5IGxvc3Mgb2YgaGVpZ2h0IChtbSkgZHVlIHRvIGhvbGUgaW4gY29udGFpbmVyIChlLmcuIGluZmlsdHJhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250d2V0PTEwMCwgIyAxMDAlIG9mIGNvbnRhaW5lciBzdXJmYWNlIGFyZWEgYWN0aW5nIGFzIGZyZWUgd2F0ZXIgZXhjaGFuZ2VyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udG9ubHk9MSkNCg0KZW52aXJvbl9wb25kX2RlZXAgPC0gYXMuZGF0YS5mcmFtZShlY3RvX3BvbmRfZGVlcCRlbnZpcm9uKQ0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9wb25kX2RlZXAgPC0gZW52aXJvbl9wb25kX2RlZXAgJT4lDQogIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0KSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIERPWSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLCANCiAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICJkcm9wIikgDQoNCiMgQ2FsY3VsYXRlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX3BvbmRfZGVlcCA8LSBkYWlseV90ZW1wX3BvbmRfZGVlcCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6Z3JvdXBfbW9kaWZ5KH5jYWxjX3llYXJseV9yb2xsaW5nX21lYW4oLikpDQoNCiMgSWRlbnRpZnkgdGhlIHdhcm1lc3QgOTEgZGF5cyAoMyBtb250aHMpIG9mIGVhY2ggeWVhcg0KZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfcG9uZF9kZWVwIDwtIGRhaWx5X3RlbXBfcG9uZF9kZWVwICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX3BvbmRfZGVlcCA8LSBwcmVkaWN0KGZpdCwgbmV3bW9kcyA9IGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfZGVlcCRtZWFuX3dlZWtseV90ZW1wKQ0KZGFpbHlfQ1RtYXhfcG9uZF9kZWVwIDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX3BvbmRfZGVlcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQocHJlZGljdGVkX0NUbWF4ID0gcHJlZGljdGlvbl9wb25kX2RlZXAkcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX3BvbmRfZGVlcCRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyBDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfcG9uZF9kZWVwIDwtIGRhaWx5X0NUbWF4X3BvbmRfZGVlcCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0Kc2F2ZVJEUyhkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfZGVlcCwgZmlsZSA9ICJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9kYWlseV92dWxuZXJhYmlsaXR5X2RlZXBfcG9uZF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9wb25kX2RlZXAgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kX2RlZXAgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICApICU+JQ0KICB1bmdyb3VwKCkgDQoNCnBvcF92dWxuZXJhYmlsaXR5X3BvbmRfZGVlcCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9wb25kX2RlZXAgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnBvcF92dWxuZXJhYmlsaXR5X3BvbmRfZGVlcCANCmBgYA0KDQojIyMjICoqQ29tcGFyZSB0aGUgcmVzdWx0cyoqIA0KDQpgYGB7ciwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMn0NCiMgUG9uZCBkZXB0aA0KDQphcXVhdGljX3BhcmFtZXRlcnMgPC0gDQogIGdncGxvdCgpKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfc2hhbGxvdywgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfZGVlcCwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya2JsdWUiKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjYsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGx3ZCA9IDEsIGFscGhhID0gMC43NSkgKyANCiAgeGxpbSgtNSwgNikgKyANCiAgeGxhYigiRGFpbHkgVFNNIikgKyANCiAgeWxhYigiRGVuc2l0eSIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gNDAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDQwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAyMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBzaXplID0gMikpDQoNCmFxdWF0aWNfcGFyYW1ldGVycw0KDQpnZ3NhdmUoYXF1YXRpY19wYXJhbWV0ZXJzLCBmaWxlID0gImZpZy9GaWd1cmVfUzEwLnBuZyIsIGhlaWdodCA9IDEwLCB3aWR0aD0xMiwgZHBpID0gNTAwKQ0KDQpgYGANCg0KDQojIyMgKipBcmJvcmVhbCBjb25kaXRpb25zKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMgKipTdGFuZGFyZCBjb25kaXRpb25zKiogDQoNCiMjIyMjICoqRmluZCB0aGUgbG9jYXRpb24gYW5kIGJvZHkgbWFzcyBvZiB0aGUgc3BlY2llcyBhdCBoaWdoZXN0IHJpc2sqKiANCmBgYHtyfQ0KIyBJZGVudGlmeSB0aGUgbG9jYXRpb24gYW5kIHNwZWNpZXMgb24gd2hpY2ggdG8gZG8gdGhlIHNlbnNpdGl2aXR5IGFuYWx5c2lzIChzcGVjaWVzIG1vc3QgdnVsbmVyYWJsZSB3YXJtaW5nKQ0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCnBvcF9hcmJfY3VycmVudCA8LSBmaWx0ZXIocG9wX2FyYl9jdXJyZW50LCB0aXAubGFiZWwgPT0gIlByaXN0aW1hbnRpcyBvY2tlbmRlbmkiKSAjIE1vc3QgaGlnaC1yaXNrIHNwZWNpZXMgaW4gYXJib3JlYWwgY29uZGl0aW9ucw0KaGlnaF9yaXNrX2FyYiA8LSBwb3BfYXJiX2N1cnJlbnQgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IG92ZXJoZWF0aW5nX2RheXMsIG4gPSAxKQ0KaGlnaF9yaXNrX2FyYiAjIFRoZSBsb2NhdGlvbiAtNzEuNSwgLTQuNSBpcyBhdCBoaWdoZXN0IHJpc2sgZm9yIHRoaXMgc3BlY2llcw0KDQojIEZpbmQgYm9keSBtYXNzIG9mIHRoaXMgYXNzZW1ibGFnZSANCnByZXNlbmNlX2FyYiA8LSByZWFkUkRTKGZpbGUgPSAiUkRhdGEvR2VuZXJhbF9kYXRhL3NwZWNpZXNfY29vcmRpbmF0ZXNfYWRqdXN0ZWRfYXJib3JlYWwucmRzIikNCg0KcHJlc2VuY2VfYm9keV9tYXNzX2FyYiA8LSBtZXJnZShwcmVzZW5jZV9hcmIsIGRwbHlyOjpzZWxlY3QoZGF0YV9mb3JfaW1wLCB0aXAubGFiZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCm1lZGlhbl9ib2R5X21hc3NfYXJiIDwtIHByZXNlbmNlX2JvZHlfbWFzc19hcmIgJT4lDQogIGRwbHlyOjpncm91cF9ieShsb24sIGxhdCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UobWVkaWFuX21hc3MgPSBtZWRpYW4oYm9keV9tYXNzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQptZWRpYW5fYm9keV9tYXNzX2FyYlttZWRpYW5fYm9keV9tYXNzX2FyYiRsb24gPT0gLTcxLjUgJiBtZWRpYW5fYm9keV9tYXNzX2FyYiRsYXQgPT0gLTQuNSxdICMgMi44NSBnDQpgYGANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCiMgU2V0IGNvb3JkaW5hdGVzDQpjb29yZHNfYXJiIDwtIGMoLTcxLjUsIC00LjUpDQoNCiMgUnVuIHRoZSBtaWNyb2NsaW1hdGUgbW9kZWwNCm1pY3JvX2FyYiA8LSAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3Jkc19hcmIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTQsICMgNEMgb2Ygd2FybWluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDIsICMgMiBtZXRlcnMgYWJvdmUgZ3JvdW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kZmFjID0gMC4yLCAjIFJlZHVjZSB3aW5kIHNwZWVkIGJ5IDgwJSBpbiBkZW5zZSB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW1hLkxBSSA9IDAuOSwgIyA5MCUgb2YgdGhlIHJhZGlhdGlvbiBpcyBkaWZmdXNlZCBiZWNhdXNlIG9mIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9OQ0VQX3RpbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ0U6L3BfcG90dGllci9DbGltYXRpY19kYXRhL2RhdGEvY2xpbWF0aWNfZGF0YV9UZXJyYUNsaW1hdGUvZGF0YScpDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCm1pY3JvIDwtIG1pY3JvX2FyYg0KbWljcm8kbWV0b3V0WywgM10gPC0gbWljcm8kbWV0b3V0WywgNF0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMm0pDQptaWNybyRtZXRvdXRbLCA1XSA8LSBtaWNybyRtZXRvdXRbLCA2XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgybSkNCm1pY3JvJG1ldG91dFssIDddIDwtIG1pY3JvJG1ldG91dFssIDhdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDJtKQ0KDQplY3RvX2FyYiA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSAyLjg1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQoNCmVudmlyb25fYXJiIDwtIGFzLmRhdGEuZnJhbWUoZWN0b19hcmIkZW52aXJvbikNCg0KIyBDYWxjdWxhdGUgZGFpbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfYXJiIDwtIGVudmlyb25fYXJiICU+JQ0KICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBET1kpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENhbGN1bGF0ZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9hcmIgPC0gZGFpbHlfdGVtcF9hcmIgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6Omdyb3VwX21vZGlmeSh+Y2FsY195ZWFybHlfcm9sbGluZ19tZWFuKC4pKQ0KDQojIElkZW50aWZ5IHRoZSB3YXJtZXN0IDkxIGRheXMgKDMgbW9udGhzKSBvZiBlYWNoIHllYXINCmRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYiA8LSBkYWlseV90ZW1wX2FyYiAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIoWUVBUiA+IDIwMDUpDQpgYGANCg0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKiANCg0KYGBge3J9DQojIExvYWQgaW1wdXRlZCBkYXRhDQpyZXN1bHRzX2ltcHV0YXRpb24gPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpDQoNCkNUbWF4X2RhdGEgPC0gZHBseXI6OnNlbGVjdChyZXN1bHRzX2ltcHV0YXRpb24sIENUbWF4ID0gZmlsbGVkX21lYW5fVVRMNSwgbG93ZXJDSSA9IGxvd2VyX21lYW5fVVRMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyQ0kgPSB1cHBlcl9tZWFuX1VUTCwgYWNjbGltYXRpb25fdGVtcCwgdGlwLmxhYmVsLCBpbXB1dGVkKSAgIyBTZWxlY3QgcmVsZXZhbnQgY29sdW1ucw0KDQpvcmlnaW5hbF9kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZCA9PSAibm8iKSAgIyBPcmlnaW5hbCBleHBlcmltZW50YWwgZGF0YQ0KaW1wdXRlZF9kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoQ1RtYXhfZGF0YSwgaW1wdXRlZCA9PSAieWVzIikgICMgSW1wdXRlZCBkYXRhDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIG9mIGVhY2ggb2JzZXJ2YXRpb24NCmltcHV0ZWRfZGF0YSA8LSBpbXB1dGVkX2RhdGEgJT4lDQogIG11dGF0ZShzZSA9ICh1cHBlckNJIC0gQ1RtYXgpLzEuOTYpDQoNCiMgR3JvdXAgZGF0YSBieSBzcGVjaWVzDQpzcGVjaWVzX2RhdGEgPC0gaW1wdXRlZF9kYXRhICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwpDQoNCiMgRmlsdGVyIHRvIHRoZSBzcGVjaWVzIG9mIGludGVyZXN0IA0Kc3BlY2llc19kYXRhX3Bfb2NrIDwtIHNwZWNpZXNfZGF0YSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIodGlwLmxhYmVsPT0iUHJpc3RpbWFudGlzIG9ja2VuZGVuaSIpDQoNCiMgR2VuZXJhdGUgcHJlZGljdGlvbnMNCmZpdF9wX29jayA8LSBtZXRhZm9yOjpybWEoeWkgPSBDVG1heCwgc2VpID0gc2UsIG1vZCA9IH5hY2NsaW1hdGlvbl90ZW1wLCBkYXRhID0gc3BlY2llc19kYXRhX3Bfb2NrKQ0KcHJlZGljdGlvbl9hcmIgPC0gcHJlZGljdChmaXRfcF9vY2ssIG5ld21vZHMgPSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmIkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X2FyYiA8LSBkcGx5cjo6c2VsZWN0KChjYmluZChkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fYXJiJHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9hcmIkc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQoNCiMgQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzDQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmIgPC0gZGFpbHlfQ1RtYXhfYXJiICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiLCBmaWxlID0gIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9kYWlseV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X2FyYiA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYiAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmIgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfYXJiICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmIgDQoNCmBgYA0KDQojIyMjICoqTG93ZXIgcGxhbnQgaGVpZ2h0KiogDQoNCiMjIyMjICoqUnVuIHRoZSBiaW9waHlzaWNhbCBtb2RlbCoqIA0KYGBge3J9DQojIFJ1biB0aGUgbWljcm9jbGltYXRlIG1vZGVsDQptaWNyb19hcmJfc2hvcnQgPC0gIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHNfYXJiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuNSwgIyAwLjUgbSBhYm92ZSBncm91bmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjIsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgODAlIGluIGRlbnNlIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbWEuTEFJID0gMC45LCAjIDkwJSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gMS41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyYV9zb3VyY2UgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9jbGltYXRpY19kYXRhX1RlcnJhQ2xpbWF0ZS9kYXRhJykNCg0KDQojIFJ1biB0aGUgZWN0b3RoZXJtIG1vZGVsDQptaWNybyA8LSBtaWNyb19hcmJfc2hvcnQNCm1pY3JvJG1ldG91dFssIDNdIDwtIG1pY3JvJG1ldG91dFssIDRdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDUwIGNtKQ0KbWljcm8kbWV0b3V0WywgNV0gPC0gbWljcm8kbWV0b3V0WywgNl0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoNTAgY20pDQptaWNybyRtZXRvdXRbLCA3XSA8LSBtaWNybyRtZXRvdXRbLCA4XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICg1MCBjbSkNCg0KZWN0b19hcmJfc2hvcnQgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gMi44NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl9zaG9ydCA8LSBhcy5kYXRhLmZyYW1lKGVjdG9fYXJiX3Nob3J0JGVudmlyb24pDQoNCiMgQ2FsY3VsYXRlIGRhaWx5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2FyYl9zaG9ydCA8LSBlbnZpcm9uX2FyYl9zaG9ydCAlPiUNCiAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgRE9ZKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksIA0KICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfYXJiX3Nob3J0IDwtIGRhaWx5X3RlbXBfYXJiX3Nob3J0ICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfc2hvcnQgPC0gZGFpbHlfdGVtcF9hcmJfc2hvcnQgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKFlFQVIgPiAyMDA1KQ0KDQpgYGANCg0KIyMjIyMgKipDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5KioNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbl9hcmJfc2hvcnQgPC0gcHJlZGljdChmaXRfcF9vY2ssIG5ld21vZHMgPSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfc2hvcnQkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X2FyYl9zaG9ydCA8LSBkcGx5cjo6c2VsZWN0KChjYmluZChkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfc2hvcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fYXJiX3Nob3J0JHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9hcmJfc2hvcnQkc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQoNCiMgQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzDQpkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9zaG9ydCA8LSBkYWlseV9DVG1heF9hcmJfc2hvcnQgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfc2hvcnQsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfc2hvcnRfaGVpZ2h0X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X2FyYl9zaG9ydCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9zaG9ydCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX3Nob3J0IDwtIHBvcF92dWxuZXJhYmlsaXR5X2FyYl9zaG9ydCAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX3Nob3J0IA0KDQpgYGANCg0KDQojIyMjICoqSGlnaGVyIHBsYW50IGhlaWdodCoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KIyBSdW4gdGhlIG1pY3JvY2xpbWF0ZSBtb2RlbA0KbWljcm9fYXJiX3RhbGwgPC0gIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHNfYXJiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDUsICMgNSBtZXRlcnMgYWJvdmUgZ3JvdW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmh5dCA9IDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjIsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgODAlIGluIGRlbnNlIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltYS5MQUkgPSAwLjksICMgOTAlIG9mIHRoZSByYWRpYXRpb24gaXMgZGlmZnVzZWQgYmVjYXVzZSBvZiB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL2NsaW1hdGljX2RhdGFfVGVycmFDbGltYXRlL2RhdGEnKQ0KDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCm1pY3JvIDwtIG1pY3JvX2FyYl90YWxsDQptaWNybyRtZXRvdXRbLCAzXSA8LSBtaWNybyRtZXRvdXRbLCA0XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICg1IG0pDQptaWNybyRtZXRvdXRbLCA1XSA8LSBtaWNybyRtZXRvdXRbLCA2XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICg1IG0pDQptaWNybyRtZXRvdXRbLCA3XSA8LSBtaWNybyRtZXRvdXRbLCA4XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICg1IG0pDQoNCmVjdG9fYXJiX3RhbGwgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSAyLjg1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl90YWxsIDwtIGFzLmRhdGEuZnJhbWUoZWN0b19hcmJfdGFsbCRlbnZpcm9uKQ0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9hcmJfdGFsbCA8LSBlbnZpcm9uX2FyYl90YWxsICU+JQ0KICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBET1kpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENhbGN1bGF0ZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9hcmJfdGFsbCA8LSBkYWlseV90ZW1wX2FyYl90YWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfdGFsbCA8LSBkYWlseV90ZW1wX2FyYl90YWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX2FyYl90YWxsIDwtIHByZWRpY3QoZml0X3Bfb2NrLCBuZXdtb2RzID0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJiX3RhbGwkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X2FyYl90YWxsIDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYl90YWxsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZChwcmVkaWN0ZWRfQ1RtYXggPSBwcmVkaWN0aW9uX2FyYl90YWxsJHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9hcmJfdGFsbCRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyBDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX3RhbGwgPC0gZGFpbHlfQ1RtYXhfYXJiX3RhbGwgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfdGFsbCwgZmlsZSA9ICJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF90YWxsX2hlaWdodF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfdGFsbCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl90YWxsICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCnBvcF92dWxuZXJhYmlsaXR5X2FyYl90YWxsIDwtIHBvcF92dWxuZXJhYmlsaXR5X2FyYl90YWxsICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfdGFsbCANCmBgYA0KDQojIyMjICoqNzUlIHJhZGlhdGlvbiBkaWZmdXNlZCoqIA0KDQojIyMjIyAqKlJ1biB0aGUgYmlvcGh5c2ljYWwgbW9kZWwqKiANCmBgYHtyfQ0KIyBSdW4gdGhlIG1pY3JvY2xpbWF0ZSBtb2RlbA0KbWljcm9fYXJiX21pZF9kaWZmIDwtICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzX2FyYiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZGZhYyA9IDAuMiwgIyBSZWR1Y2Ugd2luZCBzcGVlZCBieSA4MCUgaW4gZGVuc2UgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltYS5MQUkgPSAwLjc1LCAjIDc1JSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gMS41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyYV9zb3VyY2UgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9jbGltYXRpY19kYXRhX1RlcnJhQ2xpbWF0ZS9kYXRhJykNCg0KDQojIFJ1biB0aGUgZWN0b3RoZXJtIG1vZGVsDQptaWNybyA8LSBtaWNyb19hcmJfbWlkX2RpZmYNCm1pY3JvJG1ldG91dFssIDNdIDwtIG1pY3JvJG1ldG91dFssIDRdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCm1pY3JvJG1ldG91dFssIDVdIDwtIG1pY3JvJG1ldG91dFssIDZdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCm1pY3JvJG1ldG91dFssIDddIDwtIG1pY3JvJG1ldG91dFssIDhdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCg0KZWN0b19hcmJfbWlkX2RpZmYgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gMi44NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl9taWRfZGlmZiA8LSBhcy5kYXRhLmZyYW1lKGVjdG9fYXJiX21pZF9kaWZmJGVudmlyb24pDQoNCiMgQ2FsY3VsYXRlIGRhaWx5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2FyYl9taWRfZGlmZiA8LSBlbnZpcm9uX2FyYl9taWRfZGlmZiAlPiUNCiAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgRE9ZKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksIA0KICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfYXJiX21pZF9kaWZmIDwtIGRhaWx5X3RlbXBfYXJiX21pZF9kaWZmICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfbWlkX2RpZmYgPC0gZGFpbHlfdGVtcF9hcmJfbWlkX2RpZmYgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKFlFQVIgPiAyMDA1KQ0KDQpgYGANCg0KIyMjIyMgKipDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5KioNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbl9hcmJfbWlkX2RpZmYgPC0gcHJlZGljdChmaXRfcF9vY2ssIG5ld21vZHMgPSBkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfbWlkX2RpZmYkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X2FyYl9taWRfZGlmZiA8LSBkcGx5cjo6c2VsZWN0KChjYmluZChkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfbWlkX2RpZmYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fYXJiX21pZF9kaWZmJHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9hcmJfbWlkX2RpZmYkc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQoNCiMgQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzDQpkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9taWRfZGlmZiA8LSBkYWlseV9DVG1heF9hcmJfbWlkX2RpZmYgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCnNhdmVSRFMoZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfbWlkX2RpZmYsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVkX3NvbGFyX2RpZmZfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyBBZ2dyZWdhdGUgdG8gbG9jYWwgc3BlY2llcyBvY2N1cnJlbmNlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX21pZF9kaWZmIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX21pZF9kaWZmICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbWlkX2RpZmYgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX21pZF9kaWZmICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX21pZF9kaWZmIA0KYGBgDQoNCg0KIyMjIyAqKjUwJSByYWRpYXRpb24gZGlmZnVzZWQqKiANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCiMgUnVuIHRoZSBtaWNyb2NsaW1hdGUgbW9kZWwNCm1pY3JvX2FyYl9sb3dfZGlmZiA8LSAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3Jkc19hcmIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNyaHl0ID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjIsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgODAlIGluIGRlbnNlIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbWEuTEFJID0gMC41LCAjIDUwJSBvZiB0aGUgcmFkaWF0aW9uIGlzIGRpZmZ1c2VkIGJlY2F1c2Ugb2YgdmVnZXRhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gMS41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyYV9zb3VyY2UgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9jbGltYXRpY19kYXRhX1RlcnJhQ2xpbWF0ZS9kYXRhJykNCg0KDQojIFJ1biB0aGUgZWN0b3RoZXJtIG1vZGVsDQptaWNybyA8LSBtaWNyb19hcmJfbG93X2RpZmYNCm1pY3JvJG1ldG91dFssIDNdIDwtIG1pY3JvJG1ldG91dFssIDRdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCm1pY3JvJG1ldG91dFssIDVdIDwtIG1pY3JvJG1ldG91dFssIDZdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCm1pY3JvJG1ldG91dFssIDddIDwtIG1pY3JvJG1ldG91dFssIDhdICMgTWFrZSB0aGUgbG9jYWwgaGVpZ2h0IGVxdWFsIHRvIHJlZmVyZW5jZSBoZWlnaHQgKDIgbSkNCg0KZWN0b19hcmJfbG93X2RpZmYgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gMi44NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl9sb3dfZGlmZiA8LSBhcy5kYXRhLmZyYW1lKGVjdG9fYXJiX2xvd19kaWZmJGVudmlyb24pDQoNCiMgQ2FsY3VsYXRlIGRhaWx5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2FyYl9sb3dfZGlmZiA8LSBlbnZpcm9uX2FyYl9sb3dfZGlmZiAlPiUNCiAgZHBseXI6Om11dGF0ZShZRUFSID0gWUVBUiArIDIwMDQpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUiwgRE9ZKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtYXhfdGVtcCA9IG1heChUQyksIA0KICAgICAgICAgICAgICAgICAgIG1lYW5fdGVtcCA9IG1lYW4oVEMpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KIyBDYWxjdWxhdGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfYXJiX2xvd19kaWZmIDwtIGRhaWx5X3RlbXBfYXJiX2xvd19kaWZmICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfbG93X2RpZmYgPC0gZGFpbHlfdGVtcF9hcmJfbG93X2RpZmYgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSKSAlPiUNCiAgZHBseXI6OnRvcF9uKDkxLCBtYXhfdGVtcCkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKFlFQVIgPiAyMDA1KQ0KYGBgDQoNCiMjIyMjICoqQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSoqDQpgYGB7cn0NCiMgR2VuZXJhdGUgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25fYXJiX2xvd19kaWZmIDwtIHByZWRpY3QoZml0X3Bfb2NrLCBuZXdtb2RzID0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJiX2xvd19kaWZmJG1lYW5fd2Vla2x5X3RlbXApDQpkYWlseV9DVG1heF9hcmJfbG93X2RpZmYgPC0gZHBseXI6OnNlbGVjdCgoY2JpbmQoZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJiX2xvd19kaWZmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHByZWRpY3RlZF9DVG1heCA9IHByZWRpY3Rpb25fYXJiX2xvd19kaWZmJHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX2FyYl9sb3dfZGlmZiRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyBDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX2xvd19kaWZmIDwtIGRhaWx5X0NUbWF4X2FyYl9sb3dfZGlmZiAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX2xvd19kaWZmLCBmaWxlID0gIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9kYWlseV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX2xvd19zb2xhcl9kaWZmX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X2FyYl9sb3dfZGlmZiA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9sb3dfZGlmZiAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbG93X2RpZmYgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX2xvd19kaWZmICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbG93X2RpZmYgDQpgYGANCg0KIyMjIyAqKjEwMCUgd2luZCByZWR1Y3Rpb24qKiANCg0KIyMjIyMgKipSdW4gdGhlIGJpb3BoeXNpY2FsIG1vZGVsKiogDQpgYGB7cn0NCiMgUnVuIHRoZSBtaWNyb2NsaW1hdGUgbW9kZWwNCm1pY3JvX2FyYl9ub193aW5kIDwtICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzX2FyYiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kZmFjID0gMCwgIyBSZWR1Y2Ugd2luZCBzcGVlZCBieSAxMDAlIGluIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltYS5MQUkgPSAwLjksICMgOTAlIG9mIHRoZSByYWRpYXRpb24gaXMgZGlmZnVzZWQgYmVjYXVzZSBvZiB2ZWdldGF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJhX3NvdXJjZSA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL2NsaW1hdGljX2RhdGFfVGVycmFDbGltYXRlL2RhdGEnKQ0KDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCm1pY3JvIDwtIG1pY3JvX2FyYl9ub193aW5kDQptaWNybyRtZXRvdXRbLCAzXSA8LSBtaWNybyRtZXRvdXRbLCA0XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgyIG0pDQptaWNybyRtZXRvdXRbLCA1XSA8LSBtaWNybyRtZXRvdXRbLCA2XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgyIG0pDQptaWNybyRtZXRvdXRbLCA3XSA8LSBtaWNybyRtZXRvdXRbLCA4XSAjIE1ha2UgdGhlIGxvY2FsIGhlaWdodCBlcXVhbCB0byByZWZlcmVuY2UgaGVpZ2h0ICgyIG0pDQoNCmVjdG9fYXJiX25vX3dpbmQgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSAyLjg1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl9ub193aW5kIDwtIGFzLmRhdGEuZnJhbWUoZWN0b19hcmJfbm9fd2luZCRlbnZpcm9uKQ0KDQojIENhbGN1bGF0ZSBkYWlseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9hcmJfbm9fd2luZCA8LSBlbnZpcm9uX2FyYl9ub193aW5kICU+JQ0KICBkcGx5cjo6bXV0YXRlKFlFQVIgPSBZRUFSICsgMjAwNCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShZRUFSLCBET1kpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG1heF90ZW1wID0gbWF4KFRDKSwgDQogICAgICAgICAgICAgICAgICAgbWVhbl90ZW1wID0gbWVhbihUQyksIC5ncm91cHMgPSAiZHJvcCIpIA0KDQojIENhbGN1bGF0ZSBtZWFuIHdlZWtseSB0ZW1wZXJhdHVyZQ0KZGFpbHlfdGVtcF9hcmJfbm9fd2luZCA8LSBkYWlseV90ZW1wX2FyYl9ub193aW5kICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfbm9fd2luZCA8LSBkYWlseV90ZW1wX2FyYl9ub193aW5kICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjp0b3Bfbig5MSwgbWF4X3RlbXApICU+JSANCiAgZHBseXI6OmZpbHRlcihZRUFSID4gMjAwNSkNCmBgYA0KDQojIyMjIyAqKkNhbGN1bGF0ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkqKg0KYGBge3J9DQojIEdlbmVyYXRlIHByZWRpY3Rpb25zDQpwcmVkaWN0aW9uX2FyYl9ub193aW5kIDwtIHByZWRpY3QoZml0X3Bfb2NrLCBuZXdtb2RzID0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJiX25vX3dpbmQkbWVhbl93ZWVrbHlfdGVtcCkNCmRhaWx5X0NUbWF4X2FyYl9ub193aW5kIDwtIGRwbHlyOjpzZWxlY3QoKGNiaW5kKGRhaWx5X3RlbXBfd2FybWVzdF9kYXlzX2FyYl9ub193aW5kLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZChwcmVkaWN0ZWRfQ1RtYXggPSBwcmVkaWN0aW9uX2FyYl9ub193aW5kJHByZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX0NUbWF4X3NlID0gcHJlZGljdGlvbl9hcmJfbm9fd2luZCRzZSkpKSwgLW1heF93ZWVrbHlfdGVtcCkNCg0KIyBDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX25vX3dpbmQ8LSBkYWlseV9DVG1heF9hcmJfbm9fd2luZCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQpzYXZlUkRTKGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX25vX3dpbmQsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbm9fd2luZF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIEFnZ3JlZ2F0ZSB0byBsb2NhbCBzcGVjaWVzIG9jY3VycmVuY2VzDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbm9fd2luZCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9ub193aW5kICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbm9fd2luZCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9hcmJfbm9fd2luZCAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfYXJiX25vX3dpbmQgDQpgYGANCg0KDQojIyMjICoqNTAlIHdpbmQgcmVkdWN0aW9uKiogDQoNCiMjIyMjICoqUnVuIHRoZSBiaW9waHlzaWNhbCBtb2RlbCoqIA0KYGBge3J9DQojIFJ1biB0aGUgbWljcm9jbGltYXRlIG1vZGVsDQptaWNyb19hcmJfaGlnaF93aW5kIDwtICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzX2FyYiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRmYWMgPSAwLjUsICMgUmVkdWNlIHdpbmQgc3BlZWQgYnkgNTAlIGluIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW1hLkxBSSA9IDAuOSwgIyA5MCUgb2YgdGhlIHJhZGlhdGlvbiBpcyBkaWZmdXNlZCBiZWNhdXNlIG9mIHZlZ2V0YXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSAxLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVycmFfc291cmNlID0gJ0U6L3BfcG90dGllci9DbGltYXRpY19kYXRhL2RhdGEvY2xpbWF0aWNfZGF0YV9UZXJyYUNsaW1hdGUvZGF0YScpDQoNCg0KIyBSdW4gdGhlIGVjdG90aGVybSBtb2RlbA0KbWljcm8gPC0gbWljcm9fYXJiX2hpZ2hfd2luZA0KbWljcm8kbWV0b3V0WywgM10gPC0gbWljcm8kbWV0b3V0WywgNF0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMiBtKQ0KbWljcm8kbWV0b3V0WywgNV0gPC0gbWljcm8kbWV0b3V0WywgNl0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMiBtKQ0KbWljcm8kbWV0b3V0WywgN10gPC0gbWljcm8kbWV0b3V0WywgOF0gIyBNYWtlIHRoZSBsb2NhbCBoZWlnaHQgZXF1YWwgdG8gcmVmZXJlbmNlIGhlaWdodCAoMiBtKQ0KDQplY3RvX2FyYl9oaWdoX3dpbmQgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IDIuODUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KDQplbnZpcm9uX2FyYl9oaWdoX3dpbmQgPC0gYXMuZGF0YS5mcmFtZShlY3RvX2FyYl9oaWdoX3dpbmQkZW52aXJvbikNCg0KIyBDYWxjdWxhdGUgZGFpbHkgdGVtcGVyYXR1cmUNCmRhaWx5X3RlbXBfYXJiX2hpZ2hfd2luZCA8LSBlbnZpcm9uX2FyYl9oaWdoX3dpbmQgJT4lDQogIGRwbHlyOjptdXRhdGUoWUVBUiA9IFlFQVIgKyAyMDA0KSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIsIERPWSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWF4X3RlbXAgPSBtYXgoVEMpLCANCiAgICAgICAgICAgICAgICAgICBtZWFuX3RlbXAgPSBtZWFuKFRDKSwgLmdyb3VwcyA9ICJkcm9wIikgDQoNCiMgQ2FsY3VsYXRlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlDQpkYWlseV90ZW1wX2FyYl9oaWdoX3dpbmQgPC0gZGFpbHlfdGVtcF9hcmJfaGlnaF93aW5kICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoWUVBUikgJT4lDQogIGRwbHlyOjpncm91cF9tb2RpZnkofmNhbGNfeWVhcmx5X3JvbGxpbmdfbWVhbiguKSkNCg0KIyBJZGVudGlmeSB0aGUgd2FybWVzdCA5MSBkYXlzICgzIG1vbnRocykgb2YgZWFjaCB5ZWFyDQpkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfaGlnaF93aW5kIDwtIGRhaWx5X3RlbXBfYXJiX2hpZ2hfd2luZCAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KFlFQVIpICU+JQ0KICBkcGx5cjo6dG9wX24oOTEsIG1heF90ZW1wKSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIoWUVBUiA+IDIwMDUpDQpgYGANCg0KIyMjIyMgKipDYWxjdWxhdGUgY2xpbWF0ZSB2dWxuZXJhYmlsaXR5KioNCmBgYHtyfQ0KIyBHZW5lcmF0ZSBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbl9hcmJfaGlnaF93aW5kIDwtIHByZWRpY3QoZml0X3Bfb2NrLCBuZXdtb2RzID0gZGFpbHlfdGVtcF93YXJtZXN0X2RheXNfYXJiX2hpZ2hfd2luZCRtZWFuX3dlZWtseV90ZW1wKQ0KZGFpbHlfQ1RtYXhfYXJiX2hpZ2hfd2luZCA8LSBkcGx5cjo6c2VsZWN0KChjYmluZChkYWlseV90ZW1wX3dhcm1lc3RfZGF5c19hcmJfaGlnaF93aW5kLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZChwcmVkaWN0ZWRfQ1RtYXggPSBwcmVkaWN0aW9uX2FyYl9oaWdoX3dpbmQkcHJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfQ1RtYXhfc2UgPSBwcmVkaWN0aW9uX2FyYl9oaWdoX3dpbmQkc2UpKSksIC1tYXhfd2Vla2x5X3RlbXApDQoNCiMgQ2FsY3VsYXRlIGNsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzDQpkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQgPC0gZGFpbHlfQ1RtYXhfYXJiX2hpZ2hfd2luZCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0Kc2F2ZVJEUyhkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQsIGZpbGUgPSAiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2RhaWx5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfaGlnaF93aW5kX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMgQWdncmVnYXRlIHRvIGxvY2FsIHNwZWNpZXMgb2NjdXJyZW5jZXMNCnBvcF92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfaGlnaF93aW5kICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9hcmJfaGlnaF93aW5kIDwtIHBvcF92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnBvcF92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQgDQpgYGANCg0KIyMjIyAqKkNvbXBhcmUgdGhlIHJlc3VsdHMqKiANCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMzAsIGZpZy53aWR0aCA9IDE4fQ0KIyBQbGFudCBoZWlnaHQNCnBsYW50X2hlaWdodCA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX3RhbGwsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gImRhcmtncmVlbiIpICsgDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfc2hvcnQsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmIsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC01LCA1KSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJEZW5zaXR5IikgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KIyBEaWZmdXNpb24gb2Ygc29sYXIgcmFkaWF0aW9uDQpwbGFudF9zb2xhcl9yYWQgPC0gDQogIGdncGxvdCgpKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9sb3dfZGlmZiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiI2NjNDc3OCIpICsgDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfbWlkX2RpZmYsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiM3ZTAzYTgiKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmIsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC01LCA1KSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJEZW5zaXR5IikgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KIyBXaW5kIHJlZHVjdGlvbg0KcGxhbnRfd2luZF9yZWR1YyA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX25vX3dpbmQsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiNCQTQ5NTMiKSArIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX2hpZ2hfd2luZCwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiIzQ5QkFBRSIpICsNCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC42LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsd2QgPSAxLCBhbHBoYSA9IDAuNzUpICsgDQogIHhsaW0oLTUsIDUpICsgDQogIHhsYWIoIkRhaWx5IFRTTSIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDQwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQphcmJvcmVhbF9wYXJhbWV0ZXJzIDwtIHBsYW50X2hlaWdodCAvIHBsYW50X3NvbGFyX3JhZCAvIHBsYW50X3dpbmRfcmVkdWMNCg0KYXJib3JlYWxfcGFyYW1ldGVycw0KDQpnZ3NhdmUoYXJib3JlYWxfcGFyYW1ldGVycywgZmlsZSA9ICJmaWcvRmlndXJlX1MxMS5wbmciLCBoZWlnaHQgPSAzMCwgd2lkdGg9MTgsIGRwaSA9IDUwMCkNCg0KYGBgDQoNCiMjICoqVmFsaWRhdGlvbiBvZiBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBlc3RpbWF0ZXMqKiANCg0KSGVyZSwgd2UgcHJvdmlkZSBhIGJyaWVmIHZhbGlkYXRpb24gb2Ygb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmVzIHByZWRpY3RlZCBmcm9tIG91ciBtb2RlbHMuIEFzIGEgY2FzZSBpbiBwb2ludCwgd2UgY29tcGFyZSBvdXIgZXN0aW1hdGVzIHRvIGZpZWxkIGJvZHkgdGVtcGVyYXR1cmVzIG9mIDExIHNwZWNpZXMgb2YgZnJvZ3MgaW4gTWV4aWNvICh0YWtlbiBmcm9tIExhcmEtUmVzZW5kaXogJiBMdWphLCAyMDE4LCBSZXZpc3RhIE1leGljYW5hIGRlIEJpb2RpdmVyc2lkYWQpDQoNCiMjIyAqKlByZXBhcmUgZGF0YSoqIA0KYGBge3J9DQojIEdldCBUYiBtZWFzdXJlbWVudHMgZnJvbSB0aGUgc3R1ZHkgKFRhYmxlIDEpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIFNwZWNpZXMgPSBjKCJBZ2FseWNobmlzIGRhY25pY29sb3IiLCAiQ3JhdWdhc3RvciBvY2NpZGVudGFsaXMiLCAiSHlsYSBleGltaWEiLCAiSW5jaWxpdXMgbWF6YXRsYW5lbnNpcyIsIA0KICAgICAgICAgICAgICAiTGVwdG9kYWN0eWx1cyBtZWxhbm9ub3R1cyIsICJMaXRob2JhdGVzIGNhdGVzYmVpYW51cyIsICJMaXRob2JhdGVzIGZvcnJlcmkiLCAiUGxlY3Ryb2h5bGEgYmlzdGluY3RhIiwNCiAgICAgICAgICAgICAgIlNtaWxpc2NhIGJhdWRpbmlpIiwgIlNtaWxpc2NhIGZvZGllbnMiLCAiVGxhbG9jb2h5bGEgc21pdGhpaSIpLA0KICBUYiA9IGMoIjIxLjfCsTEuOTcgKDE3LjItMjkuOCkiLCAiMjAuNcKxMi4yOSAoMTguMi0yNS44KSIsICIyMi44wrExLjEyICgyMC40LTI0KSIsICIyNC40wrExLjQ4ICgyMi41LTI2LjYpIiwgDQogICAgICAgICAiMjQuNsKxMy4zNiAoMjEuNS0zMy4zKSIsICIyNC44wrEwLjg4ICgyMy40LTI1LjgpIiwgIjIzLjnCsTEuODQgKDIwLjktMjcuNykiLCAiMjIuNcKxMy4wOSAoMTUuMS0yOS45KSIsDQogICAgICAgICAiMjMuNMKxMi4yOSAoMjAuOC0yOSkiLCAiMjIuN8KxMS4wNyAoMjEuNC0yNCkiLCAiMjEuM8KxMi4wMyAoMTQuNS0yNS43KSIpDQopDQoNCiMgRXh0cmFjdCB0aGUgbWVhbiBhbmQgcmFuZ2Ugb2YgYm9keSB0ZW1wZXJhdHVyZXMNCmRhdGEkVGJfbWVhbiA8LSBhcy5udW1lcmljKHN1YigiXFzCsS4qIiwgIiIsIGRhdGEkVGIpKQ0KZGF0YSRUYl9yYW5nZSA8LSBnc3ViKCIuKlxcKCguKilcXCkuKiIsICJcXDEiLCBkYXRhJFRiKQ0KcmFuZ2Vfc3BsaXQgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGEkVGJfcmFuZ2UpLCAiLSIpDQpkYXRhJE1pbiA8LSBzYXBwbHkocmFuZ2Vfc3BsaXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsxXSkpDQpkYXRhJE1heCA8LSBzYXBwbHkocmFuZ2Vfc3BsaXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFsyXSkpDQoNCg0KZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6c2VsZWN0KFNwZWNpZXMsIE1lYW4gPSBUYl9tZWFuLCBNaW4sIE1heCkNCg0KIyBTcGVjaWVzIGF0IHRoZSBmaXJzdCBzaXRlDQpkYXRhX1RlcGljIDwtIGZpbHRlcihkYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIkFnYWx5Y2huaXMgZGFjbmljb2xvciIgfA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJIeWxhIGV4aW1pYSIgfA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJJbmNpbGl1cyBtYXphdGxhbmVuc2lzIiB8DQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIkxlcHRvZGFjdHlsdXMgbWVsYW5vbm90dXMiIHwgDQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIkxpdGhvYmF0ZXMgY2F0ZXNiZWlhbnVzIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJMaXRob2JhdGVzIGZvcnJlcmkiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiU21pbGlzY2EgYmF1ZGluaWkiIHwgDQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIlNtaWxpc2NhIGZvZGllbnMiIHwgDQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIlRsYWxvY29oeWxhIHNtaXRoaWkiKSANCg0KIyBTcGVjaWVzIGF0IHRoZSBzZWNvbmQgc2l0ZQ0KZGF0YV9DRCAgICA8LSBmaWx0ZXIoZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJDcmF1Z2FzdG9yIG9jY2lkZW50YWxpcyIgfA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJMaXRob2JhdGVzIGZvcnJlcmkiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiUGxlY3Ryb2h5bGEgYmlzdGluY3RhIiB8DQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIlNtaWxpc2NhIGJhdWRpbmlpIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJUbGFsb2NvaHlsYSBzbWl0aGlpIiApIA0KYGBgDQoNCioqKiAqKkNvbXBhcmUgYm9keSB0ZW1wZXJhdHVyZXMgYXQgdGhlIGZpcnN0IHNpdGUqKiANCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQ0KIyBTZXQgcGFyYW1ldGVycw0KZHN0YXJ0IDwtICIwMS8wMS8yMDEzIg0KZGZpbmlzaCA8LSAiMzEvMTIvMjAxNSIgIyBXaWRlIHJhbmdlIG9mIGRhdGVzLCBidXQgd2lsbCBvbmx5IHNlbGVjdCBKdW5lIHRvIE9jdG9iZXIgMjAxMy8yMDE1DQpjb29yZHM8LSBjKC0xMDQuODUsIDIxLjQ4KSAjIFRlcGljLCBtb3N0IHNhbXBsZWQgc2l0ZQ0KDQojIFJ1biB0aGUgbWljcm9jbGltYXRlIG1vZGVsDQptaWNyb192YWxpZCA8LSAgTmljaGVNYXBSOjptaWNyb19uY2VwKGxvYyA9IGNvb3JkcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFydCA9IGRzdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaW5pc2ggPSBkZmluaXNoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW89MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2hhZGU9ODUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNoYWRlPTkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc3JoeXQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIgPSAxLjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsID0gJ0U6L3BfcG90dGllci9DbGltYXRpY19kYXRhL2RhdGEvTkNFUF90aW1lJykNCg0KbWljcm8gPC0gbWljcm9fdmFsaWQNCg0KIyBGaW5kIGJvZHkgbWFzcyBvZiB0aGUgY2xvc2VzdCBsb2NhdGlvbg0KcHJlc2VuY2UgPC0gcmVhZFJEUyhmaWxlID0gIlJEYXRhL0dlbmVyYWxfZGF0YS9zcGVjaWVzX2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUyhmaWxlID0gIlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQpwcmVzZW5jZV9ib2R5X21hc3MgPC0gbWVyZ2UocHJlc2VuY2UsIGRwbHlyOjpzZWxlY3QoZGF0YV9mb3JfaW1wLCB0aXAubGFiZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV9tYXNzKSwgYnkgPSAidGlwLmxhYmVsIikNCm1lZGlhbl9ib2R5X21hc3MgPC0gcHJlc2VuY2VfYm9keV9tYXNzICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKG1lZGlhbl9tYXNzID0gbWVkaWFuKGJvZHlfbWFzcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGRwbHlyOjp1bmdyb3VwKCkNCg0KbWVkaWFuX2JvZHlfbWFzc1ttZWRpYW5fYm9keV9tYXNzJGxvbiA9PSAtMTA0LjUgJiBtZWRpYW5fYm9keV9tYXNzJGxhdCA9PSAyMS41LF0gIyAyNC45IGcNCg0KIyBSdW4gdGhlIGVjdG90aGVybSBtb2RlbA0KZWN0byA8LSBOaWNoZU1hcFI6OmVjdG90aGVybShsaXZlPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3dfZyA9IDI0LjksICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3dldCA9IDgwKQ0KZW52aXJvbiA8LSBhcy5kYXRhLmZyYW1lKGVjdG8kZW52aXJvbikNCg0KZW52aXJvbl8yMDEzIDwtIGZpbHRlcihlbnZpcm9uLCANCiAgICAgICAgICAgICAgICAgICAgICBZRUFSID09ICIxIiAmIA0KICAgICAgICAgICAgICAgICAgICAgIERBWSA+IDE1MiAmIERBWSA8IDMwNCAmIA0KICAgICAgICAgICAgICAgICAgICAgIChUSU1FIDwgMiB8IFRJTUUgPiAxNykpICMgSnVuZSB0byBPY3RvYmVyIDIwMTM7IGJldHdlZW4gMThoIGFuZCAwOjMwaA0KZW52aXJvbl8yMDE1IDwtIGZpbHRlcihlbnZpcm9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgWUVBUiA9PSAiMyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICBEQVkgPiA4ODIgJiBEQVkgPCAxMDM0ICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgKFRJTUUgPCAyIHwgVElNRSA+IDE3KSkgIyBKdW5lIHRvIE9jdG9iZXIgMjAxNTsgYmV0d2VlbiAxOGggYW5kIDA6MzBoDQoNCnN0YXRzXzIwMTMgPC0gZW52aXJvbl8yMDEzICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTWluID0gbWluKFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNZWFuID0gbWVhbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBzZCA9IHNkKFRDLCBuYS5ybSA9IFRSVUUpDQogICkNCg0Kc3RhdHNfMjAxNSA8LSBlbnZpcm9uXzIwMTUgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBNaW4gPSBtaW4oVEMsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lYW4gPSBtZWFuKFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkID0gc2QoVEMsIG5hLnJtID0gVFJVRSkNCiAgKQ0KDQpzdGF0c18yMDEzDQpzdGF0c18yMDE1ICMgVmlydHVhbGx5IHRoZSBzYW1lDQoNCnhfbGltaXRzIDwtIGMoMC45OSwgMS4wMSkgIyBEZWZpbmUgcGxvdCBtYXJnaW5zDQoNCiMgU3BhY2Ugb3V0IHNwZWNpZXMgZXF1YWxseQ0KbnVtX3BvaW50cyA8LSBucm93KGRhdGFfVGVwaWMpDQp4X3ZhbHVlcyA8LSBzZXEoZnJvbSA9IDAuOTkxLCB0byA9IDEuMDA5LCBsZW5ndGgub3V0ID0gbnVtX3BvaW50cykNCg0KVGJfaml0dGVyZWQgPC0gZGF0YV9UZXBpYyAlPiUNCiAgbXV0YXRlKHhfaml0dGVyID0geF92YWx1ZXMpDQoNCmZpcnN0X3NpdGUgPC0gDQpnZ3Bsb3QoKSArDQogIGdlb21fcmVjdChkYXRhID0gc3RhdHNfMjAxMywgICAjIEFkZCBhICJyaWJib24iIHRvIHJlcHJlc2VudCB0aGUgcmFuZ2UgDQogICAgICAgICAgICBhZXMoeG1pbiA9IHhfbGltaXRzWzFdLCB4bWF4ID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgIHltaW4gPSBNaW4sIHltYXggPSBNYXgpLA0KICAgICAgICAgICAgZmlsbCA9ICJncmV5ODAiLCBhbHBoYSA9IDAuNSkgKw0KICAgIGdlb21fc2VnbWVudChkYXRhID0gc3RhdHNfMjAxMywgICAjIEFkZCBhIGxpbmUgZm9yIHRoZSBNZWFuDQogICAgICAgICAgICAgICAgIGFlcyh4ID0geF9saW1pdHNbMV0sIHhlbmQgPSB4X2xpbWl0c1syXSwgDQogICAgICAgICAgICAgICAgICAgICB5ID0gTWVhbiwgeWVuZCA9IE1lYW4pLCANCiAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS41KSAgKw0KICAgIGdlb21fcmVjdChkYXRhID0gc3RhdHNfMjAxMywgICAgIyBBZGQgU0QgZm9yIHRoZSBNZWFuDQogICAgICAgICAgICAgIGFlcyh4bWluID0geF9saW1pdHNbMV0sIHhtYXggPSB4X2xpbWl0c1syXSwgDQogICAgICAgICAgICAgICAgICB5bWluID0gTWVhbiAtIHNkLCB5bWF4ID0gTWVhbiArIHNkKSwNCiAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JleTYwIiwgYWxwaGEgPSAwLjUpICsNCiAgICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IFRiX2ppdHRlcmVkLCAgICMgQWRkIGJvZHkgdGVtcGVyYXR1cmUgZGF0YQ0KICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHhfaml0dGVyLCB5ID0gTWVhbiwgDQogICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gTWluLCB5bWF4ID0gTWF4LCBjb2wgPSBTcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwgbGluZXdpZHRoID0gMS4zKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICIiLCBsYWJlbHMgPSBOVUxMLCBicmVha3MgPSBOVUxMKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJUZW1wZXJhdHVyZSAowrBDKSIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDMwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBmYWNlID0gIml0YWxpYyIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQoNCmZpcnN0X3NpdGUNCmBgYA0KDQoqKiogKipDb21wYXJlIGJvZHkgdGVtcGVyYXR1cmVzIGF0IHRoZSBzZWNvbmQgc2l0ZSoqIA0KYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTB9DQpjb29yZHMgPC0gYygtMTA1LjAzLCAyMS40NSkgIyBFbCAgQ3VhcmVudGXDsW8NCg0KIyBSdW4gdGhlIG1pY3JvY2xpbWF0ZSBtb2RlbA0KbWljcm9fdmFsaWRfQ0QgPC0gIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNyaHl0ID0gMC4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gMS41LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScpDQoNCm1pY3JvIDwtIG1pY3JvX3ZhbGlkX0NEDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCmVjdG9fQ0QgPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSAyNC45LCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCmVudmlyb25fQ0QgPC0gYXMuZGF0YS5mcmFtZShlY3RvJGVudmlyb24pDQoNCmVudmlyb25fMjAxM19DRCA8LSBmaWx0ZXIoZW52aXJvbl9DRCwgDQogICAgICAgICAgICAgICAgICAgICAgIFlFQVIgPT0gIjEiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgREFZID4gMTUyICYgREFZIDwgMzA0ICYgDQogICAgICAgICAgICAgICAgICAgICAgKFRJTUUgPCAyIHwgVElNRSA+IDE3KSkgIyBKdW5lIHRvIE9jdG9iZXIgMjAxMw0KZW52aXJvbl8yMDE1X0NEIDwtIGZpbHRlcihlbnZpcm9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgWUVBUiA9PSAiMyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICBEQVkgPiA4ODIgJiBEQVkgPCAxMDM0ICYgDQogICAgICAgICAgICAgICAgICAgICAgKFRJTUUgPCAyIHwgVElNRSA+IDE3KSkgIyBKdW5lIHRvIE9jdG9iZXIgMjAxNQ0KDQpzdGF0c18yMDEzX0NEIDwtIGVudmlyb25fMjAxM19DRCAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIE1pbiA9IG1pbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNYXggPSBtYXgoVEMsIG5hLnJtID0gVFJVRSksDQogICAgTWVhbiA9IG1lYW4oVEMsIG5hLnJtID0gVFJVRSksDQogICAgc2QgPSBzZChUQywgbmEucm0gPSBUUlVFKQ0KICApDQoNCnN0YXRzXzIwMTVfQ0QgPC0gZW52aXJvbl8yMDE1X0NEICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTWluID0gbWluKFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNZWFuID0gbWVhbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBzZCA9IHNkKFRDLCBuYS5ybSA9IFRSVUUpDQogICkNCg0Kc3RhdHNfMjAxM19DRA0Kc3RhdHNfMjAxNV9DRCAjIFZpcnR1YWxseSB0aGUgc2FtZQ0KDQoNCiMgU3BhY2Ugb3V0IHNwZWNpZXMgZXF1YWxseQ0KbnVtX3BvaW50cyA8LSBucm93KGRhdGFfQ0QpDQp4X3ZhbHVlcyA8LSBzZXEoZnJvbSA9IDAuOTkxLCB0byA9IDEuMDA5LCBsZW5ndGgub3V0ID0gbnVtX3BvaW50cykNCg0KVGJfaml0dGVyZWRfQ0QgPC0gZGF0YV9DRCAlPiUNCiAgbXV0YXRlKHhfaml0dGVyID0geF92YWx1ZXMpDQoNCnNlY29uZF9zaXRlIDwtIA0KZ2dwbG90KCkgKw0KICAgDQogIGdlb21fcmVjdChkYXRhID0gc3RhdHNfMjAxM19DRCwgIyBBZGQgYSAicmliYm9uIiB0byByZXByZXNlbnQgdGhlIHJhbmdlDQogICAgICAgICAgICBhZXMoeG1pbiA9IHhfbGltaXRzWzFdLCB4bWF4ID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgIHltaW4gPSBNaW4sIHltYXggPSBNYXgpLA0KICAgICAgICAgICAgZmlsbCA9ICJncmV5ODAiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3NlZ21lbnQoZGF0YSA9IHN0YXRzXzIwMTNfQ0QsICMgQWRkIGEgbGluZSBmb3IgdGhlIE1lYW4NCiAgICAgICAgICAgICAgIGFlcyh4ID0geF9saW1pdHNbMV0sIHhlbmQgPSB4X2xpbWl0c1syXSwgDQogICAgICAgICAgICAgICAgICAgeSA9IE1lYW4sIHllbmQgPSBNZWFuKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS41KSArDQogIGdlb21fcmVjdChkYXRhID0gc3RhdHNfMjAxM19DRCwgIyBBZGQgU0QgZm9yIHRoZSBNZWFuDQogICAgICAgICAgICBhZXMoeG1pbiA9IHhfbGltaXRzWzFdLCB4bWF4ID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgIHltaW4gPSBNZWFuIC0gc2QsIHltYXggPSBNZWFuICsgc2QpLA0KICAgICAgICAgICAgZmlsbCA9ICJncmV5NjAiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IFRiX2ppdHRlcmVkX0NELCAjIEFkZCBib2R5IHRlbXBlcmF0dXJlDQogICAgICAgICAgICAgICAgICBhZXMoeCA9IHhfaml0dGVyLCB5ID0gTWVhbiwgDQogICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IE1pbiwgeW1heCA9IE1heCwgDQogICAgICAgICAgICAgICAgICAgICAgY29sID0gU3BlY2llcyksDQogICAgICAgICAgICAgICAgICBzaXplID0gMS41LCBsaW5ld2lkdGggPSAxLjMpICsgDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIiIsIGxhYmVscyA9IE5VTEwsIGJyZWFrcyA9IE5VTEwpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJUZW1wZXJhdHVyZSAowrBDKSIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDMwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBmYWNlID0gIml0YWxpYyIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQpzZWNvbmRfc2l0ZQ0KYGBgDQoNCiMjIyAqKkZpbmFsIHBsb3QqKiANCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aCA9IDExfQ0KdmFsaWRhdGlvbl9PQlQgPC0gZmlyc3Rfc2l0ZSAvIHNlY29uZF9zaXRlDQoNCnZhbGlkYXRpb25fT0JUDQoNCmdnc2F2ZSh2YWxpZGF0aW9uX09CVCwgZmlsZSA9ICJmaWcvRmlndXJlX1MxMi5wbmciLCBoZWlnaHQgPSAxNSwgd2lkdGggPSAxMSwgZHBpID0gNTAwKQ0KYGBgDQoNCg0KIyMgKipBbHRlcm5hdGl2ZSBjbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMgKipBY2NsaW1hdGlvbiB0byB0aGUgbWF4aW11bSB3ZWVrbHkgdGVtcGVyYXR1cmUqKiANCg0KIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3Nfc3Vic3RyYXRlLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3Nfc3Vic3RyYXRlLnBicyoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpkYWlseV9DVG1heF9tYXhfY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBkYWlseV9DVG1heF9tYXhfY3VycmVudCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tYXhfY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tYXhfY3VycmVudCkNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50IDwtIGRhaWx5X2NvbnNlY3V0aXZlX21heF9jdXJyZW50ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tYXhfY3VycmVudCkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50KQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCwgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50KQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQoNCmRhaWx5X0NUbWF4X21heF8yQyA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBkYWlseV9DVG1heF9tYXhfMkMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWF4XzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tYXhfMkMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQyA8LSBkYWlseV9jb25zZWN1dGl2ZV9tYXhfMkMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21heF8yQykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkMucmRzIikNCg0KYGBgDQoNCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQoNCmRhaWx5X0NUbWF4X21heF80QyA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21heF80QyA8LSBkYWlseV9DVG1heF9tYXhfNEMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWF4XzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tYXhfNEMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF80QyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QyA8LSBkYWlseV9jb25zZWN1dGl2ZV9tYXhfNEMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21heF80QykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF80QyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF80QyAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF80QyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF80QykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KYGBgDQoNCg0KIyMjIyMgKipDbGlwIGdyaWQgY2VsbHMgdG8gbWF0Y2ggbGFuZCBtYXNzZXMqKiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9DbGlwcGluZ19ncmlkX2NlbGxzX3N1YnN0cmF0ZS5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL0NsaXBwaW5nX2dyaWRfY2VsbHNfc3Vic3RyYXRlLnBicyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQpjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnRbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRG8gdGhlIHNhbWUgZm9yIHRoZSBmdXR1cmUgY2xpbWF0ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tYXhfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tYXhfZnV0dXJlMkMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTJDKSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21heF9mdXR1cmUyQ1tpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tYXhfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tYXhfZnV0dXJlNEMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTRDKSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21heF9mdXR1cmU0Q1tpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfcG9uZC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19wb25kLnBicyoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQoNCmRhaWx5X0NUbWF4X21heF9jdXJyZW50IDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9kYWlseV9DVG1heF9wb25kX21heF9hY2NfY3VycmVudC5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gZGFpbHlfQ1RtYXhfbWF4X2N1cnJlbnQgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWF4X2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWF4X2N1cnJlbnQpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50KQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCA8LSBkYWlseV9jb25zZWN1dGl2ZV9tYXhfY3VycmVudCAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWF4X2N1cnJlbnQpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50LCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCkNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50KQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCg0KZGFpbHlfQ1RtYXhfbWF4XzJDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gZGFpbHlfQ1RtYXhfbWF4XzJDICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21heF8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWF4XzJDKQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzJDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWF4XzJDICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tYXhfMkMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21heF8yQywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21heF8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKiogDQoNCmBgYHtyLCBldmFsID0gRn0NCg0KZGFpbHlfQ1RtYXhfbWF4XzRDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gZGFpbHlfQ1RtYXhfbWF4XzRDICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21heF80QyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF80QyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWF4XzRDKQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzRDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWF4XzRDICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tYXhfNEMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21heF80QywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21heF80QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF80QykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjIyAqKkNsaXAgZ3JpZCBjZWxscyB0byBtYXRjaCBsYW5kIG1hc3NlcyoqIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9DbGlwcGluZ19ncmlkX2NlbGxzX3BvbmQuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2xpcHBpbmdfZ3JpZF9jZWxsc19wb25kLnBicyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQpjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21heF9hY2NfY3VycmVudC5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tYXhfY3VycmVudCIsICJsYW5kX3BvbHlnb24iLCAiY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIikpDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQogIGxpYnJhcnkoc2YpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoaGlyZXMpDQogIGxpYnJhcnkobHdnZW9tKQ0KICBsaWJyYXJ5KGdnc3BhdGlhbCkNCn0pDQoNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIHBhckxhcHBseShjbCwgMTpucm93KGNvbW11bml0eV9kZl9tYXhfY3VycmVudCksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tYXhfY3VycmVudFtpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tYXhfYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERvIHRoZSBzYW1lIGZvciB0aGUgZnV0dXJlIGNsaW1hdGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIENyZWF0ZSBsYW5kIHBvbHlnb24NCndvcmxkX3NmIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3NmJGdlb21ldHJ5IDwtIHN0X21ha2VfdmFsaWQod29ybGRfc2YkZ2VvbWV0cnkpDQpsYW5kX3BvbHlnb24gPC0gc3RfdW5pb24od29ybGRfc2YpDQoNCg0KIyBMb29wIHRvIGNyZWF0ZSB0aGUgY2xpcHBlZCBncmlkIGNlbGxzIGFuZCBrZWVwIHRoZSBnZW9tZXRyeSBjb2x1bW4NCmNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiA8LSBmdW5jdGlvbihsb24sIGxhdCwgZHggPSAwLjUsIGR5ID0gMC41KSB7DQogIGNlbGxfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QobWF0cml4KGMobG9uIC0gZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgLSBkeSksIG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpKSkNCiAgY2VsbF9zZiA8LSBzdF9zZihnZW9tZXRyeSA9IHN0X3NmYyhjZWxsX3BvbHlnb24pKQ0KICBzdF9zZXRfY3JzKGNlbGxfc2YsIHN0X2NycyhsYW5kX3BvbHlnb24pKQ0KfQ0KDQpjbCA8LSBtYWtlQ2x1c3RlcigxNikNCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImNvbW11bml0eV9kZl9tYXhfZnV0dXJlMkMiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTJDKSwgZnVuY3Rpb24oaSkgew0KICByb3cgPC0gY29tbXVuaXR5X2RmX21heF9mdXR1cmUyQ1tpLCBdDQogIGNlbGxfcG9seWdvbiA8LSBjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24ocm93JGxvbiwgcm93JGxhdCkNCiAgY2xpcHBlZF9jZWxsIDwtIHN0X2ludGVyc2VjdGlvbihjZWxsX3BvbHlnb24sIGxhbmRfcG9seWdvbikNCiAgDQogIGlmIChucm93KGNsaXBwZWRfY2VsbCkgPiAwKSB7ICAjIGNoZWNrIHRoYXQgY2xpcHBlZF9jZWxsIGlzIG5vdCBhbiBlbXB0eSBzZiBkYXRhIGZyYW1lDQogICAgY2xpcHBlZF9jZWxsJGxvbiA8LSByb3ckbG9uDQogICAgY2xpcHBlZF9jZWxsJGxhdCA8LSByb3ckbGF0DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heCA8LSByb3ckY29tbXVuaXR5X0NUbWF4DQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9DVG1heF9zZSA8LSByb3ckY29tbXVuaXR5X0NUbWF4X3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcCA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9tYXhfdGVtcF9zZSA8LSByb3ckY29tbXVuaXR5X21heF90ZW1wX3NlDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU00gPC0gcm93JGNvbW11bml0eV9UU00NCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTV9zZSA8LSByb3ckY29tbXVuaXR5X1RTTV9zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXMgPC0gcm93JG5fc3BlY2llcw0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZw0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZQ0KICAgIGNsaXBwZWRfY2VsbCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdA0KICAgIA0KICAgIHJldHVybihjbGlwcGVkX2NlbGwpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKE5VTEwpDQogIH0NCn0pDQoNCiMgU3RvcCB0aGUgY2x1c3Rlcg0Kc3RvcENsdXN0ZXIoY2wpDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQojIE1lcmdlIHRoZSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscyBpbnRvIGEgc2luZ2xlIHNmIGRhdGEgZnJhbWUNCmNsaXBwZWRfZ3JpZF9jZWxscyA8LSBkby5jYWxsKHJiaW5kLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0Kc2F2ZVJEUyhjbGlwcGVkX2dyaWRfY2VsbHMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCiMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X2RmX21heF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTRDIiwgImxhbmRfcG9seWdvbiIsICJjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24iKSkNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGhoaXJlcykNCiAgbGlicmFyeShsd2dlb20pDQogIGxpYnJhcnkoZ2dzcGF0aWFsKQ0KfSkNCg0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gcGFyTGFwcGx5KGNsLCAxOm5yb3coY29tbXVuaXR5X2RmX21heF9mdXR1cmU0QyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tYXhfZnV0dXJlNENbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21heF9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiAgIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfYXJib3JlYWwuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX2FyYm9yZWFsLnBicyoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqDQoNCmBgYHtyLCBldmFsID0gRn0NCg0KZGFpbHlfQ1RtYXhfbWF4X2N1cnJlbnQgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9kYWlseV9DVG1heF9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIGRhaWx5X0NUbWF4X21heF9jdXJyZW50ICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21heF9jdXJyZW50IDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21heF9jdXJyZW50KQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCkNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWF4X2N1cnJlbnQgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21heF9jdXJyZW50KQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tYXhfY3VycmVudCAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY3VycmVudCwgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50LCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4X2N1cnJlbnQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50LnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50KQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21heF9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KDQpkYWlseV9DVG1heF9tYXhfMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIGRhaWx5X0NUbWF4X21heF8yQyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tYXhfMkMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21heF8yQykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21heF8yQykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21heF8yQyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWF4XzJDKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21heF8yQyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tYXhfMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiANCg0KYGBge3IsIGV2YWwgPSBGfQ0KDQpkYWlseV9DVG1heF9tYXhfNEMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIGRhaWx5X0NUbWF4X21heF80QyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tYXhfNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21heF80QykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21heF80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21heF80QykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21heF80QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWF4XzRDKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21heF80QyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tYXhfNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWF4XzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21heF80QykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tYXhfNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMjICoqQ2xpcCBncmlkIGNlbGxzIHRvIG1hdGNoIGxhbmQgbWFzc2VzKiogDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9DbGlwcGluZ19ncmlkX2NlbGxzX2FyYm9yZWFsLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9DbGlwcGluZ19ncmlkX2NlbGxzX2FyYm9yZWFsLnBicyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQoNCmNvbW11bml0eV9kZl9tYXhfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQiLCAibGFuZF9wb2x5Z29uIiwgImNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbiIpKQ0KY2x1c3RlckV2YWxRKGNsLCB7DQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aGhpcmVzKQ0KICBsaWJyYXJ5KGx3Z2VvbSkNCiAgbGlicmFyeShnZ3NwYXRpYWwpDQp9KQ0KDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBwYXJMYXBwbHkoY2wsIDE6bnJvdyhjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnQpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWF4X2N1cnJlbnRbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERvIHRoZSBzYW1lIGZvciB0aGUgZnV0dXJlIGNsaW1hdGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQ3JlYXRlIGxhbmQgcG9seWdvbg0Kd29ybGRfc2YgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGRfc2YkZ2VvbWV0cnkgPC0gc3RfbWFrZV92YWxpZCh3b3JsZF9zZiRnZW9tZXRyeSkNCmxhbmRfcG9seWdvbiA8LSBzdF91bmlvbih3b3JsZF9zZikNCg0KDQojIExvb3AgdG8gY3JlYXRlIHRoZSBjbGlwcGVkIGdyaWQgY2VsbHMgYW5kIGtlZXAgdGhlIGdlb21ldHJ5IGNvbHVtbg0KY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIDwtIGZ1bmN0aW9uKGxvbiwgbGF0LCBkeCA9IDAuNSwgZHkgPSAwLjUpIHsNCiAgY2VsbF9wb2x5Z29uIDwtIHN0X3BvbHlnb24obGlzdChtYXRyaXgoYyhsb24gLSBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCAtIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiArIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0ICsgZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uIC0gZHgsIGxhdCAtIGR5KSwgbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpKQ0KICBjZWxsX3NmIDwtIHN0X3NmKGdlb21ldHJ5ID0gc3Rfc2ZjKGNlbGxfcG9seWdvbikpDQogIHN0X3NldF9jcnMoY2VsbF9zZiwgc3RfY3JzKGxhbmRfcG9seWdvbikpDQp9DQoNCmNsIDwtIG1ha2VDbHVzdGVyKDE2KQ0KY2x1c3RlckV4cG9ydChjbCwgYygiY29tbXVuaXR5X2RmX21heF9mdXR1cmUyQyIsICJsYW5kX3BvbHlnb24iLCAiY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uIikpDQpjbHVzdGVyRXZhbFEoY2wsIHsNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQogIGxpYnJhcnkoc2YpDQogIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoaGlyZXMpDQogIGxpYnJhcnkobHdnZW9tKQ0KICBsaWJyYXJ5KGdnc3BhdGlhbCkNCn0pDQoNCmNsaXBwZWRfZ3JpZF9jZWxsc19saXN0IDwtIHBhckxhcHBseShjbCwgMTpucm93KGNvbW11bml0eV9kZl9tYXhfZnV0dXJlMkMpLCBmdW5jdGlvbihpKSB7DQogIHJvdyA8LSBjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTJDW2ksIF0NCiAgY2VsbF9wb2x5Z29uIDwtIGNyZWF0ZV9ncmlkX2NlbGxfcG9seWdvbihyb3ckbG9uLCByb3ckbGF0KQ0KICBjbGlwcGVkX2NlbGwgPC0gc3RfaW50ZXJzZWN0aW9uKGNlbGxfcG9seWdvbiwgbGFuZF9wb2x5Z29uKQ0KICANCiAgaWYgKG5yb3coY2xpcHBlZF9jZWxsKSA+IDApIHsgICMgY2hlY2sgdGhhdCBjbGlwcGVkX2NlbGwgaXMgbm90IGFuIGVtcHR5IHNmIGRhdGEgZnJhbWUNCiAgICBjbGlwcGVkX2NlbGwkbG9uIDwtIHJvdyRsb24NCiAgICBjbGlwcGVkX2NlbGwkbGF0IDwtIHJvdyRsYXQNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4IDwtIHJvdyRjb21tdW5pdHlfQ1RtYXgNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X0NUbWF4X3NlIDwtIHJvdyRjb21tdW5pdHlfQ1RtYXhfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXANCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X21heF90ZW1wX3NlIDwtIHJvdyRjb21tdW5pdHlfbWF4X3RlbXBfc2UNCiAgICBjbGlwcGVkX2NlbGwkY29tbXVuaXR5X1RTTSA8LSByb3ckY29tbXVuaXR5X1RTTQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNX3NlIDwtIHJvdyRjb21tdW5pdHlfVFNNX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llcyA8LSByb3ckbl9zcGVjaWVzDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nDQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlDQogICAgY2xpcHBlZF9jZWxsJG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPC0gcm93JG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0DQogICAgDQogICAgcmV0dXJuKGNsaXBwZWRfY2VsbCkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KfSkNCg0KIyBTdG9wIHRoZSBjbHVzdGVyDQpzdG9wQ2x1c3RlcihjbCkNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGNsaXBwZWQgZ3JpZCBjZWxscw0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCiMgTWVyZ2UgdGhlIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzIGludG8gYSBzaW5nbGUgc2YgZGF0YSBmcmFtZQ0KY2xpcHBlZF9ncmlkX2NlbGxzIDwtIGRvLmNhbGwocmJpbmQsIGNsaXBwZWRfZ3JpZF9jZWxsc19saXN0KQ0KDQpzYXZlUkRTKGNsaXBwZWRfZ3JpZF9jZWxscywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV9kZl9tYXhfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBDcmVhdGUgbGFuZCBwb2x5Z29uDQp3b3JsZF9zZiA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9zZiRnZW9tZXRyeSA8LSBzdF9tYWtlX3ZhbGlkKHdvcmxkX3NmJGdlb21ldHJ5KQ0KbGFuZF9wb2x5Z29uIDwtIHN0X3VuaW9uKHdvcmxkX3NmKQ0KDQoNCiMgTG9vcCB0byBjcmVhdGUgdGhlIGNsaXBwZWQgZ3JpZCBjZWxscyBhbmQga2VlcCB0aGUgZ2VvbWV0cnkgY29sdW1uDQpjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24gPC0gZnVuY3Rpb24obG9uLCBsYXQsIGR4ID0gMC41LCBkeSA9IDAuNSkgew0KICBjZWxsX3BvbHlnb24gPC0gc3RfcG9seWdvbihsaXN0KG1hdHJpeChjKGxvbiAtIGR4LCBsYXQgLSBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gKyBkeCwgbGF0IC0gZHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uICsgZHgsIGxhdCArIGR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiAtIGR4LCBsYXQgKyBkeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gLSBkeCwgbGF0IC0gZHkpLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKSkpDQogIGNlbGxfc2YgPC0gc3Rfc2YoZ2VvbWV0cnkgPSBzdF9zZmMoY2VsbF9wb2x5Z29uKSkNCiAgc3Rfc2V0X2NycyhjZWxsX3NmLCBzdF9jcnMobGFuZF9wb2x5Z29uKSkNCn0NCg0KY2wgPC0gbWFrZUNsdXN0ZXIoMTYpDQpjbHVzdGVyRXhwb3J0KGNsLCBjKCJjb21tdW5pdHlfZGZfbWF4X2Z1dHVyZTRDIiwgImxhbmRfcG9seWdvbiIsICJjcmVhdGVfZ3JpZF9jZWxsX3BvbHlnb24iKSkNCmNsdXN0ZXJFdmFsUShjbCwgew0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KICBsaWJyYXJ5KHJuYXR1cmFsZWFydGhoaXJlcykNCiAgbGlicmFyeShsd2dlb20pDQogIGxpYnJhcnkoZ2dzcGF0aWFsKQ0KfSkNCg0KY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QgPC0gcGFyTGFwcGx5KGNsLCAxOm5yb3coY29tbXVuaXR5X2RmX21heF9mdXR1cmU0QyksIGZ1bmN0aW9uKGkpIHsNCiAgcm93IDwtIGNvbW11bml0eV9kZl9tYXhfZnV0dXJlNENbaSwgXQ0KICBjZWxsX3BvbHlnb24gPC0gY3JlYXRlX2dyaWRfY2VsbF9wb2x5Z29uKHJvdyRsb24sIHJvdyRsYXQpDQogIGNsaXBwZWRfY2VsbCA8LSBzdF9pbnRlcnNlY3Rpb24oY2VsbF9wb2x5Z29uLCBsYW5kX3BvbHlnb24pDQogIA0KICBpZiAobnJvdyhjbGlwcGVkX2NlbGwpID4gMCkgeyAgIyBjaGVjayB0aGF0IGNsaXBwZWRfY2VsbCBpcyBub3QgYW4gZW1wdHkgc2YgZGF0YSBmcmFtZQ0KICAgIGNsaXBwZWRfY2VsbCRsb24gPC0gcm93JGxvbg0KICAgIGNsaXBwZWRfY2VsbCRsYXQgPC0gcm93JGxhdA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXggPC0gcm93JGNvbW11bml0eV9DVG1heA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfQ1RtYXhfc2UgPC0gcm93JGNvbW11bml0eV9DVG1heF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXAgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcA0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfbWF4X3RlbXBfc2UgPC0gcm93JGNvbW11bml0eV9tYXhfdGVtcF9zZQ0KICAgIGNsaXBwZWRfY2VsbCRjb21tdW5pdHlfVFNNIDwtIHJvdyRjb21tdW5pdHlfVFNNDQogICAgY2xpcHBlZF9jZWxsJGNvbW11bml0eV9UU01fc2UgPC0gcm93JGNvbW11bml0eV9UU01fc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzIDwtIHJvdyRuX3NwZWNpZXMNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcNCiAgICBjbGlwcGVkX2NlbGwkcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlIDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UNCiAgICBjbGlwcGVkX2NlbGwkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA8LSByb3ckbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdA0KICAgIGNsaXBwZWRfY2VsbCRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IDwtIHJvdyRwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0DQogICAgY2xpcHBlZF9jZWxsJHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPC0gcm93JHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QNCiAgICANCiAgICByZXR1cm4oY2xpcHBlZF9jZWxsKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOVUxMKQ0KICB9DQp9KQ0KDQojIFN0b3AgdGhlIGNsdXN0ZXINCnN0b3BDbHVzdGVyKGNsKQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgY2xpcHBlZCBncmlkIGNlbGxzDQpjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBjbGlwcGVkX2dyaWRfY2VsbHNfbGlzdCkNCg0KIyBNZXJnZSB0aGUgbGlzdCBvZiBjbGlwcGVkIGdyaWQgY2VsbHMgaW50byBhIHNpbmdsZSBzZiBkYXRhIGZyYW1lDQpjbGlwcGVkX2dyaWRfY2VsbHMgPC0gZG8uY2FsbChyYmluZCwgY2xpcHBlZF9ncmlkX2NlbGxzX2xpc3QpDQoNCnNhdmVSRFMoY2xpcHBlZF9ncmlkX2NlbGxzLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyAqKkluY2x1ZGluZyBsYXJnZXIgdW5jZXJ0YWludHkgaW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkqKiANCg0KSGVyZSwgd2UgcmVzdHJpY3QgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzaW11bGF0ZWQgQ1RtYXggZGlzdHJpYnV0aW9ucyB0byB0aGUgImJpb2xvZ2ljYWwgcmFuZ2UiIG9mIENUbWF4LCB0aGF0IGlzLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGFsbCBDVG1heCBlc3RpbWF0ZXMgYWNyb3NzIHNwZWNpZXMgKHMuZS4gcmFuZ2UgZnJvbSBkaWZmZXJlbnQgbWljcm9oYWJpdGF0czogMS44NCAtIDIuMTcpLg0KDQojIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19zdWJzdHJhdGVfbGFyZ2Vfc2UuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19zdWJzdHJhdGVfbGFyZ2Vfc2UucGJzKiogDQoNCiMjIyMjICoqQ3VycmVudCBjbGltYXRlKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvZGFpbHlfQ1RtYXhfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiBvZiBDVG1heCwgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIENUbWF4IGVzdGltYXRlcyBhY3Jvc3Mgc3BlY2llcy4NCiMgTm90ZSB0aGF0IHRoaXMgbWF5IG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGluIHNvbWUgY2FzZXMuDQpjYXBfc2UgPC0gc2QoZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50JHByZWRpY3RlZF9DVG1heCkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCkNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50KQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byB0aGUgImJpb2xvZ2ljYWwgcmFuZ2UiIG9mIENUbWF4LCBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgQ1RtYXggZXN0aW1hdGVzIGFjcm9zcyBzcGVjaWVzLg0KIyBOb3RlIHRoYXQgdGhpcyBtYXkgb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgaW4gc29tZSBjYXNlcy4NCmNhcF9zZSA8LSBzZChkYWlseV9DVG1heF9tZWFuXzJDJHByZWRpY3RlZF9DVG1heCkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tZWFuXzJDKQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQyA8LSBkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzJDICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzJDKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KDQoNCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrNEMpKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpkYWlseV9DVG1heF9tZWFuXzRDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiBvZiBDVG1heCwgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIENUbWF4IGVzdGltYXRlcyBhY3Jvc3Mgc3BlY2llcy4NCiMgTm90ZSB0aGF0IHRoaXMgbWF5IG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGluIHNvbWUgY2FzZXMuDQpjYXBfc2UgPC0gc2QoZGFpbHlfQ1RtYXhfbWVhbl80QyRwcmVkaWN0ZWRfQ1RtYXgpDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfQ1RtYXhfbWVhbl80QyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWVhbl80QykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KYGBgDQoNCg0KIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfcG9uZF9zZW5zaXRpdml0eV9sYXJnZV9zZS5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19wb25kX2xhcmdlX3NlLnBicyoqIA0KDQojIyMjIyAqKkN1cnJlbnQgY2xpbWF0ZSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiBvZiBDVG1heCwgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIENUbWF4IGVzdGltYXRlcyBhY3Jvc3Mgc3BlY2llcy4NCiMgTm90ZSB0aGF0IHRoaXMgbWF5IG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGluIHNvbWUgY2FzZXMuDQpjYXBfc2UgPC0gc2QoZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50JHByZWRpY3RlZF9DVG1heCkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCkNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50KQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9sYXJnZV9zZS5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyLCBldmFsPUZ9DQoNCmRhaWx5X0NUbWF4X21lYW5fMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIHRoZSAiYmlvbG9naWNhbCByYW5nZSIgb2YgQ1RtYXgsIGRlZmluZWQgYXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBDVG1heCBlc3RpbWF0ZXMgYWNyb3NzIHNwZWNpZXMuDQojIE5vdGUgdGhhdCB0aGlzIG1heSBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBpbiBzb21lIGNhc2VzLg0KY2FwX3NlIDwtIHNkKGRhaWx5X0NUbWF4X21lYW5fMkMkcHJlZGljdGVkX0NUbWF4KQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fMkMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCAgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLCANCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIENvbnNlcnZhdGl2ZSBtZXRyaWNzIGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBzdW0ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZV9zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCAgDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpkYWlseV9DVG1heF9tZWFuXzRDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byB0aGUgImJpb2xvZ2ljYWwgcmFuZ2UiIG9mIENUbWF4LCBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgQ1RtYXggZXN0aW1hdGVzIGFjcm9zcyBzcGVjaWVzLg0KIyBOb3RlIHRoYXQgdGhpcyBtYXkgb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgaW4gc29tZSBjYXNlcy4NCmNhcF9zZSA8LSBzZChkYWlseV9DVG1heF9tZWFuXzRDJHByZWRpY3RlZF9DVG1heCkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBkYWlseV9DVG1heF9tZWFuXzRDICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYj4wLjUsIDEsIDApLCAjIENvbnNpZGVyIG92ZXJoZWF0aW5nIGRheSB3aGVuIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5ID4gMC41DQogICAgICAgICBkYWlseV9UU00gPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwgIyBjYWxjdWxhdGUgVFNNDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0KQ0KDQoNCiMgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCmRhaWx5X2NvbnNlY3V0aXZlX21lYW5fNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSAgDQogICMgQXJyYW5nZSBieSBkYXkgYW5kIHllYXINCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCwgWUVBUikgJT4lDQogIGFycmFuZ2UoRE9ZKSAlPiUNCiAgIyBDYWxjdWxhdGUgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KICBtdXRhdGUoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5ID0gew0KICAgIHJsZV9ydW4gPC0gcmxlKG92ZXJoZWF0aW5nX2RheSkNCiAgICByZXAocmxlX3J1biRsZW5ndGhzICogcmxlX3J1biR2YWx1ZXMsIHRpbWVzID0gcmxlX3J1biRsZW5ndGhzKQ0KICB9KQ0KDQojIFNldCBudW1iZXIgb2YgZGF5cw0Kbl9kYXlzIDwtIDkxMA0KDQpybShkYWlseV9DVG1heF9tZWFuXzRDKQ0KDQojIyMjIyMjIyMjIENsaW1hdGUgdnVsbmVyYWJpbGl0eSBtZXRyaWNzIGF0IHRoZSBwb3B1bGF0aW9uLWxldmVsICAjIyMjIyMjIyMjIw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgIyBNZWFuIG1heCB0ZW1wIGFuZCBTRQ0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgICBsb3dlcl9DSSA9IG92ZXJoZWF0aW5nX2RheXMgLSAoMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfc2UpLCANCiAgICBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA9IGlmZWxzZShsb3dlcl9DSSA+IDAsIDEsIDApICMgQ29uc2VydmF0aXZlIGVzdGltYXRlcyB3aGVuIDk1JSBDSSBkb24ndCBvdmVybGFwIHdpdGggemVybw0KICApICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb3dlcl9DSSkNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMpDQoNCiMjIENhbGN1bGF0ZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cw0KY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QyA8LSBkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgDQogIHJlbmFtZShsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpIA0KDQpkaXN0aW5jdF9jb29yZCA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvZGlzdGluY3RfY29vcmRpbmF0ZXNfYWRqdXN0ZWQucmRzIikNCmRpc3RpbmN0X2Nvb3JkIDwtIGRpc3RpbmN0X2Nvb3JkICU+JSANCiAgZHBseXI6OnNlbGVjdChsb25fYWRqID0gbG9uLCBsYXRfYWRqID0gbGF0LCBsb24gPSB4LCBsYXQgPSB5KSAlPiUgDQogIG11dGF0ZShsb25fbGF0ID0gcGFzdGUobG9uX2FkaiwgbGF0X2FkaikpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2FkaiwgLWxhdF9hZGopDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KYGBgDQoNCiMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX2FyYm9yZWFsX2xhcmdlX3NlLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19hcmJvcmVhbF9sYXJnZV9zZS5wYnMqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiBvZiBDVG1heCwgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIENUbWF4IGVzdGltYXRlcyBhY3Jvc3Mgc3BlY2llcy4NCiMgTm90ZSB0aGF0IHRoaXMgbWF5IG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGluIHNvbWUgY2FzZXMuDQpjYXBfc2UgPC0gc2QoZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50JHByZWRpY3RlZF9DVG1heCkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIyMjIyMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrICMjIyMjIyMjIyMNCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCkNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQpybShkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCkNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl9jdXJyZW50ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzID0gbWF4KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSksDQogICAgICAgICAgICAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQpybShkYWlseV9jb25zZWN1dGl2ZV9tZWFuX2N1cnJlbnQpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIGxlZnRfam9pbihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2N1cnJlbnQsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jdXJyZW50KQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50IDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50ICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudCA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICAgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnQpDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50LCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpkYWlseV9DVG1heF9tZWFuXzJDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIHRoZSAiYmlvbG9naWNhbCByYW5nZSIgb2YgQ1RtYXgsIGRlZmluZWQgYXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBDVG1heCBlc3RpbWF0ZXMgYWNyb3NzIHNwZWNpZXMuDQojIE5vdGUgdGhhdCB0aGlzIG1heSBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBpbiBzb21lIGNhc2VzLg0KY2FwX3NlIDwtIHNkKGRhaWx5X0NUbWF4X21lYW5fMkMkcHJlZGljdGVkX0NUbWF4KQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMjIyMjIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgIyMjIyMjIyMjIw0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iPjAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLCAjIGNhbGN1bGF0ZSBUU00NCiAgICAgICAgIGRhaWx5X1RTTV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCg0KIyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgZGF5cyBvZiBvdmVyaGVhdGluZw0KZGFpbHlfY29uc2VjdXRpdmVfbWVhbl8yQyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lICANCiAgIyBBcnJhbmdlIGJ5IGRheSBhbmQgeWVhcg0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0LCBZRUFSKSAlPiUNCiAgYXJyYW5nZShET1kpICU+JQ0KICAjIENhbGN1bGF0ZSBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQogIG11dGF0ZShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkgPSB7DQogICAgcmxlX3J1biA8LSBybGUob3ZlcmhlYXRpbmdfZGF5KQ0KICAgIHJlcChybGVfcnVuJGxlbmd0aHMgKiBybGVfcnVuJHZhbHVlcywgdGltZXMgPSBybGVfcnVuJGxlbmd0aHMpDQogIH0pDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCnJtKGRhaWx5X0NUbWF4X21lYW5fMkMpDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIE1lYW4gbWF4IHRlbXAgYW5kIFNFDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCksICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICAgIGxvd2VyX0NJID0gb3ZlcmhlYXRpbmdfZGF5cyAtICgxLjk2ICogb3ZlcmhlYXRpbmdfZGF5c19zZSksIA0KICAgIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID0gaWZlbHNlKGxvd2VyX0NJID4gMCwgMSwgMCkgIyBDb25zZXJ2YXRpdmUgZXN0aW1hdGVzIHdoZW4gOTUlIENJIGRvbid0IG92ZXJsYXAgd2l0aCB6ZXJvDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvd2VyX0NJKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCnJtKGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0KIyMgQ2FsY3VsYXRlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBvdmVyaGVhdGluZyBkYXlzDQpjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzJDIDwtIGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgPSBtYXgoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5KSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAnZHJvcCcpDQoNCnJtKGRhaWx5X2NvbnNlY3V0aXZlX21lYW5fMkMpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUNCiAgbGVmdF9qb2luKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfMkMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18yQykNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQyAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksICANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksIA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgQ29uc2VydmF0aXZlIG1ldHJpY3MgZm9yIHNlbnNpdGl2aXR5IGFuYWx5c2lzDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IHN1bShvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCksIG1lYW4ob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSksICANCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQykNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fNEMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiBvZiBDVG1heCwgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIENUbWF4IGVzdGltYXRlcyBhY3Jvc3Mgc3BlY2llcy4NCiMgTm90ZSB0aGF0IHRoaXMgbWF5IG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGluIHNvbWUgY2FzZXMuDQpjYXBfc2UgPC0gc2QoZGFpbHlfQ1RtYXhfbWVhbl80QyRwcmVkaWN0ZWRfQ1RtYXgpDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyMjIyMjIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayAjIyMjIyMjIyMjDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfQ1RtYXhfbWVhbl80QyAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUob3ZlcmhlYXRpbmdfcmVzdWx0ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksICMgQXBwbHkgZnVuY3Rpb24NCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2IgPSBvdmVyaGVhdGluZ19yZXN1bHQkcHJvYl9vdmVyaGVhdGluZywgIyByZXRyaWV2ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eQ0KICAgICAgICAgb3ZlcmhlYXRpbmdfZGF5ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2I+MC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsICMgY2FsY3VsYXRlIFRTTQ0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KDQojIE51bWJlciBvZiBjb25zZWN1dGl2ZSBkYXlzIG9mIG92ZXJoZWF0aW5nDQpkYWlseV9jb25zZWN1dGl2ZV9tZWFuXzRDIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgIA0KICAjIEFycmFuZ2UgYnkgZGF5IGFuZCB5ZWFyDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQsIFlFQVIpICU+JQ0KICBhcnJhbmdlKERPWSkgJT4lDQogICMgQ2FsY3VsYXRlIGNvbnNlY3V0aXZlIGRheXMgb2Ygb3ZlcmhlYXRpbmcNCiAgbXV0YXRlKGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheSA9IHsNCiAgICBybGVfcnVuIDwtIHJsZShvdmVyaGVhdGluZ19kYXkpDQogICAgcmVwKHJsZV9ydW4kbGVuZ3RocyAqIHJsZV9ydW4kdmFsdWVzLCB0aW1lcyA9IHJsZV9ydW4kbGVuZ3RocykNCiAgfSkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0Kcm0oZGFpbHlfQ1RtYXhfbWVhbl80QykNCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgICMgTWVhbiBtYXggdGVtcCBhbmQgU0UNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSwgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICAgbG93ZXJfQ0kgPSBvdmVyaGVhdGluZ19kYXlzIC0gKDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3NlKSwgDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBpZmVsc2UobG93ZXJfQ0kgPiAwLCAxLCAwKSAjIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgd2hlbiA5NSUgQ0kgZG9uJ3Qgb3ZlcmxhcCB3aXRoIHplcm8NCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG93ZXJfQ0kpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0Kcm0oZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQojIyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG92ZXJoZWF0aW5nIGRheXMNCmNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfNEMgPC0gZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QyAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IG1heChjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXkpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICdkcm9wJykNCg0Kcm0oZGFpbHlfY29uc2VjdXRpdmVfbWVhbl80QykNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JQ0KICBsZWZ0X2pvaW4oY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c180QywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXzRDKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNEMgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80QyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwgDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBDb25zZXJ2YXRpdmUgbWV0cmljcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0KSwgbWVhbihvdmVyaGVhdGluZ19yaXNrX3N0cmljdCkpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vfc3RyaWN0ID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlza19zdHJpY3QpKSwgIA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fNEMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19sYXJnZV9zZS5yZHMiKQ0KDQpgYGANCg0KDQojIyMgKipSZW1vdmluZyBvdXRsaWVycyBvciBub3QgdGFraW5nIGF2ZXJhZ2VzIGZvciBUU00qKiANCg0KSGVyZSwgd2UgZWl0aGVyIHJlbW92ZSBib2R5IHRlbXBlcmF0dXJlcyBmYWxsaW5nIG91dHNpZGUgdGhlIDUlIGFuZCA5NSUgcGVyY2VudGlsZXMgKGkuZS4sIHBvdGVudGlhbCBvdXRsaWVyIHZhbHVlcyksIGFuZCBhbHNvIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBwcmVkaWN0ZWQgYWNyb3NzIGFsbCBkYXRlcyBmb3Igc2Vuc2l0aXZpdHkgYW5hbHlzZXMuDQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX3N1YnN0cmF0ZV9zZW5zaXRpdml0eV9hbmFseXNpcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX3N1YnN0cmF0ZV9zZW5zaXRpdml0eV9hbmFseXNpcy5wYnMqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3IsIGV2YWw9Rn0NCg0KZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2RhaWx5X0NUbWF4X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQoNCiMgQXNzaWduIGEgbWF4aW11bSBzZSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggdmVyeSBsYXJnZSBlcnJvci4gDQojIFRoaXMgaXMgY2FwcGVkIHRvIGF2b2lkIGxhcmdlIHVuY2VydGFpbnR5IHRvIG92ZXJlc3RpbWF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzDQojIEEgU0Qgb2YgMSBzaW11bGF0ZXMgdmFsdWVzIHdpdGhpbiB+MyBkZWdyZWVzIG9mIHRoZSBtZWFuIENUbWF4DQpjYXBfc2UgPC0gMQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSBhbmQgU0UNCmNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA8LSBmdW5jdGlvbihwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApIHsNCiAgY2FwcGVkX3NlIDwtIG1pbihwcmVkaWN0ZWRfQ1RtYXhfc2UsIGNhcF9zZSkgICMgVGFrZSB0aGUgcHJlZGljdGVkIFNFIGlmIHVuZGVyIHRoZSBjYXBwZWQgU0UNCiAgcHJvYl9vdmVyaGVhdGluZyA8LSBwbm9ybShtYXhfdGVtcCwgbWVhbiA9IHByZWRpY3RlZF9DVG1heCwgc2QgPSBjYXBwZWRfc2UpICMgUHJvYmFiaWxpdHkgdGhhdCBtYXggdGVtcCBleGNlZWRzIENUbWF4IGRpc3RyaWJ1dGlvbg0KICByZXR1cm4obGlzdChwcm9iX292ZXJoZWF0aW5nID0gcHJvYl9vdmVyaGVhdGluZykpDQp9DQoNCiMgQ2FsY3VsYXRlIDUlIGFuZCA5NSUgcGVyY2VudGlsZSBmb3IgZWFjaCBncm91cA0KZGFpbHlfcGVyY2VudGlsZXNfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50ICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKHA1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgcDk1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpKQ0KDQojIEZpbHRlciBkYXRhIHdpdGhpbiA1JSB0byA5NSUgcGVyY2VudGlsZSByYW5nZQ0KZGFpbHlfZmlsdGVyZWRfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50ICU+JQ0KICBpbm5lcl9qb2luKGRhaWx5X3BlcmNlbnRpbGVzX21lYW5fY3VycmVudF9zZW5zLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPj0gcDVfbWF4X3RlbXAgJiBtYXhfdGVtcCA8PSBwOTVfbWF4X3RlbXApDQoNCiMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrIA0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV9maWx0ZXJlZF9tZWFuX2N1cnJlbnRfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYiA+IDAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhkYWlseV9UU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8ocHJlZGljdGVkX0NUbWF4X3NlXjIpKSAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBDVG1heCA9IHN1bShwcmVkaWN0ZWRfQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cyksIA0KICAgIENUbWF4X3NlID0gc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpLA0KICAgIG1lYW5fbWF4X3RlbXAgPSBtZWFuKG1heF90ZW1wKSwNCiAgICBtYXhfdGVtcF9zZSA9IHNkKG1heF90ZW1wKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBUU00gPSBzdW0oZGFpbHlfVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cyksIA0KICAgIFRTTV9zZSA9IHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSwNCiAgICAjIENvbWJpbmUgZGFpbHkgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBwb3B1bGF0aW9uDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPSBtZWFuKG92ZXJoZWF0aW5nX3Byb2IpLA0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X3NlID0gc3FydChvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoDQogICAgb3ZlcmhlYXRpbmdfZGF5cyA9IG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5LA0KICAgIG92ZXJoZWF0aW5nX2RheXNfc2UgPSBzcXJ0KG5fZGF5cyAqIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLCAjIFNFIGluIG92ZXJoZWF0aW5nIGRheXMNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gaWZlbHNlKG92ZXJoZWF0aW5nX2RheXMgPj0gMSwgMSwgMCkgIyBPdmVyaGVhdGluZyByaXNrIHdoZW4gb3ZlcmhlYXRpbmcgZGF5cyA+PSAxDQogICkgJT4lDQogIHVuZ3JvdXAoKSANCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgOTV0aCBwZXJjZW50aWxlIG9mIG1heF90ZW1wIGZvciBlYWNoIHBvcHVsYXRpb24NCnBvcF9kYXRhXzk1X21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fY3VycmVudF9zZW5zICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3RlbXAsIG4gPSAxKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIG1heGltdW0gdGVtcGVyYXR1cmUgDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2Vuc185NSA8LSBwb3BfZGF0YV85NV9tZWFuX2N1cnJlbnRfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShUU01fOTUgPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwNCiAgICAgICAgIFRTTV85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIENUbWF4Xzk1ID0gcHJlZGljdGVkX0NUbWF4LA0KICAgICAgICAgQ1RtYXhfOTVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBtYXhfdGVtcF85NSA9IG1heF90ZW1wLA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1ID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPSBvdmVyaGVhdGluZ19yZXN1bHRfOTUkcHJvYl9vdmVyaGVhdGluZywgDQogICAgICAgICBvdmVyaGVhdGluZ19yaXNrXzk1ID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1ID4gMC41LCAxLCAwKSkgJT4lICAgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdF85NSkgDQoNCg0KIyBDb21iaW5lIGRhdGEgZnJhbWVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnNfOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV85NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4Xzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcF85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUpLCANCiAgICAgICAgICAgIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0Kcm0ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnNfOTUpDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbiAobWluaW11bSBUU00pDQpwb3BfZGF0YV9leHRyZW1lX21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fY3VycmVudCAgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgZmlsdGVyKG1heF90ZW1wID09IG1heChtYXhfdGVtcCkpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXhpbXVtIHRlbXBlcmF0dXJlIChtb3N0IGV4dHJlbWUgVFNNKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfZGF0YV9leHRyZW1lX21lYW5fY3VycmVudF9zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIENUbWF4X2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSA9IG1heF90ZW1wLA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID0gb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUkcHJvYl9vdmVyaGVhdGluZywgDQogICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSkgDQoNCiMgSm9pbiBkYXRhc2V0cw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl9jdXJyZW50X3NlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAsIGRpc3RpbmN0X2Nvb3JkLCBieT0ibG9uX2xhdCIpDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpLA0KICAgICAgICAgVFNNX2V4dHJlbWVfd2VpZ2h0cyA9IDEvKFRTTV9leHRyZW1lX3NlXjIpLA0KICAgICAgICAgVFNNXzk1X3dlaWdodHMgPSAxLyhUU01fOTVfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWUpLCBzdW0oVFNNX2V4dHJlbWUgKiBUU01fZXh0cmVtZV93ZWlnaHRzKS9zdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZV9zZSksIHNxcnQoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpXjIpIC0gKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNXzk1ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1KSwgc3VtKFRTTV85NSAqIFRTTV85NV93ZWlnaHRzKS9zdW0oVFNNXzk1X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV85NV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NV9zZSksIHNxcnQoc3VtKFRTTV85NV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fOTVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV85NV93ZWlnaHRzXjIpKSkpKSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQoNCmBgYA0KDQojIyMjIyAqKkZ1dHVyZSBjbGltYXRlICgrMkMpKiogDQoNCmBgYHtyLCBldmFsPUZ9DQpkYWlseV9DVG1heF9tZWFuXzJDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyBDYWxjdWxhdGUgNSUgYW5kIDk1JSBwZXJjZW50aWxlIGZvciBlYWNoIGdyb3VwDQpkYWlseV9wZXJjZW50aWxlc19tZWFuXzJDX3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl8yQyAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShwNV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgIHA5NV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSkNCg0KIyBGaWx0ZXIgZGF0YSB3aXRoaW4gNSUgdG8gOTUlIHBlcmNlbnRpbGUgcmFuZ2UNCmRhaWx5X2ZpbHRlcmVkX21lYW5fMkNfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICU+JQ0KICBpbm5lcl9qb2luKGRhaWx5X3BlcmNlbnRpbGVzX21lYW5fMkNfc2VucywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKSAlPiUNCiAgZmlsdGVyKG1heF90ZW1wID49IHA1X21heF90ZW1wICYgbWF4X3RlbXAgPD0gcDk1X21heF90ZW1wKQ0KDQojIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayANCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fMkNfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYiA+IDAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQojIENyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIDk1dGggcGVyY2VudGlsZSBvZiBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uDQpwb3BfZGF0YV85NV9tZWFuXzJDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl8yQ19zZW5zICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3RlbXAsIG4gPSAxKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIG1heGltdW0gdGVtcGVyYXR1cmUgDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnNfOTUgPC0gcG9wX2RhdGFfOTVfbWVhbl8yQ19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV85NSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNXzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfOTUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wXzk1ID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfOTUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF85NSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1KSANCg0KDQojIENvbWJpbmUgZGF0YSBmcmFtZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2Vuc185NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnNfOTUpDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbiAobWluaW11bSBUU00pDQpwb3BfZGF0YV9leHRyZW1lX21lYW5fMkNfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPT0gbWF4KG1heF90ZW1wKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBDYWxjdWxhdGUgVFNNIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgKG1vc3QgZXh0cmVtZSBUU00pDQpwb3BfdnVsbmVyYWJpbGl0eV9leHRyZW1lX21lYW5fMkNfc2VucyA8LSBwb3BfZGF0YV9leHRyZW1lX21lYW5fMkNfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShUU01fZXh0cmVtZSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNX2V4dHJlbWVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4LA0KICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lJHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza19leHRyZW1lID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUpIA0KDQojIEpvaW4gZGF0YXNldHMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl8yQ19zZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lX3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4X2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcF9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUpLCANCiAgICAgICAgICAgIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpLA0KICAgICAgICAgVFNNX2V4dHJlbWVfd2VpZ2h0cyA9IDEvKFRTTV9leHRyZW1lX3NlXjIpLA0KICAgICAgICAgVFNNXzk1X3dlaWdodHMgPSAxLyhUU01fOTVfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWUpLCBzdW0oVFNNX2V4dHJlbWUgKiBUU01fZXh0cmVtZV93ZWlnaHRzKS9zdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZV9zZSksIHNxcnQoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpXjIpIC0gKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNXzk1ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1KSwgc3VtKFRTTV85NSAqIFRTTV85NV93ZWlnaHRzKS9zdW0oVFNNXzk1X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV85NV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NV9zZSksIHNxcnQoc3VtKFRTTV85NV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fOTVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV85NV93ZWlnaHRzXjIpKSkpKSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpkYWlseV9DVG1heF9tZWFuXzRDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9kYWlseV9DVG1heF9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyBDYWxjdWxhdGUgNSUgYW5kIDk1JSBwZXJjZW50aWxlIGZvciBlYWNoIGdyb3VwDQpkYWlseV9wZXJjZW50aWxlc19tZWFuXzRDX3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl80QyAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShwNV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgIHA5NV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSkNCg0KIyBGaWx0ZXIgZGF0YSB3aXRoaW4gNSUgdG8gOTUlIHBlcmNlbnRpbGUgcmFuZ2UNCmRhaWx5X2ZpbHRlcmVkX21lYW5fNENfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzRDICU+JQ0KICBpbm5lcl9qb2luKGRhaWx5X3BlcmNlbnRpbGVzX21lYW5fNENfc2VucywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKSAlPiUNCiAgZmlsdGVyKG1heF90ZW1wID49IHA1X21heF90ZW1wICYgbWF4X3RlbXAgPD0gcDk1X21heF90ZW1wKQ0KDQojIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayANCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fNENfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYiA+IDAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgOTV0aCBwZXJjZW50aWxlIG9mIG1heF90ZW1wIGZvciBlYWNoIHBvcHVsYXRpb24NCnBvcF9kYXRhXzk1X21lYW5fNENfc2VucyA8LSBkYWlseV9maWx0ZXJlZF9tZWFuXzRDX3NlbnMgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfdGVtcCwgbiA9IDEpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgbWF4aW11bSB0ZW1wZXJhdHVyZSANCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2Vuc185NSA8LSBwb3BfZGF0YV85NV9tZWFuXzRDX3NlbnMgJT4lIA0KICByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoVFNNXzk1ID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fOTVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF85NSA9IHByZWRpY3RlZF9DVG1heCwNCiAgICAgICAgIENUbWF4Xzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfOTUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF85NSA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1ID0gb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1JHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfOTUpIA0KDQoNCiMgQ29tYmluZSBkYXRhIGZyYW1lcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4Xzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrXzk1KSwgDQogICAgICAgICAgICBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2Vuc185NSkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uIChtaW5pbXVtIFRTTSkNCnBvcF9kYXRhX2V4dHJlbWVfbWVhbl80Q19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fNEMgICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIGZpbHRlcihtYXhfdGVtcCA9PSBtYXgobWF4X3RlbXApKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSB0ZW1wZXJhdHVyZSAobW9zdCBleHRyZW1lIFRTTSkNCnBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl80Q19zZW5zIDwtIHBvcF9kYXRhX2V4dHJlbWVfbWVhbl80Q19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIENUbWF4X2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSA9IG1heF90ZW1wLA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID0gb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUkcHJvYl9vdmVyaGVhdGluZywgDQogICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSkgDQoNCiMgSm9pbiBkYXRhc2V0cw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuXzRDX3NlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMiksDQogICAgICAgICBUU01fZXh0cmVtZV93ZWlnaHRzID0gMS8oVFNNX2V4dHJlbWVfc2VeMiksDQogICAgICAgICBUU01fOTVfd2VpZ2h0cyA9IDEvKFRTTV85NV9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIFRTTSBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWUgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZSksIHN1bShUU01fZXh0cmVtZSAqIFRTTV9leHRyZW1lX3dlaWdodHMpL3N1bShUU01fZXh0cmVtZV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fZXh0cmVtZV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9leHRyZW1lX3NlKSwgc3FydChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV9leHRyZW1lX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIFRTTSBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIDk1dGggcGVyY2VudGlsZSBib2R5IHRlbXBlcmF0dXJlIA0KICAgIGNvbW11bml0eV9UU01fOTUgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fOTUpLCBzdW0oVFNNXzk1ICogVFNNXzk1X3dlaWdodHMpL3N1bShUU01fOTVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNXzk1X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1X3NlKSwgc3FydChzdW0oVFNNXzk1X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV85NV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNXzk1X3dlaWdodHNeMikpKSkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCmBgYA0KDQoNCiMjIyMgKipQb25kIG9yIHdldGxhbmQqKiAgey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX3BvbmRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvQ2FsY3VsYXRpbmdfY2xpbWF0ZV92dWxuZXJhYmlsaXR5X21ldHJpY3NfcG9uZF9zZW5zaXRpdml0eV9hbmFseXNpcy5wYnMqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3IsIGV2YWw9Rn0NCg0KZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50IDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9kYWlseV9DVG1heF9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyBDYWxjdWxhdGUgNSUgYW5kIDk1JSBwZXJjZW50aWxlIGZvciBlYWNoIGdyb3VwDQpkYWlseV9wZXJjZW50aWxlc19tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UocDVfbWF4X3RlbXAgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICBwOTVfbWF4X3RlbXAgPSBxdWFudGlsZShtYXhfdGVtcCwgMC45NSkpDQoNCiMgRmlsdGVyIGRhdGEgd2l0aGluIDUlIHRvIDk1JSBwZXJjZW50aWxlIHJhbmdlDQpkYWlseV9maWx0ZXJlZF9tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgJT4lDQogIGlubmVyX2pvaW4oZGFpbHlfcGVyY2VudGlsZXNfbWVhbl9jdXJyZW50X3NlbnMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkgJT4lDQogIGZpbHRlcihtYXhfdGVtcCA+PSBwNV9tYXhfdGVtcCAmIG1heF90ZW1wIDw9IHA5NV9tYXhfdGVtcCkNCg0KIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fY3VycmVudF9zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iID4gMC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbg0KcG9wX2RhdGFfOTVfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfdGVtcCwgbiA9IDEpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgbWF4aW11bSB0ZW1wZXJhdHVyZSANCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zXzk1IDwtIHBvcF9kYXRhXzk1X21lYW5fY3VycmVudF9zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV85NSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNXzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfOTUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wXzk1ID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfOTUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF85NSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1KSANCg0KDQojIENvbWJpbmUgZGF0YSBmcmFtZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICU+JQ0KICBsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdChwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2Vuc185NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2Vuc185NSkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uIChtaW5pbXVtIFRTTSkNCnBvcF9kYXRhX2V4dHJlbWVfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50ICAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPT0gbWF4KG1heF90ZW1wKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBDYWxjdWxhdGUgVFNNIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgKG1vc3QgZXh0cmVtZSBUU00pDQpwb3BfdnVsbmVyYWJpbGl0eV9leHRyZW1lX21lYW5fY3VycmVudF9zZW5zIDwtIHBvcF9kYXRhX2V4dHJlbWVfbWVhbl9jdXJyZW50X3NlbnMgJT4lIA0KICByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoVFNNX2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwNCiAgICAgICAgIFRTTV9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfZXh0cmVtZSA9IHByZWRpY3RlZF9DVG1heCwNCiAgICAgICAgIENUbWF4X2V4dHJlbWVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBtYXhfdGVtcF9leHRyZW1lID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUgPSBvdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID4gMC41LCAxLCAwKSkgJT4lICAgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lKSANCg0KIyBKb2luIGRhdGFzZXRzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuX2N1cnJlbnRfc2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4X2V4dHJlbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lX3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza19leHRyZW1lKSwgDQogICAgICAgICAgICBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSwNCiAgICAgICAgIFRTTV9leHRyZW1lX3dlaWdodHMgPSAxLyhUU01fZXh0cmVtZV9zZV4yKSwNCiAgICAgICAgIFRTTV85NV93ZWlnaHRzID0gMS8oVFNNXzk1X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSBib2R5IHRlbXBlcmF0dXJlIA0KICAgIGNvbW11bml0eV9UU01fZXh0cmVtZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9leHRyZW1lKSwgc3VtKFRTTV9leHRyZW1lICogVFNNX2V4dHJlbWVfd2VpZ2h0cykvc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWVfc2UpLCBzcXJ0KHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV85NSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NSksIHN1bShUU01fOTUgKiBUU01fOTVfd2VpZ2h0cykvc3VtKFRTTV85NV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fOTVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fOTVfc2UpLCBzcXJ0KHN1bShUU01fOTVfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNXzk1X3dlaWdodHMpXjIpIC0gKHN1bShUU01fOTVfd2VpZ2h0c14yKSkpKSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpkYWlseV9DVG1heF9tZWFuXzJDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIENhbGN1bGF0ZSA1JSBhbmQgOTUlIHBlcmNlbnRpbGUgZm9yIGVhY2ggZ3JvdXANCmRhaWx5X3BlcmNlbnRpbGVzX21lYW5fMkNfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKHA1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgcDk1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpKQ0KDQojIEZpbHRlciBkYXRhIHdpdGhpbiA1JSB0byA5NSUgcGVyY2VudGlsZSByYW5nZQ0KZGFpbHlfZmlsdGVyZWRfbWVhbl8yQ19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgJT4lDQogIGlubmVyX2pvaW4oZGFpbHlfcGVyY2VudGlsZXNfbWVhbl8yQ19zZW5zLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPj0gcDVfbWF4X3RlbXAgJiBtYXhfdGVtcCA8PSBwOTVfbWF4X3RlbXApDQoNCiMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrIA0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl8yQ19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iID4gMC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICApICU+JQ0KICB1bmdyb3VwKCkgDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgOTV0aCBwZXJjZW50aWxlIG9mIG1heF90ZW1wIGZvciBlYWNoIHBvcHVsYXRpb24NCnBvcF9kYXRhXzk1X21lYW5fMkNfc2VucyA8LSBkYWlseV9maWx0ZXJlZF9tZWFuXzJDX3NlbnMgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfdGVtcCwgbiA9IDEpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgbWF4aW11bSB0ZW1wZXJhdHVyZSANCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2Vuc185NSA8LSBwb3BfZGF0YV85NV9tZWFuXzJDX3NlbnMgJT4lIA0KICByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoVFNNXzk1ID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fOTVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF85NSA9IHByZWRpY3RlZF9DVG1heCwNCiAgICAgICAgIENUbWF4Xzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfOTUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF85NSA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1ID0gb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1JHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfOTUpIA0KDQoNCiMgQ29tYmluZSBkYXRhIGZyYW1lcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4Xzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrXzk1KSwgDQogICAgICAgICAgICBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2Vuc185NSkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uIChtaW5pbXVtIFRTTSkNCnBvcF9kYXRhX2V4dHJlbWVfbWVhbl8yQ19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fMkMgICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIGZpbHRlcihtYXhfdGVtcCA9PSBtYXgobWF4X3RlbXApKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSB0ZW1wZXJhdHVyZSAobW9zdCBleHRyZW1lIFRTTSkNCnBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl8yQ19zZW5zIDwtIHBvcF9kYXRhX2V4dHJlbWVfbWVhbl8yQ19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIENUbWF4X2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSA9IG1heF90ZW1wLA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID0gb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUkcHJvYl9vdmVyaGVhdGluZywgDQogICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSkgDQoNCiMgSm9pbiBkYXRhc2V0cw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuXzJDX3NlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSwNCiAgICAgICAgIFRTTV9leHRyZW1lX3dlaWdodHMgPSAxLyhUU01fZXh0cmVtZV9zZV4yKSwNCiAgICAgICAgIFRTTV85NV93ZWlnaHRzID0gMS8oVFNNXzk1X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSBib2R5IHRlbXBlcmF0dXJlIA0KICAgIGNvbW11bml0eV9UU01fZXh0cmVtZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9leHRyZW1lKSwgc3VtKFRTTV9leHRyZW1lICogVFNNX2V4dHJlbWVfd2VpZ2h0cykvc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWVfc2UpLCBzcXJ0KHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV85NSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NSksIHN1bShUU01fOTUgKiBUU01fOTVfd2VpZ2h0cykvc3VtKFRTTV85NV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fOTVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fOTVfc2UpLCBzcXJ0KHN1bShUU01fOTVfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNXzk1X3dlaWdodHMpXjIpIC0gKHN1bShUU01fOTVfd2VpZ2h0c14yKSkpKSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQpkYWlseV9DVG1heF9tZWFuXzRDIDwtIHJlYWRSRFMoZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvZGFpbHlfQ1RtYXhfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIENhbGN1bGF0ZSA1JSBhbmQgOTUlIHBlcmNlbnRpbGUgZm9yIGVhY2ggZ3JvdXANCmRhaWx5X3BlcmNlbnRpbGVzX21lYW5fNENfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzRDICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKHA1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgcDk1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpKQ0KDQojIEZpbHRlciBkYXRhIHdpdGhpbiA1JSB0byA5NSUgcGVyY2VudGlsZSByYW5nZQ0KZGFpbHlfZmlsdGVyZWRfbWVhbl80Q19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fNEMgJT4lDQogIGlubmVyX2pvaW4oZGFpbHlfcGVyY2VudGlsZXNfbWVhbl80Q19zZW5zLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPj0gcDVfbWF4X3RlbXAgJiBtYXhfdGVtcCA8PSBwOTVfbWF4X3RlbXApDQoNCiMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrIA0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl80Q19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iID4gMC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApLCAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQojIENyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIDk1dGggcGVyY2VudGlsZSBvZiBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uDQpwb3BfZGF0YV85NV9tZWFuXzRDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl80Q19zZW5zICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3RlbXAsIG4gPSAxKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIG1heGltdW0gdGVtcGVyYXR1cmUgDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnNfOTUgPC0gcG9wX2RhdGFfOTVfbWVhbl80Q19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV85NSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNXzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfOTUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wXzk1ID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfOTUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF85NSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1KSANCg0KDQojIENvbWJpbmUgZGF0YSBmcmFtZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2Vuc185NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnNfOTUpDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbiAobWluaW11bSBUU00pDQpwb3BfZGF0YV9leHRyZW1lX21lYW5fNENfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzRDICAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPT0gbWF4KG1heF90ZW1wKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBDYWxjdWxhdGUgVFNNIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgKG1vc3QgZXh0cmVtZSBUU00pDQpwb3BfdnVsbmVyYWJpbGl0eV9leHRyZW1lX21lYW5fNENfc2VucyA8LSBwb3BfZGF0YV9leHRyZW1lX21lYW5fNENfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShUU01fZXh0cmVtZSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNX2V4dHJlbWVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4LA0KICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lJHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza19leHRyZW1lID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUpIA0KDQojIEpvaW4gZGF0YXNldHMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl80Q19zZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lX3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4X2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcF9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUpLCANCiAgICAgICAgICAgIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICU+JQ0KICBtdXRhdGUoVFNNX3dlaWdodHMgPSAxLyhUU01fc2VeMiksDQogICAgICAgICBDVG1heF93ZWlnaHRzID0gMS8oQ1RtYXhfc2VeMiksDQogICAgICAgICBUU01fZXh0cmVtZV93ZWlnaHRzID0gMS8oVFNNX2V4dHJlbWVfc2VeMiksDQogICAgICAgICBUU01fOTVfd2VpZ2h0cyA9IDEvKFRTTV85NV9zZV4yKSkgJT4lDQogIGdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKCMgaWZlbHNlIHN0YXRlbWVudCBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpbiBzb21lIGxvY2F0aW9ucywgb25seSBvbmUgc3BlY2llcyBpcyBwcmVzZW50Lg0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSBhdCB0aGUgY29tbXVuaXR5LWxldmVsICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfQ1RtYXggPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heCksIHN1bShDVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9DVG1heF9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4X3NlKSwgc3FydChzdW0oQ1RtYXhfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oQ1RtYXhfd2VpZ2h0cyleMikgLSAoc3VtKENUbWF4X3dlaWdodHNeMikpKSkpKSwNCiAgICBjb21tdW5pdHlfbWF4X3RlbXAgPSBmaXJzdChtYXhfdGVtcCksIA0KICAgIGNvbW11bml0eV9tYXhfdGVtcF9zZSA9IGZpcnN0KG1heF90ZW1wX3NlKSwNCiAgICAjIE1lYW4gVFNNICh3ZWlnaHRlZCBhdmVyYWdlIGFuZCBTRSkNCiAgICBjb21tdW5pdHlfVFNNID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNKSwgc3VtKFRTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9zZSksIHNxcnQoc3VtKFRTTV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fd2VpZ2h0cyleMikgLSAoc3VtKFRTTV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcw0KICAgIG5fc3BlY2llcyA9IG5fZGlzdGluY3QodGlwLmxhYmVsKSwgDQogICAgIyBOdW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZyA9IHN1bShvdmVyaGVhdGluZ19yaXNrKSwgDQogICAgIyBQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChvdmVyaGVhdGluZ19yaXNrKSwgbWVhbihvdmVyaGVhdGluZ19yaXNrKSksIA0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZ19zZSA9IGlmX2Vsc2UobigpID09IDEsIDAsIHNkKG92ZXJoZWF0aW5nX3Jpc2spKSwNCiAgICAjIFRTTSBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWUgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZSksIHN1bShUU01fZXh0cmVtZSAqIFRTTV9leHRyZW1lX3dlaWdodHMpL3N1bShUU01fZXh0cmVtZV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fZXh0cmVtZV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9leHRyZW1lX3NlKSwgc3FydChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV9leHRyZW1lX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIFRTTSBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIDk1dGggcGVyY2VudGlsZSBib2R5IHRlbXBlcmF0dXJlIA0KICAgIGNvbW11bml0eV9UU01fOTUgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fOTUpLCBzdW0oVFNNXzk1ICogVFNNXzk1X3dlaWdodHMpL3N1bShUU01fOTVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNXzk1X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1X3NlKSwgc3FydChzdW0oVFNNXzk1X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV85NV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNXzk1X3dlaWdodHNeMikpKSkpKSwNCiAgICAuZ3JvdXBzID0gJ2Ryb3AnDQogICkNCg0Kc2F2ZVJEUyhjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KYGBgDQoNCiMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqICB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL0NhbGN1bGF0aW5nX2NsaW1hdGVfdnVsbmVyYWJpbGl0eV9tZXRyaWNzX2FyYm9yZWFsX3NlbnNpdGl2aXR5X2FuYWx5c2lzLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9DYWxjdWxhdGluZ19jbGltYXRlX3Z1bG5lcmFiaWxpdHlfbWV0cmljc19hcmJvcmVhbF9zZW5zaXRpdml0eV9hbmFseXNpcy5wYnMqKiANCg0KIyMjIyMgKipDdXJyZW50IGNsaW1hdGUqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fY3VycmVudCA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2RhaWx5X0NUbWF4X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyBDYWxjdWxhdGUgNSUgYW5kIDk1JSBwZXJjZW50aWxlIGZvciBlYWNoIGdyb3VwDQpkYWlseV9wZXJjZW50aWxlc19tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UocDVfbWF4X3RlbXAgPSBxdWFudGlsZShtYXhfdGVtcCwgMC4wNSksDQogICAgICAgICAgICBwOTVfbWF4X3RlbXAgPSBxdWFudGlsZShtYXhfdGVtcCwgMC45NSkpDQoNCiMgRmlsdGVyIGRhdGEgd2l0aGluIDUlIHRvIDk1JSBwZXJjZW50aWxlIHJhbmdlDQpkYWlseV9maWx0ZXJlZF9tZWFuX2N1cnJlbnRfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuX2N1cnJlbnQgJT4lDQogIGlubmVyX2pvaW4oZGFpbHlfcGVyY2VudGlsZXNfbWVhbl9jdXJyZW50X3NlbnMsIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkgJT4lDQogIGZpbHRlcihtYXhfdGVtcCA+PSBwNV9tYXhfdGVtcCAmIG1heF90ZW1wIDw9IHA5NV9tYXhfdGVtcCkNCg0KIyBEYWlseSBUU00gYW5kIG92ZXJoZWF0aW5nIHJpc2sgDQpkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fY3VycmVudF9zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iID4gMC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIGRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUgcmVuYW1lKG1heF90ZW1wID0gbWVhbl9tYXhfdGVtcCkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbg0KcG9wX2RhdGFfOTVfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl9jdXJyZW50X3NlbnMgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfdGVtcCwgbiA9IDEpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgbWF4aW11bSB0ZW1wZXJhdHVyZSANCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zXzk1IDwtIHBvcF9kYXRhXzk1X21lYW5fY3VycmVudF9zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV85NSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNXzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfOTUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wXzk1ID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfOTUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF85NSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1KSANCg0KDQojIENvbWJpbmUgZGF0YSBmcmFtZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICU+JQ0KICBsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdChwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2Vuc185NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2Vuc185NSkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uIChtaW5pbXVtIFRTTSkNCnBvcF9kYXRhX2V4dHJlbWVfbWVhbl9jdXJyZW50X3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl9jdXJyZW50ICAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPT0gbWF4KG1heF90ZW1wKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBDYWxjdWxhdGUgVFNNIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgKG1vc3QgZXh0cmVtZSBUU00pDQpwb3BfdnVsbmVyYWJpbGl0eV9leHRyZW1lX21lYW5fY3VycmVudF9zZW5zIDwtIHBvcF9kYXRhX2V4dHJlbWVfbWVhbl9jdXJyZW50X3NlbnMgJT4lIA0KICByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoVFNNX2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXggLSBtYXhfdGVtcCwNCiAgICAgICAgIFRTTV9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfZXh0cmVtZSA9IHByZWRpY3RlZF9DVG1heCwNCiAgICAgICAgIENUbWF4X2V4dHJlbWVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBtYXhfdGVtcF9leHRyZW1lID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUgPSBvdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID4gMC41LCAxLCAwKSkgJT4lICAgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lKSANCiAgDQogICMgSm9pbiBkYXRhc2V0cw0KICBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuX2N1cnJlbnRfc2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4X2V4dHJlbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lX3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza19leHRyZW1lKSwgDQogICAgICAgICAgICBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCiMjIEFkZCBvcmlnaW5hbCBjb29yZGluYXRlcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMgICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgPC0gbGVmdF9qb2luKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fbGF0KQ0KDQpzYXZlUkRTKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fY3VycmVudF9zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyMjIyMjIyBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgIyMjIyMjIyMjIyMjIyMjIw0KDQpjb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuX2N1cnJlbnRfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpLA0KICAgICAgICAgVFNNX2V4dHJlbWVfd2VpZ2h0cyA9IDEvKFRTTV9leHRyZW1lX3NlXjIpLA0KICAgICAgICAgVFNNXzk1X3dlaWdodHMgPSAxLyhUU01fOTVfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWUpLCBzdW0oVFNNX2V4dHJlbWUgKiBUU01fZXh0cmVtZV93ZWlnaHRzKS9zdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZV9zZSksIHNxcnQoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpXjIpIC0gKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNXzk1ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1KSwgc3VtKFRTTV85NSAqIFRTTV85NV93ZWlnaHRzKS9zdW0oVFNNXzk1X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV85NV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NV9zZSksIHNxcnQoc3VtKFRTTV85NV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fOTVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV85NV93ZWlnaHRzXjIpKSkpKSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl9jdXJyZW50X3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCsyQykqKiANCg0KYGBge3IsIGV2YWw9Rn0NCmRhaWx5X0NUbWF4X21lYW5fMkMgPC0gcmVhZFJEUyhmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvZGFpbHlfQ1RtYXhfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCg0KIyBBc3NpZ24gYSBtYXhpbXVtIHNlIGZvciBvYnNlcnZhdGlvbnMgd2l0aCB2ZXJ5IGxhcmdlIGVycm9yLiANCiMgVGhpcyBpcyBjYXBwZWQgdG8gYXZvaWQgbGFyZ2UgdW5jZXJ0YWludHkgdG8gb3ZlcmVzdGltYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMNCiMgQSBTRCBvZiAxIHNpbXVsYXRlcyB2YWx1ZXMgd2l0aGluIH4zIGRlZ3JlZXMgb2YgdGhlIG1lYW4gQ1RtYXgNCmNhcF9zZSA8LSAxDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5IGFuZCBTRQ0KY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5IDwtIGZ1bmN0aW9uKHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkgew0KICBjYXBwZWRfc2UgPC0gbWluKHByZWRpY3RlZF9DVG1heF9zZSwgY2FwX3NlKSAgIyBUYWtlIHRoZSBwcmVkaWN0ZWQgU0UgaWYgdW5kZXIgdGhlIGNhcHBlZCBTRQ0KICBwcm9iX292ZXJoZWF0aW5nIDwtIHBub3JtKG1heF90ZW1wLCBtZWFuID0gcHJlZGljdGVkX0NUbWF4LCBzZCA9IGNhcHBlZF9zZSkgIyBQcm9iYWJpbGl0eSB0aGF0IG1heCB0ZW1wIGV4Y2VlZHMgQ1RtYXggZGlzdHJpYnV0aW9uDQogIHJldHVybihsaXN0KHByb2Jfb3ZlcmhlYXRpbmcgPSBwcm9iX292ZXJoZWF0aW5nKSkNCn0NCg0KIyBDYWxjdWxhdGUgNSUgYW5kIDk1JSBwZXJjZW50aWxlIGZvciBlYWNoIGdyb3VwDQpkYWlseV9wZXJjZW50aWxlc19tZWFuXzJDX3NlbnMgPC0gZGFpbHlfQ1RtYXhfbWVhbl8yQyAlPiUNCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZShwNV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjA1KSwNCiAgICAgICAgICAgIHA5NV9tYXhfdGVtcCA9IHF1YW50aWxlKG1heF90ZW1wLCAwLjk1KSkNCg0KIyBGaWx0ZXIgZGF0YSB3aXRoaW4gNSUgdG8gOTUlIHBlcmNlbnRpbGUgcmFuZ2UNCmRhaWx5X2ZpbHRlcmVkX21lYW5fMkNfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICU+JQ0KICBpbm5lcl9qb2luKGRhaWx5X3BlcmNlbnRpbGVzX21lYW5fMkNfc2VucywgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKSAlPiUNCiAgZmlsdGVyKG1heF90ZW1wID49IHA1X21heF90ZW1wICYgbWF4X3RlbXAgPD0gcDk1X21heF90ZW1wKQ0KDQojIERhaWx5IFRTTSBhbmQgb3ZlcmhlYXRpbmcgcmlzayANCmRhaWx5X3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zIDwtIGRhaWx5X2ZpbHRlcmVkX21lYW5fMkNfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShvdmVyaGVhdGluZ19yZXN1bHQgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgIyBBcHBseSBmdW5jdGlvbg0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYiA9IG92ZXJoZWF0aW5nX3Jlc3VsdCRwcm9iX292ZXJoZWF0aW5nLCAjIHJldHJpZXZlIG92ZXJoZWF0aW5nIHByb2JhYmlsaXR5DQogICAgICAgICBvdmVyaGVhdGluZ19kYXkgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYiA+IDAuNSwgMSwgMCksICMgQ29uc2lkZXIgb3ZlcmhlYXRpbmcgZGF5IHdoZW4gb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgPiAwLjUNCiAgICAgICAgIGRhaWx5X1RTTSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgZGFpbHlfVFNNX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlKSAgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHQpDQoNCiMgU2V0IG51bWJlciBvZiBkYXlzDQpuX2RheXMgPC0gOTEwDQoNCiMjIyMjIyMjIyMgQ2xpbWF0ZSB2dWxuZXJhYmlsaXR5IG1ldHJpY3MgYXQgdGhlIHBvcHVsYXRpb24tbGV2ZWwgICMjIyMjIyMjIyMjDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgPC0gZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKGRhaWx5X1RTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhwcmVkaWN0ZWRfQ1RtYXhfc2VeMikpICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIENUbWF4ID0gc3VtKHByZWRpY3RlZF9DVG1heCAqIENUbWF4X3dlaWdodHMpL3N1bShDVG1heF93ZWlnaHRzKSwgDQogICAgQ1RtYXhfc2UgPSBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSksDQogICAgbWVhbl9tYXhfdGVtcCA9IG1lYW4obWF4X3RlbXApLA0KICAgIG1heF90ZW1wX3NlID0gc2QobWF4X3RlbXApLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIFRTTSA9IHN1bShkYWlseV9UU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSwgDQogICAgVFNNX3NlID0gc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpLA0KICAgICMgQ29tYmluZSBkYWlseSBvdmVyaGVhdGluZyBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHBvcHVsYXRpb24NCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSA9IG1lYW4ob3ZlcmhlYXRpbmdfcHJvYiksDQogICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfc2UgPSBzcXJ0KG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ICogKDEgLSBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcpICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZSgNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gbl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHksDQogICAgb3ZlcmhlYXRpbmdfZGF5c19zZSA9IHNxcnQobl9kYXlzICogb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksICMgU0UgaW4gb3ZlcmhlYXRpbmcgZGF5cw0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfZGF5cyA+PSAxLCAxLCAwKSAjIE92ZXJoZWF0aW5nIHJpc2sgd2hlbiBvdmVyaGVhdGluZyBkYXlzID49IDENCiAgKSAlPiUNCiAgdW5ncm91cCgpIA0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICU+JSByZW5hbWUobWF4X3RlbXAgPSBtZWFuX21heF90ZW1wKQ0KDQojIENyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIDk1dGggcGVyY2VudGlsZSBvZiBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uDQpwb3BfZGF0YV85NV9tZWFuXzJDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl8yQ19zZW5zICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3RlbXAsIG4gPSAxKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIG1heGltdW0gdGVtcGVyYXR1cmUgDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnNfOTUgPC0gcG9wX2RhdGFfOTVfbWVhbl8yQ19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV85NSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNXzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgQ1RtYXhfOTUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF85NV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wXzk1ID0gbWF4X3RlbXAsDQogICAgICAgICBvdmVyaGVhdGluZ19yZXN1bHRfOTUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF85NSRwcm9iX292ZXJoZWF0aW5nLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfOTUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfOTUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1KSANCg0KDQojIENvbWJpbmUgZGF0YSBmcmFtZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2Vuc185NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwLmxhYmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNXzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQpybShwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnNfOTUpDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgbWF4X3RlbXAgZm9yIGVhY2ggcG9wdWxhdGlvbiAobWluaW11bSBUU00pDQpwb3BfZGF0YV9leHRyZW1lX21lYW5fMkNfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzJDICAlPiUgDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPT0gbWF4KG1heF90ZW1wKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KIyBDYWxjdWxhdGUgVFNNIGFzIHRoZSBkaWZmZXJlbmNlIHdpdGggdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgKG1vc3QgZXh0cmVtZSBUU00pDQpwb3BfdnVsbmVyYWJpbGl0eV9leHRyZW1lX21lYW5fMkNfc2VucyA8LSBwb3BfZGF0YV9leHRyZW1lX21lYW5fMkNfc2VucyAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShUU01fZXh0cmVtZSA9IHByZWRpY3RlZF9DVG1heCAtIG1heF90ZW1wLA0KICAgICAgICAgVFNNX2V4dHJlbWVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4LA0KICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lID0gbGlzdChjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSksIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA9IG92ZXJoZWF0aW5nX3Jlc3VsdF9leHRyZW1lJHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza19leHRyZW1lID0gaWZlbHNlKG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUgPiAwLjUsIDEsIDApKSAlPiUgICANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdCgtb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUpIA0KDQojIEpvaW4gZGF0YXNldHMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KHBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl8yQ19zZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lX3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4X2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGVtcF9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUpLCANCiAgICAgICAgICAgIGJ5ID0gYygidGlwLmxhYmVsIiwgImxvbiIsICJsYXQiKSkNCg0KIyMgQWRkIG9yaWdpbmFsIGNvb3JkaW5hdGVzDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgICU+JSANCiAgcmVuYW1lKGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgDQoNCmRpc3RpbmN0X2Nvb3JkIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9kaXN0aW5jdF9jb29yZGluYXRlc19hZGp1c3RlZF9hcmJvcmVhbC5yZHMiKQ0KZGlzdGluY3RfY29vcmQgPC0gZGlzdGluY3RfY29vcmQgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGxvbl9hZGogPSBsb24sIGxhdF9hZGogPSBsYXQsIGxvbiA9IHgsIGxhdCA9IHkpICU+JSANCiAgbXV0YXRlKGxvbl9sYXQgPSBwYXN0ZShsb25fYWRqLCBsYXRfYWRqKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1sb25fYWRqLCAtbGF0X2FkaikNCg0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICA8LSBsZWZ0X2pvaW4ocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICwgZGlzdGluY3RfY29vcmQsIGJ5PSJsb25fbGF0IikNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyAgPC0gcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zICAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9sYXQpDQoNCnNhdmVSRFMocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl8yQ19zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIyMjIyMjIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyAjIyMjIyMjIyMjIyMjIyMjDQoNCmNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzJDX3NlbnMgJT4lDQogIG11dGF0ZShUU01fd2VpZ2h0cyA9IDEvKFRTTV9zZV4yKSwNCiAgICAgICAgIENUbWF4X3dlaWdodHMgPSAxLyhDVG1heF9zZV4yKSwNCiAgICAgICAgIFRTTV9leHRyZW1lX3dlaWdodHMgPSAxLyhUU01fZXh0cmVtZV9zZV4yKSwNCiAgICAgICAgIFRTTV85NV93ZWlnaHRzID0gMS8oVFNNXzk1X3NlXjIpKSAlPiUNCiAgZ3JvdXBfYnkobG9uLCBsYXQpICU+JQ0KICBzdW1tYXJpc2UoIyBpZmVsc2Ugc3RhdGVtZW50IGlzIHVzZWQgaGVyZSBiZWNhdXNlIGluIHNvbWUgbG9jYXRpb25zLCBvbmx5IG9uZSBzcGVjaWVzIGlzIHByZXNlbnQuDQogICAgIyBNZWFuIENUbWF4IGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlIGF0IHRoZSBjb21tdW5pdHktbGV2ZWwgKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9DVG1heCA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KENUbWF4KSwgc3VtKENUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X0NUbWF4X3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXhfc2UpLCBzcXJ0KHN1bShDVG1heF93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShDVG1heF93ZWlnaHRzKV4yKSAtIChzdW0oQ1RtYXhfd2VpZ2h0c14yKSkpKSkpLA0KICAgIGNvbW11bml0eV9tYXhfdGVtcCA9IGZpcnN0KG1heF90ZW1wKSwgDQogICAgY29tbXVuaXR5X21heF90ZW1wX3NlID0gZmlyc3QobWF4X3RlbXBfc2UpLA0KICAgICMgTWVhbiBUU00gKHdlaWdodGVkIGF2ZXJhZ2UgYW5kIFNFKQ0KICAgIGNvbW11bml0eV9UU00gPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU00pLCBzdW0oVFNNICogVFNNX3dlaWdodHMpL3N1bShUU01fd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX3NlKSwgc3FydChzdW0oVFNNX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX3dlaWdodHNeMikpKSkpKSwNCiAgICAjIE51bWJlciBvZiBzcGVjaWVzDQogICAgbl9zcGVjaWVzID0gbl9kaXN0aW5jdCh0aXAubGFiZWwpLCANCiAgICAjIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gc3VtKG92ZXJoZWF0aW5nX3Jpc2spLCANCiAgICAjIFByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZw0KICAgIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KG92ZXJoZWF0aW5nX3Jpc2spLCBtZWFuKG92ZXJoZWF0aW5nX3Jpc2spKSwgDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgMCwgc2Qob3ZlcmhlYXRpbmdfcmlzaykpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSBib2R5IHRlbXBlcmF0dXJlIA0KICAgIGNvbW11bml0eV9UU01fZXh0cmVtZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV9leHRyZW1lKSwgc3VtKFRTTV9leHRyZW1lICogVFNNX2V4dHJlbWVfd2VpZ2h0cykvc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lX3NlID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWVfc2UpLCBzcXJ0KHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzKV4yKSAtIChzdW0oVFNNX2V4dHJlbWVfd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgVFNNIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgOTV0aCBwZXJjZW50aWxlIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV85NSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NSksIHN1bShUU01fOTUgKiBUU01fOTVfd2VpZ2h0cykvc3VtKFRTTV85NV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fOTVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fOTVfc2UpLCBzcXJ0KHN1bShUU01fOTVfd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNXzk1X3dlaWdodHMpXjIpIC0gKHN1bShUU01fOTVfd2VpZ2h0c14yKSkpKSkpLA0KICAgIC5ncm91cHMgPSAnZHJvcCcNCiAgKQ0KDQpzYXZlUkRTKGNvbW11bml0eV92dWxuZXJhYmlsaXR5X21lYW5fMkNfc2VucywgZmlsZT0iUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCg0KYGBgDQoNCiMjIyMjICoqRnV0dXJlIGNsaW1hdGUgKCs0QykqKiANCg0KYGBge3IsIGV2YWw9Rn0NCg0KZGFpbHlfQ1RtYXhfbWVhbl80QyA8LSByZWFkUkRTKGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9kYWlseV9DVG1heF9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFzc2lnbiBhIG1heGltdW0gc2UgZm9yIG9ic2VydmF0aW9ucyB3aXRoIHZlcnkgbGFyZ2UgZXJyb3IuIA0KIyBUaGlzIGlzIGNhcHBlZCB0byBhdm9pZCBsYXJnZSB1bmNlcnRhaW50eSB0byBvdmVyZXN0aW1hdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcw0KIyBBIFNEIG9mIDEgc2ltdWxhdGVzIHZhbHVlcyB3aXRoaW4gfjMgZGVncmVlcyBvZiB0aGUgbWVhbiBDVG1heA0KY2FwX3NlIDwtIDENCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkgYW5kIFNFDQpjYWxjdWxhdGVfb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24ocHJlZGljdGVkX0NUbWF4LCBwcmVkaWN0ZWRfQ1RtYXhfc2UsIG1heF90ZW1wKSB7DQogIGNhcHBlZF9zZSA8LSBtaW4ocHJlZGljdGVkX0NUbWF4X3NlLCBjYXBfc2UpICAjIFRha2UgdGhlIHByZWRpY3RlZCBTRSBpZiB1bmRlciB0aGUgY2FwcGVkIFNFDQogIHByb2Jfb3ZlcmhlYXRpbmcgPC0gcG5vcm0obWF4X3RlbXAsIG1lYW4gPSBwcmVkaWN0ZWRfQ1RtYXgsIHNkID0gY2FwcGVkX3NlKSAjIFByb2JhYmlsaXR5IHRoYXQgbWF4IHRlbXAgZXhjZWVkcyBDVG1heCBkaXN0cmlidXRpb24NCiAgcmV0dXJuKGxpc3QocHJvYl9vdmVyaGVhdGluZyA9IHByb2Jfb3ZlcmhlYXRpbmcpKQ0KfQ0KDQojIENhbGN1bGF0ZSA1JSBhbmQgOTUlIHBlcmNlbnRpbGUgZm9yIGVhY2ggZ3JvdXANCmRhaWx5X3BlcmNlbnRpbGVzX21lYW5fNENfc2VucyA8LSBkYWlseV9DVG1heF9tZWFuXzRDICU+JQ0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKHA1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuMDUpLA0KICAgICAgICAgICAgcDk1X21heF90ZW1wID0gcXVhbnRpbGUobWF4X3RlbXAsIDAuOTUpKQ0KDQojIEZpbHRlciBkYXRhIHdpdGhpbiA1JSB0byA5NSUgcGVyY2VudGlsZSByYW5nZQ0KZGFpbHlfZmlsdGVyZWRfbWVhbl80Q19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fNEMgJT4lDQogIGlubmVyX2pvaW4oZGFpbHlfcGVyY2VudGlsZXNfbWVhbl80Q19zZW5zLCBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpICU+JQ0KICBmaWx0ZXIobWF4X3RlbXAgPj0gcDVfbWF4X3RlbXAgJiBtYXhfdGVtcCA8PSBwOTVfbWF4X3RlbXApDQoNCiMgRGFpbHkgVFNNIGFuZCBvdmVyaGVhdGluZyByaXNrIA0KZGFpbHlfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgPC0gZGFpbHlfZmlsdGVyZWRfbWVhbl80Q19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKG92ZXJoZWF0aW5nX3Jlc3VsdCA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCAjIEFwcGx5IGZ1bmN0aW9uDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iID0gb3ZlcmhlYXRpbmdfcmVzdWx0JHByb2Jfb3ZlcmhlYXRpbmcsICMgcmV0cmlldmUgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdHkNCiAgICAgICAgIG92ZXJoZWF0aW5nX2RheSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iID4gMC41LCAxLCAwKSwgIyBDb25zaWRlciBvdmVyaGVhdGluZyBkYXkgd2hlbiBvdmVyaGVhdGluZyBwcm9iYWJpbGl0eSA+IDAuNQ0KICAgICAgICAgZGFpbHlfVFNNID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBkYWlseV9UU01fc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UpICAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW92ZXJoZWF0aW5nX3Jlc3VsdCkNCg0KIyBTZXQgbnVtYmVyIG9mIGRheXMNCm5fZGF5cyA8LSA5MTANCg0KIyMjIyMjIyMjIyBDbGltYXRlIHZ1bG5lcmFiaWxpdHkgbWV0cmljcyBhdCB0aGUgcG9wdWxhdGlvbi1sZXZlbCAgIyMjIyMjIyMjIyMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBkYWlseV92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oZGFpbHlfVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKHByZWRpY3RlZF9DVG1heF9zZV4yKSkgJT4lIA0KICBncm91cF9ieSh0aXAubGFiZWwsIGxvbiwgbGF0KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgICMgTWVhbiBDVG1heCBhbmQgbWF4aW11bSB0ZW1wZXJhdHVyZSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgQ1RtYXggPSBzdW0ocHJlZGljdGVkX0NUbWF4ICogQ1RtYXhfd2VpZ2h0cykvc3VtKENUbWF4X3dlaWdodHMpLCANCiAgICBDVG1heF9zZSA9IHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSwNCiAgICBtZWFuX21heF90ZW1wID0gbWVhbihtYXhfdGVtcCksDQogICAgbWF4X3RlbXBfc2UgPSBzZChtYXhfdGVtcCksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgVFNNID0gc3VtKGRhaWx5X1RTTSAqIFRTTV93ZWlnaHRzKS9zdW0oVFNNX3dlaWdodHMpLCANCiAgICBUU01fc2UgPSBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSksDQogICAgIyBDb21iaW5lIGRhaWx5IG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9wdWxhdGlvbg0KICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5ID0gbWVhbihvdmVyaGVhdGluZ19wcm9iKSwNCiAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9zZSA9IHNxcnQob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkgKiAoMSAtIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KSksDQogICAgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSwNCiAgICBvdmVyaGVhdGluZ19kYXlzX3NlID0gc3FydChuX2RheXMgKiBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eSAqICgxIC0gb3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHkpKSwgIyBTRSBpbiBvdmVyaGVhdGluZyBkYXlzDQogICAgb3ZlcmhlYXRpbmdfcmlzayA9IGlmZWxzZShvdmVyaGVhdGluZ19kYXlzID49IDEsIDEsIDApICMgT3ZlcmhlYXRpbmcgcmlzayB3aGVuIG92ZXJoZWF0aW5nIGRheXMgPj0gMQ0KICApICU+JQ0KICB1bmdyb3VwKCkgDQoNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgJT4lIHJlbmFtZShtYXhfdGVtcCA9IG1lYW5fbWF4X3RlbXApDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgOTV0aCBwZXJjZW50aWxlIG9mIG1heF90ZW1wIGZvciBlYWNoIHBvcHVsYXRpb24NCnBvcF9kYXRhXzk1X21lYW5fNENfc2VucyA8LSBkYWlseV9maWx0ZXJlZF9tZWFuXzRDX3NlbnMgJT4lDQogIGdyb3VwX2J5KHRpcC5sYWJlbCwgbG9uLCBsYXQpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfdGVtcCwgbiA9IDEpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgQ2FsY3VsYXRlIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgbWF4aW11bSB0ZW1wZXJhdHVyZSANCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2Vuc185NSA8LSBwb3BfZGF0YV85NV9tZWFuXzRDX3NlbnMgJT4lIA0KICByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoVFNNXzk1ID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fOTVfc2UgPSBwcmVkaWN0ZWRfQ1RtYXhfc2UsDQogICAgICAgICBDVG1heF85NSA9IHByZWRpY3RlZF9DVG1heCwNCiAgICAgICAgIENUbWF4Xzk1X3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfOTUgPSBtYXhfdGVtcCwNCiAgICAgICAgIG92ZXJoZWF0aW5nX3Jlc3VsdF85NSA9IGxpc3QoY2FsY3VsYXRlX292ZXJoZWF0aW5nX3Byb2JhYmlsaXR5KHByZWRpY3RlZF9DVG1heCwgcHJlZGljdGVkX0NUbWF4X3NlLCBtYXhfdGVtcCkpLCANCiAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1ID0gb3ZlcmhlYXRpbmdfcmVzdWx0Xzk1JHByb2Jfb3ZlcmhlYXRpbmcsIA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmlza185NSA9IGlmZWxzZShvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV85NSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfOTUpIA0KDQoNCiMgQ29tYmluZSBkYXRhIGZyYW1lcw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zXzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUU01fOTVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF85NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIENUbWF4Xzk1X3NlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5Xzk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGVhdGluZ19yaXNrXzk1KSwgDQogICAgICAgICAgICBieSA9IGMoInRpcC5sYWJlbCIsICJsb24iLCAibGF0IikpDQoNCnJtKHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2Vuc185NSkNCg0KIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBtYXhfdGVtcCBmb3IgZWFjaCBwb3B1bGF0aW9uIChtaW5pbXVtIFRTTSkNCnBvcF9kYXRhX2V4dHJlbWVfbWVhbl80Q19zZW5zIDwtIGRhaWx5X0NUbWF4X21lYW5fNEMgICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsLCBsb24sIGxhdCkgJT4lDQogIGZpbHRlcihtYXhfdGVtcCA9PSBtYXgobWF4X3RlbXApKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQojIENhbGN1bGF0ZSBUU00gYXMgdGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGUgbWF4aW11bSB0ZW1wZXJhdHVyZSAobW9zdCBleHRyZW1lIFRTTSkNCnBvcF92dWxuZXJhYmlsaXR5X2V4dHJlbWVfbWVhbl80Q19zZW5zIDwtIHBvcF9kYXRhX2V4dHJlbWVfbWVhbl80Q19zZW5zICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKFRTTV9leHRyZW1lID0gcHJlZGljdGVkX0NUbWF4IC0gbWF4X3RlbXAsDQogICAgICAgICBUU01fZXh0cmVtZV9zZSA9IHByZWRpY3RlZF9DVG1heF9zZSwNCiAgICAgICAgIENUbWF4X2V4dHJlbWUgPSBwcmVkaWN0ZWRfQ1RtYXgsDQogICAgICAgICBDVG1heF9leHRyZW1lX3NlID0gcHJlZGljdGVkX0NUbWF4X3NlLA0KICAgICAgICAgbWF4X3RlbXBfZXh0cmVtZSA9IG1heF90ZW1wLA0KICAgICAgICAgb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUgPSBsaXN0KGNhbGN1bGF0ZV9vdmVyaGVhdGluZ19wcm9iYWJpbGl0eShwcmVkaWN0ZWRfQ1RtYXgsIHByZWRpY3RlZF9DVG1heF9zZSwgbWF4X3RlbXApKSwgDQogICAgICAgICBvdmVyaGVhdGluZ19wcm9iYWJpbGl0eV9leHRyZW1lID0gb3ZlcmhlYXRpbmdfcmVzdWx0X2V4dHJlbWUkcHJvYl9vdmVyaGVhdGluZywgDQogICAgICAgICBvdmVyaGVhdGluZ19yaXNrX2V4dHJlbWUgPSBpZmVsc2Uob3ZlcmhlYXRpbmdfcHJvYmFiaWxpdHlfZXh0cmVtZSA+IDAuNSwgMSwgMCkpICU+JSAgIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1vdmVyaGVhdGluZ19yZXN1bHRfZXh0cmVtZSkgDQoNCiMgSm9pbiBkYXRhc2V0cw0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocG9wX3Z1bG5lcmFiaWxpdHlfZXh0cmVtZV9tZWFuXzRDX3NlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpcC5sYWJlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFRTTV9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFNNX2V4dHJlbWVfc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDVG1heF9leHRyZW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RtYXhfZXh0cmVtZV9zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Byb2JhYmlsaXR5X2V4dHJlbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoZWF0aW5nX3Jpc2tfZXh0cmVtZSksIA0KICAgICAgICAgICAgYnkgPSBjKCJ0aXAubGFiZWwiLCAibG9uIiwgImxhdCIpKQ0KDQojIyBBZGQgb3JpZ2luYWwgY29vcmRpbmF0ZXMNCnBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAgIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAgJT4lIA0KICByZW5hbWUobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSANCg0KZGlzdGluY3RfY29vcmQgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL2Rpc3RpbmN0X2Nvb3JkaW5hdGVzX2FkanVzdGVkX2FyYm9yZWFsLnJkcyIpDQpkaXN0aW5jdF9jb29yZCA8LSBkaXN0aW5jdF9jb29yZCAlPiUgDQogIGRwbHlyOjpzZWxlY3QobG9uX2FkaiA9IGxvbiwgbGF0X2FkaiA9IGxhdCwgbG9uID0geCwgbGF0ID0geSkgJT4lIA0KICBtdXRhdGUobG9uX2xhdCA9IHBhc3RlKGxvbl9hZGosIGxhdF9hZGopKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLWxvbl9hZGosIC1sYXRfYWRqKQ0KDQpwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgIDwtIGxlZnRfam9pbihwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgLCBkaXN0aW5jdF9jb29yZCwgYnk9Imxvbl9sYXQiKQ0KcG9wX3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zICA8LSBwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMgICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbG9uX2xhdCkNCg0Kc2F2ZVJEUyhwb3BfdnVsbmVyYWJpbGl0eV9tZWFuXzRDX3NlbnMsIGZpbGU9IlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMjIyMjIyMgQ29tbXVuaXR5LWxldmVsIHBhdHRlcm5zICMjIyMjIyMjIyMjIyMjIyMNCg0KY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zIDwtIHBvcF92dWxuZXJhYmlsaXR5X21lYW5fNENfc2VucyAlPiUNCiAgbXV0YXRlKFRTTV93ZWlnaHRzID0gMS8oVFNNX3NlXjIpLA0KICAgICAgICAgQ1RtYXhfd2VpZ2h0cyA9IDEvKENUbWF4X3NlXjIpLA0KICAgICAgICAgVFNNX2V4dHJlbWVfd2VpZ2h0cyA9IDEvKFRTTV9leHRyZW1lX3NlXjIpLA0KICAgICAgICAgVFNNXzk1X3dlaWdodHMgPSAxLyhUU01fOTVfc2VeMikpICU+JQ0KICBncm91cF9ieShsb24sIGxhdCkgJT4lDQogIHN1bW1hcmlzZSgjIGlmZWxzZSBzdGF0ZW1lbnQgaXMgdXNlZCBoZXJlIGJlY2F1c2UgaW4gc29tZSBsb2NhdGlvbnMsIG9ubHkgb25lIHNwZWNpZXMgaXMgcHJlc2VudC4NCiAgICAjIE1lYW4gQ1RtYXggYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXQgdGhlIGNvbW11bml0eS1sZXZlbCAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X0NUbWF4ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoQ1RtYXgpLCBzdW0oQ1RtYXggKiBDVG1heF93ZWlnaHRzKS9zdW0oQ1RtYXhfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfQ1RtYXhfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChDVG1heF9zZSksIHNxcnQoc3VtKENUbWF4X3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKENUbWF4X3dlaWdodHMpXjIpIC0gKHN1bShDVG1heF93ZWlnaHRzXjIpKSkpKSksDQogICAgY29tbXVuaXR5X21heF90ZW1wID0gZmlyc3QobWF4X3RlbXApLCANCiAgICBjb21tdW5pdHlfbWF4X3RlbXBfc2UgPSBmaXJzdChtYXhfdGVtcF9zZSksDQogICAgIyBNZWFuIFRTTSAod2VpZ2h0ZWQgYXZlcmFnZSBhbmQgU0UpDQogICAgY29tbXVuaXR5X1RTTSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTSksIHN1bShUU00gKiBUU01fd2VpZ2h0cykvc3VtKFRTTV93ZWlnaHRzKSksIA0KICAgIGNvbW11bml0eV9UU01fc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fc2UpLCBzcXJ0KHN1bShUU01fd2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0oVFNNX3dlaWdodHMpXjIpIC0gKHN1bShUU01fd2VpZ2h0c14yKSkpKSkpLA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMNCiAgICBuX3NwZWNpZXMgPSBuX2Rpc3RpbmN0KHRpcC5sYWJlbCksIA0KICAgICMgTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBzdW0ob3ZlcmhlYXRpbmdfcmlzayksIA0KICAgICMgUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3Qob3ZlcmhlYXRpbmdfcmlzayksIG1lYW4ob3ZlcmhlYXRpbmdfcmlzaykpLCANCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCAwLCBzZChvdmVyaGVhdGluZ19yaXNrKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgDQogICAgY29tbXVuaXR5X1RTTV9leHRyZW1lID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNX2V4dHJlbWUpLCBzdW0oVFNNX2V4dHJlbWUgKiBUU01fZXh0cmVtZV93ZWlnaHRzKS9zdW0oVFNNX2V4dHJlbWVfd2VpZ2h0cykpLCANCiAgICBjb21tdW5pdHlfVFNNX2V4dHJlbWVfc2UgPSBpZl9lbHNlKG4oKSA9PSAxLCBmaXJzdChUU01fZXh0cmVtZV9zZSksIHNxcnQoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpICogKG4oKSAtIDEpIC8gKCgoc3VtKFRTTV9leHRyZW1lX3dlaWdodHMpXjIpIC0gKHN1bShUU01fZXh0cmVtZV93ZWlnaHRzXjIpKSkpKSksDQogICAgIyBUU00gY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHRoZSA5NXRoIHBlcmNlbnRpbGUgYm9keSB0ZW1wZXJhdHVyZSANCiAgICBjb21tdW5pdHlfVFNNXzk1ID0gaWZfZWxzZShuKCkgPT0gMSwgZmlyc3QoVFNNXzk1KSwgc3VtKFRTTV85NSAqIFRTTV85NV93ZWlnaHRzKS9zdW0oVFNNXzk1X3dlaWdodHMpKSwgDQogICAgY29tbXVuaXR5X1RTTV85NV9zZSA9IGlmX2Vsc2UobigpID09IDEsIGZpcnN0KFRTTV85NV9zZSksIHNxcnQoc3VtKFRTTV85NV93ZWlnaHRzKSAqIChuKCkgLSAxKSAvICgoKHN1bShUU01fOTVfd2VpZ2h0cyleMikgLSAoc3VtKFRTTV85NV93ZWlnaHRzXjIpKSkpKSksDQogICAgLmdyb3VwcyA9ICdkcm9wJw0KICApDQoNCnNhdmVSRFMoY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfbWVhbl80Q19zZW5zLCBmaWxlPSJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KYGBgDQoNCiMjICoqVGhlcm1hbCBzYWZldHkgbWFyZ2luKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCk9ubHkgdGhlIGNvZGUgYW5kIG91dHB1dHMgb2YgcG9wdWxhdGlvbi1sZXZlbCBtb2RlbHMgYXJlIHByZXNlbnRlZCBoZXJlLiBDb21tdW5pdHktbGV2ZWwgbW9kZWxzIHdlcmUgYWxzbyBmaXR0ZWQsIGFuZCB0aGUgb3V0cHV0cyBjYW4gYmUgZm91bmQgaW4gdGhlICoqUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy8qKiBmb2xkZXIuDQoNCiMjIyAqKkFjY2xpbWF0aW9uIHRvIHRoZSBtYXhpbXVtIHdlZWtseSBib2R5IHRlbXBlcmF0dXJlKiogDQoNCkhlcmUsIGFuaW1hbHMgd2VyZSBhY2NsaW1hdGVkIGRhaWx5IHRvIHRoZSB3ZWVrbHkgbWF4aW11bSBib2R5IHRlbXBlcmF0dXJlIGV4cGVyaWVuY2VkLCBhcyBvcHBvc2VkIHRvIHRoZSB3ZWVrbHkgbWVhbiBib2R5IHRlbXBlcmF0dXJlLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX1RTTV9zZW5zaXRpdml0eV9hbmFseXNpc19tYXhfYWNjLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19UU01fc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbWF4X2FjYy5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgUG9uZA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21heF9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgVFNNIG1vZGVscyBpbiBwYXJhbGxlbCANCnJ1bl9UU01fYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChUU00gfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJFRTTV9zZV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgVFNNID0gTkEsIA0KICAgIFRTTV9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkVFNNX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkVFNNX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBUU01fcHJlZCArIDEuOTYgKiBUU01fcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gVFNNX3ByZWQgLSAxLjk2ICogVFNNX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbWF4X2FjYy5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzX3BvcDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX1RTTV9hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCg0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9wb25kX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fcG9uZF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50X21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgcG9wX3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBwb3BfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgcG9wX3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQoNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsIA0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQojIFJ1biBtb2RlbHMgd2l0aCBNQ01DZ2xtbSANCnByaW9yICA8LSBsaXN0KFIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyKSwgDQogICAgICAgICAgICAgICBHID0gbGlzdChHMSA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEczID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwsIHZhcmlhdGlvbiBiZXR3ZWVuIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0ZSBzY2VuYXJpb3MNCm1vZGVsX01DTUMgPC0gTUNNQ2dsbW0oVFNNIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChUU01fc2UpOnVuaXRzLCAjIEdlbnVzLCBzcGVjaWVzLCBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MsIGFuZCB3ZWlnaHRzDQogICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9NQ01DLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVzcG9uc2UiKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShwcmVkaWN0aW9uID0gZW1tZWFuKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9NQ01DLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX21heF9hY2MucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19NQ01DZ2xtbV9UU01fbWF4X2FjYy5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9NQ01DX2NvbnRyYXN0IDwtIE1DTUNnbG1tKFRTTSB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgoVFNNX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX2NvbnRyYXN0X21heF9hY2MucmRzIikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX1RTTSkNCmBgYA0KDQojIyMjIyMgKipDb250cmFzdHMqKiANCg0KYGBge3J9DQptb2RlbF9NQ01DX1RTTV9jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX1RTTV9jb250cmFzdF9tYXhfYWNjLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfVFNNX2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjIyAqKk1vZGVsIGRpYWdub3N0aWNzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KcGxvdChtb2RlbF9NQ01DX1RTTSkNCmBgYA0KDQojIyMgKipOb3QgYXZlcmFnaW5nIFRTTSAobWF4aW11bSB0ZW1wZXJhdHVyZSkqKiANCg0KSGVyZSwgd2UgY2FsY3VsYXRlZCBUU00gYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWF4aW11bSBob3VybHkgYm9keSB0ZW1wZXJhdHVyZSBleHBlcmllbmNlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1RtYXguIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfVFNNX3NlbnNpdGl2aXR5X2FuYWx5c2lzX25vX2F2ZXJhZ2luZ19tYXhfdGVtcC5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfVFNNX3NlbnNpdGl2aXR5X2FuYWx5c2lzX25vX2F2ZXJhZ2luZ19tYXhfdGVtcC5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMgUG9uZA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgVFNNIG1vZGVscyBpbiBwYXJhbGxlbCB3aXRoIHRoZSBtYXhpbXVtIGhvdXJseSBib2R5IHRlbXBlcmF0dXJlIChUU01fZXh0cmVtZSkNCnJ1bl9UU01fYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQgDQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQoVFNNX2V4dHJlbWUgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJFRTTV9leHRyZW1lX3NlXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBUU01fZXh0cmVtZSA9IE5BLCANCiAgICBUU01fZXh0cmVtZV9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkVFNNX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkVFNNX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBUU01fcHJlZCArIDEuOTYgKiBUU01fcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gVFNNX3ByZWQgLSAxLjk2ICogVFNNX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF90ZW1wLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbWF4X3RlbXAucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfdGVtcC5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5KQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0c19wb3A8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9UU01fYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudF9tYXhfdGVtcC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudF9tYXhfdGVtcC5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmUyQ19tYXhfdGVtcC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X3RlbXAucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNENfbWF4X3RlbXAucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDX21heF90ZW1wLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfY3VycmVudF9tYXhfdGVtcC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9wb25kX2N1cnJlbnRfbWF4X3RlbXAucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTJDX21heF90ZW1wLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlMkNfbWF4X3RlbXAucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTRDX21heF90ZW1wLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlNENfbWF4X3RlbXAucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50X21heF90ZW1wLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2N1cnJlbnRfbWF4X3RlbXAucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQ19tYXhfdGVtcC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQ19tYXhfdGVtcC5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDX21heF90ZW1wLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDX21heF90ZW1wLnJkcyIpKQ0KYGBgDQoNCg0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgcG9wX3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBwb3BfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgcG9wX3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQoNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsIA0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQojIFJ1biBtb2RlbHMgd2l0aCBNQ01DZ2xtbSANCnByaW9yICA8LSBsaXN0KFIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyKSwgDQogICAgICAgICAgICAgICBHID0gbGlzdChHMSA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEczID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwsIHZhcmlhdGlvbiBiZXR3ZWVuIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0ZSBzY2VuYXJpb3MNCm1vZGVsX01DTUMgPC0gTUNNQ2dsbW0oVFNNX2V4dHJlbWUgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV9leHRyZW1lX3NlKTp1bml0cywgIyBHZW51cywgc3BlY2llcywgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzLCBhbmQgd2VpZ2h0cw0KICAgICAgICAgICAgICAgICAgICAgICBnaW52ZXJzZT1saXN0KHRpcC5sYWJlbCA9IEFpbnYpLA0KICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9NQ01DLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVzcG9uc2UiKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShwcmVkaWN0aW9uID0gZW1tZWFuKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9NQ01DLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX21heF90ZW1wLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfTUNNQ2dsbW1fVFNNX21heF90ZW1wLnJkcyIpDQoNCg0KIyBDb250cmFzdHMNCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX01DTUNfY29udHJhc3QgPC0gTUNNQ2dsbW0oVFNNX2V4dHJlbWUgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCAjIHN1YnN0cmF0ZV9jdXJyZW50IGFzIHRoZSByZWZlcmVuY2UgbGV2ZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV9leHRyZW1lX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX2NvbnRyYXN0X21heF90ZW1wLnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fbWF4X3RlbXAucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU00pDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19UU01fY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fY29udHJhc3RfbWF4X3RlbXAucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19UU01fY29udHJhc3QpDQpgYGANCg0KIyMjIyMjICoqTW9kZWwgZGlhZ25vc3RpY3MqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQpwbG90KG1vZGVsX01DTUNfVFNNKQ0KYGBgDQoNCg0KIyMjICoqTm90IGF2ZXJhZ2luZyBUU00gKDk1dGggcGVyY2VudGlsZSB0ZW1wZXJhdHVyZSkqKiANCg0KSGVyZSwgd2UgY2FsY3VsYXRlZCBUU00gYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgOTV0aCBwZXJjZW50aWxlIGhvdXJseSBib2R5IHRlbXBlcmF0dXJlIGV4cGVyaWVuY2VkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBDVG1heC4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19UU01fc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbm9fYXZlcmFnaW5nXzk1dGhfcGVyY2VudGlsZS5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfVFNNX3NlbnNpdGl2aXR5X2FuYWx5c2lzX25vX2F2ZXJhZ2luZ185NXRoX3BlcmNlbnRpbGUucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMjIEhlcmUsIHdlIHdpbGwgY2FsY3VsYXRlIFRTTSBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSA5NXRoIHBlcmNlbnRpbGUgaG91cmx5IG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlIGFuZCB0aGUgcHJlZGljdGVkIENUbWF4IGF0IHRoaXMgdGltZSBwb2ludA0KIyMgVGhpcyBpcyB0byBjb250cmFzdCB3aXRoIHRoZSB1c2Ugb2YgYXZlcmFnZSB2YWx1ZXMgKG1lYW4gbWF4aW11bSB0ZW1wZXJhdHVyZSBvZiB0aGUgd2FybWVzdCBxdWFydGVyKS4NCg0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIFBvbmQNCnBvcF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KDQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIFRTTSBtb2RlbHMgaW4gcGFyYWxsZWwgd2l0aCB0aGUgbWF4aW11bSBob3VybHkgYm9keSB0ZW1wZXJhdHVyZSAoVFNNXzk1KQ0KcnVuX1RTTV9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldCANCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChUU01fOTUgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJFRTTV85NV9zZV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgVFNNXzk1ID0gTkEsIA0KICAgIFRTTV85NV9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkVFNNX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkVFNNX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBUU01fcHJlZCArIDEuOTYgKiBUU01fcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gVFNNX3ByZWQgLSAxLjk2ICogVFNNX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5KQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0c19wb3A8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9UU01fYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCg0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2N1cnJlbnRfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9jdXJyZW50Xzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmUyQ185NXRoX3BlcmNlbnRpbGUucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Q185NXRoX3BlcmNlbnRpbGUucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCg0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2N1cnJlbnRfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfY3VycmVudF85NXRoX3BlcmNlbnRpbGUucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTJDXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTJDXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlNENfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlNENfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fYXJib3JlYWxfY3VycmVudF85NXRoX3BlcmNlbnRpbGUucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fYXJib3JlYWxfY3VycmVudF85NXRoX3BlcmNlbnRpbGUucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQ185NXRoX3BlcmNlbnRpbGUucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fYXJib3JlYWxfZnV0dXJlMkNfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fYXJib3JlYWxfZnV0dXJlNENfOTV0aF9wZXJjZW50aWxlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDXzk1dGhfcGVyY2VudGlsZS5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzKioNCg0KYGBge3IsIGV2YWw9Rn0NCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIiksIA0KICBwb3BfcG9uZF9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2N1cnJlbnQiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTJDIiksIA0KICBwb3BfcG9uZF9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmU0QyIpDQopDQoNCg0KYWxsX2RhdGEkc3BlY2llcyA8LSBhbGxfZGF0YSR0aXAubGFiZWwgDQoNCiMgTWF0Y2ggcGh5bG9nZW55IHRvIGRhdGFzZXQNCnRyZWUgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KdHJlZSA8LSBkcm9wLnRpcCh0cmVlLCB0cmVlJHRpcC5sYWJlbFstbWF0Y2goYWxsX2RhdGEkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAgDQoNCnRyZWUgPC0gZm9yY2UudWx0cmFtZXRyaWModHJlZSwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCkFpbnY8LWludmVyc2VBKHRyZWUpJEFpbnYNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCiMgUnVuIG1vZGVscyB3aXRoIE1DTUNnbG1tIA0KcHJpb3IgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzMgPSBsaXN0KFYgPSAxLCBmaXggPSAxKSkpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCwgdmFyaWF0aW9uIGJldHdlZW4gbWljcm9oYWJpdGF0IGFuZCBjbGltYXRlIHNjZW5hcmlvcw0KbW9kZWxfTUNNQyA8LSBNQ01DZ2xtbShUU01fOTUgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV85NV9zZSk6dW5pdHMsICMgR2VudXMsIHNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fOTV0aF9wZXJjZW50aWxlLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfTUNNQ2dsbW1fVFNNXzk1dGhfcGVyY2VudGlsZS5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9NQ01DX2NvbnRyYXN0IDwtIE1DTUNnbG1tKFRTTV85NSB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgoVFNNXzk1X3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX2NvbnRyYXN0Xzk1dGhfcGVyY2VudGlsZS5yZHMiKQ0KDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fOTV0aF9wZXJjZW50aWxlLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfVFNNKQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX01DTUNfVFNNX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fVFNNX2NvbnRyYXN0Xzk1dGhfcGVyY2VudGlsZS5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX1RTTV9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipNb2RlbCBkaWFnbm9zdGljcyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCnBsb3QobW9kZWxfTUNNQ19UU00pDQpgYGANCg0KDQojIyMgKipXaXRob3V0IG91dGxpZXJzKiogDQoNCkhlcmUsIHdlIGV4Y2x1ZGVkIHRoYXQgZmVsbCBiZWxvdyB0aGUgNXRoIHBlcmNlbnRpbGUgb3IgYWJvdmUgdGhlIDk1dGggcGVyY2VudGlsZSBtYXhpbXVtIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlIGZvciBlYWNoIHBvcHVsYXRpb24uIFdoaWxlIHRoZXNlIG1heSBub3QgYmUgdHJ1ZSBvdXRsaWVyIHZhbHVlcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGFuYWx5c2VzIHBlcmZvcm1lZCBpbiBwcmV2aW91cyBzdHVkaWVzIChlLmcuLCBQaW5reSBldCBhbC4sIDIwMTkuIE5hdHVyZSkNCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX1RTTV9zZW5zaXRpdml0eV9hbmFseXNpc19vdXRsaWVycy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfVFNNX3NlbnNpdGl2aXR5X2FuYWx5c2lzX291dGxpZXJzLnBicyoqIA0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIyBUaGVzZSBkYXRhc2V0cyBhcmUgZXhjbHVkaW5nICJvdXRsaWVyIiB2YWx1ZXMsIGkuZS4sIHZhbHVlcyB0aGF0IGFyZSBiZWxvdyB0aGUgNXRoIGFuZCBhYm92ZSB0aGUgOTV0aCBwZXJjZW50aWxlIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlIGZvciBlYWNoIHBvcHVsYXRpb24uIA0KIyMgVGhlc2UgYW5hbHlzZXMgd2VyZSBwZXJmb3JtZWQgdG8gZWNobyBwcmV2aW91cyB3b3JrIHRyaW1taW5nIG91dGxpZXIgdmFsdWVzIChlLmcuLCBQaW5za3kgZXQgYWwuLCAyMDE5LiBOYXR1cmUpDQoNCiMjIFN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQojIyBQb25kDQpwb3BfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCg0KIyBGdW5jdGlvbiB0byBydW4gcG9wdWxhdGlvbi1sZXZlbCBUU00gbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX1RTTV9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldCANCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChUU00gfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJFRTTV9zZV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgVFNNID0gTkEsIA0KICAgIFRTTV9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkVFNNX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkVFNNX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBUU01fcHJlZCArIDEuOTYgKiBUU01fcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gVFNNX3ByZWQgLSAxLjk2ICogVFNNX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fIiwgaGFiaXRhdF9zY2VuYXJpbywgIl93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5KQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0c19wb3A8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9UU01fYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fcG9uZF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfVFNNX3BvbmRfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9UU01fYXJib3JlYWxfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fYXJib3JlYWxfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9UU01fYXJib3JlYWxfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCiMjIyMgKipCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzKioNCg0KYGBge3IsIGV2YWw9Rn0NCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIiksIA0KICBwb3BfcG9uZF9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2N1cnJlbnQiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTJDIiksIA0KICBwb3BfcG9uZF9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmU0QyIpDQopDQoNCg0KYWxsX2RhdGEkc3BlY2llcyA8LSBhbGxfZGF0YSR0aXAubGFiZWwgDQoNCiMgTWF0Y2ggcGh5bG9nZW55IHRvIGRhdGFzZXQNCnRyZWUgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KdHJlZSA8LSBkcm9wLnRpcCh0cmVlLCB0cmVlJHRpcC5sYWJlbFstbWF0Y2goYWxsX2RhdGEkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAgDQoNCnRyZWUgPC0gZm9yY2UudWx0cmFtZXRyaWModHJlZSwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCkFpbnY8LWludmVyc2VBKHRyZWUpJEFpbnYNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCiMgUnVuIG1vZGVscyB3aXRoIE1DTUNnbG1tIA0KcHJpb3IgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzMgPSBsaXN0KFYgPSAxLCBmaXggPSAxKSkpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCwgdmFyaWF0aW9uIGJldHdlZW4gbWljcm9oYWJpdGF0IGFuZCBjbGltYXRlIHNjZW5hcmlvcw0KbW9kZWxfTUNNQyA8LSBNQ01DZ2xtbShUU00gfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKFRTTV9zZSk6dW5pdHMsICMgR2VudXMsIHNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0Kc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX01DTUNnbG1tX1RTTV93aXRob3V0X291dGxpZXJzLnJkcyIpDQoNCg0KIyBDb250cmFzdHMNCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX01DTUNfY29udHJhc3QgPC0gTUNNQ2dsbW0oVFNNIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgIyBzdWJzdHJhdGVfY3VycmVudCBhcyB0aGUgcmVmZXJlbmNlIGxldmVsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChUU01fc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fY29udHJhc3Rfd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0KDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19UU00gPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9UU01fd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX1RTTSkNCmBgYA0KDQojIyMjIyMgKipDb250cmFzdHMqKiANCg0KYGBge3J9DQptb2RlbF9NQ01DX1RTTV9jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX1RTTV9jb250cmFzdF93aXRob3V0X291dGxpZXJzLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfVFNNX2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjIyAqKk1vZGVsIGRpYWdub3N0aWNzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KcGxvdChtb2RlbF9NQ01DX1RTTSkNCmBgYA0KDQoNCiMjICoqQ1RtYXgqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KT25seSB0aGUgY29kZSBhbmQgb3V0cHV0cyBvZiBwb3B1bGF0aW9uLWxldmVsIG1vZGVscyBhcmUgcHJlc2VudGVkIGhlcmUuIENvbW11bml0eS1sZXZlbCBtb2RlbHMgd2VyZSBhbHNvIGZpdHRlZCwgYW5kIHRoZSBvdXRwdXRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgKipSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvKiogZm9sZGVyLiANCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1heGltdW0gd2Vla2x5IGJvZHkgdGVtcGVyYXR1cmUqKiANCg0KSGVyZSwgYW5pbWFscyB3ZXJlIGFjY2xpbWF0ZWQgZGFpbHkgdG8gdGhlIHdlZWtseSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQsIGFzIG9wcG9zZWQgdG8gdGhlIHdlZWtseSBtZWFuIGJvZHkgdGVtcGVyYXR1cmUuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfQ1RtYXhfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbWF4X2FjYy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfQ1RtYXhfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbWF4X2FjYy5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KDQojIExvYWQgcG9wdWxhdGlvbi1sZXZlbCBkYXRhDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgUG9uZA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21heF9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgQ1RtYXggbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX0NUbWF4X2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIHNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihkYXRhc2V0JHRpcC5sYWJlbCksICcgJykNCiAgZGF0YXNldCRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCiAgZGF0YXNldCRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KICANCiAgZGF0YSA8LSBkYXRhc2V0IA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KENUbWF4IH4gcyhsYXQsIGJzID0gInRwIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAoMSB8IGdlbnVzL3NwZWNpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gMS8oZGF0YSRDVG1heF9zZV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgQ1RtYXggPSBOQSwgDQogICAgQ1RtYXhfc2UgPSBOQSwgDQogICAgZ2VudXMgPSBOQSwgDQogICAgc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJENUbWF4X3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkQ1RtYXhfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IENUbWF4X3ByZWQgKyAxLjk2ICogQ1RtYXhfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gQ1RtYXhfcHJlZCAtIDEuOTYgKiBDVG1heF9wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4XyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbWF4X2FjYy5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQp9DQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIHBvbmRfY3VycmVudCA9IHBvcF9wb25kX2N1cnJlbnQsDQogIHBvbmRfZnV0dXJlMkMgPSBwb3BfcG9uZF9mdXR1cmUyQywNCiAgcG9uZF9mdXR1cmU0QyA9IHBvcF9wb25kX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IHBvcF9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gcG9wX3N1Yl9mdXR1cmU0QywNCiAgYXJib3JlYWxfY3VycmVudCA9IHBvcF9hcmJfY3VycmVudCwNCiAgYXJib3JlYWxfZnV0dXJlMkMgPSBwb3BfYXJiX2Z1dHVyZTJDLA0KICBhcmJvcmVhbF9mdXR1cmU0QyA9IHBvcF9hcmJfZnV0dXJlNEMNCikgDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MikpIA0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0c19wb3A8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9DVG1heF9hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X0NUbWF4X3BvbmRfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9wb25kX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9wb25kX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X3BvbmRfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9wb25kX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X3BvbmRfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9hcmJvcmVhbF9jdXJyZW50X21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyAqKkJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KYWxsX2RhdGEgPC0gYmluZF9yb3dzKA0KICBwb3Bfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBwb3Bfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIHBvcF9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgcG9wX2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBwb3BfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgcG9wX2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKSwgDQogIHBvcF9wb25kX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfY3VycmVudCIpLCANCiAgcG9wX3BvbmRfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlMkMiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTRDIikNCikNCg0Kc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGFsbF9kYXRhJHRpcC5sYWJlbCksICcgJykNCmFsbF9kYXRhJGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KYWxsX2RhdGEkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCg0KYWxsX2RhdGEkc3BlY2llcyA8LSBhbGxfZGF0YSR0aXAubGFiZWwNCg0KIyBNYXRjaCBwaHlsb2dlbnkgdG8gZGF0YXNldA0KdHJlZSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQp0cmVlIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChhbGxfZGF0YSR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICANCg0KdHJlZSA8LSBmb3JjZS51bHRyYW1ldHJpYyh0cmVlLCBtZXRob2Q9ImV4dGVuZCIpICMgRm9yY2UgdGhlIHRyZWUgdG8gYmUgdWx0cmFtZXRyaWMNCg0KQWludjwtaW52ZXJzZUEodHJlZSkkQWludg0KYWxsX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfZGF0YSkNCg0KIyBSdW4gbW9kZWxzIHdpdGggTUNNQ2dsbW0gDQpwcmlvciAgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgRyA9IGxpc3QoRzEgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEcyID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCkpKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwsIHZhcmlhdGlvbiBiZXR3ZWVuIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0ZSBzY2VuYXJpb3MNCiMgSGFkIHRvIHJlbW92ZSBwaHlsb2dlbmV0aWMgZWZmZWN0cyBhbmQgd2VpZ2h0cyBiZWNhdXNlIHRoaXMgbW9kZWwgZmFpbGVkIHRvIGVzdGltYXRlIHZhcmlhbmNlIGNvbXBvbmVudHMuIE9ubHkgYSBuZXN0ZWQgZ2VudXMvc3BlY2llcyBzdHJ1Y3R1cmUgd2FzIGtlcHQuDQptb2RlbF9NQ01DIDwtIE1DTUNnbG1tKENUbWF4IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIGdlbnVzOnNwZWNpZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfTUNNQywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfTUNNQywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fQ1RtYXhfbWF4X2FjYy5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfTUNNQ2dsbW1fQ1RtYXhfbWF4X2FjYy5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIEhhZCB0byByZW1vdmUgcGh5bG9nZW5ldGljIGVmZmVjdHMgYW5kIHdlaWdodHMgYmVjYXVzZSB0aGlzIG1vZGVsIGZhaWxlZCB0byBlc3RpbWF0ZSB2YXJpYW5jZSBjb21wb25lbnRzLiBPbmx5IGEgbmVzdGVkIGdlbnVzL3NwZWNpZXMgc3RydWN0dXJlIHdhcyBrZXB0Lg0KbW9kZWxfTUNNQ19jb250cmFzdCA8LSBNQ01DZ2xtbShDVG1heCB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGdlbnVzICsgZ2VudXM6c3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX0NUbWF4X2NvbnRyYXN0X21heF9hY2MucmRzIikNCg0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKk92ZXJhbGwgbWVhbnMqKiANCg0KYGBge3J9DQptb2RlbF9NQ01DX0NUbWF4IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9DVG1heF9tYXhfYWNjLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX01DTUNfQ1RtYXgpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19DVG1heF9jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fQ1RtYXhfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4X2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjIyAqKk1vZGVsIGRpYWdub3N0aWNzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQ0KcGxvdChtb2RlbF9NQ01DX0NUbWF4KQ0KYGBgDQoNCiMjIyAqKldpdGhvdXQgb3V0bGllcnMqKiANCg0KSGVyZSwgd2UgZXhjbHVkZWQgdGhhdCBmZWxsIGJlbG93IHRoZSA1dGggcGVyY2VudGlsZSBvciBhYm92ZSB0aGUgOTV0aCBwZXJjZW50aWxlIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgZm9yIGVhY2ggcG9wdWxhdGlvbi4gV2hpbGUgdGhlc2UgbWF5IG5vdCBiZSB0cnVlIG91dGxpZXIgdmFsdWVzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYW5hbHlzZXMgcGVyZm9ybWVkIGluIHByZXZpb3VzIHN0dWRpZXMgKGUuZy4sIFBpbmt5IGV0IGFsLiwgMjAxOS4gTmF0dXJlKQ0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfQ1RtYXhfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfb3V0bGllcnMuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX0NUbWF4X3NlbnNpdGl2aXR5X2FuYWx5c2lzX291dGxpZXJzLnBicyoqIA0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIExvYWQgcG9wdWxhdGlvbi1sZXZlbCBkYXRhDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KIyMgUG9uZA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgQ1RtYXggbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX0NUbWF4X2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIHNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihkYXRhc2V0JHRpcC5sYWJlbCksICcgJykNCiAgZGF0YXNldCRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCiAgZGF0YXNldCRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KICANCiAgZGF0YSA8LSBkYXRhc2V0IA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KENUbWF4IH4gcyhsYXQsIGJzID0gInRwIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAoMSB8IGdlbnVzL3NwZWNpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gMS8oZGF0YSRDVG1heF9zZV4yKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgQ1RtYXggPSBOQSwgDQogICAgQ1RtYXhfc2UgPSBOQSwgDQogICAgZ2VudXMgPSBOQSwgDQogICAgc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJENUbWF4X3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkQ1RtYXhfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IENUbWF4X3ByZWQgKyAxLjk2ICogQ1RtYXhfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gQ1RtYXhfcHJlZCAtIDEuOTYgKiBDVG1heF9wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4XyIsIGhhYml0YXRfc2NlbmFyaW8sICJfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQp9DQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIHBvbmRfY3VycmVudCA9IHBvcF9wb25kX2N1cnJlbnQsDQogIHBvbmRfZnV0dXJlMkMgPSBwb3BfcG9uZF9mdXR1cmUyQywNCiAgcG9uZF9mdXR1cmU0QyA9IHBvcF9wb25kX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IHBvcF9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gcG9wX3N1Yl9mdXR1cmU0QywNCiAgYXJib3JlYWxfY3VycmVudCA9IHBvcF9hcmJfY3VycmVudCwNCiAgYXJib3JlYWxfZnV0dXJlMkMgPSBwb3BfYXJiX2Z1dHVyZTJDLA0KICBhcmJvcmVhbF9mdXR1cmU0QyA9IHBvcF9hcmJfZnV0dXJlNEMNCikgDQoNCiMgU2V0IHVwIHBhcmFsbGVsIHByb2Nlc3NpbmcNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MikpIA0KDQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLm1heFNpemUgPSA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHNfcG9wPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fQ1RtYXhfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2N1cnJlbnRfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2N1cnJlbnRfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9zdWJzdHJhdGVfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTJDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9DVG1heF9wb25kX2N1cnJlbnRfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfcG9uZF9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9wb25kX2Z1dHVyZTJDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfcG9uZF9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9DVG1heF9wb25kX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2N1cnJlbnRfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTJDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTJDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipCYXllc2lhbiBsaW5lYXIgbWl4ZWQgbW9kZWxzKioNCg0KYGBge3IsIGV2YWw9Rn0NCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIiksIA0KICBwb3BfcG9uZF9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2N1cnJlbnQiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTJDIiksIA0KICBwb3BfcG9uZF9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmU0QyIpDQopDQoNCg0KYWxsX2RhdGEkc3BlY2llcyA8LSBhbGxfZGF0YSR0aXAubGFiZWwNCg0Kc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGFsbF9kYXRhJHRpcC5sYWJlbCksICcgJykNCmFsbF9kYXRhJGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KYWxsX2RhdGEkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCg0KIyBNYXRjaCBwaHlsb2dlbnkgdG8gZGF0YXNldA0KdHJlZSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQp0cmVlIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChhbGxfZGF0YSR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pICANCg0KdHJlZSA8LSBmb3JjZS51bHRyYW1ldHJpYyh0cmVlLCBtZXRob2Q9ImV4dGVuZCIpICMgRm9yY2UgdGhlIHRyZWUgdG8gYmUgdWx0cmFtZXRyaWMNCg0KQWludjwtaW52ZXJzZUEodHJlZSkkQWludg0KYWxsX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShhbGxfZGF0YSkNCg0KIyBSdW4gbW9kZWxzIHdpdGggTUNNQ2dsbW0gDQpwcmlvciAgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgRyA9IGxpc3QoRzEgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEcyID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMyA9IGxpc3QoViA9IDEsIGZpeCA9IDEpKSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsLCB2YXJpYXRpb24gYmV0d2VlbiBtaWNyb2hhYml0YXQgYW5kIGNsaW1hdGUgc2NlbmFyaW9zDQptb2RlbF9NQ01DIDwtIE1DTUNnbG1tKENUbWF4IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEsICMgTm8gaW50ZXJjZXB0DQogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gc3BlY2llcyArIHRpcC5sYWJlbCArIGlkaChDVG1heF9zZSk6dW5pdHMsICMgU3BlY2llcywgcGh5bG9nZW5ldGljIHJlbGF0ZWRuZXNzLCBhbmQgd2VpZ2h0cw0KICAgICAgICAgICAgICAgICAgICAgICBnaW52ZXJzZT1saXN0KHRpcC5sYWJlbCA9IEFpbnYpLA0KICAgICAgICAgICAgICAgICAgICAgICBzaW5ndWxhci5vaz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IHByaW9yLA0KICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBkYXRhLmZyYW1lKGVtbWVhbnMobW9kZWxfTUNNQywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjcz0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9YWxsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlc3BvbnNlIikpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUocHJlZGljdGlvbiA9IGVtbWVhbikNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfTUNNQywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fQ1RtYXhfd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfTUNNQ2dsbW1fQ1RtYXhfd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0KDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIEhhZCB0byByZW1vdmUgcGh5bG9nZW5ldGljIGVmZmVjdHMgYW5kIHdlaWdodHMgYmVjYXVzZSB0aGlzIG1vZGVsIGZhaWxlZCB0byBlc3RpbWF0ZSB2YXJpYW5jZSBjb21wb25lbnRzLiBPbmx5IGEgbmVzdGVkIGdlbnVzL3NwZWNpZXMgc3RydWN0dXJlIHdhcyBrZXB0Lg0KDQpwcmlvciAgPC0gbGlzdChSID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiksIA0KICAgICAgICAgICAgICAgRyA9IGxpc3QoRzEgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEcyID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCkpKSANCg0KbW9kZWxfTUNNQ19jb250cmFzdCA8LSBNQ01DZ2xtbShDVG1heCB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGdlbnVzICsgZ2VudXM6c3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX0NUbWF4X2NvbnRyYXN0X3dpdGhvdXRfb3V0bGllcnMucmRzIikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19DVG1heCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fQ1RtYXhfd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX0NUbWF4KQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX01DTUNfQ1RtYXhfY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX0NUbWF4X2NvbnRyYXN0X3dpdGhvdXRfb3V0bGllcnMucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19DVG1heF9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipNb2RlbCBkaWFnbm9zdGljcyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCnBsb3QobW9kZWxfTUNNQ19DVG1heCkNCmBgYA0KDQoNCiMjICoqTWF4aW11bSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQoNCk9ubHkgdGhlIGNvZGUgYW5kIG91dHB1dHMgb2YgcG9wdWxhdGlvbi1sZXZlbCBtb2RlbHMgYXJlIHByZXNlbnRlZCBoZXJlLiBDb21tdW5pdHktbGV2ZWwgbW9kZWxzIHdlcmUgYWxzbyBmaXR0ZWQsIGFuZCB0aGUgb3V0cHV0cyBjYW4gYmUgZm91bmQgaW4gdGhlICoqUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzLyoqIGZvbGRlci4gDQoNCiMjIyAqKkFjY2xpbWF0aW9uIHRvIHRoZSBtYXhpbXVtIHdlZWtseSBib2R5IHRlbXBlcmF0dXJlKiogDQoNCkhlcmUsIGFuaW1hbHMgd2VyZSBhY2NsaW1hdGVkIGRhaWx5IHRvIHRoZSB3ZWVrbHkgbWF4aW11bSBib2R5IHRlbXBlcmF0dXJlIGV4cGVyaWVuY2VkLCBhcyBvcHBvc2VkIHRvIHRoZSB3ZWVrbHkgbWVhbiBib2R5IHRlbXBlcmF0dXJlLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX21heF90ZW1wX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX21heF90ZW1wX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCiMjIFN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBQb25kDQpwb3BfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWF4X2FjY19jdXJyZW50LnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tYXhfYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCg0KIyBGdW5jdGlvbiB0byBydW4gcG9wdWxhdGlvbi1sZXZlbCBtYXhfdGVtcCBtb2RlbHMgaW4gcGFyYWxsZWwgDQpydW5fbWF4X3RlbXBfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQgDQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQobWF4X3RlbXAgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSAxLyhkYXRhJG1heF90ZW1wX3NlXjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBtYXhfdGVtcCA9IE5BLCANCiAgICBtYXhfdGVtcF9zZSA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkbWF4X3RlbXBfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRtYXhfdGVtcF9wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gbWF4X3RlbXBfcHJlZCArIDEuOTYgKiBtYXhfdGVtcF9wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBtYXhfdGVtcF9wcmVkIC0gMS45NiAqIG1heF90ZW1wX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19wb3BfbGF0X21heF90ZW1wXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbWF4X2FjYy5yZHMiKSkNCn0NCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgcG9uZF9jdXJyZW50ID0gcG9wX3BvbmRfY3VycmVudCwNCiAgcG9uZF9mdXR1cmUyQyA9IHBvcF9wb25kX2Z1dHVyZTJDLA0KICBwb25kX2Z1dHVyZTRDID0gcG9wX3BvbmRfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDLA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0Qw0KKSANCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkgDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzX3BvcDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX21heF90ZW1wX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjIyMgKipQb25kIG9yIHdldGxhbmQqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3BvbmRfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9wb25kX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50X21heF9hY2MucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyAqKkJheWVzaWFuIGxpbmVhciBtaXhlZCBtb2RlbHMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KYWxsX2RhdGEgPC0gYmluZF9yb3dzKA0KICBwb3Bfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBwb3Bfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIHBvcF9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgcG9wX2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBwb3BfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgcG9wX2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKSwgDQogIHBvcF9wb25kX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfY3VycmVudCIpLCANCiAgcG9wX3BvbmRfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlMkMiKSwgDQogIHBvcF9wb25kX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJwb25kX2Z1dHVyZTRDIikNCikNCg0KDQphbGxfZGF0YSRzcGVjaWVzIDwtIGFsbF9kYXRhJHRpcC5sYWJlbA0KDQojIE1hdGNoIHBoeWxvZ2VueSB0byBkYXRhc2V0DQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCnRyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGFsbF9kYXRhJHRpcC5sYWJlbCwgdHJlZSR0aXAubGFiZWwpXSkgIA0KDQp0cmVlIDwtIGZvcmNlLnVsdHJhbWV0cmljKHRyZWUsIG1ldGhvZD0iZXh0ZW5kIikgIyBGb3JjZSB0aGUgdHJlZSB0byBiZSB1bHRyYW1ldHJpYw0KDQpBaW52PC1pbnZlcnNlQSh0cmVlKSRBaW52DQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpwbGFuKHNlcXVlbnRpYWwpIA0KDQojIFJ1biBtb2RlbHMgd2l0aCBNQ01DZ2xtbSANCnByaW9yICA8LSBsaXN0KFIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyKSwgDQogICAgICAgICAgICAgICBHID0gbGlzdChHMSA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzIgPSBsaXN0KFYgPSAxLCBudSA9IDAuMDAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5tdSA9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLlYgPSAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEczID0gbGlzdChWID0gMSwgZml4ID0gMSkpKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwsIHZhcmlhdGlvbiBiZXR3ZWVuIG1pY3JvaGFiaXRhdCBhbmQgY2xpbWF0ZSBzY2VuYXJpb3MNCm1vZGVsX01DTUMgPC0gTUNNQ2dsbW0obWF4X3RlbXAgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSwgIyBObyBpbnRlcmNlcHQNCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKG1heF90ZW1wX3NlKTp1bml0cywgIyBTcGVjaWVzLCBwaHlsb2dlbmV0aWMgcmVsYXRlZG5lc3MsIGFuZCB3ZWlnaHRzDQogICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGRhdGEuZnJhbWUoZW1tZWFucyhtb2RlbF9NQ01DLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzPSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1hbGxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVzcG9uc2UiKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShwcmVkaWN0aW9uID0gZW1tZWFuKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9NQ01DLCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9tYXhfdGVtcF9tYXhfYWNjLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19NQ01DZ2xtbV9tYXhfdGVtcF9tYXhfYWNjLnJkcyIpDQoNCg0KIyBDb250cmFzdHMNCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX01DTUNfY29udHJhc3QgPC0gTUNNQ2dsbW0obWF4X3RlbXAgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCAjIHN1YnN0cmF0ZV9jdXJyZW50IGFzIHRoZSByZWZlcmVuY2UgbGV2ZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBzcGVjaWVzICsgdGlwLmxhYmVsICsgaWRoKG1heF90ZW1wX3NlKTp1bml0cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnZlcnNlPWxpc3QodGlwLmxhYmVsID0gQWludiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmd1bGFyLm9rPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gcHJpb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9NQ01DX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9NQ01DZ2xtbV9tYXhfdGVtcF9jb250cmFzdF9tYXhfYWNjLnJkcyIpDQoNCmBgYA0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19tYXhfdGVtcCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fbWF4X3RlbXBfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX21heF90ZW1wKQ0KYGBgDQoNCiMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19tYXhfdGVtcF9jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fbWF4X3RlbXBfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX21heF90ZW1wX2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgZGlhZ25vc3RpY3MqKiANCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9DQpwbG90KG1vZGVsX01DTUNfbWF4X3RlbXApDQpgYGANCg0KDQojIyMgKipXaXRob3V0IG91dGxpZXJzKiogDQoNCkhlcmUsIHdlIGV4Y2x1ZGVkIHRoYXQgZmVsbCBiZWxvdyB0aGUgNXRoIHBlcmNlbnRpbGUgb3IgYWJvdmUgdGhlIDk1dGggcGVyY2VudGlsZSBtYXhpbXVtIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlIGZvciBlYWNoIHBvcHVsYXRpb24uIFdoaWxlIHRoZXNlIG1heSBub3QgYmUgdHJ1ZSBvdXRsaWVyIHZhbHVlcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGFuYWx5c2VzIHBlcmZvcm1lZCBpbiBwcmV2aW91cyBzdHVkaWVzIChlLmcuLCBQaW5reSBldCBhbC4sIDIwMTkuIE5hdHVyZSkNCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX21heF90ZW1wX3NlbnNpdGl2aXR5X2FuYWx5c2lzX291dGxpZXJzLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19tYXhfdGVtcF9zZW5zaXRpdml0eV9hbmFseXNpc19vdXRsaWVycy5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMb2FkIHBvcHVsYXRpb24tbGV2ZWwgZGF0YQ0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCiMjIFBvbmQNCnBvcF9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50X3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmUyQ19zZW5zaXRpdml0eV9hbmFseXNpcy5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfc2Vuc2l0aXZpdHlfYW5hbHlzaXMucmRzIikNCg0KDQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIG1heF90ZW1wIG1vZGVscyBpbiBwYXJhbGxlbCANCnJ1bl9tYXhfdGVtcF9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldCANCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChtYXhfdGVtcCB+IHMobGF0LCBicyA9ICJ0cCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKDEgfCBnZW51cy9zcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IDEvKGRhdGEkbWF4X3RlbXBfc2VeMiksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIG1heF90ZW1wID0gTkEsIA0KICAgIG1heF90ZW1wX3NlID0gTkEsIA0KICAgIGdlbnVzID0gTkEsIA0KICAgIHNwZWNpZXMgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRtYXhfdGVtcF9wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJG1heF90ZW1wX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBtYXhfdGVtcF9wcmVkICsgMS45NiAqIG1heF90ZW1wX3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IG1heF90ZW1wX3ByZWQgLSAxLjk2ICogbWF4X3RlbXBfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KfQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBwb25kX2N1cnJlbnQgPSBwb3BfcG9uZF9jdXJyZW50LA0KICBwb25kX2Z1dHVyZTJDID0gcG9wX3BvbmRfZnV0dXJlMkMsDQogIHBvbmRfZnV0dXJlNEMgPSBwb3BfcG9uZF9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMsDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDDQopIA0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKSANCg0Kb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkpDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzX3BvcDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX21heF90ZW1wX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTJDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9zdWJzdHJhdGVfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX3BvbmRfY3VycmVudF93aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlMkNfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX3BvbmRfZnV0dXJlNENfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9mdXR1cmU0Q193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9jdXJyZW50X3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2N1cnJlbnRfd2l0aG91dF9vdXRsaWVycy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9tYXhfdGVtcF9hcmJvcmVhbF9mdXR1cmUyQ193aXRob3V0X291dGxpZXJzLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikpDQpgYGANCg0KDQojIyMjICoqQmF5ZXNpYW4gbGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpLCANCiAgcG9wX3BvbmRfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9jdXJyZW50IiksIA0KICBwb3BfcG9uZF9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAicG9uZF9mdXR1cmUyQyIpLCANCiAgcG9wX3BvbmRfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInBvbmRfZnV0dXJlNEMiKQ0KKQ0KDQoNCmFsbF9kYXRhJHNwZWNpZXMgPC0gYWxsX2RhdGEkdGlwLmxhYmVsDQoNCiMgTWF0Y2ggcGh5bG9nZW55IHRvIGRhdGFzZXQNCnRyZWUgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyZWVfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KdHJlZSA8LSBkcm9wLnRpcCh0cmVlLCB0cmVlJHRpcC5sYWJlbFstbWF0Y2goYWxsX2RhdGEkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSAgDQoNCnRyZWUgPC0gZm9yY2UudWx0cmFtZXRyaWModHJlZSwgbWV0aG9kPSJleHRlbmQiKSAjIEZvcmNlIHRoZSB0cmVlIHRvIGJlIHVsdHJhbWV0cmljDQoNCkFpbnY8LWludmVyc2VBKHRyZWUpJEFpbnYNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCnBsYW4oc2VxdWVudGlhbCkgDQoNCiMgUnVuIG1vZGVscyB3aXRoIE1DTUNnbG1tIA0KcHJpb3IgIDwtIGxpc3QoUiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIpLCANCiAgICAgICAgICAgICAgIEcgPSBsaXN0KEcxID0gbGlzdChWID0gMSwgbnUgPSAwLjAwMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEubXUgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5WID0gMTAwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBHMiA9IGxpc3QoViA9IDEsIG51ID0gMC4wMDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLm11ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuViA9IDEwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgRzMgPSBsaXN0KFYgPSAxLCBmaXggPSAxKSkpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBJbnRlcmNlcHQtbGVzcyBtb2RlbCwgdmFyaWF0aW9uIGJldHdlZW4gbWljcm9oYWJpdGF0IGFuZCBjbGltYXRlIHNjZW5hcmlvcw0KbW9kZWxfTUNNQyA8LSBNQ01DZ2xtbShtYXhfdGVtcCB+IGhhYml0YXRfc2NlbmFyaW8gLSAxLCAjIE5vIGludGVyY2VwdA0KICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgobWF4X3RlbXBfc2UpOnVuaXRzLCAjIFNwZWNpZXMsIHBoeWxvZ2VuZXRpYyByZWxhdGVkbmVzcywgYW5kIHdlaWdodHMNCiAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShlbW1lYW5zKG1vZGVsX01DTUMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3M9ImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWFsbF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZXNwb25zZSIpKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKHByZWRpY3Rpb24gPSBlbW1lYW4pDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX01DTUMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX21heF90ZW1wX3dpdGhvdXRfb3V0bGllcnMucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX01DTUNnbG1tX21heF90ZW1wX3dpdGhvdXRfb3V0bGllcnMucmRzIikNCg0KDQojIENvbnRyYXN0cw0KYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KbW9kZWxfTUNNQ19jb250cmFzdCA8LSBNQ01DZ2xtbShtYXhfdGVtcCB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IiksICMgc3Vic3RyYXRlX2N1cnJlbnQgYXMgdGhlIHJlZmVyZW5jZSBsZXZlbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IHNwZWNpZXMgKyB0aXAubGFiZWwgKyBpZGgobWF4X3RlbXBfc2UpOnVuaXRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludmVyc2U9bGlzdCh0aXAubGFiZWwgPSBBaW52KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ3VsYXIub2s9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBwcmlvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQpzYXZlUkRTKG1vZGVsX01DTUNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX21heF90ZW1wX2NvbnRyYXN0X3dpdGhvdXRfb3V0bGllcnMucmRzIikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfTUNNQ19tYXhfdGVtcCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfTUNNQ2dsbW1fbWF4X3RlbXBfd2l0aG91dF9vdXRsaWVycy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9NQ01DX21heF90ZW1wKQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX01DTUNfbWF4X3RlbXBfY29udHJhc3QgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX01DTUNnbG1tX21heF90ZW1wX2NvbnRyYXN0X3dpdGhvdXRfb3V0bGllcnMucmRzIikNCnN1bW1hcnkobW9kZWxfTUNNQ19tYXhfdGVtcF9jb250cmFzdCkNCmBgYA0KDQojIyMjIyMgKipNb2RlbCBkaWFnbm9zdGljcyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0NCnBsb3QobW9kZWxfTUNNQ19tYXhfdGVtcCkNCmBgYA0KDQoNCiMjICoqT3ZlcmhlYXRpbmcgcmlzayoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMgKipBY2NsaW1hdGlvbiB0byB0aGUgbWF4aW11bSB3ZWVrbHkgYm9keSB0ZW1wZXJhdHVyZSoqIA0KDQpIZXJlLCBhbmltYWxzIHdlcmUgYWNjbGltYXRlZCBkYWlseSB0byB0aGUgd2Vla2x5IG1heGltdW0gYm9keSB0ZW1wZXJhdHVyZSBleHBlcmllbmNlZCwgYXMgb3Bwb3NlZCB0byB0aGUgd2Vla2x5IG1lYW4gYm9keSB0ZW1wZXJhdHVyZS4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19vdmVyaGVhdGluZ19yaXNrX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX3Jpc2tfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbWF4X2FjYy5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBXZSBkbyBub3QgbG9hZCBwb25kIGRhdGEgYmVjYXVzZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0IGluIHdhdGVyIGJvZGllcw0KDQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIG92ZXJoZWF0aW5nX3Jpc2sgbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX292ZXJoZWF0aW5nX3Jpc2tfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChvdmVyaGVhdGluZ19yaXNrIH4gcyhsYXQsIGJzID0gInRwIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAoMSB8IGdlbnVzL3NwZWNpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBvdmVyaGVhdGluZ19yaXNrID0gTkEsIA0KICAgIGdlbnVzID0gTkEsIA0KICAgIHNwZWNpZXMgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gb3ZlcmhlYXRpbmdfcmlza19wcmVkICsgMS45NiAqIG92ZXJoZWF0aW5nX3Jpc2tfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gb3ZlcmhlYXRpbmdfcmlza19wcmVkIC0gMS45NiAqIG92ZXJoZWF0aW5nX3Jpc2tfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQp9DQoNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMNCikNCg0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9vdmVyaGVhdGluZ19yaXNrX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19hcmJvcmVhbF9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9yaXNrIDwtICBnbG1lcihvdmVyaGVhdGluZ19yaXNrIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcmlzaywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCiMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfcmlzaywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfbWF4X2FjYy5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX3Jpc2tfbWF4X2FjYy5yZHMiKQ0KDQojIENvbnRyYXN0cw0KYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KbW9kZWxfcmlza19jb250cmFzdCA8LSAgZ2xtZXIob3ZlcmhlYXRpbmdfcmlzayB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IikgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQoNCnNhdmVSRFMobW9kZWxfcmlza19jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKk92ZXJhbGwgbWVhbnMqKiANCg0KYGBge3J9DQojIE1vZGVsIHN1bW1hcnkNCm1vZGVsX292ZXJoZWF0aW5nX3Jpc2sgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19yaXNrX21heF9hY2MucmRzIikNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfcmlzaykNCg0KIyBQcmVkaWN0aW9ucw0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19yaXNrX21heF9hY2MucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfb3ZlcmhlYXRpbmdfcmlza19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9vdmVyaGVhdGluZ19yaXNrX2NvbnRyYXN0KQ0KYGBgDQoNCiMjIyAqKlVuY2VydGFpbiBlc3RpbWF0ZXMqKiANCg0KSGVyZSwgd2UgY2FwcGVkIHRoZSBkaXN0cmlidXRpb24gb2Ygc2ltdWxhdGVkIENUbWF4IGVzdGltYXRlcyB0byB0aGUgImJpb2xvZ2ljYWwgcmFuZ2UiLCB0aGF0IGlzLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGFsbCBDVG1heCBlc3RpbWF0cyBhY3Jvc3Mgc3BlY2llcyAocy5lLiByYW5nZSBhY3Jvc3MgaGFiaXRhdHM6IDEuODQtMi4xNykuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfb3ZlcmhlYXRpbmdfcmlza19zZW5zaXRpdml0eV9hbmFseXNpc19sYXJnZV9zZS5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfb3ZlcmhlYXRpbmdfcmlza19zZW5zaXRpdml0eV9hbmFseXNpc19sYXJnZV9zZS5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMb2FkIHBvcHVsYXRpb24tbGV2ZWwgZGF0YQ0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9sYXJnZV9zZS5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgb3ZlcmhlYXRpbmdfcmlzayBtb2RlbHMgaW4gcGFyYWxsZWwgDQpydW5fb3ZlcmhlYXRpbmdfcmlza19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KG92ZXJoZWF0aW5nX3Jpc2sgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKCksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIG92ZXJoZWF0aW5nX3Jpc2sgPSBOQSwgDQogICAgZ2VudXMgPSBOQSwgDQogICAgc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbGFyZ2Vfc2UucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9sYXJnZV9zZS5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IHBvcF9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gcG9wX3N1Yl9mdXR1cmU0Qw0KKQ0KDQoNCiMgUnVuIGluIHBhcmFsbGVsDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTIpKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9vdmVyaGVhdGluZ19yaXNrX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqVmVnZXRhdGVkIHN1YnN0cmF0ZSoqIA0KDQpDdXJyZW50IGNsaW1hdGUNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N1YnN0cmF0ZV9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N1YnN0cmF0ZV9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N1YnN0cmF0ZV9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3Vic3RyYXRlX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfY3VycmVudF9sYXJnZV9zZS5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCsyQykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX2FyYm9yZWFsX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfYXJib3JlYWxfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KIyMjIyAqKkxpbmVhciBtaXhlZCBtb2RlbHMqKg0KDQpgYGB7ciwgZXZhbCA9IEZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9yaXNrIDwtICBnbG1lcihvdmVyaGVhdGluZ19yaXNrIH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcmlzaywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9yaXNrLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfcmlza19sYXJnZV9zZS5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX3Jpc2tfbGFyZ2Vfc2UucmRzIikNCg0KIyMjIyBDb250cmFzdHMgDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfcmlza19jb250cmFzdCA8LSAgZ2xtZXIob3ZlcmhlYXRpbmdfcmlzayB+IHJlbGV2ZWwoaGFiaXRhdF9zY2VuYXJpbywgcmVmID0gInN1YnN0cmF0ZV9jdXJyZW50IikgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIFNhdmUgbW9kZWwgDQpzYXZlUkRTKG1vZGVsX3Jpc2tfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19yaXNrX2NvbnRyYXN0X2xhcmdlX3NlLnJkcyIpDQpgYGANCg0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5DQptb2RlbF9vdmVyaGVhdGluZ19yaXNrIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfcmlza19sYXJnZV9zZS5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9vdmVyaGVhdGluZ19yaXNrKQ0KDQojIFByZWRpY3Rpb25zDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX3Jpc2tfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfb3ZlcmhlYXRpbmdfcmlza19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3RfbGFyZ2Vfc2UucmRzIikNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfcmlza19jb250cmFzdCkNCmBgYA0KDQojIyMgKipTdHJpY3QgZXN0aW1hdGVzKiogDQoNCkhlcmUsIHdlIGNsYXNzaWZpZWQgYW4gb3ZlcmhlYXRpbmcgZXZlbnQgb25seSB3aGVuIDk1JSBjb25maWRlbmNlIGludGVydmFscyBkaWQgbm90IG92ZXJsYXAgd2l0aCB6ZXJvLg0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfb3ZlcmhlYXRpbmdfcmlza19zZW5zaXRpdml0eV9hbmFseXNpc19zdHJpY3RfZXN0aW1hdGVzLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19vdmVyaGVhdGluZ19yaXNrX3NlbnNpdGl2aXR5X2FuYWx5c2lzX3N0cmljdF9lc3RpbWF0ZXMucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCiMjIFN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBXZSBkbyBub3QgbG9hZCBwb25kIGRhdGEgYmVjYXVzZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0IGluIHdhdGVyIGJvZGllcw0KDQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIG92ZXJoZWF0aW5nX3Jpc2sgbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX292ZXJoZWF0aW5nX3Jpc2tfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChvdmVyaGVhdGluZ19yaXNrX3N0cmljdCB+IHMobGF0LCBicyA9ICJ0cCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKDEgfCBnZW51cy9zcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPSBOQSwgDQogICAgZ2VudXMgPSBOQSwgDQogICAgc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0XyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3RfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBwb3BfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gcG9wX2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBwb3BfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IHBvcF9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gcG9wX3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gcG9wX3N1Yl9mdXR1cmU0Qw0KKQ0KDQoNCiMgUnVuIHNlcXVlbnRpYWxseSB0byByZWR1Y2UgY29tcHV0YXRpb25hbCBkZW1hbmRzDQpwbGFuKHNlcXVlbnRpYWwpDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzIDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX292ZXJoZWF0aW5nX3Jpc2tfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0X3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0X3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3Rfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3RfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3RfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3RfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KRnV0dXJlIGNsaW1hdGUgKCs0QykNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipMaW5lYXIgbWl4ZWQgbW9kZWxzKioNCg0KYGBge3IsIGV2YWw9Rn0NCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIikNCikNCg0KIyBMb2FkIHRyYWluaW5nIGRhdGEgZm9yIHRheG9ub21pYyBpbmZvcm1hdGlvbg0KdHJhaW5pbmdfZGF0YSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCnRyYWluaW5nX2RhdGEgPC0gZHBseXI6OnNlbGVjdCh0cmFpbmluZ19kYXRhLCB0aXAubGFiZWwsIGZhbWlseSkNCg0KYWxsX2RhdGEgPC0gZGlzdGluY3QobGVmdF9qb2luKGFsbF9kYXRhLCB0cmFpbmluZ19kYXRhLCBieT0idGlwLmxhYmVsIikpDQoNCnNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihhbGxfZGF0YSR0aXAubGFiZWwpLCAnICcpDQphbGxfZGF0YSRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCmFsbF9kYXRhJHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQoNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBSdW4gbW9kZWwNCm1vZGVsX3Jpc2sgPC0gIGdsbWVyKG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMXxnZW51cy9zcGVjaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSdvcHRpbXgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcmlzaywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9yaXNrLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX3Jpc2svc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9vdmVyaGVhdGluZ19yaXNrX3N0cmljdC5yZHMiKQ0KDQojIyMjIENvbnRyYXN0cyANCmFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCiMgUnVuIG1vZGVsDQptb2RlbF9yaXNrX2NvbnRyYXN0IDwtICBnbG1lcihvdmVyaGVhdGluZ19yaXNrIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxfGdlbnVzL3NwZWNpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9J29wdGlteCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsPWxpc3QobWV0aG9kPSdubG1pbmInKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2RhdGEpDQoNCiMgU2F2ZSBtb2RlbCANCnNhdmVSRFMobW9kZWxfcmlza19jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3Rfc3RyaWN0LnJkcyIpDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeQ0KbW9kZWxfb3ZlcmhlYXRpbmdfcmlzayA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX292ZXJoZWF0aW5nX3Jpc2spDQoNCiMgUHJlZGljdGlvbnMNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19yaXNrL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfb3ZlcmhlYXRpbmdfcmlza19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfcmlzay9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3Rfc3RyaWN0LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX292ZXJoZWF0aW5nX3Jpc2tfY29udHJhc3QpDQpgYGANCg0KDQojIyAqKk92ZXJoZWF0aW5nIGRheXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1heGltdW0gd2Vla2x5IGJvZHkgdGVtcGVyYXR1cmUqKiANCg0KSGVyZSwgYW5pbWFscyB3ZXJlIGFjY2xpbWF0ZWQgZGFpbHkgdG8gdGhlIHdlZWtseSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQsIGFzIG9wcG9zZWQgdG8gdGhlIHdlZWtseSBtZWFuIGJvZHkgdGVtcGVyYXR1cmUuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfb3ZlcmhlYXRpbmdfZGF5c19zZW5zaXRpdml0eV9hbmFseXNpc19tYXhfYWNjLlIqKiBhbmQgdGhlIHJlc291cmNlcyB1c2VkIGluICoqcGJzL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19vdmVyaGVhdGluZ19kYXlzX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBwb3B1bGF0aW9uLWxldmVsIGRhdGENCiMjIFN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBXZSBkbyBub3QgbG9hZCBwb25kIGRhdGEgYmVjYXVzZSBub25lIG9mIHRoZSBzcGVjaWVzIG92ZXJoZWF0IGluIHdhdGVyIGJvZGllcw0KDQojIEZ1bmN0aW9uIHRvIHJ1biBwb3B1bGF0aW9uLWxldmVsIG92ZXJoZWF0aW5nX2RheXMgbW9kZWxzIGluIHBhcmFsbGVsIA0KcnVuX292ZXJoZWF0aW5nX2RheXNfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgc3BsaXRfbmFtZXMgPC0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKGRhdGFzZXQkdGlwLmxhYmVsKSwgJyAnKQ0KICBkYXRhc2V0JGdlbnVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAxKQ0KICBkYXRhc2V0JHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQogIGRhdGFzZXQkb3ZlcmhlYXRpbmdfZGF5cyA8LSByb3VuZChkYXRhc2V0JG92ZXJoZWF0aW5nX2RheXMpDQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChvdmVyaGVhdGluZ19kYXlzIH4gcyhsYXQsIGJzID0gInRwIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsICMgRGlkIG5vdCBydW4gd2l0aCByYW5kb20gZWZmZWN0cw0KICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBvdmVyaGVhdGluZ19kYXlzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkb3ZlcmhlYXRpbmdfZGF5c19wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IG92ZXJoZWF0aW5nX2RheXNfcHJlZCArIDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IG92ZXJoZWF0aW5nX2RheXNfcHJlZCAtIDEuOTYgKiBvdmVyaGVhdGluZ19kYXlzX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KfQ0KDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgYXJib3JlYWxfY3VycmVudCA9IHBvcF9hcmJfY3VycmVudCwNCiAgYXJib3JlYWxfZnV0dXJlMkMgPSBwb3BfYXJiX2Z1dHVyZTJDLA0KICBhcmJvcmVhbF9mdXR1cmU0QyA9IHBvcF9hcmJfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDDQopDQoNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0yKSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fb3ZlcmhlYXRpbmdfZGF5c19hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrMkMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbCA9IEZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KYWxsX2RhdGEkb3ZlcmhlYXRpbmdfZGF5cyA8LSByb3VuZChhbGxfZGF0YSRvdmVyaGVhdGluZ19kYXlzKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQojIyBOb3RlIHRoYXQgdGhpcyBtb2RlbCBmYWlscyBpZiB3ZSBhZGQgYW4gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdA0KbW9kZWxfZGF5cyA8LSAgZ2xtZXIob3ZlcmhlYXRpbmdfZGF5cyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDF8Z2VudXMvc3BlY2llcyksIA0KICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9kYXlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0gImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCg0KIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9kYXlzLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19tYXhfYWNjLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19tYXhfYWNjLnJkcyIpDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9kYXlzX2NvbnRyYXN0IDwtICBnbG1lcihvdmVyaGVhdGluZ19kYXlzIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxfGdlbnVzL3NwZWNpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9kYXlzX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdF9tYXhfYWNjLnJkcyIpDQoNCg0KYGBgDQoNCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCiMgTW9kZWwgc3VtbWFyeQ0KbW9kZWxfb3ZlcmhlYXRpbmdfZGF5cyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9vdmVyaGVhdGluZ19kYXlzKQ0KDQojIFByZWRpY3Rpb25zDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX2RheXNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipDb250cmFzdHMqKiANCg0KYGBge3J9DQptb2RlbF9vdmVyaGVhdGluZ19kYXlzX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdF9tYXhfYWNjLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX292ZXJoZWF0aW5nX2RheXNfY29udHJhc3QpDQpgYGANCg0KDQojIyMgKipVbmNlcnRhaW4gZXN0aW1hdGVzKiogDQoNCkhlcmUsIHdlIGNhcHBlZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHNpbXVsYXRlZCBDVG1heCBlc3RpbWF0ZXMgdG8gdGhlICJiaW9sb2dpY2FsIHJhbmdlIiwgdGhhdCBpcywgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhbGwgQ1RtYXggZXN0aW1hdHMgYWNyb3NzIHNwZWNpZXMgKHMuZS4gcmFuZ2UgYWNyb3NzIGhhYml0YXRzOiAxLjg0LTIuMTcpLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX292ZXJoZWF0aW5nX2RheXNfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfc3RyaWN0X2VzdGltYXRlcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfb3ZlcmhlYXRpbmdfZGF5c19zZW5zaXRpdml0eV9hbmFseXNpc19zdHJpY3RfZXN0aW1hdGVzLnBicyoqIA0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIExvYWQgcG9wdWxhdGlvbi1sZXZlbCBkYXRhDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyMgQXJib3JlYWwNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9sYXJnZV9zZS5yZHMiKQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyBGdW5jdGlvbiB0byBydW4gcG9wdWxhdGlvbi1sZXZlbCBvdmVyaGVhdGluZ19kYXlzIG1vZGVscyBpbiBwYXJhbGxlbCANCnJ1bl9vdmVyaGVhdGluZ19kYXlzX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIHNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihkYXRhc2V0JHRpcC5sYWJlbCksICcgJykNCiAgZGF0YXNldCRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCiAgZGF0YXNldCRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KICBkYXRhc2V0JG92ZXJoZWF0aW5nX2RheXMgPC0gcm91bmQoZGF0YXNldCRvdmVyaGVhdGluZ19kYXlzKQ0KDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KG92ZXJoZWF0aW5nX2RheXMgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwgIyBEaWQgbm90IHJ1biB3aXRoIHJhbmRvbSBlZmZlY3RzDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKCksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIG92ZXJoZWF0aW5nX2RheXMgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19kYXlzX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkb3ZlcmhlYXRpbmdfZGF5c19wcmVkX3NlIDwtIHByZWQkc2UuZml0DQogIA0KICAjIENhbGN1bGF0ZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgbmV3X2RhdGEgPC0gbXV0YXRlKG5ld19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gb3ZlcmhlYXRpbmdfZGF5c19wcmVkICsgMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gb3ZlcmhlYXRpbmdfZGF5c19wcmVkIC0gMS45NiAqIG92ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9sYXJnZV9zZS5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfcG9wX2xhdF9vdmVyaGVhdGluZ19kYXlzXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbGFyZ2Vfc2UucmRzIikpDQp9DQoNCg0KIyBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gcG9wX2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IHBvcF9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gcG9wX2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBwb3Bfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IHBvcF9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IHBvcF9zdWJfZnV0dXJlNEMNCikNCg0KIyBSdW4gaW4gcGFyYWxsZWwNCnBsYW4obXVsdGljb3JlKHdvcmtlcnM9MikpDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzIDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX292ZXJoZWF0aW5nX2RheXNfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCkN1cnJlbnQgY2xpbWF0ZQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfY3VycmVudF9sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpKQ0KYGBgDQoNCkZ1dHVyZSBjbGltYXRlICgrNEMpDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KQ3VycmVudCBjbGltYXRlDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudF9sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzJDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQpGdXR1cmUgY2xpbWF0ZSAoKzRDKQ0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9wb3BfbGF0X292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmU0Q19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsID0gRn0NCmFsbF9kYXRhIDwtIGJpbmRfcm93cygNCiAgcG9wX3N1Yl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfY3VycmVudCIpLCANCiAgcG9wX3N1Yl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTJDIiksIA0KICBwb3Bfc3ViX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlNEMiKSwgDQogIHBvcF9hcmJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfY3VycmVudCIpLCANCiAgcG9wX2FyYl9mdXR1cmUyQyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlMkMiKSwgDQogIHBvcF9hcmJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTRDIikNCikNCg0KIyBMb2FkIHRyYWluaW5nIGRhdGEgZm9yIHRheG9ub21pYyBpbmZvcm1hdGlvbg0KdHJhaW5pbmdfZGF0YSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCnRyYWluaW5nX2RhdGEgPC0gZHBseXI6OnNlbGVjdCh0cmFpbmluZ19kYXRhLCB0aXAubGFiZWwsIGZhbWlseSkNCg0KYWxsX2RhdGEgPC0gZGlzdGluY3QobGVmdF9qb2luKGFsbF9kYXRhLCB0cmFpbmluZ19kYXRhLCBieT0idGlwLmxhYmVsIikpDQoNCnNwbGl0X25hbWVzIDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihhbGxfZGF0YSR0aXAubGFiZWwpLCAnICcpDQphbGxfZGF0YSRnZW51cyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMSkNCmFsbF9kYXRhJHNwZWNpZXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDIpDQphbGxfZGF0YSRvdmVyaGVhdGluZ19kYXlzIDwtIHJvdW5kKGFsbF9kYXRhJG92ZXJoZWF0aW5nX2RheXMpDQoNCmFsbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2RhdGEpDQoNCnNldC5zZWVkKDEyMykNCg0KIyBSdW4gbW9kZWwNCm1vZGVsX2RheXMgPC0gIGdsbWVyKG92ZXJoZWF0aW5nX2RheXMgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSArICgxfGdlbnVzL3NwZWNpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9kYXlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0gImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCg0KIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9kYXlzLCBmaWxlID0gIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19sYXJnZV9zZS5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX2RheXNfbGFyZ2Vfc2UucmRzIikNCg0KIyMjIyBDb250cmFzdHMgDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9kYXlzX2NvbnRyYXN0IDwtICBnbG1lcihvdmVyaGVhdGluZ19kYXlzIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxfGdlbnVzL3NwZWNpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQojIFNhdmUgbW9kZWwgDQpzYXZlUkRTKG1vZGVsX2RheXNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9vdmVyaGVhdGluZ19kYXlzX2NvbnRyYXN0X2xhcmdlX3NlLnJkcyIpDQpgYGANCg0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5DQptb2RlbF9vdmVyaGVhdGluZ19kYXlzIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfb3ZlcmhlYXRpbmdfZGF5c19sYXJnZV9zZS5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9vdmVyaGVhdGluZ19kYXlzKQ0KDQojIFByZWRpY3Rpb25zDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X292ZXJoZWF0aW5nX2RheXNfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X292ZXJoZWF0aW5nX2RheXNfY29udHJhc3RfbGFyZ2Vfc2UucmRzIikNCnN1bW1hcnkobW9kZWxfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdCkNCmBgYA0KDQoNCiMjICoqQ29uc2VjdXRpdmUgb3ZlcmhlYXRpbmcgZGF5cyoqIA0KDQpIZXJlLCB3ZSBzcGVjaWZpY2FsbHkgcXVhbnRpZmllZCB0aGUgY29uc2VjdXRpdmUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyBwb3B1bGF0aW9ucyB3ZXJlIHByZWRpY3RlZCB0byBleHBlcmllbmNlLiANCg0KVGhpcyBjb2RlIHJhbiBvbiBhbiBIUEMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNhbiBiZSBmb3VuZCBpbiAqKlIvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMucGJzKiogDQoNCiMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMb2FkIHBvcHVsYXRpb24tbGV2ZWwgZGF0YQ0KIyMgU3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIEFyYm9yZWFsDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMjIFdlIGRvIG5vdCBsb2FkIHBvbmQgZGF0YSBiZWNhdXNlIG5vbmUgb2YgdGhlIHNwZWNpZXMgb3ZlcmhlYXQgaW4gd2F0ZXIgYm9kaWVzDQoNCiMgRnVuY3Rpb24gdG8gcnVuIHBvcHVsYXRpb24tbGV2ZWwgY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyBtb2RlbHMgaW4gcGFyYWxsZWwgDQpydW5fY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoZGF0YXNldCR0aXAubGFiZWwpLCAnICcpDQogIGRhdGFzZXQkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQogIGRhdGFzZXQkc3BlY2llcyA8LSBzYXBwbHkoc3BsaXRfbmFtZXMsIGBbYCwgMikNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMgfiBzKGxhdCwgYnMgPSAidHAiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+ICgxIHwgZ2VudXMvc3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHBvaXNzb24oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyA9IE5BLCANCiAgICBnZW51cyA9IE5BLCANCiAgICBzcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfcHJlZCArIDEuOTYgKiBjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGNvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfcHJlZCAtIDEuOTYgKiBjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCiAgc2F2ZVJEUyhzdW1tYXJ5X21lciwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzXyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KfQ0KDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIGRhdGFzZXRzDQpkYXRhc2V0X2xpc3QgPC0gbGlzdCgNCiAgYXJib3JlYWxfY3VycmVudCA9IHBvcF9hcmJfY3VycmVudCwNCiAgYXJib3JlYWxfZnV0dXJlMkMgPSBwb3BfYXJiX2Z1dHVyZTJDLA0KICBhcmJvcmVhbF9mdXR1cmU0QyA9IHBvcF9hcmJfZnV0dXJlNEMsDQogIHN1YnN0cmF0ZV9jdXJyZW50ID0gcG9wX3N1Yl9jdXJyZW50LA0KICBzdWJzdHJhdGVfZnV0dXJlMkMgPSBwb3Bfc3ViX2Z1dHVyZTJDLA0KICBzdWJzdHJhdGVfZnV0dXJlNEMgPSBwb3Bfc3ViX2Z1dHVyZTRDDQopDQoNCg0KIyBSdW4gc2VxdWVudGlhbGx5IHRvIHJlZHVjZSBtZW1vcnkgZGVtYW5kcw0KcGxhbihzZXF1ZW50aWFsKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCg0KIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfSANCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfcG9wX2xhdF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9wb3BfbGF0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX3BvcF9sYXRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fcG9wX2xhdF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KYGBgDQoNCg0KIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIHBvcF9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIHBvcF9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgcG9wX3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBwb3BfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIHBvcF9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBwb3BfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCiMgTG9hZCB0cmFpbmluZyBkYXRhIGZvciB0YXhvbm9taWMgaW5mb3JtYXRpb24NCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQp0cmFpbmluZ19kYXRhIDwtIGRwbHlyOjpzZWxlY3QodHJhaW5pbmdfZGF0YSwgdGlwLmxhYmVsLCBmYW1pbHkpDQoNCmFsbF9kYXRhIDwtIGRpc3RpbmN0KGxlZnRfam9pbihhbGxfZGF0YSwgdHJhaW5pbmdfZGF0YSwgYnk9InRpcC5sYWJlbCIpKQ0KDQpzcGxpdF9uYW1lcyA8LSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYWxsX2RhdGEkdGlwLmxhYmVsKSwgJyAnKQ0KYWxsX2RhdGEkZ2VudXMgPC0gc2FwcGx5KHNwbGl0X25hbWVzLCBgW2AsIDEpDQphbGxfZGF0YSRzcGVjaWVzIDwtIHNhcHBseShzcGxpdF9uYW1lcywgYFtgLCAyKQ0KDQphbGxfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgUnVuIG1vZGVsDQojIyBOb3RlIHRoYXQgdGhpcyBtb2RlbCBmYWlscyBpZiB3ZSBhZGQgYW4gb2JzZXJ2YXRpb24tbGV2ZWwgcmFuZG9tIGVmZmVjdA0KbW9kZWxfZGF5cyA8LSAgZ2xtZXIoY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDF8Z2VudXMvc3BlY2llcyksIA0KICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9kYXRhKQ0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9kYXlzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0gImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfZGF5cywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzLnJkcyIpDQoNCiMgQ29udHJhc3RzDQphbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQptb2RlbF9kYXlzX2NvbnRyYXN0IDwtICBnbG1lcihjb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxfGdlbnVzL3NwZWNpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfZGF0YSkNCg0KDQpzYXZlUkRTKG1vZGVsX2RheXNfY29udHJhc3QsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL292ZXJoZWF0aW5nX2RheXMvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzX2NvbnRyYXN0LnJkcyIpDQpgYGANCg0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KIyBNb2RlbCBzdW1tYXJ5DQptb2RlbF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9vdmVyaGVhdGluZ19kYXlzL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5cy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9jb25zZWN1dGl2ZV9vdmVyaGVhdGluZ19kYXlzKQ0KDQojIFByZWRpY3Rpb25zDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXMucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvb3ZlcmhlYXRpbmdfZGF5cy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X2NvbnNlY3V0aXZlX292ZXJoZWF0aW5nX2RheXNfY29udHJhc3QucmRzIikNCnN1bW1hcnkobW9kZWxfY29uc2VjdXRpdmVfb3ZlcmhlYXRpbmdfZGF5c19jb250cmFzdCkNCmBgYA0KDQoNCiMjICoqTnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1heGltdW0gd2Vla2x5IGJvZHkgdGVtcGVyYXR1cmUqKiANCg0KSGVyZSwgYW5pbWFscyB3ZXJlIGFjY2xpbWF0ZWQgZGFpbHkgdG8gdGhlIHdlZWtseSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQsIGFzIG9wcG9zZWQgdG8gdGhlIHdlZWtseSBtZWFuIGJvZHkgdGVtcGVyYXR1cmUuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX25fc3BlY2llc19vdmVyaGVhdGluZ19zZW5zaXRpdml0eV9hbmFseXNpc19tYXhfYWNjLnBicyoqIA0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIExvYWQgY29tbXVuaXR5LWxldmVsIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEZ1bmN0aW9uIHRvIHJ1biBtb2RlbHMgcXVhbnRpZnlpbmcgdGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIGluIGVhY2ggY29tbXVuaXR5DQpydW5fY29tbXVuaXR5X25fc3BlY2llc19vdmVyaGVhdGluZ19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBzKGxhdCwgYnMgPSAidHAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IG5fc3BlY2llc19vdmVyaGVhdGluZ19wcmVkICsgMS45NiAqIG5fc3BlY2llc19vdmVyaGVhdGluZ19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCAtIDEuOTYgKiBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQp9DQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IGNvbW11bml0eV9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0Qw0KKQ0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTMpKQ0KDQoNCiMgUnVuIGZ1bmN0aW9uDQpyZXN1bHRzIDwtIGZ1dHVyZV9sYXBwbHkoDQogIG5hbWVzKGRhdGFzZXRfbGlzdCksIA0KICBmdW5jdGlvbih4KSB7cnVuX2NvbW11bml0eV9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50X21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlNENfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoNCiMjIyMgKipMaW5lYXIgbWl4ZWQgbW9kZWxzKioNCg0KYGBge3IsIGV2YWw9Rn0NCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBiaW5kX3Jvd3MoDQogIGNvbW11bml0eV9zdWJfY3VycmVudCAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAic3Vic3RyYXRlX2Z1dHVyZTRDIiksIA0KICBjb21tdW5pdHlfYXJiX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2N1cnJlbnQiKSwgDQogIGNvbW11bml0eV9hcmJfZnV0dXJlMkMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gImFyYm9yZWFsX2Z1dHVyZTJDIiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmU0QyIpDQopDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhbGxfY29tbXVuaXR5X2RhdGEgJT4lIG11dGF0ZShvYnMgPSBhcy5jaGFyYWN0ZXIocm93X251bWJlcigpKSkNCg0KYWxsX2NvbW11bml0eV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoYWxsX2NvbW11bml0eV9kYXRhKQ0KDQpzZXQuc2VlZCgxMjMpDQoNCiMgSW50ZXJjZXB0LWxlc3MgbW9kZWwgDQptb2RlbF9uX3NwIDwtIGdsbWVyKG5fc3BlY2llc19vdmVyaGVhdGluZyB+IGhhYml0YXRfc2NlbmFyaW8gLSAxICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAicG9pc3NvbiIsDQogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQoNCiMgR2V0IHByZWRpY3Rpb25zDQpwcmVkaWN0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKGdncHJlZGljdChtb2RlbF9uX3NwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0gImhhYml0YXRfc2NlbmFyaW8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2ltdWxhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX25fc3AsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19tYXhfYWNjLnJkcyIpDQpzYXZlUkRTKHByZWRpY3Rpb25zLCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfbWF4X2FjYy5yZHMiKQ0KDQoNCiMgQ29udHJhc3QgDQphbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX25fc3BfY29udHJhc3QgPC0gZ2xtZXIobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9uX3NwX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3AgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19tYXhfYWNjLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3ApDQoNCiMgUHJlZGljdGlvbnMNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipDb250cmFzdHMqKiANCg0KYGBge3J9DQptb2RlbF9uX3NwX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwX2NvbnRyYXN0KQ0KYGBgDQoNCg0KIyMjICoqVW5jZXJ0YWluIGVzdGltYXRlcyoqIA0KDQpIZXJlLCB3ZSBjYXBwZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzaW11bGF0ZWQgQ1RtYXggZXN0aW1hdGVzIHRvIHRoZSAiYmlvbG9naWNhbCByYW5nZSIsIHRoYXQgaXMsIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYWxsIENUbWF4IGVzdGltYXRzIGFjcm9zcyBzcGVjaWVzIChzLmUuIHJhbmdlIGFjcm9zcyBoYWJpdGF0czogMS44NC0yLjE3KS4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbGFyZ2Vfc2UuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX25fc3BlY2llc19vdmVyaGVhdGluZ19zZW5zaXRpdml0eV9hbmFseXNpc19sYXJnZV9zZS5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMb2FkIGNvbW11bml0eS1sZXZlbCBkYXRhDQpjb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyBGdW5jdGlvbiB0byBydW4gbW9kZWxzIHF1YW50aWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBlYWNoIGNvbW11bml0eQ0KcnVuX2NvbW11bml0eV9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcyhsYXQsIGJzID0gInRwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHBvaXNzb24oKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWQgPC0gcHJlZCRmaXQNCiAgbmV3X2RhdGEkbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCArIDEuOTYgKiBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSwNCiAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWQgLSAxLjk2ICogbl9zcGVjaWVzX292ZXJoZWF0aW5nX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KfQ0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IGNvbW11bml0eV9zdWJfZnV0dXJlNEMNCikNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0zKSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fY29tbXVuaXR5X25fc3BlY2llc19vdmVyaGVhdGluZ19hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X25fc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X25fc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfbl9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X25fc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9uX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KYGBgDQoNCg0KIyMjIyAqKkxpbmVhciBtaXhlZCBtb2RlbHMqKg0KDQpgYGB7ciwgZXZhbD1GfQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYWxsX2NvbW11bml0eV9kYXRhICU+JSBtdXRhdGUob2JzID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfbl9zcCA8LSBnbG1lcihuX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfbl9zcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInNpbXVsYXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2ltID0gMTAwMCkpDQoNCnByZWRpY3Rpb25zIDwtIHByZWRpY3Rpb25zICU+JSByZW5hbWUoaGFiaXRhdF9zY2VuYXJpbyA9IHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uID0gcHJlZGljdGVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZSA9IHN0ZC5lcnJvciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyX0NJID0gY29uZi5sb3csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9DSSA9IGNvbmYuaGlnaCkgJT4lIGRwbHlyOjpzZWxlY3QoLWdyb3VwKQ0KDQojIFNhdmUgbW9kZWwgc3VtbWFyaWVzIGFuZCBwcmVkaWN0aW9ucw0Kc2F2ZVJEUyhtb2RlbF9uX3NwLCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfbGFyZ2Vfc2UucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19sYXJnZV9zZS5yZHMiKQ0KDQoNCiMgQ29udHJhc3QgDQphbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX25fc3BfY29udHJhc3QgPC0gZ2xtZXIobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9uX3NwX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3RfbGFyZ2Vfc2UucmRzIikNCg0KDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3BfbGFyZ2Vfc2UgPC0gcmVhZFJEUyggIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfbGFyZ2Vfc2UucmRzIikNCnN1bW1hcnkobW9kZWxfbl9zcF9sYXJnZV9zZSkNCg0KIyBQcmVkaWN0aW9ucw0KcmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19sYXJnZV9zZS5yZHMiKQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3BfbGFyZ2Vfc2VfY29udHJhc3QgPC0gcmVhZFJEUyggIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3RfbGFyZ2Vfc2UucmRzIikNCnN1bW1hcnkobW9kZWxfbl9zcF9sYXJnZV9zZV9jb250cmFzdCkNCmBgYA0KDQoNCiMjIyAqKlN0cmljdCBlc3RpbWF0ZXMqKiANCg0KSGVyZSwgd2UgY2xhc3NpZmllZCBhbiBvdmVyaGVhdGluZyBldmVudCBvbmx5IHdoZW4gOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGRpZCBub3Qgb3ZlcmxhcCB3aXRoIHplcm8uDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfc3RyaWN0X2VzdGltYXRlcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfbl9zcGVjaWVzX292ZXJoZWF0aW5nX3NlbnNpdGl2aXR5X2FuYWx5c2lzX3N0cmljdF9lc3RpbWF0ZXMucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBjb21tdW5pdHktbGV2ZWwgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCg0KIyBGdW5jdGlvbiB0byBydW4gbW9kZWxzIHF1YW50aWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBpbiBlYWNoIGNvbW11bml0eQ0KcnVuX2NvbW11bml0eV9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQobl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCB+IHMobGF0LCBicyA9ICJ0cCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKCksDQogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gVFJVRSkNCiAgDQogICMgR2VuZXJhdGUgZGF0YSBzZXQgZm9yIHByZWRpY3Rpb25zDQogIG5ld19kYXRhIDwtIGRhdGEuZnJhbWUoDQogICAgbGF0ID0gc2VxKG1pbihkYXRhJGxhdCksIG1heChkYXRhJGxhdCksIGxlbmd0aCA9IDEwMDApLA0KICAgIG5fc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QgPSBOQSkNCiAgDQogICMgUHJlZGljdCBmb3IgZWFjaCBsYXRpdHVkZSB2YWx1ZQ0KICBwcmVkIDwtIHByZWRpY3QobW9kZWwkZ2FtLCBuZXdkYXRhID0gbmV3X2RhdGEsIHR5cGUgPSAicmVzcG9uc2UiLCBzZS5maXQgPSBUUlVFKQ0KICBuZXdfZGF0YSRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IG5fc3BlY2llc19vdmVyaGVhdGluZ19wcmVkICsgMS45NiAqIG5fc3BlY2llc19vdmVyaGVhdGluZ19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZCAtIDEuOTYgKiBuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfcHJlZF9zZSkNCiAgDQogICMgTW9kZWwgc3VtbWFyaWVzIA0KICBzdW1tYXJ5X2dhbSA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJGdhbSkpICMgR2VuZXJhbGlzZWQgYWRkaXRpdmUgbW9kZWwNCiAgc3VtbWFyeV9tZXIgPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRtZXIpKSAjIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQogIA0KICAjIFNhdmUgbW9kZWwgYW5kIHByZWRpY3Rpb25zDQogIHNhdmVSRFMoc3VtbWFyeV9nYW0sIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0XyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0XyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0XyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQp9DQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IGNvbW11bml0eV9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0Qw0KKQ0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTMpKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9jb21tdW5pdHlfbl9zcGVjaWVzX292ZXJoZWF0aW5nX2FuYWx5c2lzKGRhdGFzZXRfbGlzdFtbeF1dLCB4KX0sDQogIGZ1dHVyZS5wYWNrYWdlcyA9IGMoImdhbW00IiwgIm1nY3YiLCAiZHBseXIiKQ0KKQ0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3Rfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3Rfc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdF9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdF9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQojIFJ1biBhbmFseXNlcyB3aXRoIGxtZTQgdG8gZXN0aW1hdGUgdGhlIG1lYW4gbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgaW4gZWFjaCBtaWNyb2hhYml0YXQgYW5kIHNjZW5hcmlvDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYWxsX2NvbW11bml0eV9kYXRhICU+JSBtdXRhdGUob2JzID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfbl9zcCA8LSBnbG1lcihuX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMSB8b2JzKSwgDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJwb2lzc29uIiwNCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGFzLmRhdGEuZnJhbWUoZ2dwcmVkaWN0KG1vZGVsX25fc3AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJzaW11bGF0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfbl9zcCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdC5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdC5yZHMiKQ0KDQoNCiMgQ29udHJhc3QgDQphbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbyA8LSBhcy5mYWN0b3IoYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8pDQoNCm1vZGVsX25fc3BfY29udHJhc3QgPC0gZ2xtZXIobl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gInBvaXNzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9uX3NwX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3Rfc3RyaWN0LnJkcyIpDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3Bfc3RyaWN0IDwtIHJlYWRSRFMoICJSRGF0YS9Nb2RlbHMvbl9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfbnVtYmVyX3NwX292ZXJoZWF0aW5nX3N0cmljdC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwX3N0cmljdCkNCg0KIyBQcmVkaWN0aW9ucw0Kc3VtbWFyeShyZWFkUkRTKCAiUkRhdGEvTW9kZWxzL25fc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X251bWJlcl9zcF9vdmVyaGVhdGluZ19zdHJpY3QucmRzIikpDQpgYGANCg0KIyMjIyMjICoqQ29udHJhc3RzKiogDQoNCmBgYHtyfQ0KbW9kZWxfbl9zcF9zdHJpY3RfY29udHJhc3QgPC0gcmVhZFJEUyggIlJEYXRhL01vZGVscy9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9udW1iZXJfc3Bfb3ZlcmhlYXRpbmdfY29udHJhc3Rfc3RyaWN0LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3Bfc3RyaWN0X2NvbnRyYXN0KQ0KYGBgDQoNCg0KIyMgKipQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1heGltdW0gd2Vla2x5IGJvZHkgdGVtcGVyYXR1cmUqKiANCg0KSGVyZSwgYW5pbWFscyB3ZXJlIGFjY2xpbWF0ZWQgZGFpbHkgdG8gdGhlIHdlZWtseSBtYXhpbXVtIGJvZHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQsIGFzIG9wcG9zZWQgdG8gdGhlIHdlZWtseSBtZWFuIGJvZHkgdGVtcGVyYXR1cmUuIA0KDQpUaGlzIGNvZGUgcmFuIG9uIGFuIEhQQyBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGluICoqUi9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX3NlbnNpdGl2aXR5X2FuYWx5c2lzX21heF9hY2MuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19zZW5zaXRpdml0eV9hbmFseXNpc19tYXhfYWNjLnBicyoqIA0KDQojIyMjICoqR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzKiogDQoNCmBgYHtyLCBldmFsPUZ9DQojIExvYWQgY29tbXVuaXR5LWxldmVsIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21heF9hY2NfZnV0dXJlNEMucmRzIikNCg0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEZ1bmN0aW9uIHRvIHJ1biBtb2RlbHMgZXN0aW1hdGluZyB0aGUgbWVhbiBvdmVyaGVhdGluZyByaXNrIChpLmUuLCBwcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcpIA0KcnVuX2NvbW11bml0eV9wcm9wb3J0aW9uX292ZXJoZWF0aW5nX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGRhdGFzZXQsIGhhYml0YXRfc2NlbmFyaW8pIHsNCiAgDQogIGRhdGEgPC0gZGF0YXNldA0KICANCiAgIyBSdW4gbW9kZWwNCiAgbW9kZWwgPC0gZ2FtbTQ6OmdhbW00KHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyB+IHMobGF0LCBicyA9ICJ0cCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gZGF0YSRuX3NwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgPSBOQSwgDQogICAgbl9zcGVjaWVzID0gTkEpDQogIA0KICAjIFByZWRpY3QgZm9yIGVhY2ggbGF0aXR1ZGUgdmFsdWUNCiAgcHJlZCA8LSBwcmVkaWN0KG1vZGVsJGdhbSwgbmV3ZGF0YSA9IG5ld19kYXRhLCB0eXBlID0gInJlc3BvbnNlIiwgc2UuZml0ID0gVFJVRSkNCiAgbmV3X2RhdGEkb3ZlcmhlYXRpbmdfcmlza19wcmVkIDwtIHByZWQkZml0DQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZF9zZSA8LSBwcmVkJHNlLmZpdA0KICANCiAgIyBDYWxjdWxhdGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIG5ld19kYXRhIDwtIG11dGF0ZShuZXdfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICB1cHBlciA9IG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCArIDEuOTYgKiBvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UsDQogICAgICAgICAgICAgICAgICAgICBsb3dlciA9IG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCAtIDEuOTYgKiBvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UpDQogIA0KICAjIE1vZGVsIHN1bW1hcmllcyANCiAgc3VtbWFyeV9nYW0gPC0gY2FwdHVyZS5vdXRwdXQoc3VtbWFyeShtb2RlbCRnYW0pKSAjIEdlbmVyYWxpc2VkIGFkZGl0aXZlIG1vZGVsDQogIHN1bW1hcnlfbWVyIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkbWVyKSkgIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KICANCiAgIyBTYXZlIG1vZGVsIGFuZCBwcmVkaWN0aW9ucw0KICBzYXZlUkRTKHN1bW1hcnlfZ2FtLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfcHJvcG9ydGlvbl9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX21heF9hY2MucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9wcm9wb3J0aW9uX3NwX292ZXJoZWF0aW5nXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbWF4X2FjYy5yZHMiKSkNCiAgc2F2ZVJEUyhuZXdfZGF0YSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X3Byb3BvcnRpb25fc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9tYXhfYWNjLnJkcyIpKQ0KfQ0KDQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhc2V0cw0KZGF0YXNldF9saXN0IDwtIGxpc3QoDQogIGFyYm9yZWFsX2N1cnJlbnQgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsDQogIGFyYm9yZWFsX2Z1dHVyZTJDID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywNCiAgYXJib3JlYWxfZnV0dXJlNEMgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLA0KICBzdWJzdHJhdGVfY3VycmVudCA9IGNvbW11bml0eV9zdWJfY3VycmVudCwNCiAgc3Vic3RyYXRlX2Z1dHVyZTJDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywNCiAgc3Vic3RyYXRlX2Z1dHVyZTRDID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0Qw0KKQ0KDQojIFNldCB1cCBwYXJhbGxlbCBwcm9jZXNzaW5nDQpwbGFuKG11bHRpY29yZSh3b3JrZXJzPTMpKQ0KDQojIFJ1biBmdW5jdGlvbg0KcmVzdWx0cyA8LSBmdXR1cmVfbGFwcGx5KA0KICBuYW1lcyhkYXRhc2V0X2xpc3QpLCANCiAgZnVuY3Rpb24oeCkge3J1bl9jb21tdW5pdHlfcHJvcG9ydGlvbl9vdmVyaGVhdGluZ19hbmFseXNpcyhkYXRhc2V0X2xpc3RbW3hdXSwgeCl9LA0KICBmdXR1cmUucGFja2FnZXMgPSBjKCJnYW1tNCIsICJtZ2N2IiwgImRwbHlyIikNCikNCg0KYGBgDQoNCiMjIyMjICoqTW9kZWwgc3VtbWFyaWVzKiogey50YWJzZXQgLnRhYnNldF9mYWRlIC50YWJzZXRfcGlsbHN9DQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKiANCg0KDQoqKkN1cnJlbnQgY2xpbWF0ZSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2N1cnJlbnRfbWF4X2FjYy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQ19tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCs0QykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9jdXJyZW50X21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfY3VycmVudF9tYXhfYWNjLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTJDX21heF9hY2MucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlMkNfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9mdXR1cmU0Q19tYXhfYWNjLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2Z1dHVyZTRDX21heF9hY2MucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYWxsX2NvbW11bml0eV9kYXRhICU+JSBtdXRhdGUob2JzID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfcHJvcCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwNCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IG5fc3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQoNCg0KDQojIEdldCBwcmVkaWN0aW9ucw0KcHJlZGljdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShnZ3ByZWRpY3QobW9kZWxfcHJvcCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9ICJoYWJpdGF0X3NjZW5hcmlvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJhbmRvbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbSA9IDEwMDApKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0aW9ucyAlPiUgcmVuYW1lKGhhYml0YXRfc2NlbmFyaW8gPSB4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiA9IHByZWRpY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UgPSBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9DSSA9IGNvbmYubG93LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfQ0kgPSBjb25mLmhpZ2gpICU+JSBkcGx5cjo6c2VsZWN0KC1ncm91cCkNCg0KIyBTYXZlIG1vZGVsIHN1bW1hcmllcyBhbmQgcHJlZGljdGlvbnMNCnNhdmVSRFMobW9kZWxfcHJvcCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX21heF9hY2MucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19tYXhfYWNjLnJkcyIpDQoNCg0KIyBDb250cmFzdCANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KbW9kZWxfcHJvcF9jb250cmFzdCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2F2ZVJEUyhtb2RlbF9wcm9wX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0KDQpgYGANCg0KIyMjIyMgKipNb2RlbCBzdW1tYXJpZXMqKiB7LnRhYnNldCAudGFic2V0X2ZhZGUgLnRhYnNldF9waWxsc30NCg0KIyMjIyMjICoqT3ZlcmFsbCBtZWFucyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3AgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19tYXhfYWNjLnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3ApDQoNCiMgUHJlZGljdGlvbnMNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfbWF4X2FjYy5yZHMiKSkNCmBgYA0KDQojIyMjIyMgKipDb250cmFzdHMqKiANCg0KYGBge3J9DQptb2RlbF9uX3NwX2NvbnRyYXN0IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3RfbWF4X2FjYy5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwX2NvbnRyYXN0KQ0KYGBgDQoNCg0KIyMjICoqVW5jZXJ0YWluIGVzdGltYXRlcyoqIA0KDQpIZXJlLCB3ZSBjYXBwZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzaW11bGF0ZWQgQ1RtYXggZXN0aW1hdGVzIHRvIHRoZSAiYmlvbG9naWNhbCByYW5nZSIsIHRoYXQgaXMsIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYWxsIENUbWF4IGVzdGltYXRzIGFjcm9zcyBzcGVjaWVzIChzLmUuIHJhbmdlIGFjcm9zcyBoYWJpdGF0czogMS44NC0yLjE3KS4gDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfbGFyZ2Vfc2UuUioqIGFuZCB0aGUgcmVzb3VyY2VzIHVzZWQgaW4gKipwYnMvTW9kZWxzL1NlbnNpdGl2aXR5X2FuYWx5c2VzL1J1bm5pbmdfbW9kZWxzX3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19zZW5zaXRpdml0eV9hbmFseXNpc19sYXJnZV9zZS5wYnMqKiANCg0KIyMjIyAqKkdlbmVyYWxpemVkIGFkZGl0aXZlIG1peGVkIG1vZGVscyoqIA0KDQpgYGB7ciwgZXZhbD1GfQ0KIyBMb2FkIGNvbW11bml0eS1sZXZlbCBkYXRhDQpjb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyBGdW5jdGlvbiB0byBydW4gbW9kZWxzIGVzdGltYXRpbmcgdGhlIG1lYW4gb3ZlcmhlYXRpbmcgcmlzayAoaS5lLiwgcHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nKSANCnJ1bl9jb21tdW5pdHlfcHJvcG9ydGlvbl9vdmVyaGVhdGluZ19hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhc2V0LCBoYWJpdGF0X3NjZW5hcmlvKSB7DQogIA0KICBkYXRhIDwtIGRhdGFzZXQNCiAgDQogICMgUnVuIG1vZGVsDQogIG1vZGVsIDwtIGdhbW00OjpnYW1tNChwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBzKGxhdCwgYnMgPSAidHAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IGRhdGEkbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBUUlVFKQ0KICANCiAgIyBHZW5lcmF0ZSBkYXRhIHNldCBmb3IgcHJlZGljdGlvbnMNCiAgbmV3X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgICBsYXQgPSBzZXEobWluKGRhdGEkbGF0KSwgbWF4KGRhdGEkbGF0KSwgbGVuZ3RoID0gMTAwMCksDQogICAgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nID0gTkEsIA0KICAgIG5fc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ18iLCBoYWJpdGF0X3NjZW5hcmlvLCAiX2xhcmdlX3NlLnJkcyIpKQ0KICBzYXZlUkRTKHN1bW1hcnlfbWVyLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nXyIsIGhhYml0YXRfc2NlbmFyaW8sICJfbGFyZ2Vfc2UucmRzIikpDQogIHNhdmVSRFMobmV3X2RhdGEsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfIiwgaGFiaXRhdF9zY2VuYXJpbywgIl9sYXJnZV9zZS5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IGNvbW11bml0eV9zdWJfZnV0dXJlNEMNCikNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0zKSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fY29tbXVuaXR5X3Byb3BvcnRpb25fb3ZlcmhlYXRpbmdfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdWJzdHJhdGVfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3Vic3RyYXRlX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N1YnN0cmF0ZV9mdXR1cmU0Q19sYXJnZV9zZS5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19hcmJvcmVhbF9jdXJyZW50X2xhcmdlX3NlLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX2FyYm9yZWFsX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzJDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KKipGdXR1cmUgY2xpbWF0ZSAoKzRDKSoqDQpgYGB7cn0NCiMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfYXJib3JlYWxfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYWxsX2NvbW11bml0eV9kYXRhICU+JSBtdXRhdGUob2JzID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfcHJvcCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiBoYWJpdGF0X3NjZW5hcmlvIC0gMSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwNCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IG5fc3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGFzLmRhdGEuZnJhbWUoZ2dwcmVkaWN0KG1vZGVsX3Byb3AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYW5kb20iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX3Byb3AsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19sYXJnZV9zZS5yZHMiKQ0Kc2F2ZVJEUyhwcmVkaWN0aW9ucywgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX2xhcmdlX3NlLnJkcyIpDQoNCg0KIyMjIyMjIENvbnRyYXN0cyANCmFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvIDwtIGFzLmZhY3RvcihhbGxfY29tbXVuaXR5X2RhdGEkaGFiaXRhdF9zY2VuYXJpbykNCg0KIyBSdW4gbW9kZWwNCm1vZGVsX3Byb3BfY29udHJhc3QgPC0gZ2xtZXIocHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nIH4gcmVsZXZlbChoYWJpdGF0X3NjZW5hcmlvLCByZWYgPSAic3Vic3RyYXRlX2N1cnJlbnQiKSArICgxIHxvYnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IG5fc3BlY2llcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDAwMDAwKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbGxfY29tbXVuaXR5X2RhdGEpDQojIFNhdmUgbW9kZWwNCnNhdmVSRFMobW9kZWxfcHJvcF9jb250cmFzdCwgZmlsZSA9ICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX2NvbnRyYXN0X2xhcmdlX3NlLnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfbl9zcF9sYXJnZV9zZSA8LSByZWFkUkRTKCAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19sYXJnZV9zZS5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwX2xhcmdlX3NlKQ0KDQojIFByZWRpY3Rpb25zDQpyZWFkUkRTKCAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19sYXJnZV9zZS5yZHMiKQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3BfbGFyZ2Vfc2VfY29udHJhc3QgPC0gcmVhZFJEUyggIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3RfbGFyZ2Vfc2UucmRzIikNCnN1bW1hcnkobW9kZWxfbl9zcF9sYXJnZV9zZV9jb250cmFzdCkNCmBgYA0KDQoNCiMjIyAqKlN0cmljdCBlc3RpbWF0ZXMqKiANCg0KSGVyZSwgd2UgY2xhc3NpZmllZCBhbiBvdmVyaGVhdGluZyBldmVudCBvbmx5IHdoZW4gOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGRpZCBub3Qgb3ZlcmxhcCB3aXRoIHplcm8uDQoNClRoaXMgY29kZSByYW4gb24gYW4gSFBDIGVudmlyb25tZW50LCB3aGVyZSB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaW4gKipSL01vZGVscy9TZW5zaXRpdml0eV9hbmFseXNlcy9SdW5uaW5nX21vZGVsc19wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc2Vuc2l0aXZpdHlfYW5hbHlzaXNfc3RyaWN0X2VzdGltYXRlcy5SKiogYW5kIHRoZSByZXNvdXJjZXMgdXNlZCBpbiAqKnBicy9Nb2RlbHMvU2Vuc2l0aXZpdHlfYW5hbHlzZXMvUnVubmluZ19tb2RlbHNfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX3NlbnNpdGl2aXR5X2FuYWx5c2lzX3N0cmljdF9lc3RpbWF0ZXMucGJzKiogDQoNCiMjIyMgKipHZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMqKiANCg0KYGBge3IsIGV2YWw9Rn0NCiMgTG9hZCBjb21tdW5pdHktbGV2ZWwgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgRnVuY3Rpb24gdG8gcnVuIG1vZGVscyBlc3RpbWF0aW5nIHRoZSBtZWFuIG92ZXJoZWF0aW5nIHJpc2sgKGkuZS4sIHByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZykgDQpydW5fY29tbXVuaXR5X3Byb3BvcnRpb25fb3ZlcmhlYXRpbmdfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZGF0YXNldCwgaGFiaXRhdF9zY2VuYXJpbykgew0KICANCiAgZGF0YSA8LSBkYXRhc2V0DQogIA0KICAjIFJ1biBtb2RlbA0KICBtb2RlbCA8LSBnYW1tNDo6Z2FtbTQocHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdCB+IHMobGF0LCBicyA9ICJ0cCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gZGF0YSRuX3NwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IFRSVUUpDQogIA0KICAjIEdlbmVyYXRlIGRhdGEgc2V0IGZvciBwcmVkaWN0aW9ucw0KICBuZXdfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAgIGxhdCA9IHNlcShtaW4oZGF0YSRsYXQpLCBtYXgoZGF0YSRsYXQpLCBsZW5ndGggPSAxMDAwKSwNCiAgICBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0ID0gTkEsIA0KICAgIG5fc3BlY2llcyA9IE5BKQ0KICANCiAgIyBQcmVkaWN0IGZvciBlYWNoIGxhdGl0dWRlIHZhbHVlDQogIHByZWQgPC0gcHJlZGljdChtb2RlbCRnYW0sIG5ld2RhdGEgPSBuZXdfZGF0YSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpDQogIG5ld19kYXRhJG92ZXJoZWF0aW5nX3Jpc2tfcHJlZCA8LSBwcmVkJGZpdA0KICBuZXdfZGF0YSRvdmVyaGVhdGluZ19yaXNrX3ByZWRfc2UgPC0gcHJlZCRzZS5maXQNCiAgDQogICMgQ2FsY3VsYXRlIDk1JSBjb25maWRlbmNlIGludGVydmFscw0KICBuZXdfZGF0YSA8LSBtdXRhdGUobmV3X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgKyAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlLA0KICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBvdmVyaGVhdGluZ19yaXNrX3ByZWQgLSAxLjk2ICogb3ZlcmhlYXRpbmdfcmlza19wcmVkX3NlKQ0KICANCiAgIyBNb2RlbCBzdW1tYXJpZXMgDQogIHN1bW1hcnlfZ2FtIDwtIGNhcHR1cmUub3V0cHV0KHN1bW1hcnkobW9kZWwkZ2FtKSkgIyBHZW5lcmFsaXNlZCBhZGRpdGl2ZSBtb2RlbA0KICBzdW1tYXJ5X21lciA8LSBjYXB0dXJlLm91dHB1dChzdW1tYXJ5KG1vZGVsJG1lcikpICMgTWl4ZWQgZWZmZWN0IHJlZ3Jlc3Npb24NCiAgDQogICMgU2F2ZSBtb2RlbCBhbmQgcHJlZGljdGlvbnMNCiAgc2F2ZVJEUyhzdW1tYXJ5X2dhbSwgZmlsZSA9IHBhc3RlMCgiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0XyIsIGhhYml0YXRfc2NlbmFyaW8sICIucmRzIikpDQogIHNhdmVSRFMoc3VtbWFyeV9tZXIsIGZpbGUgPSBwYXN0ZTAoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9NRVJfY29tbXVuaXR5X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N0cmljdF8iLCBoYWJpdGF0X3NjZW5hcmlvLCAiLnJkcyIpKQ0KICBzYXZlUkRTKG5ld19kYXRhLCBmaWxlID0gcGFzdGUwKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdHJpY3RfIiwgaGFiaXRhdF9zY2VuYXJpbywgIi5yZHMiKSkNCn0NCg0KDQojIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YXNldHMNCmRhdGFzZXRfbGlzdCA8LSBsaXN0KA0KICBhcmJvcmVhbF9jdXJyZW50ID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LA0KICBhcmJvcmVhbF9mdXR1cmUyQyA9IGNvbW11bml0eV9hcmJfZnV0dXJlMkMsDQogIGFyYm9yZWFsX2Z1dHVyZTRDID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywNCiAgc3Vic3RyYXRlX2N1cnJlbnQgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsDQogIHN1YnN0cmF0ZV9mdXR1cmUyQyA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsDQogIHN1YnN0cmF0ZV9mdXR1cmU0QyA9IGNvbW11bml0eV9zdWJfZnV0dXJlNEMNCikNCg0KIyBTZXQgdXAgcGFyYWxsZWwgcHJvY2Vzc2luZw0KcGxhbihtdWx0aWNvcmUod29ya2Vycz0zKSkNCg0KIyBSdW4gZnVuY3Rpb24NCnJlc3VsdHMgPC0gZnV0dXJlX2xhcHBseSgNCiAgbmFtZXMoZGF0YXNldF9saXN0KSwgDQogIGZ1bmN0aW9uKHgpIHtydW5fY29tbXVuaXR5X3Byb3BvcnRpb25fb3ZlcmhlYXRpbmdfYW5hbHlzaXMoZGF0YXNldF9saXN0W1t4XV0sIHgpfSwNCiAgZnV0dXJlLnBhY2thZ2VzID0gYygiZ2FtbTQiLCAibWdjdiIsICJkcGx5ciIpDQopDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKiogDQoNCg0KKipDdXJyZW50IGNsaW1hdGUqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdHJpY3Rfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N0cmljdF9zdWJzdHJhdGVfY3VycmVudC5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrMkMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCg0KIyBHZW5lcmFsaXplZCBhZGRpdGl2ZSBtb2RlbA0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X0dBTV9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKSkNCmBgYA0KDQojIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCioqQ3VycmVudCBjbGltYXRlKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X2FyYm9yZWFsX2N1cnJlbnQucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N0cmljdF9hcmJvcmVhbF9jdXJyZW50LnJkcyIpKQ0KYGBgDQoNCioqRnV0dXJlIGNsaW1hdGUgKCsyQykqKg0KYGBge3J9DQojIE1peGVkIGVmZmVjdCByZWdyZXNzaW9uDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfTUVSX2NvbW11bml0eV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfZnV0dXJlMkMucmRzIikpDQoNCiMgR2VuZXJhbGl6ZWQgYWRkaXRpdmUgbW9kZWwNCnByaW50KHJlYWRSRFMoIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvc3VtbWFyeV9HQU1fY29tbXVuaXR5X2xhdF9wcm9wX3NwX292ZXJoZWF0aW5nX3N0cmljdF9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKSkNCmBgYA0KDQoqKkZ1dHVyZSBjbGltYXRlICgrNEMpKioNCmBgYHtyfQ0KIyBNaXhlZCBlZmZlY3QgcmVncmVzc2lvbg0KcHJpbnQocmVhZFJEUygiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9zdW1tYXJ5X01FUl9jb21tdW5pdHlfbGF0X3Byb3Bfc3Bfb3ZlcmhlYXRpbmdfc3RyaWN0X2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpKQ0KDQojIEdlbmVyYWxpemVkIGFkZGl0aXZlIG1vZGVsDQpwcmludChyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3N1bW1hcnlfR0FNX2NvbW11bml0eV9sYXRfcHJvcF9zcF9vdmVyaGVhdGluZ19zdHJpY3RfYXJib3JlYWxfZnV0dXJlNEMucmRzIikpDQpgYGANCg0KDQojIyMjICoqTGluZWFyIG1peGVkIG1vZGVscyoqDQoNCmBgYHtyLCBldmFsPUZ9DQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYmluZF9yb3dzKA0KICBjb21tdW5pdHlfc3ViX2N1cnJlbnQgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfc3ViX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJzdWJzdHJhdGVfZnV0dXJlMkMiKSwgDQogIGNvbW11bml0eV9zdWJfZnV0dXJlNEMgJT4lIG11dGF0ZShoYWJpdGF0X3NjZW5hcmlvID0gInN1YnN0cmF0ZV9mdXR1cmU0QyIpLCANCiAgY29tbXVuaXR5X2FyYl9jdXJyZW50ICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9jdXJyZW50IiksIA0KICBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDICU+JSBtdXRhdGUoaGFiaXRhdF9zY2VuYXJpbyA9ICJhcmJvcmVhbF9mdXR1cmUyQyIpLCANCiAgY29tbXVuaXR5X2FyYl9mdXR1cmU0QyAlPiUgbXV0YXRlKGhhYml0YXRfc2NlbmFyaW8gPSAiYXJib3JlYWxfZnV0dXJlNEMiKQ0KKQ0KDQphbGxfY29tbXVuaXR5X2RhdGEgPC0gYWxsX2NvbW11bml0eV9kYXRhICU+JSBtdXRhdGUob2JzID0gYXMuY2hhcmFjdGVyKHJvd19udW1iZXIoKSkpDQoNCmFsbF9jb21tdW5pdHlfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGFsbF9jb21tdW5pdHlfZGF0YSkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQojIEludGVyY2VwdC1sZXNzIG1vZGVsIA0KbW9kZWxfcHJvcCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0IH4gaGFiaXRhdF9zY2VuYXJpbyAtIDEgKyAoMSB8b2JzKSwgDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsDQogICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSBuX3NwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMTAwMDAwMDAwMCkpLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsX2NvbW11bml0eV9kYXRhKQ0KDQoNCg0KIyBHZXQgcHJlZGljdGlvbnMNCnByZWRpY3Rpb25zIDwtIGFzLmRhdGEuZnJhbWUoZ2dwcmVkaWN0KG1vZGVsX3Byb3AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPSAiaGFiaXRhdF9zY2VuYXJpbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyYW5kb20iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSAxMDAwKSkNCg0KcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIHJlbmFtZShoYWJpdGF0X3NjZW5hcmlvID0geCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gPSBwcmVkaWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfQ0kgPSBjb25mLmxvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX0NJID0gY29uZi5oaWdoKSAlPiUgZHBseXI6OnNlbGVjdCgtZ3JvdXApDQoNCiMgU2F2ZSBtb2RlbCBzdW1tYXJpZXMgYW5kIHByZWRpY3Rpb25zDQpzYXZlUkRTKG1vZGVsX3Byb3AsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9tb2RlbF9sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QucmRzIikNCnNhdmVSRFMocHJlZGljdGlvbnMsIGZpbGUgPSAiUkRhdGEvTW9kZWxzL3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZy9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19sbWU0X3Byb3Bfc3BlY2llc19vdmVyaGVhdGluZ19zdHJpY3QucmRzIikNCg0KDQojIyMjIyMgQ29udHJhc3RzIA0KYWxsX2NvbW11bml0eV9kYXRhJGhhYml0YXRfc2NlbmFyaW8gPC0gYXMuZmFjdG9yKGFsbF9jb21tdW5pdHlfZGF0YSRoYWJpdGF0X3NjZW5hcmlvKQ0KDQojIFJ1biBtb2RlbA0KbW9kZWxfcHJvcF9jb250cmFzdCA8LSBnbG1lcihwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcgfiByZWxldmVsKGhhYml0YXRfc2NlbmFyaW8sIHJlZiA9ICJzdWJzdHJhdGVfY3VycmVudCIpICsgKDEgfG9icyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbl9zcGVjaWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMDAwMDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbF9jb21tdW5pdHlfZGF0YSkNCiMgU2F2ZSBtb2RlbA0Kc2F2ZVJEUyhtb2RlbF9wcm9wX2NvbnRyYXN0LCBmaWxlID0gIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfY29udHJhc3Rfc3RyaWN0LnJkcyIpDQoNCmBgYA0KDQojIyMjIyAqKk1vZGVsIHN1bW1hcmllcyoqIHsudGFic2V0IC50YWJzZXRfZmFkZSAudGFic2V0X3BpbGxzfQ0KDQojIyMjIyMgKipPdmVyYWxsIG1lYW5zKiogDQoNCmBgYHtyfQ0KbW9kZWxfbl9zcF9zdHJpY3QgPC0gcmVhZFJEUyggIlJEYXRhL01vZGVscy9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmcvc2Vuc2l0aXZpdHlfYW5hbHlzZXMvbW9kZWxfbG1lNF9wcm9wX3NwZWNpZXNfb3ZlcmhlYXRpbmdfc3RyaWN0LnJkcyIpDQpzdW1tYXJ5KG1vZGVsX25fc3Bfc3RyaWN0KQ0KDQojIFByZWRpY3Rpb25zDQpyZWFkUkRTKCJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX3N0cmljdC5yZHMiKQ0KYGBgDQoNCiMjIyMjIyAqKkNvbnRyYXN0cyoqIA0KDQpgYGB7cn0NCm1vZGVsX25fc3Bfc3RyaWN0X2NvbnRyYXN0IDwtIHJlYWRSRFMoICJSRGF0YS9Nb2RlbHMvcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nL3NlbnNpdGl2aXR5X2FuYWx5c2VzL21vZGVsX2xtZTRfcHJvcF9zcGVjaWVzX292ZXJoZWF0aW5nX2NvbnRyYXN0X3N0cmljdC5yZHMiKQ0Kc3VtbWFyeShtb2RlbF9uX3NwX3N0cmljdF9jb250cmFzdCkNCmBgYA0KDQoNCg0KIyAqKk1haW4gZmlndXJlcyoqIA0KDQpOb3RlIHRoYXQgY29zbWV0aWMgYWRqdXN0bWVudHMgd2VyZSBtYWRlIHRvIGFsbCBmaWd1cmVzIGluIEFkb2JlIElsbHVzdHJhdG9yLiAgDQoNCiMjICoqRmlndXJlIDEqKiANCg0KYGBge3IsIHdpZHRoID0gMjAsIGhlaWdodCA9IDExfQ0KIyBMb2FkIGRhdGEgZnJvbSBQb3R0aWVyIGV0IGFsLiAyMDIyDQpkYXRhIDwtIHJlYWRfY3N2KCJkYXRhL2RhdGFfUG90dGllcl9ldF9hbF8yMDIyLmNzdiIpDQoNCiMgTG9hZCBvbmUgb2YgdGhlIGRhdGFzZXRzIGZvciBzcGVjaWVzIHJpY2huZXNzDQpjb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50X2NsaXBwZWRfY2VsbHMucmRzIikNCg0Kd29ybGQgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGQgPC0gd29ybGQgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCJBbnRhcmN0aWNhIiwgbmFtZSkpDQoNCiMgTWFwDQptYXBfZGl2ZXJzaXR5IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBsb2cxMChuX3NwZWNpZXMpKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInZpcmlkaXMiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgbmFtZSA9ICJTcGVjaWVzIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIGxvZzEwKDEwKSwgbG9nMTAoNTApLCBsb2cxMCgxMDApLCBsb2cxMCgxNTApKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoMSwgMTAsIDUwLCAxMDAsIDE1MCksIA0KICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDIsIGJhcmhlaWdodCA9IDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAuMSwgZW5kPTEpICsNCiAgZ2duZXdzY2FsZTo6bmV3X3NjYWxlX2ZpbGwoKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEsIA0KICAgICAgICAgICAgIGFlcyh5ID0gbGF0aXR1ZGUsIHggPSBsb25naXR1ZGUpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsIA0KICAgICAgICAgICAgIHNpemU9IDQsIA0KICAgICAgICAgICAgIHN0cm9rZSA9IDEuNSwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwNCiAgICAgICAgICAgICBmaWxsID0gIiNDRTVCOTciLA0KICAgICAgICAgICAgIGNvbCA9ICJibGFjayIpKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMC41LCAwLjUpLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjAyLCAwLjI3KSwNCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDAuNSksDQogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQojIERlbnNpdHkgb2YgcG9pbnRzDQpjb21tdW5pdHlfcG9uZF9leHBhbmRlZCA8LSBjb21tdW5pdHlfcG9uZF9jdXJyZW50ICU+JSANCiAgdW5jb3VudChuX3NwZWNpZXMsIC5yZW1vdmUgPSBGQUxTRSkNCg0KZGVuc2l0eSA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhdGEsIGFlcyh4ID0gbGF0aXR1ZGUpLCANCiAgICAgICAgICAgICAgICBmaWxsID0gIiNDRTVCOTciLCANCiAgICAgICAgICAgICAgICBhbHBoYT0wLjUpICsNCiAgIGdlb21fZGVuc2l0eShkYXRhID0gY29tbXVuaXR5X3BvbmRfZXhwYW5kZWQsIGFlcyh4ID0gbGF0KSwgDQogICAgICAgICAgICAgICAgZmlsbD0iIzIxOTE4YyIsIA0KICAgICAgICAgICAgICAgIGFscGhhPTAuNSkgKw0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxhYigiRGVuc2l0eSIpICsgDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvdXIgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvdXIgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KbWFwIDwtIG1hcF9kaXZlcnNpdHkgKyBkZW5zaXR5ICsgcGxvdF9sYXlvdXQobmNvbCA9IDIpDQoNCm1hcA0KDQpnZ3NhdmUobWFwLCBmaWxlPSJmaWcvRmlndXJlXzEuc3ZnIiwgd2lkdGg9MjAsIGhlaWdodD0xMSwgZHBpPTUwMCkNCmBgYA0KDQpGaWcuIDEgfCBDb250cmFzdCBiZXR3ZWVuIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb25zIGF0IHdoaWNoIGV4cGVyaW1lbnRhbCBkYXRhIHdlcmUgY29sbGVjdGVkLCBhbmQgcGF0dGVybnMgaW4gc3BlY2llcyByaWNobmVzcy4gUGluayBwb2ludHMgZGVub3RlIGV4cGVyaW1lbnRhbCBkYXRhLCB3aGlsZSB0aGUgY29sb3IgZ3JhZGllbnRzIHJlZmVyIHRvIHNwZWNpZXMgcmljaG5lc3MgY2FsY3VsYXRlZCBpbiAxIHggMSDCsCBncmlkIGNlbGxzIGluIHRoZSBpbXB1dGVkIGRhdGEgKG4gPSA1LDIwMyBzcGVjaWVzKS4gRGVuc2l0eSBwbG90cyByZXByZXNlbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBleHBlcmltZW50YWwgZGF0YSAocGluaykgYW5kIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBpbmhhYml0aW5nIHRoZXNlIGFyZWFzIChibHVlKSBhY3Jvc3MgbGF0aXR1ZGVzLiBEYXNoZWQgbGluZXMgcmVwcmVzZW50IHRoZSBlcXVhdG9yIGFuZCB0cm9waWNzLiANCg0KDQojIyAqKkZpZ3VyZSAyKiogDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9DQojIExvYWQgZGF0YSANCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQWRkIHNwZWNpZXMtbGV2ZWwgZGF0YSB0byBwb3B1bGF0aW9uLWxldmVsIGRhdGFzZXQNCnNwZWNpZXNfZGF0YSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCnNwZWNpZXNfZGF0YSA8LSBkcGx5cjo6c2VsZWN0KHNwZWNpZXNfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXAubGFiZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wdXRlZCkNCg0KcG9wX3N1Yl9mdXR1cmU0QyA8LSBkaXN0aW5jdChsZWZ0X2pvaW4ocG9wX3N1Yl9mdXR1cmU0Qywgc3BlY2llc19kYXRhKSkNCg0KIyBJbXBvcnQgdHJlZSBmcm9tIEpldHogYW5kIFB5cm9uICh3aXRoIHNsaWdodCBtb2RpZmljYXRpb25zIGluIHNwZWNpZXMgbmFtZXMpDQp0cmVlIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS90cmVlX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMgQ2FsY3VsYXRlIGRhdGEgc3VtbWFyeQ0KZGF0YV9zdW1tYXJ5IDwtIHBvcF9zdWJfZnV0dXJlNEMgJT4lIA0KICAgZ3JvdXBfYnkodGlwLmxhYmVsKSAlPiUgDQogICBzdW1tYXJpc2UobWVhbl9DVG1heCA9IG1lYW4oQ1RtYXgpLA0KICAgICAgICAgICAgIG1lYW5fVFNNID0gbWVhbihUU00pLA0KICAgICAgICAgICAgIG1lYW5fb3ZlcmhlYXRpbmdfZGF5cyA9IG1lYW4ob3ZlcmhlYXRpbmdfZGF5cyksDQogICAgICAgICAgICAgbG9nX292ZXJoZWF0aW5nX2RheXMgPSBsb2cyKG1lYW5fb3ZlcmhlYXRpbmdfZGF5cyArIDEpKQ0KDQojIEFkZCBvcmRlciBvZiB0aGUgc3BlY2llcyB0byB0aGUgZGF0YSBzdW1tYXJ5DQpkYXRhX3N1bW1hcnkgPC0gZGlzdGluY3QobGVmdF9qb2luKGRhdGFfc3VtbWFyeSwgZHBseXI6OnNlbGVjdChwb3Bfc3ViX2Z1dHVyZTRDLCB0aXAubGFiZWwsIG9yZGVyLCBpbXB1dGVkKSkpIA0KDQojIEZsYWcgc3BlY2llcyB0aGF0IHdlcmUgdGVzdGVkIHByZXZpb3VzbHkgb3IgZnVsbCBpbXB1dGVkDQpkYXRhX3N1bW1hcnkgPC0gZGF0YV9zdW1tYXJ5ICU+JSANCiAgZ3JvdXBfYnkodGlwLmxhYmVsKSAlPiUgDQogIGZpbHRlcihpZihhbnkoaW1wdXRlZD09Im5vIikpIGltcHV0ZWQgPT0gIm5vIiBlbHNlIFRSVUUpICU+JSANCiAgdW5ncm91cCgpDQoNCiMgUHJ1bmUgdHJlZQ0KcHJ1bmVkX3RyZWUgPC0gZHJvcC50aXAodHJlZSwgdHJlZSR0aXAubGFiZWxbLW1hdGNoKGRhdGFfc3VtbWFyeSR0aXAubGFiZWwsIHRyZWUkdGlwLmxhYmVsKV0pIA0KDQojIEJ1aWxkIHRyZWUgc2tlbGV0b24NCnAxIDwtIGdndHJlZShwcnVuZWRfdHJlZSwgDQogICAgICAgICAgICAgbGF5b3V0ID0gImZhbiIsIA0KICAgICAgICAgICAgIGx3ZCA9IDAuMDUpICsgDQogICAgICAgeGxpbSgwLDgwMCkNCg0KIyBNYXRjaCBkYXRhIHRvIHRoZSB0cmVlDQpwMSA8LSBwMSAlPCslIGRhdGFfc3VtbWFyeSANCg0KcDIgPC0gIHAxICsgZ2VvbV9mcnVpdChnZW9tID0gZ2VvbV90aWxlLCAjIEhlYXQgbWFwDQogICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IG9yZGVyKSwgDQogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PTAuMDM1LA0KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDEpKyANCiAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9YygiZ3JheTYwIiwgImdyYXkyMCIpKQ0KDQpwMyA8LSAgcDIgKyBnZ25ld3NjYWxlOjpuZXdfc2NhbGVfZmlsbCgpICsNCiAgICAgICAgICAgIGdlb21fZnJ1aXQoZ2VvbSA9IGdlb21fdGlsZSwgIyBIZWF0IG1hcA0KICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBpbXB1dGVkKSwgDQogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PTAuMDc1LA0KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDEpKyANCiAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9YygiI0NFNUI5NyIsICJncmF5ODUiKSkNCg0KcDQgPC0gcDMgKyBnZ25ld3NjYWxlOjpuZXdfc2NhbGVfZmlsbCgpKw0KICAgICAgICAgICBnZW9tX2ZydWl0KGdlb20gPSBnZW9tX3RpbGUsICMgSGVhdCBtYXANCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBtZWFuX0NUbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9MC4xNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMSkgKyANCiAgICAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbj0idmlyaWRpcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ9MSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJDVG1heCIpIA0KDQpwNSA8LSBwNCArIGdnbmV3c2NhbGU6Om5ld19zY2FsZV9maWxsKCkrDQogICAgICAgICAgIGdlb21fZnJ1aXQoZ2VvbSA9IGdlb21fdGlsZSwgIyBIZWF0IG1hcA0KICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IG1lYW5fVFNNKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9MC4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAxKSArIA0KDQogICAgICAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb249ImluZmVybm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kPTAuOSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJUU00iKSANCg0KcDYgPC0gcDUgKyANCiAgZ2VvbV9mcnVpdChnZW9tID0gZ2VvbV9iYXIsICMgQmFyIHBsb3QNCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb2dfb3ZlcmhlYXRpbmdfZGF5cyksDQogICAgICAgICAgICAgY29sID0gIiNmYjliMDYiLA0KICAgICAgICAgICAgIGZpbGwgPSAiI2ZiOWIwNiIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSwNCiAgICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwgDQogICAgICAgICAgICAgb3JpZW50YXRpb24gPSAieSIsIA0KICAgICAgICAgICAgIGF4aXMucGFyYW1zID0gbGlzdChheGlzID0gIngiLCAjIEJhcnBsb3QgcGFyYW1ldGVycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmFuZ2xlID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2l6ZSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbD0idHJhbnNwYXJlbnQiKSwgDQogICAgICAgICAgICAgZ3JpZC5wYXJhbXMgPSBsaXN0KGFscGhhID0gMC4xKSwNCiAgICAgICAgICAgICBvZmZzZXQgPSAwLjExLCANCiAgICAgICAgICAgICBwd2lkdGggPSAwLjUsIA0KICAgICAgICAgICAgIGFscGhhID0gMSkNCg0KcDYNCg0KZ2dzYXZlKHA2LCBmaWxlPSJmaWcvRmlndXJlXzIuc3ZnIiwgd2lkdGg9MTAsIGhlaWdodD0xMCwgZHBpPTEwMDApDQpgYGANCg0KRmlnLiAyIHwgUGh5bG9nZW5ldGljIGNvdmVyYWdlIGFuZCB0YXhvbm9taWMgdmFyaWF0aW9uIGluIGNsaW1hdGUgdnVsbmVyYWJpbGl0eS4gQ2hyb25vZ3JhbXMgc2hvdyBoZWF0IHRvbGVyYW5jZSBsaW1pdHMgKENUbWF4KSwgdGhlcm1hbCBzYWZldHkgbWFyZ2lucyAoVFNNKSwgYW5kIGhpc3RvZ3JhbXMgdGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBldmVudHMgKGRheXMpIGF2ZXJhZ2VkIGFjcm9zcyBlYWNoIHNwZWNpZXPigJkgZGlzdHJpYnV0aW9uIHJhbmdlLiBQaW5rIGJhcnMgcmVmZXIgdG8gc3BlY2llcyB3aXRoIHByaW9yIGtub3dsZWRnZSwgd2hpbGUgZ3JheSBiYXJzIHJlZmVyIHRvIGVudGlyZWx5IGltcHV0ZWQgc3BlY2llcy4gVGhpcyBmaWd1cmUgd2FzIGNvbnN0cnVjdGVkIGFzc3VtaW5nIGdyb3VuZC1sZXZlbCBtaWNyb2NsaW1hdGVzIG9jY3VycmluZyB1bmRlciA0wrBDIG9mIGdsb2JhbCB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscy4gUGh5bG9nZW55IGlzIGJhc2VkIG9uIHRoZSBjb25zZW5zdXMgb2YgMTAsMDAwIHRyZWVzIHNhbXBsZWQgZnJvbSBhIHBvc3RlcmlvciBkaXN0cmlidXRpb24gKHNlZSBKZXR6ICYgUHlyb24sIDIwMTggZm9yIGRldGFpbHMpLg0KDQojIyAqKkZpZ3VyZSAzKioNCg0KIyMjICoqVmVnZXRhdGVkIFN1YnN0cmF0ZSoqIA0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9DQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZCA8LSB3b3JsZCAlPiUgDQogIGZpbHRlcighZ3JlcGwoIkFudGFyY3RpY2EiLCBuYW1lKSkNCg0KIyBTdWJzdHJhdGUgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKSANCg0KIyBQb25kIGRhdGEgDQpjb21tdW5pdHlfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19jdXJyZW50X2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCiMgQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24NCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KdHNtX21pbiA8LSBtaW4obWluKGNvbW11bml0eV9zdWJfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfc3ViX2Z1dHVyZTRDJGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSkpDQoNCnRzbV9tYXggPC0gbWF4KG1heChjb21tdW5pdHlfc3ViX2N1cnJlbnQkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9hcmJfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3BvbmRfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpKQ0KDQojIEN1cnJlbnQNCm1hcF9zdWJfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiVFNNIiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KDQoNCiMgRnV0dXJlICs0Qw0KbWFwX3N1Yl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfc3ViIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplID0gMS9jb21tdW5pdHlfVFNNX3NlKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTV9wcmVkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgIHNpemUgPSAxLjA1KSArICMgYmxhY2sgbGluZQ0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTV9wcmVkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNzUpICsgIyBtb2RlbCBwcmVkaWN0aW9ucw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU01fcHJlZCksDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICBzaXplID0gMS4wNSkgKyAjIGJsYWNrIGxpbmUNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNX3ByZWQpLA0KICAgICAgICAgICAgIGNvbG9yID0gIiNFRjQxODciLCANCiAgICAgICAgICAgICBzaXplID0gMC43NSkgKyAjIG1vZGVsIHByZWRpY3Rpb25zDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMDAxLCAyLjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCnN1YnN0cmF0ZV9wbG90IDwtIG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICBsYXRfc3ViICsgDQogICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gMykNCmBgYA0KDQojIyMgKipQb25kIG9yIHdldGxhbmQqKiANCg0KYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD04fQ0KIyBDdXJyZW50DQptYXBfcG9uZF9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiVFNNIiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KDQoNCiMgRnV0dXJlICs0Qw0KbWFwX3BvbmRfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCnByZWRfY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3BvbmRfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3BvbmRfZnV0dXJlMkMucmRzIikNCnByZWRfY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9wb25kX2Z1dHVyZTRDLnJkcyIpDQoNCmxhdF9wb25kIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZT0xL2NvbW11bml0eV9UU01fc2UpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuNywNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X3BvbmRfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU01fcHJlZCksDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICBzaXplID0gMS4wNSkgKyAjIGJsYWNrIGxpbmUNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNX3ByZWQpLA0KICAgICAgICAgICAgIGNvbG9yID0gIiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaXplID0gMC43NSkgKyAjIG1vZGVsIHByZWRpY3Rpb25zDQogIGdlb21fbGluZShkYXRhID0gcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU01fcHJlZCksDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICBzaXplID0gMS4wNSkgKyAjIGJsYWNrIGxpbmUNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTV9wcmVkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNzUpICsgIyBtb2RlbCBwcmVkaWN0aW9ucw0KIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMDAxLCAyLjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpICsNCiB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCnBvbmRfcGxvdCA8LSAobWFwX3BvbmRfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgbWFwX3BvbmRfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgIGxhdF9wb25kICsgDQogICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKSkNCmBgYA0KDQoNCiMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD04fQ0KIyBDdXJyZW50DQptYXBfYXJiX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX2FyYl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJUU00iLA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuNSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDEsICJjbSIpLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fYXJib3JlYWxfZnV0dXJlNEMucmRzIikNCg0KbGF0X2FyYiA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZT0xL2NvbW11bml0eV9UU01fc2UpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuNywNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplPTEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTV9wcmVkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgIHNpemUgPSAxLjA1KSArICMgYmxhY2sgbGluZQ0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTV9wcmVkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNzUpICsgIyBtb2RlbCBwcmVkaWN0aW9ucw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU01fcHJlZCksDQogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICBzaXplID0gMS4wNSkgKyAjIGJsYWNrIGxpbmUNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNX3ByZWQpLA0KICAgICAgICAgICAgIGNvbG9yID0gIiNFRjQxODciLCANCiAgICAgICAgICAgICBzaXplID0gMC43NSkgKyAjIG1vZGVsIHByZWRpY3Rpb25zDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMDAxLCAyLjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpICsNCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgNDApKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlRoZXJtYWwgc2FmZXR5IG1hcmdpbiIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuNiwgImNtIiksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCmFyYm9yZWFsX3Bsb3QgPC0gKG1hcF9hcmJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICBsYXRfYXJiICsgDQogICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gMykpDQpgYGANCg0KDQojIyMjICoqRmluYWwgcGxvdCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDh9DQoNCmZpZ3VyZTMgPC0gKHN1YnN0cmF0ZV9wbG90IC8NCiAgICAgICAgICAgIHBvbmRfcGxvdCAvDQogICAgICAgICAgICBhcmJvcmVhbF9wbG90IC8NCiAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KZmlndXJlMw0KDQpnZ3NhdmUoImZpZy9GaWd1cmVfMy5zdmciLCB3aWR0aD0xNCwgaGVpZ2h0PTcsIGRwaSA9IDUwMCkNCmBgYA0KDQpGaWcuIDMgfCBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGZvciBhbXBoaWJpYW5zIGluIHRlcnJlc3RyaWFsICh0b3Agcm93KSwgYXF1YXRpYyAobWlkZGxlIHJvdykgb3IgYXJib3JlYWwgKGJvdHRvbSByb3cpIG1pY3JvaGFiaXRhdHMuIFRoZXJtYWwgc2FmZXR5IG1hcmdpbnMgKFRTTSkgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RlZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBpbiBmdWxsIHNoYWRlIGR1cmluZyB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUgaW4gZWFjaCBjb21tdW5pdHkgKDEtZGVncmVlIGdyaWQgY2VsbCkuIEJsYWNrIGNvbG9yIGRlcGljdHMgYXJlYXMgd2l0aCBubyBkYXRhLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiBUU00gaW4gY3VycmVudCBjbGltYXRlcyAoYmx1ZSkgb3IgYXNzdW1pbmcgNMKwQyBvZiBnbG9iYWwgd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLCBhcyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIERhc2hlZCBsaW5lcyByZXByZXNlbnQgdGhlIGVxdWF0b3IgYW5kIHRyb3BpY3MuDQoNCg0KIyMgKipGaWd1cmUgNCoqDQoNCiMjIyAqKkxvYWQgZGF0YSoqIA0KDQpgYGB7cn0NCiMgU3Vic3RyYXRlIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikgDQoNCiMgUG9uZCBkYXRhIA0KY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KIyBVcGxvYWQgaGlnaCByZXNvbHV0aW9uIEVhcnRoIGRhdGENCndvcmxkIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkIDwtIHdvcmxkICU+JSANCiAgZmlsdGVyKCFncmVwbCgiQW50YXJjdGljYSIsIG5hbWUpKQ0Kc3RfY3JzKHdvcmxkKSA8LSBzdF9jcnMoY29tbXVuaXR5X3N1Yl9jdXJyZW50KQ0KYGBgDQoNCiMjIyMgKipWZWdldGF0ZWQgU3Vic3RyYXRlKiogDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0NCiMgU2V0IGNvbG91cnMNCmNvbG9yX3BhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShjb2xvcnMgPSBjKCIjRkFGMjE4IiwgIiNFRjQxODciLCAiI2Q5MDQyOSIpKQ0KY29sb3JzIDwtIGNvbG9yX3BhbGV0dGUoMTAwKQ0KY29sb3JfZnVuYyA8LSBjb2xvclJhbXBQYWxldHRlKGMoImdyYXk2NSIsIGNvbG9ycykpDQpjb2xvcl9wYWxldHRlIDwtIGNvbG9yX2Z1bmMoMTAwKQ0KDQpzcF9taW4gPC0gbWluKG1pbihjb21tdW5pdHlfc3ViX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSkNCg0Kc3BfbWF4IDwtIG1heChtYXgoY29tbXVuaXR5X3N1Yl9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9zdWJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3BvbmRfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSkpDQoNCiMgU3Vic3RyYXRlIChjdXJyZW50KQ0KbWFwX3N1Yl9UU01fY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjEsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQoNCiMgU3Vic3RyYXRlIChGdXR1cmUgKzRDKQ0KbWFwX3N1Yl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpsYXRfc3ViIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9zdWJfZnV0dXJlNEMsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsIA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9zdWJfY3VycmVudCwgbl9zcGVjaWVzX292ZXJoZWF0aW5nPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKDAsIDM4KSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCIiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gbWFwX3N1Yl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgbWFwX3N1Yl9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgIGxhdF9zdWIgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKQ0KDQpgYGANCg0KIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0NCg0KIyBBcXVhdGljIChjdXJyZW50KQ0KbWFwX3BvbmRfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KIyBBcXVhdGljIChGdXR1cmUgKzRDKQ0KbWFwX3BvbmRfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhzcF9taW4sIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCmxhdF9wb25kIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9wb25kX2Z1dHVyZTRDLCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLCANCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCAzOCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCnBvbmRfcGxvdCAgICAgPC0gbWFwX3BvbmRfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9wb25kX1RTTV9mdXR1cmU0QyArIA0KICAgICAgICAgICAgICAgICAgbGF0X3BvbmQgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKQ0KDQpgYGANCg0KDQojIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9DQojIEN1cnJlbnQNCm1hcF9hcmJfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhzcF9taW4sIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KDQojIEZ1dHVyZSArNEMNCm1hcF9hcmJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjUsICJjbSIpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgxLCAiY20iKSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpsYXRfYXJiIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLCANCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfYXJiX2N1cnJlbnQsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKDAsIDM4KSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJTcGVjaWVzIG92ZXJoZWF0aW5nIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC42LCAiY20iKSwNCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC41LCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KYXJib3JlYWxfcGxvdCA8LSBtYXBfYXJiX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgIGxhdF9hcmIgKyANCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDMpDQpgYGANCg0KIyMjIyAqKkZpbmFsIHBsb3QqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0ID0gNX0NCg0KZmlndXJlNCAgPC0gKHN1YnN0cmF0ZV9wbG90IC8NCiAgICAgICAgICAgICBwb25kX3Bsb3QgLw0KICAgICAgICAgICAgIGFyYm9yZWFsX3Bsb3QgLw0KICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KZmlndXJlNA0KDQpnZ3NhdmUoZmlndXJlNCwgZmlsZSA9ICJmaWcvRmlndXJlXzQuc3ZnIiwgd2lkdGg9MTQsIGhlaWdodD03LCBkcGkgPSA1MDApDQoNCmBgYA0KDQpGaWcuIDQgfCBOdW1iZXIgb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gZXhwZXJpZW5jZSBvdmVyaGVhdGluZyBldmVudHMgaW4gdGVycmVzdHJpYWwgKHRvcCByb3cpLCBhcXVhdGljIChtaWRkbGUgcm93KSwgYW5kIGFyYm9yZWFsIChib3R0b20gcm93KSBtaWNyb2hhYml0YXRzLiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgd2FzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1KSBpbiBlYWNoIGNvbW11bml0eSAoMS1kZWdyZWUgZ3JpZCBjZWxsKS4gQmxhY2sgY29sb3IgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEsIGFuZCBncmF5IGNvbG9yIGNvbW11bml0aWVzIHdpdGhvdXQgc3BlY2llcyBhdCByaXNrLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpIG9yIGFzc3VtaW5nIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gRGFzaGVkIGxpbmVzIHJlcHJlc2VudCB0aGUgZXF1YXRvciBhbmQgdHJvcGljcy4gTm8gc3BlY2llcyB3ZXJlIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiB3YXRlciBib2RpZXMsIGFuZCBoZW5jZSBhcmUgbm90IGRpc3BsYXllZC4NCg0KDQojIyAqKkZpZ3VyZSA1KioNCg0KIyMjICoqTG9hZCBkYXRhKiogDQpgYGB7cn0NCiMgVmVnZXRhdGVkIHN1YnN0cmF0ZQ0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFyYm9yZWFsIGNvbmRpdGlvbnMNCnBvcF9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KDQojIEZpbmQgbGltaXRzIGZvciBjb2xvdXJzIG9mIHRoZSBwbG90DQpkYXlzX21pbiA8LSBtaW4obWluKHBvcF9zdWJfY3VycmVudCRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1pbihwb3Bfc3ViX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtaW4ocG9wX2FyYl9jdXJyZW50JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKHBvcF9hcmJfZnV0dXJlNEMkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSkNCg0KZGF5c19tYXggPC0gbWF4KG1heChwb3Bfc3ViX2N1cnJlbnQkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgocG9wX3N1Yl9mdXR1cmU0QyRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KHBvcF9hcmJfY3VycmVudCRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBsYXRpdHVkZSAtIFN1YnN0cmF0ZSoqIA0KDQpgYGB7cn0NCm5fZGF5c19zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTRDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkrDQogIHlsaW0oLTAuMzUsIGRheXNfbWF4KzAuMzUpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIk51bWJlciBvZiBvdmVyaGVhdGluZyBkYXlzIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBsYXRpdHVkZSAtIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCmBgYHtyfQ0Kbl9kYXlzX2FyYiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlMkMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfY3VycmVudCwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSsNCiAgeWxpbSgtMC4zNSwgZGF5c19tYXgrMC4zNSkgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIG92ZXJoZWF0aW5nIGRheXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBUU00gLSBTdWJzdHJhdGUqKiANCmBgYHtyfQ0KZGF5c19UU01fc3ViIDwtIGdncGxvdCgpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBUU00sIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUpICsNCiAgeWxpbSgtMC4zNSwgZGF5c19tYXgrMC4zNSkgKw0KICB4bGltICgwLCAxOCkgKw0KICB4bGFiKCJUaGVybWFsIHNhZmV0eSBtYXJnaW4iKSArDQogIHlsYWIoIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBUU00gLSBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCmRheXNfVFNNX2FyYiA8LSBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIHlsaW0oLTAuMzUsIGRheXNfbWF4KzAuMzUpICsNCiAgeGxpbSAoMCwgMTgpICsNCiAgeGxhYigiVGhlcm1hbCBzYWZldHkgbWFyZ2luIikgKw0KICB5bGFiKCIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjICoqRmluYWwgcGxvdCoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSAxMn0NCmZpZ3VyZTUgPC0gKG5fZGF5c19zdWIgfCBkYXlzX1RTTV9zdWIpIC8NCiAgICAgICAgICAgKG5fZGF5c19hcmIgfCBkYXlzX1RTTV9hcmIpIA0KDQoNCmZpZ3VyZTUNCg0KZ2dzYXZlKCJmaWcvRmlndXJlXzUuc3ZnIiwgd2lkdGg9MTYsIGhlaWdodD0xMiwgZHBpID0gMzAwKQ0KYGBgDQoNCkZpZy4gNSB8IExhdGl0dWRpbmFsIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiB0ZXJyZXN0cmlhbCAodG9wIHJvdykgYW5kIGFyYm9yZWFsIChib3R0b20gcm93KSBtaWNyb2hhYml0YXRzIGFzIGEgZnVuY3Rpb24gb2YgbGF0aXR1ZGUgKGxlZnQgY29sdW1uKSBhbmQgdGhlcm1hbCBzYWZldHkgbWFyZ2luIChyaWdodCBjb2x1bW4pLiBUaGUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyAoZGF5cykgd2VyZSBjYWxjdWxhdGVkIGFzIHRoZSBzdW0gb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzICh3aGVuIGRhaWx5IG1heGltdW0gdGVtcGVyYXR1cmVzIGV4Y2VlZCBDVG1heCkgZHVyaW5nIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNSBmb3IgZWFjaCBwb3B1bGF0aW9uLiBCbHVlIHBvaW50cyBkZXBpY3QgdGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBldmVudHMgaW4gaGlzdG9yaWNhbCBtaWNyb2NsaW1hdGVzLCB3aGlsZSBvcmFuZ2UgYW5kIHBpbmsgcG9pbnRzIGRlcGljdCB0aGUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyBhc3N1bWluZyAywrBDIGFuZCA0wrBDIG9mIGdsb2JhbCB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscywgcmVzcGVjdGl2ZWx5LiBGb3IgY2xhcml0eSwgb25seSB0aGUgcG9wdWxhdGlvbnMgcHJlZGljdGVkIHRvIGV4cGVyaWVuY2Ugb3ZlcmhlYXRpbmcgZXZlbnRzIGFjcm9zcyBsYXRpdHVkZXMgYXJlIGRlcGljdGVkIChsZWZ0IGNvbHVtbikuDQoNCg0KIyAqKkV4dGVuZGVkIERhdGEgZmlndXJlcyoqIA0KDQojIyAqKkV4dGVuZGVkIGRhdGEgLSBGaWd1cmUgMioqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxNn0NCiMgTG9hZCBkYXRhIHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBpbXB1dGF0aW9uDQpkYXRhX2Zvcl9pbXAgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3ByZV9kYXRhX2Zvcl9pbXB1dGF0aW9uLnJkcyIpDQoNCiMgTG9hZCBkYXRhc2V0cyBmcm9tIHRoZSBjcm9zcy12YWxpZGF0aW9uDQpmaXJzdF9jcm9zc1YgPC0gcmVhZFJEUyhmaWxlID0gIlJkYXRhL0ltcHV0YXRpb24vcmVzdWx0cy8xc3RfY3Jvc3NfdmFsaWRhdGlvbl81dGhfY3ljbGUuUmRzIikgJT4lIG11dGF0ZShjcm9zc1YgPSAiMSIpDQpzZWNvbmRfY3Jvc3NWIDwtIHJlYWRSRFMoZmlsZSA9ICJSZGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvMm5kX2Nyb3NzX3ZhbGlkYXRpb25fNXRoX2N5Y2xlLlJkcyIpICU+JSBtdXRhdGUoY3Jvc3NWID0gIjIiKQ0KdGhpcmRfY3Jvc3NWIDwtIHJlYWRSRFMoZmlsZSA9ICJSZGF0YS9JbXB1dGF0aW9uL3Jlc3VsdHMvM3JkX2Nyb3NzX3ZhbGlkYXRpb25fNXRoX2N5Y2xlLlJkcyIpICU+JSBtdXRhdGUoY3Jvc3NWID0gIjMiKQ0KZm91cnRoX2Nyb3NzViA8LSByZWFkUkRTKGZpbGUgPSAiUmRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzR0aF9jcm9zc192YWxpZGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAlPiUgbXV0YXRlKGNyb3NzViA9ICI0IikNCmZpZnRoX2Nyb3NzViA8LSByZWFkUkRTKGZpbGUgPSAiUmRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzLzV0aF9jcm9zc192YWxpZGF0aW9uXzV0aF9jeWNsZS5SZHMiKSAlPiUgbXV0YXRlKGNyb3NzViA9ICI1IikNCg0KYWxsX2ltcHV0ZWRfZGF0PC0gYmluZF9yb3dzKGZpcnN0X2Nyb3NzViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfY3Jvc3NWLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkX2Nyb3NzViwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VydGhfY3Jvc3NWLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZnRoX2Nyb3NzVikNCg0KIyBGaWx0ZXIgdG8gZGF0YSB0aGF0IHdhcyB1c2VkIGZvciB0aGUgY3Jvc3MtdmFsaWRhdGlvbg0KaW1wX2RhdGEgPC0gYWxsX2ltcHV0ZWRfZGF0W2FsbF9pbXB1dGVkX2RhdCRkYXRfdG9fdmFsaWRhdGU9PSJ5ZXMiLF0NCmltcF9kYXRhIDwtIGRwbHlyOjpmaWx0ZXIoaW1wX2RhdGEsaXMubmEodGlwLmxhYmVsKT09RkFMU0UpIA0KDQojIEFkZCByb3cgbnVtYmVyDQpyb3dfbl9pbXAgPC0gZGF0YS5mcmFtZShyb3dfbiA9IGltcF9kYXRhJHJvd19uKQ0KDQojIEZpbHRlciB0byBvcmlnaW5hbCBkYXRhDQpvcmlnaW5hbF9kYXRhIDwtIGRhdGFfZm9yX2ltcFtkYXRhX2Zvcl9pbXAkcm93X24gJWluJSByb3dfbl9pbXAkcm93X24sXQ0Kb3JpZ2luYWxfZGF0YTwtIGRwbHlyOjo6c2VsZWN0KG9yaWdpbmFsX2RhdGEsIHJvd19uLCBtZWFuX1VUTCkNCg0KIyBDb21iaW5lIGRhdGFmcmFtZXMNCmRhdGE8LSBkcGx5cjo6bGVmdF9qb2luKG9yaWdpbmFsX2RhdGEsIGltcF9kYXRhLCBieT0icm93X24iKQ0KZGF0YSA8LSByZW5hbWUoZGF0YSwgb3JpZ2luYWxfQ1RtYXggPSBtZWFuX1VUTC54LA0KICAgICAgICAgICAgICAgICAgICAgaW1wdXRlZF9DVG1heCA9IGZpbGxlZF9tZWFuX1VUTDUpDQoNCiMgUmVtb3ZlIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgY3Jvc3MtdmFsaWRhdGVkIHR3aWNlDQpkdXBsaWNhdGVzIDwtIGRhdGEgJT4lIA0KICBncm91cF9ieShyb3dfbikgJT4lIA0KICBzdW1tYXJpc2Uobj1uKCkpICU+JSANCiAgZmlsdGVyKG4+MSkgDQpkdXBsaWNhdGVzIDwtIGR1cGxpY2F0ZXMkcm93X24NCg0KZGF0YSA8LSBkYXRhWyEoZGF0YSRyb3dfbiAlaW4lIGR1cGxpY2F0ZXMgJiBkYXRhJGNyb3NzViA9PSAiNSIpLCBdDQoNCg0KZGF0YSAlPiUgc3VtbWFyaXNlKG1lYW49bWVhbihvcmlnaW5hbF9DVG1heCksIA0KICAgICAgICAgICAgICAgICAgIHNkPXNkKG9yaWdpbmFsX0NUbWF4KSwgDQogICAgICAgICAgICAgICAgICAgbj1uKCkpDQoNCmRhdGEgJT4lIHN1bW1hcmlzZShtZWFuPW1lYW4oaW1wdXRlZF9DVG1heCksIA0KICAgICAgICAgICAgICAgICAgIHNkPXNkKGltcHV0ZWRfQ1RtYXgpLCANCiAgICAgICAgICAgICAgICAgICBuPW4oKSkNCg0KcGxvdF9jcm9zc1YgPC0gZ2dwbG90KGRhdGEpICsgDQogIGdlb21fZGVuc2l0eShhZXMob3JpZ2luYWxfQ1RtYXgpLCANCiAgICAgICAgICAgICAgIGZpbGw9IiMyMTkxOGMiLCANCiAgICAgICAgICAgICAgIGFscGhhPTAuOCkrDQogIGdlb21fZGVuc2l0eShhZXMoaW1wdXRlZF9DVG1heCksIA0KICAgICAgICAgICAgICAgZmlsbD0iI0NFNUI5NyIsIA0KICAgICAgICAgICAgICAgYWxwaGE9MC44KSsNCiAgeGxhYigiQ1RtYXgiKSArDQogIHlsYWIoIkRlbnNpdHkiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KcGxvdF9jcm9zc1YNCg0KDQpnZ3NhdmUocGxvdF9jcm9zc1YsIGZpbGU9ImZpZy9FeHRlbmRlZF9kYXRhX2ZpZ3VyZV8yYS5zdmciLCB3aWR0aD0xOCwgaGVpZ2h0PTE2LCBkcGk9NTAwKQ0KYGBgDQoNCkV4dGVuZGVkIERhdGEgRmlnLiAyYSB8ICBQcm9iYWJpbGl0eSBkZW5zaXR5IGRpc3RyaWJ1dGlvbnMgb2YgZXhwZXJpbWVudGFsIENUbWF4IChibHVlKSBhbmQgQ1RtYXggY3Jvc3MtdmFsaWRhdGVkIHVzaW5nIG91ciBkYXRhIGltcHV0YXRpb24gcHJvY2VkdXJlIChwaW5rKS4NCg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxNn0NCnBsb3RfY29yciA8LSBnZ3Bsb3QoZGF0YSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsaW5ld2lkdGggPSAxLjI1KSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gaW1wdXRlZF9DVG1heCwgeSA9IG9yaWdpbmFsX0NUbWF4KSwgDQogICAgICAgICAgICAgZmlsbD0iI0NFNUI5NyIsIA0KICAgICAgICAgICAgIGFscGhhPTAuOCwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgc2l6ZSA9IDEwKSArDQogIHlsYWIoIkV4cGVyaW1lbnRhbCBDVG1heCIpICsNCiAgeGxhYigiSW1wdXRlZCBDVG1heCIpICsNCiAgeGxpbSgyNyw0My41KSArIA0KICB5bGltKDI3LDQzLjUpKw0KICBnZW9tX3RleHQoYWVzKHg9IDQwLCB5ID0gMjkpLCBsYWJlbCA9ICJyID0gMC44NiIsIHNpemUgPSAyMCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNjAsIG1hcmdpbiA9IG1hcmdpbih0ID0gNDAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAyMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQpwbG90X2NvcnINCg0KZ2dzYXZlKHBsb3RfY29yciwgZmlsZT0iZmlnL0V4dGVuZGVkX2RhdGFfZmlndXJlXzJiLnN2ZyIsIHdpZHRoPTE4LCBoZWlnaHQ9MTYsIGRwaT01MDApDQoNCmBgYA0KDQpFeHRlbmRlZCBEYXRhIEZpZy4gMmIgfCAgQ29ycmVsYXRpb24gYmV0d2VlbiBleHBlcmltZW50YWwgQ1RtYXggYW5kIENUbWF4IGNyb3NzLXZhbGlkYXRlZCB1c2luZyBvdXIgZGF0YSBpbXB1dGF0aW9uIHByb2NlZHVyZS4gDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQ0KIyBMb2FkIGltcHV0ZWQgZGF0YQ0KaW1wdXRlZF9kYXRhIDwtIHJlYWRSRFMoIlJEYXRhL0ltcHV0YXRpb24vcmVzdWx0cy9pbXB1dGF0aW9uXzV0aF9jeWNsZS5SZHMiKQ0KDQppbXB1dGVkX2RhdGEgPC0gZmlsdGVyKGltcHV0ZWRfZGF0YSwgaW1wdXRlZD09InllcyIpDQoNCiMgQ2FsY3VsYXRlIGRhdGEgc3VtbWFyeQ0KZGF0YV9zdW1tYXJ5IDwtIGltcHV0ZWRfZGF0YSAlPiUgDQogICBtdXRhdGUoU0UgPSAodXBwZXJfbWVhbl9VVEwgLSBmaWxsZWRfbWVhbl9VVEw1KS8xLjk2LA0KICAgICAgICAgIHdlaWdodHMgPSAxLyhTRV4yKSkgJT4lIA0KICAgZ3JvdXBfYnkodGlwLmxhYmVsKSAlPiUgDQogICBzdW1tYXJpc2UoQ1RtYXggPSAoc3VtKGZpbGxlZF9tZWFuX1VUTDUgKiB3ZWlnaHRzKS9zdW0od2VpZ2h0cykpLA0KICAgICAgICAgICAgIFNFID0gc3FydChzdW0od2VpZ2h0cykgKiAobigpIC0gMSkgLyAoKChzdW0od2VpZ2h0cyleMikgLSAoc3VtKHdlaWdodHNeMikpKSkpLA0KICAgICAgICAgICAgIG9yZGVyID0gb3JkZXIpDQoNCiMgQ2FsY3VsYXRlIGRhdGEgc3VtbWFyeSBmb3IgdGhlIHRyYWluaW5nIGRhdGENCnRyYWluaW5nX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvR2VuZXJhbF9kYXRhL3RyYWluaW5nX2RhdGEucmRzIikgDQoNCmRhdGFfc3VtbWFyeV9leHAgPC0gdHJhaW5pbmdfZGF0YSAlPiUgDQogICBncm91cF9ieSh0aXAubGFiZWwpICU+JSANCiAgIHN1bW1hcmlzZShDVG1heF9leHAgPSBtZWFuKG1lYW5fVVRMKSwNCiAgICAgICAgICAgICBvcmRlciA9IG9yZGVyKQ0KDQpkYXRhX3N1bW1hcnkgPC0gZGlzdGluY3QobGVmdF9qb2luKGRhdGFfc3VtbWFyeSwgZGF0YV9zdW1tYXJ5X2V4cCkpDQoNCmRhdGFfc3VtbWFyeSA8LSBtdXRhdGUoZGF0YV9zdW1tYXJ5LCB0ZXN0ZWQgPSBpZmVsc2UoaXMubmEoQ1RtYXhfZXhwKT09ICJGQUxTRSIsICJ0ZXN0ZWQiLCAibm90X3Rlc3RlZCIpKQ0KDQojIFNldCBjb2xvdXINCkNUbWF4X21pbiA8LSBtaW4obWluKGRhdGFfc3VtbWFyeSRDVG1heCwgbmEucm0gPSBUUlVFKSkNCg0KQ1RtYXhfbWF4IDwtIG1heChtYXgoZGF0YV9zdW1tYXJ5JENUbWF4LCBuYS5ybSA9IFRSVUUpKQ0KDQoNCiMgSW1wb3J0IHRyZWUgZnJvbSBKZXR6IGFuZCBQeXJvbiAod2l0aCBzbGlnaHQgbW9kaWZpY2F0aW9ucyBpbiBzcGVjaWVzIG5hbWVzKQ0KdHJlZSA8LSByZWFkUkRTKCJSRGF0YS9HZW5lcmFsX2RhdGEvdHJlZV9mb3JfaW1wdXRhdGlvbi5yZHMiKQ0KDQojIFBydW5lIHRyZWUNCnBydW5lZF90cmVlIDwtIGRyb3AudGlwKHRyZWUsIHRyZWUkdGlwLmxhYmVsWy1tYXRjaChkYXRhX3N1bW1hcnkkdGlwLmxhYmVsLCB0cmVlJHRpcC5sYWJlbCldKSANCg0KDQojIEJ1aWxkIHRyZWUgc2tlbGV0b24NCnAxIDwtIGdndHJlZShwcnVuZWRfdHJlZSwgDQogICAgICAgICAgICAgbGF5b3V0ID0gImZhbiIsIA0KICAgICAgICAgICAgIGx3ZCA9IDAuMDUpICsgDQogICAgICAgeGxpbSgwLDgwMCkNCg0KIyBNYXRjaCBkYXRhIHRvIHRoZSB0cmVlDQpwMSA8LSBwMSAlPCslIGRhdGFfc3VtbWFyeSANCg0KcDIgPC0gIHAxICsgZ2VvbV9mcnVpdChnZW9tID0gZ2VvbV90aWxlLCAjIEhlYXQgbWFwDQogICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IG9yZGVyKSwgDQogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PTAuMDM1KSsgDQogICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPWMoImdyYXk2MCIsICJncmF5MjAiKSkNCg0KcDMgPC0gcDIgKyBnZ25ld3NjYWxlOjpuZXdfc2NhbGVfZmlsbCgpKw0KICAgICAgICAgICBnZW9tX2ZydWl0KGdlb20gPSBnZW9tX3RpbGUsICMgSGVhdCBtYXANCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSB0ZXN0ZWQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTU1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0wLjE1KSArIA0KICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmF5ODUiLCAiIzIxOTE4YyIpKQ0KDQpwNCA8LSBwMyArIGdnbmV3c2NhbGU6Om5ld19zY2FsZV9maWxsKCkrDQogICAgICAgICAgIGdlb21fZnJ1aXQoZ2VvbSA9IGdlb21fdGlsZSwgIyBIZWF0IG1hcA0KICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IFNFKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9MC4xOSkgKyANCiAgICAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbj0icGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZD0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlNFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk4NSIpDQoNCnA0DQoNCmdnc2F2ZShmaWxlPSJmaWcvRXh0ZW5kZWRfZGF0YV9maWd1cmVfMmMuc3ZnIiwgd2lkdGg9MTAsIGhlaWdodD0xMCwgZHBpPTEwMDApDQpgYGANCg0KDQpFeHRlbmRlZCBEYXRhIEZpZy4gMmMgfCBWYXJpYXRpb24gaW4gdGhlIHVuY2VydGFpbnR5IChzdGFuZGFyZCBlcnJvciwgU0UpIG9mIGltcHV0ZWQgQ1RtYXggcHJlZGljdGlvbnMgKG91dGVyIGNocm9ub2dyYW0pIGFjcm9zcyBzdHVkaWVkIChibHVlKSBhbmQgaW1wdXRlZCAoZ3JleSkgc3BlY2llcy4NCg0KIyMgKipFeHRlbmRlZCBkYXRhIC0gRmlndXJlIDMqKg0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhIA0KDQojIyBTdWJzdHJhdGUNCnBvcF9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyMgUG9uZA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQpgYGANCg0KIyMjICoqVFNNKiogDQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlMkMucmRzIikNCnByZWRfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX1RTTV9zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNLCBzaXplID0gMS9UU01fc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNLCBzaXplID0gMS9UU01fc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00sIHNpemUgPSAxL1RTTV9zZSksIA0KICAgICAgICAgICAgIGNvbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2U9YygwLjI1LCAzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gIm5vbmUiKSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCIiKSArDQogIHlsaW0oLTEwLCA1MCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMjUsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fcG9uZF9jdXJyZW50LnJkcyIpDQpwcmVkX3BvbmRfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9wb25kX2Z1dHVyZTRDLnJkcyIpDQoNCnBvcF9UU01fcG9uZCA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNLCBzaXplID0gMS9UU01fc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSwgc2l6ZSA9IDEvVFNNX3NlKSwgDQogICAgICAgICAgICAgY29sPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSwgc2l6ZSA9IDEvVFNNX3NlKSwgDQogICAgICAgICAgICAgY29sPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMjUsIDMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlRoZXJtYWwgc2FmZXR5IG1hcmdpbiIpICsNCiAgeWxpbSgtMTAsIDUwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQ1KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4yNSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9hcmJvcmVhbF9jdXJyZW50LnJkcyIpDQpwcmVkX2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX1RTTV9hcmIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNLCBzaXplID0gMS9UU01fc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNLCBzaXplID0gMS9UU01fc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00sIHNpemUgPSAxL1RTTV9zZSksIA0KICAgICAgICAgICAgIGNvbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMjUsIDMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiIikgKw0KICB5bGltKC0xMCwgNTApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0NSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjI1LCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KDQojIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MTB9DQpUU00gPC0gcG9wX1RTTV9zdWIgLyBwb3BfVFNNX3BvbmQgLyBwb3BfVFNNX2FyYiAvIHBsb3RfbGF5b3V0KG5jb2wgPSAxKQ0KYGBgDQoNCiMjIyAqKkNUbWF4KiogDQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikNCnByZWRfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCnBvcF9DVG1heF9zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgsIHNpemUgPSAxL0NUbWF4X3NlKSwgDQogICAgICAgICAgICAgY29sPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3Bfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4LCBzaXplID0gMS9DVG1heF9zZSksIA0KICAgICAgICAgICAgIGNvbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4LCBzaXplID0gMS9DVG1heF9zZSksIA0KICAgICAgICAgICAgIGNvbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2U9YygwLjI1LCAzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gIm5vbmUiKSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCIiKSArDQogIHlsaW0oLTEwLCA1MCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMjUsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfcG9uZF9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X3BvbmRfY3VycmVudC5yZHMiKQ0KcHJlZF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X3BvbmRfZnV0dXJlMkMucmRzIikNCnByZWRfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvQ1RtYXgvcHJlZGljdGlvbnNfcG9wX2xhdF9DVG1heF9wb25kX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX0NUbWF4X3BvbmQgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4LCBzaXplID0gMS9DVG1heF9zZSksIA0KICAgICAgICAgICAgIGNvbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgsIHNpemUgPSAxL0NUbWF4X3NlKSwgDQogICAgICAgICAgICAgY29sPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IENUbWF4LCBzaXplID0gMS9DVG1heF9zZSksIA0KICAgICAgICAgICAgIGNvbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2U9YygwLjI1LCAzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gIm5vbmUiKSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJDcml0aWNhbCB0aGVybWFsIG1heGltdW0iKSArDQogIHlsaW0oLTEwLCA1MCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0NSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMjUsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCg0KYGBgDQoNCg0KIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL0NUbWF4L3ByZWRpY3Rpb25zX3BvcF9sYXRfQ1RtYXhfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9DVG1heC9wcmVkaWN0aW9uc19wb3BfbGF0X0NUbWF4X2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX0NUbWF4X2FyYiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBDVG1heCwgc2l6ZSA9IDEvQ1RtYXhfc2UpLCANCiAgICAgICAgICAgICBjb2w9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9hcmJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgsIHNpemUgPSAxL0NUbWF4X3NlKSwgDQogICAgICAgICAgICAgY29sPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gQ1RtYXgsIHNpemUgPSAxL0NUbWF4X3NlKSwgDQogICAgICAgICAgICAgY29sPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDAuMjUsIDMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiIikgKw0KICB5bGltKC0xMCwgNTApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0NSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjI1LCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KDQojIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MTB9DQpDVG1heCAgPC0gcG9wX0NUbWF4X3N1YiAvIHBvcF9DVG1heF9wb25kIC8gcG9wX0NUbWF4X2FyYiAvIHBsb3RfbGF5b3V0KG5jb2wgPSAxKQ0KYGBgDQoNCiMjIyAqKk9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlKiogDQoNCiMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2N1cnJlbnQucmRzIikNCnByZWRfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19wb3BfbGF0X21heF90ZW1wX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX21heF90ZW1wX3N1YiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICB5bGltKC0xMCwgNTApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDExfQ0KIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zDQpwcmVkX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfcG9wX2xhdF9tYXhfdGVtcF9wb25kX2N1cnJlbnQucmRzIikNCnByZWRfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvbWF4X3RlbXAvcHJlZGljdGlvbnNfcG9wX2xhdF9tYXhfdGVtcF9wb25kX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX3BvbmRfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfcG9uZF9mdXR1cmU0Qy5yZHMiKQ0KDQoNCnBvcF9tYXhfdGVtcF9wb25kIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbWF4X3RlbXApLCANCiAgICAgICAgICAgICBjb2w9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbWF4X3RlbXApLCANCiAgICAgICAgICAgICBjb2w9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAyKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3BvbmRfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3BvbmRfZnV0dXJlMkMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICAgY29sb3VyPSJibGFjayIpICsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJPcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSIpICsNCiAgeWxpbSgtMTAsIDUwKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQ1KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQoNCiMjIyMjIyAqKkFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTF9DQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfY3VycmVudC5yZHMiKQ0KcHJlZF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL21heF90ZW1wL3ByZWRpY3Rpb25zX3BvcF9sYXRfbWF4X3RlbXBfYXJib3JlYWxfZnV0dXJlMkMucmRzIikNCnByZWRfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9tYXhfdGVtcC9wcmVkaWN0aW9uc19wb3BfbGF0X21heF90ZW1wX2FyYm9yZWFsX2Z1dHVyZTRDLnJkcyIpDQoNCg0KcG9wX21heF90ZW1wX2FyYiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBtYXhfdGVtcCksIA0KICAgICAgICAgICAgIGNvbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX2FyYl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG1heF90ZW1wKSwgDQogICAgICAgICAgICAgY29sPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMCwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwNCiAgICAgICAgICAgICBzaXplID0gMikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCIiKSArDQogIHlsaW0oLTEwLCA1MCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQ1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KDQojIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MTB9DQpib2R5X3RlbXAgPC0gcG9wX21heF90ZW1wX3N1YiAvIHBvcF9tYXhfdGVtcF9wb25kIC8gcG9wX21heF90ZW1wX2FyYiAvIHBsb3RfbGF5b3V0KG5jb2wgPSAxKQ0KYGBgDQoNCiMjIyAqKkNvbWJpbmUgVFNNLCBDVG1heCBhbmQgYm9keSB0ZW1wZXJhdHVyZSBwbG90cyoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAzMCwgZmlnLmhlaWdodCA9IDIwfQ0KDQphbGxfdHJhaXRzIDwtIChUU018Q1RtYXh8Ym9keV90ZW1wKQ0KDQphbGxfdHJhaXRzDQoNCmdnc2F2ZShhbGxfdHJhaXRzLCBmaWxlID0gImZpZy9FeHRlbmRlZF9kYXRhX2ZpZ3VyZV8zLnN2ZyIsIHdpZHRoPTMwLCBoZWlnaHQ9MjAsIGRwaSA9IDEwMDApDQpgYGANCg0KRXh0ZW5kZWQgRGF0YSBGaWcuIDMgfCBUaGVybWFsIHNhZmV0eSBtYXJnaW4sIGNyaXRpY2FsIHRoZXJtYWwgbWF4aW11bSwgYW5kIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBpbiBkaWZmZXJlbnQgbWljcm9oYWJpdGF0cyBhbmQgY2xpbWF0aWMgc2NlbmFyaW9zLiBQb3B1bGF0aW9uLWxldmVsIG1lYW4gdGhlcm1hbCBzYWZldHkgbWFyZ2lucyAoVFNNOyBsZWZ0IGNvbHVtbiksIGNyaXRpY2FsIHRoZXJtYWwgbWF4aW11bSAoQ1RtYXg7IG1pZGRsZSBjb2x1bW4pIGFuZCBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZXMgKHJpZ2h0IGNvbHVtbikgaW4gdGVycmVzdHJpYWwgKHRvcCByb3cpLCBhcXVhdGljIChtaWRkbGUgcm93KSBhbmQgYXJib3JlYWwgKGJvdHRvbSByb3cpIG1pY3JvaGFiaXRhdHMgYXJlIGRlcGljdGVkIGluIGN1cnJlbnQgbWljcm9jbGltYXRlcyAoYmx1ZSBkYXRhIHBvaW50cyksIG9yIGFzc3VtaW5nIDLCsEMgYW5kIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChvcmFuZ2UsIGFuZCBwaW5rIGRhdGEgcG9pbnRzLCByZXNwZWN0aXZlbHkpIGFjcm9zcyBsYXRpdHVkZXMuIExpbmVzIHJlcHJlc2VudCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgbW9kZWwgcHJlZGljdGlvbnMgZnJvbSBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuDQoNCg0KIyMgKipFeHRlbmRlZCBkYXRhIC0gRmlndXJlIDQqKg0KDQojIyMgKipQb3B1bGF0aW9uLWxldmVsIHBhdHRlcm5zKiogDQoNCmBgYHtyfQ0KIyBWZWdldGF0ZWQgc3Vic3RyYXRlDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgUG9uZCBvciB3ZXRsYW5kDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgRmlsdGVyIHN1YnN0cmF0ZSBkYXRhIHRvIG9ubHkgYXJib3JlYWwgc3BlY2llcw0KcG9wX3N1Yl9jdXJyZW50IDwtIHBvcF9zdWJfY3VycmVudFtwb3Bfc3ViX2N1cnJlbnQkdGlwLmxhYmVsICVpbiUgcG9wX2FyYl9jdXJyZW50JHRpcC5sYWJlbCxdDQpwb3Bfc3ViX2Z1dHVyZTJDIDwtIHBvcF9zdWJfZnV0dXJlMkNbcG9wX3N1Yl9mdXR1cmUyQyR0aXAubGFiZWwgJWluJSBwb3BfYXJiX2Z1dHVyZTJDJHRpcC5sYWJlbCxdDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHBvcF9zdWJfZnV0dXJlNENbcG9wX3N1Yl9mdXR1cmU0QyR0aXAubGFiZWwgJWluJSBwb3BfYXJiX2Z1dHVyZTRDJHRpcC5sYWJlbCxdDQoNCmBgYA0KDQojIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBsYXRpdHVkZSAtIFN1YnN0cmF0ZSoqIA0KDQpgYGB7cn0NCm5fZGF5c19zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTRDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkrDQogIHlsaW0oLTAuMzUsIDE1NCkgKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQojIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBsYXRpdHVkZSAtIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCmBgYHtyfQ0Kbl9kYXlzX2FyYiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlMkMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfY3VycmVudCwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSsNCiAgeWxpbSgtMC4zNSwgMTU0KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDM1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KDQpgYGANCg0KDQojIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBUU00gLSBTdWJzdHJhdGUqKiANCmBgYHtyfQ0KZGF5c19UU01fc3ViIDwtIGdncGxvdCgpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBUU00sIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUpICsNCiAgeWxpbSgtMC4zNSwgMTU0KSArDQogIHhsaW0gKDAsIDE4KSArDQogIHhsYWIoIlRoZXJtYWwgc2FmZXR5IG1hcmdpbiIpICsNCiAgeWxhYigiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KDQojIyMjICoqT3ZlcmhlYXRpbmcgZGF5cyBieSBUU00gLSBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCmRheXNfVFNNX2FyYiA8LSBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IFRTTSwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwb3BfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gVFNNLCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41KSArDQogIHlsaW0oLTAuMzUsIDE1NCkgKw0KICB4bGltICgwLCAxOCkgKw0KICB4bGFiKCJUaGVybWFsIHNhZmV0eSBtYXJnaW4iKSArDQogIHlsYWIoIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDM1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KDQojIyMjICoqQ29tYmluZSBwbG90KiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDEyfQ0KZXh0X2ZpZzQgPC0gKG5fZGF5c19zdWIgfCBkYXlzX1RTTV9zdWIpIC8NCiAgICAgICAgICAgIChuX2RheXNfYXJiIHwgZGF5c19UU01fYXJiKSANCg0KDQpleHRfZmlnNA0KDQpnZ3NhdmUoZXh0X2ZpZzQsIGZpbGU9ImZpZy9FeHRlbmRlZF9kYXRhX2ZpZ3VyZV80YWJjZC5zdmciLCB3aWR0aD0xNiwgaGVpZ2h0PTEyLCBkcGkgPSA1MDApDQpgYGANCg0KDQojIyMgKipDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMqKiANCmBgYHtyfQ0KIyBMb2FkIGRhdGENCiMjIFN1YnN0cmF0ZQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzX2FyYm9yZWFsX3NwLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHNfYXJib3JlYWxfc3AucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxsc19hcmJvcmVhbF9zcC5yZHMiKQ0KDQojIyBBcmJvcmVhbA0KY29tbXVuaXR5X2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkNfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIFNldCBjb2xvdXJzDQpjb2xvcl9wYWxldHRlIDwtIGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzID0gYygiI0ZBRjIxOCIsICIjRUY0MTg3IiwgIiNkOTA0MjkiKSkNCmNvbG9ycyA8LSBjb2xvcl9wYWxldHRlKDEwMCkNCmNvbG9yX2Z1bmMgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJncmF5NjUiLCBjb2xvcnMpKQ0KY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9mdW5jKDEwMCkNCg0Kc3BfbWluIDwtIG1pbihtaW4oY29tbXVuaXR5X3N1Yl9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9zdWJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpKQ0KDQpzcF9tYXggPC0gbWF4KG1heChjb21tdW5pdHlfc3ViX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQpFeHRlbmRlZCBEYXRhIEZpZy4gNGEtZCB8ICBOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIGV4cGVyaWVuY2VkIGJ5IGFyYm9yZWFsIHNwZWNpZXMgYWNyb3NzIGxhdGl0dWRlcyAobGVmdCBjb2x1bW4pIGFuZCBpbiByZWxhdGlvbiB0byB0aGVybWFsIHNhZmV0eSBtYXJnaW5zIChyaWdodCBjb2x1bW4pIGluIHRlcnJlc3RyaWFsICh0b3Agcm93KSBhbmQgYXJib3JlYWwgbWljcm9oYWJpdGF0cyAoYm90dG9tIHJvdykuIFRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIHdlcmUgY2FsY3VsYXRlZCBhcyB0aGUgc3VtIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyAod2hlbiBkYWlseSBtYXhpbXVtIHRlbXBlcmF0dXJlcyBleGNlZWQgQ1RtYXgpIGR1cmluZyB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUgZm9yIGVhY2ggcG9wdWxhdGlvbi4gQmx1ZSBwb2ludHMgZGVwaWN0IHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIGluIGhpc3RvcmljYWwgbWljcm9jbGltYXRlcywgd2hpbGUgb3JhbmdlIGFuZCBwaW5rIHBvaW50cyBkZXBpY3QgdGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBldmVudHMgYXNzdW1pbmcgMsKwQyBhbmQgNMKwQyBvZiBnbG9iYWwgd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMsIHJlc3BlY3RpdmVseS4gSW4gdGhlIGxlZnQgY29sdW1uLCBvbmx5IHRoZSBwb3B1bGF0aW9ucyBwcmVkaWN0ZWQgdG8gb3ZlcmhlYXQgYXJlIGRpc3BsYXllZC4gDQoNCg0KIyMjIyMgKipWZWdldGF0ZWQgc3Vic3RyYXRlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gOH0NCg0KIyBDdXJyZW50DQptYXBfc3ViX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX3N1Yl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9zdWJfZnV0dXJlNEMsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X3N1Yl9jdXJyZW50LCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwgDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCAxNCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTApLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpzdWJzdHJhdGVfcGxvdCA8LSAobWFwX3N1Yl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X2FsbCArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKSkNCmBgYA0KDQoNCiMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQ0KDQojIEN1cnJlbnQNCm1hcF9hcmJfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KDQojIEZ1dHVyZSArNEMNCm1hcF9hcmJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KbGF0X2FsbF9hcmIgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X2FyYl9mdXR1cmU0Qywgbl9zcGVjaWVzX292ZXJoZWF0aW5nPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfYXJiX2N1cnJlbnQsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLCANCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKDAsIDE0KSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJTcGVjaWVzIG92ZXJoZWF0aW5nIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTApLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQphcmJvcmVhbF9wbG90IDwtIChtYXBfYXJiX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgICBsYXRfYWxsX2FyYiArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKSkNCmBgYA0KDQoNCiMjIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aCA9IDE1fQ0KDQphbGxfaGFiaXRhdHMgPC0gKHN1YnN0cmF0ZV9wbG90IC8NCiAgICAgICAgICAgICAgICAgYXJib3JlYWxfcGxvdCAvDQogICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KYWxsX2hhYml0YXRzDQoNCmdnc2F2ZShhbGxfaGFiaXRhdHMsIGZpbGUgPSAiZmlnL0V4dGVuZGVkX2RhdGFfZmlndXJlXzRlZi5zdmciLCB3aWR0aD0xNCwgaGVpZ2h0PTUsIGRwaSA9IDUwMCkNCmBgYA0KDQpFeHRlbmRlZCBEYXRhIEZpZy4gNGUtZiB8IE51bWJlciBvZiBhcmJvcmVhbCBzcGVjaWVzIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyB0ZXJyZXN0cmlhbCAodG9wIHJvdykgYW5kIGFyYm9yZWFsIChib3R0b20gcm93KSBtaWNyb2hhYml0YXRzIGluIGVhY2ggY29tbXVuaXR5LiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgd2FzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1KSBpbiBlYWNoIGNvbW11bml0eSAoMS1kZWdyZWUgZ3JpZCBjZWxsKS4gQmxhY2sgY29sb3IgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEsIGFuZCBncmF5IGNvbG9yIGNvbW11bml0aWVzIHdpdGhvdXQgc3BlY2llcyBhdCByaXNrLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgcHJlZGljdGVkIHRvIG92ZXJoZWF0IGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpIG9yIGFzc3VtaW5nIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gRGFzaGVkIGxpbmVzIHJlcHJlc2VudCB0aGUgZXF1YXRvciBhbmQgdHJvcGljcy4gTm8gc3BlY2llcyB3ZXJlIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiB3YXRlciBib2RpZXMsIGFuZCBoZW5jZSBhcmUgbm90IGRpc3BsYXllZC4NCg0KDQojIyAqKkV4dGVuZGVkIGRhdGEgLSBGaWd1cmUgNSoqIA0KDQpgYGB7cn0NCiMgTG9hZCBkYXRhDQojIyBTdWJzdHJhdGUNCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyMgQXJib3JlYWwNCmNvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50X2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikNCg0KIyMgUG9uZA0KY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQpgYGANCg0KDQojIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQ0KDQojIEN1cnJlbnQNCm1hcF9zdWJfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsMSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9zdWJfZnV0dXJlNEMsIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X3N1Yl9jdXJyZW50LCBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsIA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oLTAuMDEsIDEpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIiIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEwKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX1RTTV9mdXR1cmU0QyArIA0KICAgICAgICAgICAgICAgICAgIGxhdF9hbGwgKyANCiAgICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gMykpDQpgYGANCg0KDQojIyMjIyAqKlBvbmQgb3Igd2V0bGFuZCoqDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQ0KDQojIEN1cnJlbnQNCm1hcF9wb25kX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoMCwxKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjEsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQoNCiMgRnV0dXJlICs0Qw0KbWFwX3BvbmRfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsMSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCg0KbGF0X2FsbCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfcG9uZF9mdXR1cmU0QywgcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgtMC4wMSwgMSkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTApLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpwb25kX3Bsb3QgPC0gKG1hcF9wb25kX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgICAgbWFwX3BvbmRfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X2FsbCArIA0KICAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAzKSkNCmBgYA0KDQoNCiMjIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQ0KIyBDdXJyZW50DQptYXBfYXJiX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X2FyYl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByb3BvcnRpb24gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygwLDEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KIyBGdXR1cmUgKzRDDQptYXBfYXJiX1RTTV9mdXR1cmU0QyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcHJvcG9ydGlvbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJvcG9ydGlvbiBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsMSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KDQpsYXRfYWxsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIHByb3BvcnRpb25fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X2FyYl9jdXJyZW50LCBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBwcm9wb3J0aW9uX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsIA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oLTAuMDEsIDEpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlByb3BvcnRpb24gb2Ygc3BlY2llcyANCm92ZXJoZWF0aW5nIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTApLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQphcmJvcmVhbF9wbG90IDwtIChtYXBfYXJiX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgICBsYXRfYWxsICsgDQogICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDMpKQ0KYGBgDQoNCg0KIyMjIyMgKipBbGwgaGFiaXRhdHMqKiANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoID0gMTV9DQoNCmFsbF9oYWJpdGF0cyA8LSAoc3Vic3RyYXRlX3Bsb3QgLw0KICAgICAgICAgICAgICAgICBwb25kX3Bsb3QgLw0KICAgICAgICAgICAgICAgICBhcmJvcmVhbF9wbG90IC8NCiAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQphbGxfaGFiaXRhdHMNCg0KZ2dzYXZlKGFsbF9oYWJpdGF0cywgZmlsZSA9ICJmaWcvRXh0ZW5kZWRfZGF0YV9maWd1cmVfNS5zdmciLCB3aWR0aD0xNCwgaGVpZ2h0PTcsIGRwaSA9IDUwMCkNCmBgYA0KDQpFeHRlbmRlZCBEYXRhIEZpZy4gNSB8IFByb3BvcnRpb24gb2Ygc3BlY2llcyBwcmVkaWN0ZWQgdG8gZXhwZXJpZW5jZSBvdmVyaGVhdGluZyBldmVudHMgaW4gdGVycmVzdHJpYWwgKHRvcCByb3cpLCBhcXVhdGljIChtaWRkbGUgcm93KSBhbmQgYXJib3JlYWwgKGJvdHRvbSByb3cpIG1pY3JvaGFiaXRhdHMuIFRoZSBwcm9wb3J0aW9uIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgd2FzIGFzc2Vzc2VkIGFzIHRoZSBzdW0gb2Ygc3BlY2llcyBvdmVyaGVhdGluZyBhdCBsZWFzdCBvbmNlIGluIHRoZSBwZXJpb2Qgc3VydmV5ZWQgKHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1KSBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2Ygc3BlY2llcyBpbiBlYWNoIGNvbW11bml0eSAoMS1kZWdyZWUgZ3JpZCBjZWxsKS4gQmxhY2sgY29sb3IgZGVwaWN0cyBhcmVhcyB3aXRoIG5vIGRhdGEsIGFuZCBncmF5IGNvbG9yIGNvbW11bml0aWVzIHdpdGhvdXQgc3BlY2llcyBhdCByaXNrLiBUaGUgcmlnaHQgcGFuZWwgZGVwaWN0cyBsYXRpdHVkaW5hbCBwYXR0ZXJucyBpbiB0aGUgcHJvcG9ydGlvbiBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSBvciBhc3N1bWluZyA0wrBDIG9mIGdsb2JhbCB3YXJtaW5nIGFib3ZlIHByZS1pbmR1c3RyaWFsIGxldmVscyAocGluaykuIERhc2hlZCBsaW5lcyByZXByZXNlbnQgdGhlIGVxdWF0b3IgYW5kIHRyb3BpY3MuIE5vIHNwZWNpZXMgd2VyZSBwcmVkaWN0ZWQgdG8gZXhwZXJpZW5jZSBvdmVyaGVhdGluZyBldmVudHMgaW4gd2F0ZXIgYm9kaWVzLCBhbmQgaGVuY2UgYXJlIG5vdCBkaXNwbGF5ZWQuDQoNCiMjICoqRXh0ZW5kZWQgZGF0YSAtIEZpZ3VyZSA2KiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDExfQ0KIyBMb2FkIGN1cnJlbnQgZGF0YQ0KcG9wX3N1Yl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNEMucmRzIikNCg0KIyBMb2FkIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGRhdGEgDQpwb3Bfc3ViX2Z1dHVyZTRDX3NlbnMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX3NlbnNpdGl2aXR5X2FuYWx5c2lzLnJkcyIpDQoNCg0KIyBMb2FkIGN1cnJlbnQgbW9kZWwgcHJlZGljdGlvbnMNCnByZWRfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDLnJkcyIpICMgIyBMb2FkIG1vZGVsIHByZWRpY3Rpb25zIGFmdGVyIHJlbW92aW5nIG91dGxpZXJzICh0ZW1wZXJhdHVyZXMgYmVsb3cgdGhlIDV0aCBhbmQgYWJvdmUgdGhlIDk1dGggcGVyY2VudGlsZSBib2R5IHRlbXBlcmF0dXJlcykNCnByZWRfc3ViX2Z1dHVyZTRDX25vX291dGxpZXJzIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vc2Vuc2l0aXZpdHlfYW5hbHlzZXMvcHJlZGljdGlvbnNfcG9wX2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTRDX3dpdGhvdXRfb3V0bGllcnMucmRzIikNCiMgTG9hZCBtb2RlbCBwcmVkaWN0aW9ucyB3aXRob3V0IGF2ZXJhZ2luZyAodGFraW5nIFRTTSBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSA5NXRoIHBlcmNlbnRpbGUgYm9keSB0ZW1wZXJhdHVyZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1RtYXgpDQpwcmVkX3N1Yl9mdXR1cmU0Q185NXRoX3BlcmMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9zZW5zaXRpdml0eV9hbmFseXNlcy9wcmVkaWN0aW9uc19wb3BfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNENfOTV0aF9wZXJjZW50aWxlLnJkcyIpDQojIExvYWQgbW9kZWwgcHJlZGljdGlvbnMgd2l0aG91dCBhdmVyYWdpbmcgKHRha2luZyBUU00gYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWF4aW11bSBob3VybHkgYm9keSB0ZW1wZXJhdHVyZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1RtYXg7IGkuZS4sIGxvd2VzdCBwb3NzaWJsZSBUU00pDQpwcmVkX3N1Yl9mdXR1cmU0Q19tYXhfdGVtcCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3NlbnNpdGl2aXR5X2FuYWx5c2VzL3ByZWRpY3Rpb25zX3BvcF9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Q19tYXhfdGVtcC5yZHMiKQ0KDQojIEZpbmQgbGltaXQgb2YgdGhlIHBsb3QNCnRzbV9tYXggPC0gbWF4KHBvcF9zdWJfZnV0dXJlNEMkVFNNKQ0KdHNtX21pbiA8LSBtaW4ocG9wX3N1Yl9mdXR1cmU0Q19zZW5zJFRTTV9leHRyZW1lKQ0KDQpUU01fc2Vuc2l0aXZpdHkgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNENfc2VucywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU01fZXh0cmVtZSksICMgTm8gYXZlcmFnaW5nIChsb3dlc3QgVFNNKQ0KICAgICAgICAgICAgIGNvbG91cj0iI2JmMDYwMyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjAsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsDQogICAgICAgICAgICAgc2l6ZSA9IDMpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gcG9wX3N1Yl9mdXR1cmU0Q19zZW5zLA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gVFNNXzk1KSwgIyBObyBhdmVyYWdpbmcgKDk1dGggcGVyY2VudGlsZSkNCiAgICAgICAgICAgICBjb2xvdXI9IiNmNGQ1OGQiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNENfc2VucywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBUU00pLCAjIFdpdGhvdXQgb3V0bGllcnMNCiAgICAgICAgICAgICBjb2xvdXI9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBvcF9zdWJfZnV0dXJlNEMsICANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IFRTTSksICAjIEN1cnJlbnQgVFNNIHVzZWQgaW4gYW5hbHlzZXMNCiAgICAgICAgICAgICBjb2xvdXI9IiNhZGI1YmQiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIwLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LA0KICAgICAgICAgICAgIHNpemUgPSAzKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmU0Q19tYXhfdGVtcCwgDQogICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksIA0KICAgICAgICAgICAgICBmaWxsPSIjYmYwNjAzIiwgDQogICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX3N1Yl9mdXR1cmU0Q185NXRoX3BlcmMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI2Y0ZDU4ZCIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlNENfbm9fb3V0bGllcnMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9zdWJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLCANCiAgICAgICAgICAgICAgZmlsbD0iI2FkYjViZCIsIA0KICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMS41KSArIA0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiVGhlcm1hbCBzYWZldHkgbWFyZ2luIikgKw0KICB5bGltKHRzbV9taW4sIHRzbV9tYXgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzApLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KDQpUU01fc2Vuc2l0aXZpdHkgDQoNCmdnc2F2ZSgiZmlnL0V4dGVuZGVkX2RhdGFfZmlndXJlXzYuc3ZnIiwgd2lkdGg9MTYsIGhlaWdodD0xMSwgZHBpID0gMzAwKQ0KYGBgDQoNCkV4dGVuZGVkIERhdGEgRmlnLiA2IHwgVmFyaWF0aW9uIGluIHRoZXJtYWwgc2FmZXR5IG1hcmdpbiBjYWxjdWxhdGVkIHVzaW5nIGRpZmZlcmVudCBhc3N1bXB0aW9ucy4gVGhlcm1hbCBzYWZldHkgbWFyZ2lucyAoVFNNKSB3ZXJlIGNhbGN1bGF0ZWQgYXMgdGhlIG1lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIENUbWF4IGFuZCB0aGUgcHJlZGljdGVkIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlIGluIGZ1bGwgc2hhZGUgZHVyaW5nIHRoZSB3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNSAoZ3JleSBjb2xvdXIpLCBhcyB0aGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ1RtYXggYW5kIHRoZSBwcmVkaWN0ZWQgb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgaW4gZnVsbCBzaGFkZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGV4Y2x1ZGluZyBib2R5IHRlbXBlcmF0dXJlcyBmYWxsaW5nIG91dHNpZGUgdGhlIDUlIGFuZCA5NSUgcGVyY2VudGlsZSB0ZW1wZXJhdHVyZXMgKGJsdWUpLCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSA5NSUgcGVyY2VudGlsZSBvcGVyYXRpdmUgYm9keSB0ZW1wZXJhdHVyZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1RtYXggKHllbGxvdyksIG9yIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1heGltdW0gb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIENUbWF4IChyZWQpLiBMaW5lcyByZXByZXNlbnRlZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCByYW5nZXMgcHJlZGljdGVkIGZyb20gZ2VuZXJhbGl6ZWQgYWRkaXRpdmUgbWl4ZWQgbW9kZWxzLiBUaGlzIGZpZ3VyZSB3YXMgY29uc3RydWN0ZWQgYXNzdW1pbmcgZ3JvdW5kLWxldmVsIG1pY3JvY2xpbWF0ZXMgb2NjdXJyaW5nIHVuZGVyIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzLg0KDQojIyAqKkV4dGVuZGVkIGRhdGEgLSBGaWd1cmUgNyoqIA0KDQojIyMgKipMb2FkIGRhdGEqKiANCmBgYHtyfQ0KIyBWZWdldGF0ZWQgc3Vic3RyYXRlIChhY2NsaW1hdGlvbiB0byB0aGUgbWVhbiB3ZWVrbHkgdGVtcGVyYXR1cmUpDQpwb3Bfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudC5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQXJib3JlYWwgY29uZGl0aW9ucyAoYWNjbGltYXRpb24gdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlKQ0KcG9wX2FyYl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIFZlZ2V0YXRlZCBzdWJzdHJhdGUgKGFjY2xpbWF0aW9uIHRvIHRoZSBtYXggd2Vla2x5IHRlbXBlcmF0dXJlKQ0KcG9wX3N1Yl9jdXJyZW50X21heCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkNfbWF4IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tYXhfYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDX21heCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFyYm9yZWFsIGNvbmRpdGlvbnMgKGFjY2xpbWF0aW9uIHRvIHRoZSBtYXggd2Vla2x5IHRlbXBlcmF0dXJlKQ0KcG9wX2FyYl9jdXJyZW50X21heCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19jdXJyZW50LnJkcyIpDQpwb3BfYXJiX2Z1dHVyZTJDX21heCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21heF9hY2NfZnV0dXJlMkMucmRzIikNCnBvcF9hcmJfZnV0dXJlNENfbWF4IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWF4X2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQoNCiMgRmluZCBsaW1pdHMgZm9yIGNvbG91cnMgb2YgdGhlIHBsb3QNCmRheXNfbWluIDwtIG1pbihtaW4ocG9wX3N1Yl9jdXJyZW50JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKHBvcF9zdWJfZnV0dXJlNEMkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihwb3BfYXJiX2N1cnJlbnQkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4ocG9wX2FyYl9mdXR1cmU0QyRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWluKHBvcF9zdWJfY3VycmVudF9tYXgkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4ocG9wX3N1Yl9mdXR1cmU0Q19tYXgkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihwb3BfYXJiX2N1cnJlbnRfbWF4JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWluKHBvcF9hcmJfZnV0dXJlNENfbWF4JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSkpDQoNCmRheXNfbWF4IDwtIG1heChtYXgocG9wX3N1Yl9jdXJyZW50JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KHBvcF9zdWJfZnV0dXJlNEMkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2N1cnJlbnQkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgocG9wX2FyYl9mdXR1cmU0QyRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KHBvcF9zdWJfY3VycmVudF9tYXgkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgocG9wX3N1Yl9mdXR1cmU0Q19tYXgkb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1heChwb3BfYXJiX2N1cnJlbnRfbWF4JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KHBvcF9hcmJfZnV0dXJlNENfbWF4JG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlIC0gU3Vic3RyYXRlKiogDQoNCmBgYHtyfQ0Kbl9kYXlzX3N1YiA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9zdWJfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9zdWJfZnV0dXJlMkMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9zdWJfY3VycmVudCwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSsNCiAgeWxpbSgtMC4zNSwgZGF5c19tYXgrMC4zNSkgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIG92ZXJoZWF0aW5nIGRheXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQojIyMgKipBY2NsaW1hdGlvbiB0byB0aGUgbWF4IHdlZWtseSB0ZW1wZXJhdHVyZSAtIFN1YnN0cmF0ZSoqIA0KDQpgYGB7cn0NCm5fZGF5c19zdWJfbWF4IDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3N1Yl9mdXR1cmU0Q19tYXgsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9zdWJfZnV0dXJlMkNfbWF4LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2N1cnJlbnRfbWF4LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1lYW4gd2Vla2x5IHRlbXBlcmF0dXJlIC0gQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKiANCg0KYGBge3J9DQpuX2RheXNfYXJiIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX2FyYl9mdXR1cmU0Qywgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX2FyYl9mdXR1cmUyQywgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX2FyYl9jdXJyZW50LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDM1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KIyMjICoqQWNjbGltYXRpb24gdG8gdGhlIG1heCB3ZWVrbHkgdGVtcGVyYXR1cmUgLSBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCm5fZGF5c19hcmJfbWF4IDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX2FyYl9mdXR1cmU0Q19tYXgsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlMkNfbWF4LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfYXJiX2N1cnJlbnRfbWF4LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDM1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KIyMjICoqQ29tYmluZSBwbG90cyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSAxMn0NCmV4dF9maWdfNyAgPC0gKG5fZGF5c19zdWIgfCBuX2RheXNfc3ViX21heCkgLw0KICAgICAgICAgICAobl9kYXlzX2FyYiB8IG5fZGF5c19hcmJfbWF4KSANCg0KZXh0X2ZpZ183DQoNCmdnc2F2ZShleHRfZmlnXzcsIGZpbGUgPSJmaWcvRXh0ZW5kZWRfZGF0YV9maWd1cmVfNy5zdmciLCB3aWR0aD0xNiwgaGVpZ2h0PTEyLCBkcGkgPSA1MDApDQpgYGANCg0KRXh0ZW5kZWQgRGF0YSBGaWcuIDcgIHwgTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIHdoZW4gYW5pbWFscyBhcmUgYWNjbGltYXRlZCB0byB0aGUgbWVhbiAobGVmdCBjb2x1bW4pIG9yIG1heGltdW0gd2Vla2x5IGJvZHkgdGVtcGVyYXR1cmUgZXhwZXJpZW5jZWQgaW4gdGhlIHNldmVuIGRheXMgcHJpb3IgKHJpZ2h0IGNvbHVtbikgaW4gdGVycmVzdHJpYWwgKHRvcCByb3cpIGFuZCBhcmJvcmVhbCAoYm90dG9tIHJvdykgbWljcm9oYWJpdGF0cy4gVGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBldmVudHMgKGRheXMpIHdlcmUgY2FsY3VsYXRlZCBhcyB0aGUgc3VtIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyAod2hlbiBkYWlseSBtYXhpbXVtIHRlbXBlcmF0dXJlcyBleGNlZWQgQ1RtYXgpIGR1cmluZyB0aGUgd2FybWVzdCBxdWFydGVycyBvZiAyMDA2LTIwMTUgZm9yIGVhY2ggcG9wdWxhdGlvbi4gQmx1ZSBwb2ludHMgZGVwaWN0IHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIGluIGhpc3RvcmljYWwgbWljcm9jbGltYXRlcywgd2hpbGUgb3JhbmdlIGFuZCBwaW5rIHBvaW50cyBkZXBpY3QgdGhlIG51bWJlciBvZiBvdmVyaGVhdGluZyBldmVudHMgYXNzdW1pbmcgMsKwQyBhbmQgNMKwQyBvZiBnbG9iYWwgd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMsIHJlc3BlY3RpdmVseS4gRm9yIGNsYXJpdHksIG9ubHkgdGhlIHBvcHVsYXRpb25zIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyBhY3Jvc3MgbGF0aXR1ZGVzIGFyZSBkZXBpY3RlZC4NCg0KIyMgKipFeHRlbmRlZCBkYXRhIC0gRmlndXJlIDgqKg0KDQojIyMgKipMb2FkIGRhdGEqKiANCmBgYHtyfQ0KIyBWZWdldGF0ZWQgc3Vic3RyYXRlIA0KcG9wX3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9zdWJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmUyQy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIEFyYm9yZWFsIGNvbmRpdGlvbnMgDQpwb3BfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9hcmJfZnV0dXJlMkMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQy5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDLnJkcyIpDQoNCiMgQXF1YXRpYyBjb25kaXRpb25zIA0KcG9wX3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2N1cnJlbnQucmRzIikNCnBvcF9wb25kX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDLnJkcyIpDQpwb3BfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmU0Qy9wb3B1bGF0aW9uX3Z1bG5lcmFiaWxpdHlfcG9uZF9tZWFuX2FjY19mdXR1cmU0Qy5yZHMiKQ0KDQojIFZlZ2V0YXRlZCBzdWJzdHJhdGUgKGxhcmdlIHNlIHVzZWQgZm9yIGVzdGltYXRpbmcgb3ZlcmhlYXRpbmcgcHJvYmFiaWxpdGllcykNCnBvcF9zdWJfY3VycmVudF9zZSA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19jdXJyZW50X2xhcmdlX3NlLnJkcyIpDQpwb3Bfc3ViX2Z1dHVyZTJDX3NlIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KcG9wX3N1Yl9mdXR1cmU0Q19zZSA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfbGFyZ2Vfc2UucmRzIikNCg0KIyBBcmJvcmVhbCBjb25kaXRpb25zIChsYXJnZSBzZSB1c2VkIGZvciBlc3RpbWF0aW5nIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMpDQpwb3BfYXJiX2N1cnJlbnRfc2UgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2N1cnJlbnRfbGFyZ2Vfc2UucmRzIikNCnBvcF9hcmJfZnV0dXJlMkNfc2UgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2Z1dHVyZTJDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19sYXJnZV9zZS5yZHMiKQ0KcG9wX2FyYl9mdXR1cmU0Q19zZSA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvQXJib3JlYWwvZnV0dXJlNEMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X2FyYm9yZWFsX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMgQXF1YXRpYyBjb25kaXRpb25zIChsYXJnZSBzZSB1c2VkIGZvciBlc3RpbWF0aW5nIG92ZXJoZWF0aW5nIHByb2JhYmlsaXRpZXMpDQpwb3BfcG9uZF9jdXJyZW50X3NlIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2N1cnJlbnQvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9sYXJnZV9zZS5yZHMiKQ0KcG9wX3BvbmRfZnV0dXJlMkNfc2UgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvZnV0dXJlMkMvcG9wdWxhdGlvbl92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlMkNfbGFyZ2Vfc2UucmRzIikNCnBvcF9wb25kX2Z1dHVyZTRDX3NlIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL3BvcHVsYXRpb25fdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTRDX2xhcmdlX3NlLnJkcyIpDQoNCiMgRmluZCBsaW1pdHMgZm9yIGNvbG91cnMgb2YgdGhlIHBsb3QNCmRheXNfbWluIDwtIDANCg0KZGF5c19tYXggPC0gbWF4KG1heChwb3Bfc3ViX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgocG9wX2FyYl9mdXR1cmU0QyRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KHBvcF9wb25kX2Z1dHVyZTRDJG92ZXJoZWF0aW5nX2RheXMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgocG9wX3N1Yl9mdXR1cmU0Q19zZSRvdmVyaGVhdGluZ19kYXlzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWF4KHBvcF9hcmJfZnV0dXJlNENfc2Ukb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtYXgocG9wX3BvbmRfZnV0dXJlNENfc2Ukb3ZlcmhlYXRpbmdfZGF5cywgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQojIyMgKipSZWd1bGFyIGVzdGltYXRlcyAtIFN1YnN0cmF0ZSoqIA0KDQpgYGB7cn0NCm5fZGF5c19zdWIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTRDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkrDQogIHlsaW0oLTAuMzUsIGRheXNfbWF4KzAuMzUpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIk51bWJlciBvZiBvdmVyaGVhdGluZyBkYXlzIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KIyMjICoqRXN0aW1hdGVzIHdpdGggbGFyZ2UgdW5jZXJ0YWludHkgLSBTdWJzdHJhdGUqKiANCg0KYGBge3J9DQpuX2RheXNfc3ViX3NlIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3N1Yl9mdXR1cmU0Q19zZSwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3N1Yl9mdXR1cmUyQ19zZSwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3N1Yl9jdXJyZW50X3NlLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCiMjIyAqKlN0cmljdCBlc3RpbWF0ZXMgLSBTdWJzdHJhdGUqKiANCg0KYGBge3J9DQpuX2RheXNfc3ViX3N0cmljdCA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9zdWJfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3N1Yl9mdXR1cmUyQywgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3Bfc3ViX2N1cnJlbnQsIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSsNCiAgeWxpbSgtMC4zNSwgZGF5c19tYXgrMC4zNSkgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIG92ZXJoZWF0aW5nIGRheXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQoNCiMjIyAqKlJlZ3VsYXIgZXN0aW1hdGVzIC0gQXF1YXRpYyoqIA0KDQpgYGB7cn0NCm5fZGF5c19wb25kIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3BvbmRfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9wb25kX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfcG9uZF9jdXJyZW50LCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCiMjIyAqKkVzdGltYXRlcyB3aXRoIGxhcmdlIHVuY2VydGFpbnR5IC0gQXF1YXRpYyoqIA0KDQpgYGB7cn0NCm5fZGF5c19wb25kX3NlIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3BvbmRfZnV0dXJlNENfc2UsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9wb25kX2Z1dHVyZTJDX3NlLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfcG9uZF9jdXJyZW50X3NlLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCiMjIyAqKlN0cmljdCBlc3RpbWF0ZXMgLSBBcXVhdGljKiogDQoNCmBgYHtyfQ0Kbl9kYXlzX3BvbmRfc3RyaWN0IDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3BvbmRfZnV0dXJlNEMsIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0VGNDE4NyIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3BvbmRfZnV0dXJlMkMsIG92ZXJoZWF0aW5nX3Jpc2tfc3RyaWN0ID4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iI0ZBQTQzQSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX3BvbmRfY3VycmVudCwgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCg0KIyMjICoqUmVndWxhciBlc3RpbWF0ZXMgLSBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCm5fZGF5c19hcmIgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfYXJiX2Z1dHVyZTRDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfYXJiX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19kYXlzID49IDEpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRkFBNDNBIiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfYXJiX2N1cnJlbnQsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiM1REM4RDkiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTUwLCAtMjUsIDAsIDI1LCA1MCksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSkrDQogIHlsaW0oLTAuMzUsIGRheXNfbWF4KzAuMzUpICsNCiAgeGxhYigiTGF0aXR1ZGUiKSArDQogIHlsYWIoIk51bWJlciBvZiBvdmVyaGVhdGluZyBkYXlzIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzUpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDEwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAzKSkNCmBgYA0KDQojIyMgKipFc3RpbWF0ZXMgd2l0aCBsYXJnZSB1bmNlcnRhaW50eSAtIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uKiogDQoNCmBgYHtyfQ0Kbl9kYXlzX2FyYl9zZSA8LSBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlNENfc2UsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNFRjQxODciLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfZnV0dXJlMkNfc2UsIG92ZXJoZWF0aW5nX2RheXMgPj0gMSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfY3VycmVudF9zZSwgb3ZlcmhlYXRpbmdfZGF5cyA+PSAxKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBvdmVyaGVhdGluZ19kYXlzKSwgDQogICAgICAgICAgICAgZmlsbD0iIzVEQzhEOSIsIA0KICAgICAgICAgICAgIHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgIGFscGhhPTAuODUsIA0KICAgICAgICAgICAgIHNpemUgPSAzLjUsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMzUsIGhlaWdodD0wLjM1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtNTAsIC0yNSwgMCwgMjUsIDUwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpKSsNCiAgeWxpbSgtMC4zNSwgZGF5c19tYXgrMC4zNSkgKw0KICB4bGFiKCJMYXRpdHVkZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIG92ZXJoZWF0aW5nIGRheXMiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDgsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMTAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDMpKQ0KYGBgDQoNCiMjIyAqKlN0cmljdCBlc3RpbWF0ZXMgLSBBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqIA0KDQpgYGB7cn0NCm5fZGF5c19hcmJfc3RyaWN0IDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIocG9wX2FyYl9mdXR1cmU0Qywgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjRUY0MTg3IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihwb3BfYXJiX2Z1dHVyZTJDLCBvdmVyaGVhdGluZ19yaXNrX3N0cmljdCA+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gb3ZlcmhlYXRpbmdfZGF5cyksIA0KICAgICAgICAgICAgIGZpbGw9IiNGQUE0M0EiLCANCiAgICAgICAgICAgICBzaGFwZSA9IDIxLCANCiAgICAgICAgICAgICBhbHBoYT0wLjg1LCANCiAgICAgICAgICAgICBzaXplID0gMy41LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjM1LCBoZWlnaHQ9MC4zNSkpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKHBvcF9hcmJfY3VycmVudCwgb3ZlcmhlYXRpbmdfcmlza19zdHJpY3QgPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG92ZXJoZWF0aW5nX2RheXMpLCANCiAgICAgICAgICAgICBmaWxsPSIjNURDOEQ5IiwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgDQogICAgICAgICAgICAgYWxwaGE9MC44NSwgDQogICAgICAgICAgICAgc2l6ZSA9IDMuNSwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zNSwgaGVpZ2h0PTAuMzUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC01MCwgLTI1LCAwLCAyNSwgNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCkpKw0KICB5bGltKC0wLjM1LCBkYXlzX21heCswLjM1KSArDQogIHhsYWIoIkxhdGl0dWRlIikgKw0KICB5bGFiKCJOdW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZGF5cyIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDM1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gOCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAxMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMykpDQpgYGANCg0KIyMjICoqQ29tYmluZSBwbG90cyoqIA0KDQpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSAxMn0NCmV4dF9maWdfOCAgPC0gKG5fZGF5c19zdWIgfCBuX2RheXNfc3ViX3NlIHwgbl9kYXlzX3N1Yl9zdHJpY3QpIC8NCiAgICAgICAgICAgKG5fZGF5c19wb25kIHwgbl9kYXlzX3BvbmRfc2UgfCBuX2RheXNfcG9uZF9zdHJpY3QpIC8NCiAgICAgICAgICAgKG5fZGF5c19hcmIgfCBuX2RheXNfYXJiX3NlIHwgbl9kYXlzX2FyYl9zdHJpY3QpIA0KDQpleHRfZmlnXzgNCg0KZ2dzYXZlKGV4dF9maWdfOCwgZmlsZT0iZmlnL0V4dGVuZGVkX2RhdGFfZmlndXJlXzguc3ZnIiwgd2lkdGg9MjAsIGhlaWdodD0xMywgZHBpID0gNTAwKQ0KYGBgDQoNCkV4dGVuZGVkIERhdGEgRmlnLiA4IHwgTGF0aXR1ZGluYWwgdmFyaWF0aW9uIGluIHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIHVzaW5nIHJlZ3VsYXIgKGxlZnQgY29sdW1uKSBvciBjb25zZXJ2YXRpdmUgZXN0aW1hdGVzIChyaWdodCBjb2x1bW4pIGluIHRlcnJlc3RyaWFsICh0b3Agcm93KSBhbmQgYXJib3JlYWwgKGJvdHRvbSByb3cpIG1pY3JvaGFiaXRhdHMuIFRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIChkYXlzKSB3ZXJlIGNhbGN1bGF0ZWQgYXMgdGhlIHN1bSBvZiBvdmVyaGVhdGluZyBldmVudHMgKHdoZW4gZGFpbHkgbWF4aW11bSB0ZW1wZXJhdHVyZXMgZXhjZWVkIENUbWF4KSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGZvciBlYWNoIHBvcHVsYXRpb24uIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZXMgYXJlIHRob3NlIHdoZXJlIG92ZXJoZWF0aW5nIGV2ZW50cyB3ZXJlIGNvdW50ZWQgb25seSB3aGVuIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBleGNlZWRlZCA1MCUgb2YgdGhlIHByZWRpY3RlZCBkaXN0cmlidXRpb24gb2YgQ1RtYXguIEJsdWUgcG9pbnRzIGRlcGljdCB0aGUgbnVtYmVyIG9mIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiBoaXN0b3JpY2FsIG1pY3JvY2xpbWF0ZXMsIHdoaWxlIG9yYW5nZSBhbmQgcGluayBwb2ludHMgZGVwaWN0IHRoZSBudW1iZXIgb2Ygb3ZlcmhlYXRpbmcgZXZlbnRzIGFzc3VtaW5nIDLCsEMgYW5kIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzLCByZXNwZWN0aXZlbHkuIEZvciBjbGFyaXR5LCBvbmx5IHRoZSBwb3B1bGF0aW9ucyBwcmVkaWN0ZWQgdG8gZXhwZXJpZW5jZSBvdmVyaGVhdGluZyBldmVudHMgYWNyb3NzIGxhdGl0dWRlcyBhcmUgZGVwaWN0ZWQuDQoNCiMjICoqRXh0ZW5kZWQgZGF0YSAtIEZpZ3VyZSA5KioNCg0KIyMjICoqVGVycmVzdHJpYWwgYmlvcGh5c2ljYWwgbW9kZWxzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMqKiANCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMjAsIGZpZy53aWR0aCA9IDE2fQ0KIyBPcGVuIGhhYml0YXRzIGFuZCBidXJyb3dzDQpoYWJpdGF0X3NlbGVjdGlvbiA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfb3BlbiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC42LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAicmVkIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBmaWx0ZXIoZGFpbHlfdnVsbmVyYWJpbGl0eV9idXJyb3csIERFUFRIID09ICIyLjVjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICJnb2xkIiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGZpbHRlcihkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdywgREVQVEggPT0gIjVjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjQkE5RTQ5IiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGZpbHRlcihkYWlseV92dWxuZXJhYmlsaXR5X2J1cnJvdywgREVQVEggPT0gIjEwY20iKSwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya29yYW5nZSIsIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBmaWx0ZXIoZGFpbHlfdnVsbmVyYWJpbGl0eV9idXJyb3csIERFUFRIID09ICIxNWNtIiksIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiNGMUFGNzkiLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZmlsdGVyKGRhaWx5X3Z1bG5lcmFiaWxpdHlfYnVycm93LCBERVBUSCA9PSAiMjBjbSIpLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjOTk1QzUxIiwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKw0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHksIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC02LjUsIDUpICsgDQogIHlsaW0oMCwgMS4wNSkgKw0KICB4bGFiKCJEYWlseSBUU00iKSArIA0KICB5bGFiKCJEZW5zaXR5IikgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KDQojIEJvZHkgc2l6ZQ0KYm9keV9zaXplIDwtIA0KZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfc21hbGwsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiM0OUJBQUUiKSArIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfbGFyZ2UsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiNCQTQ5ODkiKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eSwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC42LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsd2QgPSAxLCBhbHBoYSA9IDAuNzUpICsgDQogIHhsaW0oLTUsIDUpICsgDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIkRlbnNpdHkiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDQwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQoNCnRlcnJlc3RyaWFsX3BhcmFtZXRlcnMgPC0gYm9keV9zaXplIC8gaGFiaXRhdF9zZWxlY3Rpb24gDQoNCnRlcnJlc3RyaWFsX3BhcmFtZXRlcnMNCmBgYA0KDQoNCiMjIyAqKkFxdWF0aWMgYmlvcGh5c2ljYWwgbW9kZWxzIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMqKg0KYGBge3IsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTJ9DQphcXVhdGljX3BhcmFtZXRlcnMgPC0gDQogIGdncGxvdCgpKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfc2hhbGxvdywgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X3BvbmRfZGVlcCwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya2JsdWUiKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9wb25kLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjYsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICJibGFjayIpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGx3ZCA9IDEsIGFscGhhID0gMC43NSkgKyANCiAgeGxpbSgtNSwgNikgKyANCiAgeGxhYigiIikgKyANCiAgeWxhYigiRGVuc2l0eSIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gNDAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDQwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAyMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBzaXplID0gMikpDQoNCmFxdWF0aWNfcGFyYW1ldGVycw0KYGBgDQoNCiMjIyAqKkFyYm9yZWFsIGJpb3BoeXNpY2FsIG1vZGVscyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzKioNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMzAsIGZpZy53aWR0aCA9IDE4fQ0KIyBQbGFudCBoZWlnaHQNCnBsYW50X2hlaWdodCA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX3RhbGwsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gImRhcmtncmVlbiIpICsgDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmJfc2hvcnQsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmIsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC01LCA1KSArIA0KICB4bGFiKCIiKSArIA0KICB5bGFiKCIiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDQwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQojIERpZmZ1c2lvbiBvZiBzb2xhciByYWRpYXRpb24NCnBsYW50X3NvbGFyX3JhZCA8LSANCiAgZ2dwbG90KCkrIA0KICBnZW9tX2RlbnNpdHkoZGF0YSA9IGRhaWx5X3Z1bG5lcmFiaWxpdHlfYXJiX2xvd19kaWZmLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjY2M0Nzc4IikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9taWRfZGlmZiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC41LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiIzdlMDNhOCIpICsNCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYiwgDQogICAgICAgICAgICAgICBhZXMoeD1kYWlseV9UU00pLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC42LCANCiAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsd2QgPSAxLCBhbHBoYSA9IDAuNzUpICsgDQogIHhsaW0oLTUsIDUpICsgDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIiIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gNDAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNTAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDQwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAyMCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAyMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBzaXplID0gMikpDQoNCiMgV2luZCByZWR1Y3Rpb24NCnBsYW50X3dpbmRfcmVkdWMgPC0gDQogIGdncGxvdCgpKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9ub193aW5kLCANCiAgICAgICAgICAgICAgIGFlcyh4PWRhaWx5X1RTTSksIA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgICAgZmlsbCA9ICIjQkE0OTUzIikgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkYWlseV92dWxuZXJhYmlsaXR5X2FyYl9oaWdoX3dpbmQsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiM0OUJBQUUiKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGFpbHlfdnVsbmVyYWJpbGl0eV9hcmIsIA0KICAgICAgICAgICAgICAgYWVzKHg9ZGFpbHlfVFNNKSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgDQogICAgICAgICAgICAgICBmaWxsID0gImJsYWNrIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbHdkID0gMSwgYWxwaGEgPSAwLjc1KSArIA0KICB4bGltKC01LCA1KSArIA0KICB4bGFiKCJEYWlseSBUU00iKSArIA0KICB5bGFiKCIiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDQwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSA0MCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMjAsIHIgPSAwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgc2l6ZSA9IDIpKQ0KDQphcmJvcmVhbF9wYXJhbWV0ZXJzIDwtIHBsYW50X2hlaWdodCAvIHBsYW50X3NvbGFyX3JhZCAvIHBsYW50X3dpbmRfcmVkdWMNCg0KYXJib3JlYWxfcGFyYW1ldGVycw0KYGBgDQoNCiMjIyAqKkFsbCBoYWJpdGF0cyoqIA0KYGBge3IsIGZpZy5oZWlnaHQgPSAzMCwgZmlnLndpZHRoID0gMjV9DQphbGxfaGFiaXRhdF9wYXJhbWV0ZXJzIDwtICh0ZXJyZXN0cmlhbF9wYXJhbWV0ZXJzL2FxdWF0aWNfcGFyYW1ldGVycykgfCBhcmJvcmVhbF9wYXJhbWV0ZXJzDQoNCmFsbF9oYWJpdGF0X3BhcmFtZXRlcnMNCg0KZ2dzYXZlKGFsbF9oYWJpdGF0X3BhcmFtZXRlcnMgLCBmaWxlID0gImZpZy9FeHRlbmRlZF9kYXRhX2ZpZ3VyZV85LnN2ZyIsIGhlaWdodCA9IDMwLCB3aWR0aD0yNSwgZHBpID0gNTAwKQ0KYGBgDQoNCg0KRXh0ZW5kZWQgRGF0YSBGaWcuIDkgfCANCg0KIyMgKipFeHRlbmRlZCBkYXRhIC0gRmlndXJlIDEwKioNCkhlcmUsIHdlIHByb3ZpZGUgYSBicmllZiB2YWxpZGF0aW9uIG9mIG9wZXJhdGl2ZSBib2R5IHRlbXBlcmF0dXJlcyBwcmVkaWN0ZWQgZnJvbSBvdXIgbW9kZWxzLiBBcyBhIGNhc2UgaW4gcG9pbnQsIHdlIGNvbXBhcmUgb3VyIGVzdGltYXRlcyB0byBmaWVsZCBib2R5IHRlbXBlcmF0dXJlcyBvZiAxMSBzcGVjaWVzIG9mIGZyb2dzIGluIE1leGljbyAodGFrZW4gZnJvbSBMYXJhLVJlc2VuZGl6ICYgTHVqYSwgMjAxOCwgUmV2aXN0YSBNZXhpY2FuYSBkZSBCaW9kaXZlcnNpZGFkKQ0KDQojIyMgKipQcmVwYXJlIGRhdGEqKiANCmBgYHtyfQ0KIyBHZXQgVGIgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHN0dWR5IChUYWJsZSAxKQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBTcGVjaWVzID0gYygiQWdhbHljaG5pcyBkYWNuaWNvbG9yIiwgIkNyYXVnYXN0b3Igb2NjaWRlbnRhbGlzIiwgIkh5bGEgZXhpbWlhIiwgIkluY2lsaXVzIG1hemF0bGFuZW5zaXMiLCANCiAgICAgICAgICAgICAgIkxlcHRvZGFjdHlsdXMgbWVsYW5vbm90dXMiLCAiTGl0aG9iYXRlcyBjYXRlc2JlaWFudXMiLCAiTGl0aG9iYXRlcyBmb3JyZXJpIiwgIlBsZWN0cm9oeWxhIGJpc3RpbmN0YSIsDQogICAgICAgICAgICAgICJTbWlsaXNjYSBiYXVkaW5paSIsICJTbWlsaXNjYSBmb2RpZW5zIiwgIlRsYWxvY29oeWxhIHNtaXRoaWkiKSwNCiAgVGIgPSBjKCIyMS43wrExLjk3ICgxNy4yLTI5LjgpIiwgIjIwLjXCsTIuMjkgKDE4LjItMjUuOCkiLCAiMjIuOMKxMS4xMiAoMjAuNC0yNCkiLCAiMjQuNMKxMS40OCAoMjIuNS0yNi42KSIsIA0KICAgICAgICAgIjI0LjbCsTMuMzYgKDIxLjUtMzMuMykiLCAiMjQuOMKxMC44OCAoMjMuNC0yNS44KSIsICIyMy45wrExLjg0ICgyMC45LTI3LjcpIiwgIjIyLjXCsTMuMDkgKDE1LjEtMjkuOSkiLA0KICAgICAgICAgIjIzLjTCsTIuMjkgKDIwLjgtMjkpIiwgIjIyLjfCsTEuMDcgKDIxLjQtMjQpIiwgIjIxLjPCsTIuMDMgKDE0LjUtMjUuNykiKQ0KKQ0KDQojIEV4dHJhY3QgdGhlIG1lYW4gYW5kIHJhbmdlIG9mIGJvZHkgdGVtcGVyYXR1cmVzDQpkYXRhJFRiX21lYW4gPC0gYXMubnVtZXJpYyhzdWIoIlxcwrEuKiIsICIiLCBkYXRhJFRiKSkNCmRhdGEkVGJfcmFuZ2UgPC0gZ3N1YigiLipcXCgoLiopXFwpLioiLCAiXFwxIiwgZGF0YSRUYikNCnJhbmdlX3NwbGl0IDwtIHN0cnNwbGl0KGFzLmNoYXJhY3RlcihkYXRhJFRiX3JhbmdlKSwgIi0iKQ0KZGF0YSRNaW4gPC0gc2FwcGx5KHJhbmdlX3NwbGl0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMV0pKQ0KZGF0YSRNYXggPC0gc2FwcGx5KHJhbmdlX3NwbGl0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbMl0pKQ0KDQoNCmRhdGEgPC0gZGF0YSAlPiUgZHBseXI6OnNlbGVjdChTcGVjaWVzLCBNZWFuID0gVGJfbWVhbiwgTWluLCBNYXgpDQoNCiMgU3BlY2llcyBhdCB0aGUgZmlyc3Qgc2l0ZQ0KZGF0YV9UZXBpYyA8LSBmaWx0ZXIoZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJBZ2FseWNobmlzIGRhY25pY29sb3IiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiSHlsYSBleGltaWEiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiSW5jaWxpdXMgbWF6YXRsYW5lbnNpcyIgfA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJMZXB0b2RhY3R5bHVzIG1lbGFub25vdHVzIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJMaXRob2JhdGVzIGNhdGVzYmVpYW51cyIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiTGl0aG9iYXRlcyBmb3JyZXJpIiB8DQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIlNtaWxpc2NhIGJhdWRpbmlpIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJTbWlsaXNjYSBmb2RpZW5zIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJUbGFsb2NvaHlsYSBzbWl0aGlpIikgDQoNCiMgU3BlY2llcyBhdCB0aGUgc2Vjb25kIHNpdGUNCmRhdGFfQ0QgICAgPC0gZmlsdGVyKGRhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiQ3JhdWdhc3RvciBvY2NpZGVudGFsaXMiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiTGl0aG9iYXRlcyBmb3JyZXJpIiB8DQogICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPT0gIlBsZWN0cm9oeWxhIGJpc3RpbmN0YSIgfA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzID09ICJTbWlsaXNjYSBiYXVkaW5paSIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2llcyA9PSAiVGxhbG9jb2h5bGEgc21pdGhpaSIgKSANCmBgYA0KDQojIyMgKipDb21wYXJlIGJvZHkgdGVtcGVyYXR1cmVzIGF0IHRoZSBmaXJzdCBzaXRlKiogDQpgYGB7ciwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMH0NCiMgU2V0IHBhcmFtZXRlcnMNCmRzdGFydCA8LSAiMDEvMDEvMjAxMyINCmRmaW5pc2ggPC0gIjMxLzEyLzIwMTUiICMgV2lkZSByYW5nZSBvZiBkYXRlcywgYnV0IHdpbGwgb25seSBzZWxlY3QgSnVuZSB0byBPY3RvYmVyIDIwMTMvMjAxNQ0KY29vcmRzPC0gYygtMTA0Ljg1LCAyMS40OCkgIyBUZXBpYywgbW9zdCBzYW1wbGVkIHNpdGUNCg0KIyBSdW4gdGhlIG1pY3JvY2xpbWF0ZSBtb2RlbA0KbWljcm9fdmFsaWQgPC0gIE5pY2hlTWFwUjo6bWljcm9fbmNlcChsb2MgPSBjb29yZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhcnQgPSBkc3RhcnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmluaXNoID0gZGZpbmlzaCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvPTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNoYWRlPTg1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhzaGFkZT05MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNyaHl0ID0gMC4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSID0gMS41LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbCA9ICdFOi9wX3BvdHRpZXIvQ2xpbWF0aWNfZGF0YS9kYXRhL05DRVBfdGltZScpDQoNCm1pY3JvIDwtIG1pY3JvX3ZhbGlkDQoNCiMgRmluZCBib2R5IG1hc3Mgb2YgdGhlIGNsb3Nlc3QgbG9jYXRpb24NCnByZXNlbmNlIDwtIHJlYWRSRFMoZmlsZSA9ICJSRGF0YS9HZW5lcmFsX2RhdGEvc3BlY2llc19jb29yZGluYXRlc19hZGp1c3RlZC5yZHMiKQ0KZGF0YV9mb3JfaW1wIDwtIHJlYWRSRFMoZmlsZSA9ICJSRGF0YS9HZW5lcmFsX2RhdGEvcHJlX2RhdGFfZm9yX2ltcHV0YXRpb24ucmRzIikNCg0KcHJlc2VuY2VfYm9keV9tYXNzIDwtIG1lcmdlKHByZXNlbmNlLCBkcGx5cjo6c2VsZWN0KGRhdGFfZm9yX2ltcCwgdGlwLmxhYmVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbWFzcyksIGJ5ID0gInRpcC5sYWJlbCIpDQptZWRpYW5fYm9keV9tYXNzIDwtIHByZXNlbmNlX2JvZHlfbWFzcyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGxvbiwgbGF0KSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShtZWRpYW5fbWFzcyA9IG1lZGlhbihib2R5X21hc3MsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBkcGx5cjo6dW5ncm91cCgpDQoNCm1lZGlhbl9ib2R5X21hc3NbbWVkaWFuX2JvZHlfbWFzcyRsb24gPT0gLTEwNC41ICYgbWVkaWFuX2JvZHlfbWFzcyRsYXQgPT0gMjEuNSxdICMgMjQuOSBnDQoNCiMgUnVuIHRoZSBlY3RvdGhlcm0gbW9kZWwNCmVjdG8gPC0gTmljaGVNYXBSOjplY3RvdGhlcm0obGl2ZT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd3X2cgPSAyNC45LCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdF93ZXQgPSA4MCkNCmVudmlyb24gPC0gYXMuZGF0YS5mcmFtZShlY3RvJGVudmlyb24pDQoNCmVudmlyb25fMjAxMyA8LSBmaWx0ZXIoZW52aXJvbiwgDQogICAgICAgICAgICAgICAgICAgICAgWUVBUiA9PSAiMSIgJiANCiAgICAgICAgICAgICAgICAgICAgICBEQVkgPiAxNTIgJiBEQVkgPCAzMDQgJiANCiAgICAgICAgICAgICAgICAgICAgICAoVElNRSA8IDIgfCBUSU1FID4gMTcpKSAjIEp1bmUgdG8gT2N0b2JlciAyMDEzOyBiZXR3ZWVuIDE4aCBhbmQgMDozMGgNCmVudmlyb25fMjAxNSA8LSBmaWx0ZXIoZW52aXJvbiwgDQogICAgICAgICAgICAgICAgICAgICAgIFlFQVIgPT0gIjMiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgREFZID4gODgyICYgREFZIDwgMTAzNCAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1FIDwgMiB8IFRJTUUgPiAxNykpICMgSnVuZSB0byBPY3RvYmVyIDIwMTU7IGJldHdlZW4gMThoIGFuZCAwOjMwaA0KDQpzdGF0c18yMDEzIDwtIGVudmlyb25fMjAxMyAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIE1pbiA9IG1pbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNYXggPSBtYXgoVEMsIG5hLnJtID0gVFJVRSksDQogICAgTWVhbiA9IG1lYW4oVEMsIG5hLnJtID0gVFJVRSksDQogICAgc2QgPSBzZChUQywgbmEucm0gPSBUUlVFKQ0KICApDQoNCnN0YXRzXzIwMTUgPC0gZW52aXJvbl8yMDE1ICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTWluID0gbWluKFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNZWFuID0gbWVhbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBzZCA9IHNkKFRDLCBuYS5ybSA9IFRSVUUpDQogICkNCg0Kc3RhdHNfMjAxMw0Kc3RhdHNfMjAxNSAjIFZpcnR1YWxseSB0aGUgc2FtZQ0KDQp4X2xpbWl0cyA8LSBjKDAuOTksIDEuMDEpICMgRGVmaW5lIHBsb3QgbWFyZ2lucw0KDQojIFNwYWNlIG91dCBzcGVjaWVzIGVxdWFsbHkNCm51bV9wb2ludHMgPC0gbnJvdyhkYXRhX1RlcGljKQ0KeF92YWx1ZXMgPC0gc2VxKGZyb20gPSAwLjk5MSwgdG8gPSAxLjAwOSwgbGVuZ3RoLm91dCA9IG51bV9wb2ludHMpDQoNClRiX2ppdHRlcmVkIDwtIGRhdGFfVGVwaWMgJT4lDQogIG11dGF0ZSh4X2ppdHRlciA9IHhfdmFsdWVzKQ0KDQpmaXJzdF9zaXRlIDwtIA0KZ2dwbG90KCkgKw0KICBnZW9tX3JlY3QoZGF0YSA9IHN0YXRzXzIwMTMsICAgIyBBZGQgYSAicmliYm9uIiB0byByZXByZXNlbnQgdGhlIHJhbmdlIA0KICAgICAgICAgICAgYWVzKHhtaW4gPSB4X2xpbWl0c1sxXSwgeG1heCA9IHhfbGltaXRzWzJdLCANCiAgICAgICAgICAgICAgICB5bWluID0gTWluLCB5bWF4ID0gTWF4KSwNCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgICBnZW9tX3NlZ21lbnQoZGF0YSA9IHN0YXRzXzIwMTMsICAgIyBBZGQgYSBsaW5lIGZvciB0aGUgTWVhbg0KICAgICAgICAgICAgICAgICBhZXMoeCA9IHhfbGltaXRzWzFdLCB4ZW5kID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgICAgICAgeSA9IE1lYW4sIHllbmQgPSBNZWFuKSwgDQogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuNSkgICsNCiAgICBnZW9tX3JlY3QoZGF0YSA9IHN0YXRzXzIwMTMsICAgICMgQWRkIFNEIGZvciB0aGUgTWVhbg0KICAgICAgICAgICAgICBhZXMoeG1pbiA9IHhfbGltaXRzWzFdLCB4bWF4ID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgICAgeW1pbiA9IE1lYW4gLSBzZCwgeW1heCA9IE1lYW4gKyBzZCksDQogICAgICAgICAgICAgICBmaWxsID0gImdyZXk2MCIsIGFscGhhID0gMC41KSArDQogICAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBUYl9qaXR0ZXJlZCwgICAjIEFkZCBib2R5IHRlbXBlcmF0dXJlIGRhdGENCiAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB4X2ppdHRlciwgeSA9IE1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IE1pbiwgeW1heCA9IE1heCwgY29sID0gU3BlY2llcyksDQogICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsIGxpbmV3aWR0aCA9IDEuMykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiIiwgbGFiZWxzID0gTlVMTCwgYnJlYWtzID0gTlVMTCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgeGxhYigiIikgKyANCiAgeWxhYigiVGVtcGVyYXR1cmUgKMKwQykiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAzMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KDQpmaXJzdF9zaXRlDQpgYGANCg0KIyMjICoqQ29tcGFyZSBib2R5IHRlbXBlcmF0dXJlcyBhdCB0aGUgc2Vjb25kIHNpdGUqKiANCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQ0KY29vcmRzIDwtIGMoLTEwNS4wMywgMjEuNDUpICMgRWwgIEN1YXJlbnRlw7FvDQoNCiMgUnVuIHRoZSBtaWNyb2NsaW1hdGUgbW9kZWwNCm1pY3JvX3ZhbGlkX0NEIDwtICBOaWNoZU1hcFI6Om1pY3JvX25jZXAobG9jID0gY29vcmRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0YXJ0ID0gZHN0YXJ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbmlzaCA9IGRmaW5pc2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpbz0wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaGFkZT04NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4c2hhZGU9OTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzcmh5dCA9IDAuMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiA9IDEuNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgPSAnRTovcF9wb3R0aWVyL0NsaW1hdGljX2RhdGEvZGF0YS9OQ0VQX3RpbWUnKQ0KDQptaWNybyA8LSBtaWNyb192YWxpZF9DRA0KDQojIFJ1biB0aGUgZWN0b3RoZXJtIG1vZGVsDQplY3RvX0NEIDwtIE5pY2hlTWFwUjo6ZWN0b3RoZXJtKGxpdmU9IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXd19nID0gMjQuOSwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3Rfd2V0ID0gODApDQplbnZpcm9uX0NEIDwtIGFzLmRhdGEuZnJhbWUoZWN0byRlbnZpcm9uKQ0KDQplbnZpcm9uXzIwMTNfQ0QgPC0gZmlsdGVyKGVudmlyb25fQ0QsIA0KICAgICAgICAgICAgICAgICAgICAgICBZRUFSID09ICIxIiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgIERBWSA+IDE1MiAmIERBWSA8IDMwNCAmIA0KICAgICAgICAgICAgICAgICAgICAgIChUSU1FIDwgMiB8IFRJTUUgPiAxNykpICMgSnVuZSB0byBPY3RvYmVyIDIwMTMNCmVudmlyb25fMjAxNV9DRCA8LSBmaWx0ZXIoZW52aXJvbiwgDQogICAgICAgICAgICAgICAgICAgICAgIFlFQVIgPT0gIjMiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgREFZID4gODgyICYgREFZIDwgMTAzNCAmIA0KICAgICAgICAgICAgICAgICAgICAgIChUSU1FIDwgMiB8IFRJTUUgPiAxNykpICMgSnVuZSB0byBPY3RvYmVyIDIwMTUNCg0Kc3RhdHNfMjAxM19DRCA8LSBlbnZpcm9uXzIwMTNfQ0QgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBNaW4gPSBtaW4oVEMsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lYW4gPSBtZWFuKFRDLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkID0gc2QoVEMsIG5hLnJtID0gVFJVRSkNCiAgKQ0KDQpzdGF0c18yMDE1X0NEIDwtIGVudmlyb25fMjAxNV9DRCAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIE1pbiA9IG1pbihUQywgbmEucm0gPSBUUlVFKSwNCiAgICBNYXggPSBtYXgoVEMsIG5hLnJtID0gVFJVRSksDQogICAgTWVhbiA9IG1lYW4oVEMsIG5hLnJtID0gVFJVRSksDQogICAgc2QgPSBzZChUQywgbmEucm0gPSBUUlVFKQ0KICApDQoNCnN0YXRzXzIwMTNfQ0QNCnN0YXRzXzIwMTVfQ0QgIyBWaXJ0dWFsbHkgdGhlIHNhbWUNCg0KDQojIFNwYWNlIG91dCBzcGVjaWVzIGVxdWFsbHkNCm51bV9wb2ludHMgPC0gbnJvdyhkYXRhX0NEKQ0KeF92YWx1ZXMgPC0gc2VxKGZyb20gPSAwLjk5MSwgdG8gPSAxLjAwOSwgbGVuZ3RoLm91dCA9IG51bV9wb2ludHMpDQoNClRiX2ppdHRlcmVkX0NEIDwtIGRhdGFfQ0QgJT4lDQogIG11dGF0ZSh4X2ppdHRlciA9IHhfdmFsdWVzKQ0KDQpzZWNvbmRfc2l0ZSA8LSANCmdncGxvdCgpICsNCiAgIA0KICBnZW9tX3JlY3QoZGF0YSA9IHN0YXRzXzIwMTNfQ0QsICMgQWRkIGEgInJpYmJvbiIgdG8gcmVwcmVzZW50IHRoZSByYW5nZQ0KICAgICAgICAgICAgYWVzKHhtaW4gPSB4X2xpbWl0c1sxXSwgeG1heCA9IHhfbGltaXRzWzJdLCANCiAgICAgICAgICAgICAgICB5bWluID0gTWluLCB5bWF4ID0gTWF4KSwNCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBzdGF0c18yMDEzX0NELCAjIEFkZCBhIGxpbmUgZm9yIHRoZSBNZWFuDQogICAgICAgICAgICAgICBhZXMoeCA9IHhfbGltaXRzWzFdLCB4ZW5kID0geF9saW1pdHNbMl0sIA0KICAgICAgICAgICAgICAgICAgIHkgPSBNZWFuLCB5ZW5kID0gTWVhbiksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3JlY3QoZGF0YSA9IHN0YXRzXzIwMTNfQ0QsICMgQWRkIFNEIGZvciB0aGUgTWVhbg0KICAgICAgICAgICAgYWVzKHhtaW4gPSB4X2xpbWl0c1sxXSwgeG1heCA9IHhfbGltaXRzWzJdLCANCiAgICAgICAgICAgICAgICB5bWluID0gTWVhbiAtIHNkLCB5bWF4ID0gTWVhbiArIHNkKSwNCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTYwIiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBUYl9qaXR0ZXJlZF9DRCwgIyBBZGQgYm9keSB0ZW1wZXJhdHVyZQ0KICAgICAgICAgICAgICAgICAgYWVzKHggPSB4X2ppdHRlciwgeSA9IE1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSBNaW4sIHltYXggPSBNYXgsIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IFNwZWNpZXMpLA0KICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwgbGluZXdpZHRoID0gMS4zKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICIiLCBsYWJlbHMgPSBOVUxMLCBicmVha3MgPSBOVUxMKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgeGxhYigiIikgKyANCiAgeWxhYigiVGVtcGVyYXR1cmUgKMKwQykiKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAzMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMzAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0Kc2Vjb25kX3NpdGUNCmBgYA0KDQojIyMgKipGaW5hbCBwbG90KiogDQpgYGB7ciwgZmlnLmhlaWdodCA9IDE1LCBmaWcud2lkdGggPSAxMX0NCnZhbGlkYXRpb25fT0JUIDwtIGZpcnN0X3NpdGUgLyBzZWNvbmRfc2l0ZQ0KDQp2YWxpZGF0aW9uX09CVA0KDQpnZ3NhdmUodmFsaWRhdGlvbl9PQlQsIGZpbGUgPSAiZmlnL0V4dGVuZGVkX2RhdGFfZmlndXJlXzEwLnN2ZyIsIGhlaWdodCA9IDE1LCB3aWR0aCA9IDExLCBkcGkgPSA1MDApDQpgYGANCg0KDQojICoqU3VwcGxlbWVudGFyeSBmaWd1cmVzKiogDQoNCkhlcmUsIHdlIGxpc3QgYWRkaXRpb25hbCBmaWd1cmVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGluIHRoZSBTdXBwbGVtZW50YXJ5IG1hdGVyaWFscywgYnV0IHN1YnNlcXVlbnRseSByZW1vdmVkIChhcyBwZXIgZWRpdG9yaWFsIHBvbGljaWVzKS4gRm9yIHRyYW5zcGFyZW5jeSwgdGhlc2UgZmlndXJlcyBhcmUgcHJlc2VudGVkIGhlcmUuIA0KDQojIyAqKkZpZy4gUzEgLSBJbXB1dGF0aW9uIGNvbnZlcmdlbmNlKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTJ9DQppbXB1dGVkX2RhdGEgPC0gcmVhZFJEUygiUkRhdGEvSW1wdXRhdGlvbi9yZXN1bHRzL2ltcHV0YXRpb25fNXRoX2N5Y2xlLlJkcyIpDQoNCmltcHV0ZWRfZGF0YSA8LSBmaWx0ZXIoaW1wdXRlZF9kYXRhLCBpbXB1dGVkPT0ieWVzIikNCg0KaW1wX2NvbnZlcmdlbmNlIDwtIA0KZ2dwbG90KGltcHV0ZWRfZGF0YSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHggPSAxLCB5ID0gZmlsbGVkX21lYW5fVVRMMSksIA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCksDQogICAgICAgICAgICAgIGNvbCA9ICIjZWRlMGQ0IikgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHggPSAyLCB5ID0gZmlsbGVkX21lYW5fVVRMMiksIA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwNCiAgICAgICAgICAgICAgc2l6ZSA9IDMsIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCksDQogICAgICAgICAgICAgIGNvbCA9ICIjYzlhZGE3IikgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHggPSAzLCB5ID0gZmlsbGVkX21lYW5fVVRMMyksIA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCksDQogICAgICAgICAgICAgIGNvbCA9ICIjOWE4Yzk4IikgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHggPSA0LCB5ID0gZmlsbGVkX21lYW5fVVRMNCksIA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwNCiAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yLCBoZWlnaHQgPSAwKSwNCiAgICAgICAgICAgICAgY29sID0gIiM0YTRlNjkiKSArIA0KICBnZW9tX2ppdHRlcihhZXMoeCA9IDUsIHkgPSBmaWxsZWRfbWVhbl9VVEw1KSwgDQogICAgICAgICAgICAgIGFscGhhID0gMC41LA0KICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjIsIGhlaWdodCA9IDApLA0KICAgICAgICAgICAgICBjb2wgPSAiIzM3Mzc2MCIpICsgDQogIGdlb21fYm94cGxvdChhZXMoeCA9IDEsIHkgPSBmaWxsZWRfbWVhbl9VVEwxKSwgDQogICAgICAgICAgICAgICBub3RjaCA9IFRSVUUsDQogICAgICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICAgICBjb2wgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgb3V0bGllci5jb2xvdXIgPSBOQSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxLjI1LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIA0KICBnZW9tX2JveHBsb3QoYWVzKHggPSAyLCB5ID0gZmlsbGVkX21lYW5fVVRMMiksIA0KICAgICAgICAgICAgICAgbm90Y2ggPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgICAgY29sID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICBzaXplID0gMS4yNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKyANCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gMywgeSA9IGZpbGxlZF9tZWFuX1VUTDMpLCANCiAgICAgICAgICAgICAgIG5vdGNoID0gVFJVRSwNCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSwNCiAgICAgICAgICAgICAgIGNvbCA9ICJibGFjayIsDQogICAgICAgICAgICAgICBvdXRsaWVyLmNvbG91ciA9IE5BLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEuMjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsgDQogIGdlb21fYm94cGxvdChhZXMoeCA9IDQsIHkgPSBmaWxsZWRfbWVhbl9VVEw0KSwgDQogICAgICAgICAgICAgICBub3RjaCA9IFRSVUUsDQogICAgICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICAgICBjb2wgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgb3V0bGllci5jb2xvdXIgPSBOQSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxLjI1LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIA0KICBnZW9tX2JveHBsb3QoYWVzKHggPSA1LCB5ID0gZmlsbGVkX21lYW5fVVRMNSksIA0KICAgICAgICAgICAgICAgbm90Y2ggPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgICAgY29sID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICBzaXplID0gMS4yNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKw0KICB4bGFiKCJJbXB1dGF0aW9uIGN5Y2xlIikgKw0KICB5bGFiKCJQcmVkaWN0ZWQgQ1RtYXgiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSA4LCByID0gMCwgYiA9IDAsIGwgPSAwKSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDAsIHIgPSAwLCBiID0gMCwgbCA9IDgpKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KaW1wX2NvbnZlcmdlbmNlDQoNCmdnc2F2ZShpbXBfY29udmVyZ2VuY2UsIGZpbGU9ImZpZy9GaWd1cmVfUzEucG5nIiwgd2lkdGg9MTgsIGhlaWdodD0xMiwgZHBpPTUwMCkNCmBgYA0KDQpGaWcuIFMxIHwgUHJlZGljdGVkIGNyaXRpY2FsIHRoZXJtYWwgbWF4aW11bSAoQ1RtYXgpIGFjcm9zcyBpbXB1dGF0aW9uIGN5Y2xlcy4gQm94cGxvdHMgZGVwaWN0IG1lZGlhbiAoaG9yaXpvbnRhbCBsaW5lKSwgaW50ZXJxdWFydGlsZSByYW5nZXMgKGJveGVzKSwgYW5kIHdoaXNrZXJzIGV4dGVuZCB0byAxLjUgdGltZXMgdGhlIGludGVycXVhcnRpbGUgcmFuZ2UuIA0KDQoNCg0KIyMgKipGaWcuIFMyIC0gUHJlZGljdG9ycyBvZiBDVG1heCoqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDEyfQ0KIyBMb2FkIGV4cGVyaW1lbnRhbCBkYXRhc2V0DQp0cmFpbmluZ19kYXRhIDwtIHJlYWRSRFMoIlJEYXRhL0dlbmVyYWxfZGF0YS9wcmVfZGF0YV9mb3JfaW1wdXRhdGlvbi5yZHMiKSAlPiUgDQogIHJlbmFtZShDVG1heCA9IG1lYW5fVVRMKSAlPiUgIA0KICBmaWx0ZXIoaW1wdXRlZCA9PSAibm8iKQ0KDQojIFBsb3QgcHJlZGljdG9ycyB1c2VkIGZvciB0aGUgaW1wdXRhdGlvbiANCg0KIyMgQWNjbGltYXRpb24gdGVtcGVyYXR1cmUNCmFjYyA8LSBnZ3Bsb3QodHJhaW5pbmdfZGF0YSkgKyANCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBDVG1heCwgeCA9IGFjY2xpbWF0aW9uX3RlbXAsIGdyb3VwID0gdGlwLmxhYmVsKSwgDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIA0KICAgICAgICAgICAgICBzZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgY29sID0gImdyYXkzNSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IENUbWF4LCB4ID0gYWNjbGltYXRpb25fdGVtcCwgY29sID0gYWNjbGltYXRpb25fdGVtcCksDQogICAgICAgICAgICAgYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMSwgaGVpZ2h0PSAwKSkgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkFjY2xpbWF0aW9uIHRlbXBlcmF0dXJlIikgKyANCiAgeGxhYigiQWNjbGltYXRpb24gdGVtcGVyYXR1cmUgKMKwQykiKSArDQogIHlsYWIoIkNUbWF4IikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQojIER1cmF0aW9uIG9mIGFjY2xpbWF0aW9uDQpkdXIgPC0gZ2dwbG90KHRyYWluaW5nX2RhdGEsIA0KICAgICAgICAgICAgICBhZXMoeSA9IENUbWF4LCB4ID0gbG9nKGFjY2xpbWF0aW9uX3RpbWUpLCBjb2wgPSBsb2coYWNjbGltYXRpb25fdGltZSkpKSArIA0KICBnZW9tX3BvaW50KGFscGhhID0gMC41LCANCiAgICAgICAgICAgICBzaXplID0gNCwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjEsIGhlaWdodD0gMCkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDMsIGNvbCA9ICJncmF5MzUiKSArIA0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkFjY2xpbWF0aW9uIHRpbWUiKSArIA0KICB4bGFiKCJBY2NsaW1hdGlvbiB0aW1lIChkYXlzLCBsb2cgc2NhbGUpIikgKw0KICB5bGFiKCIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCiMgUmFtcGluZyByYXRlDQpyYW1wIDwtIGdncGxvdCh0cmFpbmluZ19kYXRhLCANCiAgICAgICAgICAgICAgYWVzKHkgPSBDVG1heCwgeCA9IHJhbXBpbmcsIGNvbCA9IHJhbXBpbmcpKSArIA0KICBnZW9tX3BvaW50KGFscGhhID0gMC41LCANCiAgICAgICAgICAgICBzaXplID0gNCwgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjEsIGhlaWdodD0gMCkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDMsIGNvbCA9ICJncmF5MzUiKSArIA0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJSYW1waW5nIHJhdGUiKSArIA0KICB4bGFiKCJSYW1waW5nIHJhdGUgKMKwQykiKSArDQogIHlsYWIoIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KIyMgRW5kcG9pbnQNCnRyYWluaW5nX2RhdGEgPC0gbXV0YXRlKHRyYWluaW5nX2RhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGZhY3RvcihlbmRwb2ludCwgDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJMUlIiLCAiT1MiLCAiTE9FIiwgInByb2RkaW5nIiwgIm90aGVyIiwgImRlYXRoIiksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJMUlIiLCAiT1MiLCAiTFJSIiwgIm90aGVyIiwgIm90aGVyIiwgIm90aGVyIikpKSAjIFJlb3JkZXIgYW5kIHJlZ3JvdXANCmVuZHAgPC0gZ2dwbG90KHRyYWluaW5nX2RhdGEsIA0KICAgICAgICAgICAgICBhZXMoeSA9IENUbWF4LCB4ID0gZW5kcG9pbnQsIGNvbCA9IGVuZHBvaW50KSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodD0gMCkpICsgDQogIGdlb21fYm94cGxvdChub3RjaCA9IFRSVUUsDQogICAgICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICAgICBjb2wgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgb3V0bGllci5jb2xvdXIgPSBOQSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxLjI1KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiI2U5ZDhhNiIsICIjZTA5ZjNlIiwgIiM5ZTJhMmIiKSkgKw0KICB4bGFiKCJFbmRwb2ludCIpICsNCiAgeWxhYigiQ1RtYXgiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCiMjIE1lZGl1bSANCnRyYWluaW5nX2RhdGEgPC0gbXV0YXRlKHRyYWluaW5nX2RhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICBtZWRpdW1fdGVzdF90ZW1wID0gZmFjdG9yKG1lZGl1bV90ZXN0X3RlbXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoImJvZHlfd2F0ZXIiLCAiYW1iaWVudCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoImJvZHkvd2F0ZXIiLCAiYW1iaWVudCIpKSkgIyBSZW9yZGVyIA0KbWVkaXVtIDwtIGdncGxvdChmaWx0ZXIodHJhaW5pbmdfZGF0YSwgaXMubmEobWVkaXVtX3Rlc3RfdGVtcCk9PSBGQUxTRSksIA0KICAgICAgICAgICAgICBhZXMoeSA9IENUbWF4LCB4ID0gbWVkaXVtX3Rlc3RfdGVtcCwgY29sID0gbWVkaXVtX3Rlc3RfdGVtcCksDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodD0gMCksDQogICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIA0KICBnZW9tX2JveHBsb3Qobm90Y2ggPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgICAgY29sID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICBzaXplID0gMS4yNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM4NGE1OWQiLCAiI2YyODQ4MiIpKSArDQogIHhsYWIoIlRlbXBlcmF0dXJlIGFzc2F5ZWQiKSArDQogIHlsYWIoIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KIyMgTGlmZSBzdGFnZSBvZiB0aGUgYW5pbWFscyANCnRyYWluaW5nX2RhdGEgPC0gbXV0YXRlKHRyYWluaW5nX2RhdGEsDQogICAgICAgICAgICAgICAgICAgICAgIGxpZmVfc3RhZ2VfdGVzdGVkID0gZmFjdG9yKGxpZmVfc3RhZ2VfdGVzdGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJsYXJ2YWUiLCAiYWR1bHRzIiksDQogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygibGFydmFlIiwgImFkdWx0cyIpKSkgIyBSZW9yZGVyIA0KDQpsaWZlc3RhZ2UgPC0gZ2dwbG90KHRyYWluaW5nX2RhdGEsIA0KICAgICAgICAgICAgICBhZXMoeSA9IENUbWF4LCB4ID0gbGlmZV9zdGFnZV90ZXN0ZWQsIGNvbCA9IGxpZmVfc3RhZ2VfdGVzdGVkKSwNCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIA0KICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSwgDQogICAgICAgICAgICAgc2l6ZSA9IDQsIA0KICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4yNSwgaGVpZ2h0PSAwKSwNCiAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsgDQogIGdlb21fYm94cGxvdChub3RjaCA9IFRSVUUsDQogICAgICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICAgICBjb2wgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgb3V0bGllci5jb2xvdXIgPSBOQSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxLjI1LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiI2UwOWYzZSIsICIjNGY3NzJkIikpICsNCiAgeGxhYigiTGlmZSBzdGFnZSIpICsNCiAgeWxhYigiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQojIEVjb3R5cGUNCnRyYWluaW5nX2RhdGEkZWNvdHlwZSA8LSBmYWN0b3IodHJhaW5pbmdfZGF0YSRlY290eXBlLCBsZXZlbHMgPSBjKCJBcXVhdGljIiwgIlN0cmVhbS1kd2VsbGluZyIsICJTZW1pLWFxdWF0aWMiLCAiR3JvdW5kLWR3ZWxsaW5nIiwgIkZvc3NvcmlhbCIsICJBcmJvcmVhbCIpKQ0KDQoNCmVjb3R5cGUgPC0gZ2dwbG90KHRyYWluaW5nX2RhdGEsIA0KICAgICAgICAgICAgICBhZXMoeSA9IENUbWF4LCB4ID0gZWNvdHlwZSwgY29sID0gZWNvdHlwZSksDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUsIA0KICAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodD0gMCksDQogICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIA0KICBnZW9tX2JveHBsb3Qobm90Y2ggPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgICAgY29sID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICBzaXplID0gMS4yNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTkxOGMiLCAiIzJjNzI4ZSIsICIjNDcyZDdiIiwgIiNGMUFGNzkiLCAiIzk5NUM1MSIsICIjMjhhZTgwIikpICsNCiAgeGxhYigiRWNvdHlwZSIpICsNCiAgeWxhYigiQ1RtYXgiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1KSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCmFsbCA8LSAoYWNjICsgZHVyICsgcmFtcCkgLyAoZW5kcCArIG1lZGl1bSArIGxpZmVzdGFnZSkgLyBlY290eXBlDQoNCmFsbA0KDQpnZ3NhdmUoYWxsLCBmaWxlPSJmaWcvRmlndXJlX1MyLnBuZyIsIHdpZHRoPTIwLCBoZWlnaHQ9MTgsIGRwaT01MDApDQpgYGANCg0KRmlnLiBTMiB8IENvcnJlbGF0aW9ucyBiZXR3ZWVuIGNyaXRpY2FsIHRoZXJtYWwgbWF4aW11bSAoQ1RtYXgpIGFuZCBwcmVkaWN0b3JzIHVzZWQgZm9yIHRoZSBpbXB1dGF0aW9uLiBDVG1heCBmcm9tIHRoZSBleHBlcmltZW50YWwgZGF0YXNldCB3YXMgcGxvdHRlZCBhZ2FpbnN0IGFjY2xpbWF0aW9uIHRlbXBlcmF0dXJlIChhKSwgYWNjbGltYXRpb24gdGltZSAoYiwgbG9nIHNjYWxlKSwgcmFtcGluZyByYXRlIChjKS4gQ29sb3VycyBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBhbmQgdGhlIGxpbmUgcmVmZXJzIHRvIHByZWRpY3Rpb25zIGZyb20gYSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gYmV0d2VlbiBDVG1heCBhbmQgdGhlIHByZWRpY3RvcnMuIEluZGl2aWR1YWwgc2xvcGVzIGZvciBlYWNoIHNwZWNpZXMgYXJlIGRlcGljdGVkIGZvciBzcGVjaWVzIHdoZW4gQ1RtYXggd2FzIGVzdGltYXRlZCBhdCBkaWZmZXJlbnQgYWNjbGltYXRpb24gdGVtcGVyYXR1cmVzIChhKS4gRGVwaWN0ZWQgaXMgYWxzbyB0aGUgdmFyaWF0aW9uIGluIENUbWF4IHdpdGggZGlmZmVyZW50IGVuZHBvaW50cyAoZCksIG1lZGlhIHVzZWQgdG8gaW5mZXIgYm9keSB0ZW1wZXJhdHVyZSAoZSksIGxpZmUgc3RhZ2VzIChmKSwgYW5kIGVjb3R5cGVzIChnKS4gQm94cGxvdHMgZGVwaWN0IG1lZGlhbiAoaG9yaXpvbnRhbCBsaW5lKSwgaW50ZXJxdWFydGlsZSByYW5nZXMgKGJveGVzKSwgYW5kIHdoaXNrZXJzIGV4dGVuZCB0byAxLjUgdGltZXMgdGhlIGludGVycXVhcnRpbGUgcmFuZ2UuIExSUjogbG9zcyBvZiByaWdodGluZyByZXNwb25zZS4gT1M6IG9uc2V0IG9mIHNwYXNtcy4gDQoNCiMjICoqRmlnLiBTMyAtIFZhcmlhdGlvbiBpbiBwbGFzdGljaXR5KioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gMTV9DQojIExvYWQgZXN0aW1hdGVkIGludGVyY2VwdHMgYW5kIGFjY2xpbWF0aW9uIHJlc3BvbnNlIHJhdGlvcw0Kc3BlY2llc19BUlIgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1BvbmQvY3VycmVudC9zcGVjaWVzX0FSUl9wb25kX2N1cnJlbnQucmRzIikNCg0KIyBEaXNwbGF5IGRhdGENCmthYmxlKHNwZWNpZXNfQVJSLCAiaHRtbCIpICU+JSANCiAgcm93X3NwZWMoMCwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIiwgYm9sZCA9IFRSVUUpICU+JSANCiAga2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRikgJT4lDQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjUwMHB4IikgDQoNCiMgU3VtbWFyeSBzdGF0aXN0aWNzIA0Kc3VtbWFyeShzcGVjaWVzX0FSUiRzbG9wZSkNCg0Kc3BlY2llc19BUlIgJT4lIHN1bW1hcmlzZShBUlIgPSBtZWFuKHNsb3BlKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc2xvcGUpKQ0KDQojIEZpZ3VyZQ0KZ2dwbG90KHNwZWNpZXNfQVJSKSArIA0KICBnZW9tX2RlbnNpdHkoYWVzKHNsb3BlKSwgDQogICAgICAgICAgICAgICBmaWxsID0gIiNDRTVCOTciLA0KICAgICAgICAgICAgICAgYWxwaGEgPSAxKSArIA0KICB4bGFiKCJBY2NsaW1hdGlvbiBSZXNwb25zZSBSYXRpbyAoQVJSKSIpICsgDQogIHlsYWIoIk51bWJlciBvZiBzcGVjaWVzIikgKyANCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSA0MCwgciA9IDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1MCwgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gNDAsIGIgPSAwLCBsID0gMCkpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQwLCBtYXJnaW4gPSBtYXJnaW4odCA9IDIwLCByID0gMCwgYiA9IDAsIGwgPSAwKSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNDAsIG1hcmdpbiA9IG1hcmdpbih0ID0gMCwgciA9IDIwLCBiID0gMCwgbCA9IDApKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIHNpemUgPSAyKSkNCg0KZ2dzYXZlKGZpbGUgPSAiZmlnL0ZpZ3VyZV9TMy5wbmciLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgZHBpID0gNTAwKQ0KYGBgDQoNCkZpZy4gQTMgfCBWYXJpYXRpb24gaW4gcGxhc3RpYyByZXNwb25zZXMgYWNyb3NzIHNwZWNpZXMuIFRoZSBhY2NsaW1hdGlvbiByZXNwb25zZSByYXRpbyAoQVJSKSByZXByZXNlbnRzIHRoZSBtYWduaXR1ZGUgY2hhbmdlIGluIGhlYXQgdG9sZXJhbmNlIGxpbWl0cyBmb3IgZWFjaCBkZWdyZWUgY2hhbmdlIGluIGVudmlyb25tZW50YWwgdGVtcGVyYXR1cmUuIFRoZSB2YXJpYXRpb24gaW4gQVJSIHdhcyBsb3cgKG1lYW4gwrEgc3RhbmRhcmQgZGV2aWF0aW9uID0gMC4xMzQgwrEgMC4wMDg7IHJhbmdlID0gMC4wNDkg4oCTIDAuMjE2OyBuID0gNTIwMykuDQoNCiMjICoqRmlnLiBTNCAtIENvbW11bml0eS1sZXZlbCBwYXR0ZXJucyBpbiBUU00qKg0KDQpMb2FkIGRhdGENCmBgYHtyfQ0KIyBTdWJzdHJhdGUgZGF0YQ0KY29tbXVuaXR5X3N1Yl9jdXJyZW50IDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvY3VycmVudC9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlMkMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L1N1YnN0cmF0ZS9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9zdWJzdHJhdGVfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIFBvbmQgZGF0YQ0KY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KIyBVcGxvYWQgaGlnaCByZXNvbHV0aW9uIEVhcnRoIGRhdGENCndvcmxkIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkIDwtIHdvcmxkICU+JQ0KICAgIGZpbHRlcighZ3JlcGwoIkFudGFyY3RpY2EiLCBuYW1lKSkNCnN0X2Nycyh3b3JsZCkgPC0gc3RfY3JzKGNvbW11bml0eV9wb25kX2N1cnJlbnQpDQoNCg0KIyBGaW5kIGxpbWl0cyBmb3IgY29sb3VycyBvZiB0aGUgcGxvdA0KdHNtX21pbiA8LSBtaW4obWluKGNvbW11bml0eV9zdWJfY3VycmVudCRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9zdWJfZnV0dXJlNEMkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9wb25kX2N1cnJlbnQkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpKQ0KDQp0c21fbWF4IDwtIG1heChtYXgoY29tbXVuaXR5X3N1Yl9jdXJyZW50JGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2N1cnJlbnQkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJGNvbW11bml0eV9UU00sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9wb25kX2N1cnJlbnQkY29tbXVuaXR5X1RTTSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRjb21tdW5pdHlfVFNNLCBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCiMjIyMjIyAqKlZlZ2V0YXRlZCBzdWJzdHJhdGUqKg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA2fQ0KIyBDdXJyZW50DQptYXBfc3ViX1RTTV9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCiMgRnV0dXJlICsyQyANCm1hcF9zdWJfVFNNX2Z1dHVyZTJDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmUyQywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA0MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9zdWJfVFNNX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA0MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KcHJlZF9jb21tdW5pdHlfc3ViX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL01vZGVscy9UU00vcHJlZGljdGlvbnNfY29tbXVuaXR5X2xhdF9UU01fc3Vic3RyYXRlX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9zdWJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfZnV0dXJlNEMucmRzIikNCg0KbGF0X3N1Yl9hbGwgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IGNvbW11bml0eV9UU00sIHNpemUgPSAxL2NvbW11bml0eV9UU01fc2UpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuNywNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfc3ViX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43NSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTJDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xICkgKyANCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlPWMoMC4wMDEsIDEuNzUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0Kc3Vic3RyYXRlX3Bsb3QgPC0gKG1hcF9zdWJfVFNNX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgICBtYXBfc3ViX1RTTV9mdXR1cmUyQyArIA0KICAgICAgICAgICAgICAgICAgIG1hcF9zdWJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICAgbGF0X3N1Yl9hbGwgKyANCiAgICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQpgYGANCg0KIyMjIyMjICoqUG9uZCBvciB3ZXRsYW5kKioNCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0NCiMgQ3VycmVudA0KbWFwX3BvbmRfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCg0KDQojIEZ1dHVyZSArMkMgDQptYXBfcG9uZF9UU01fZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgYWVzKGZpbGwgPSBjb21tdW5pdHlfVFNNKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA0MCwgYnkgPSA1KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0ZBQTQzQSIpKQ0KDQojIEZ1dHVyZSArNEMNCm1hcF9wb25kX1RTTV9mdXR1cmU0QyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9wb25kX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9zdWJzdHJhdGVfY3VycmVudC5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmUyQy5yZHMiKQ0KcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmU0QyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX3N1YnN0cmF0ZV9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfcG9uZF9hbGwgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplID0gMS9jb21tdW5pdHlfVFNNX3NlKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplID0gMS9jb21tdW5pdHlfVFNNX3NlKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfcG9uZF9jdXJyZW50LCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBnZW9tX3JpYmJvbihkYXRhID0gcHJlZF9jb21tdW5pdHlfcG9uZF9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjEpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9wb25kX2Z1dHVyZTRDLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICBzaXplID0gMC4xKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2U9YygwLjAwMSwgMS43NSksDQogICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICJub25lIikrDQogIHhsaW0oLTU1LjAwMDk5LCA3Mi4wMDA2NCkgKw0KICB5bGltKDAsIDQwKSsNCiAgeGxhYigiIikgKw0KICB5bGFiKCIiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpwb25kX3Bsb3QgPC0gKG1hcF9wb25kX1RTTV9jdXJyZW50ICsgDQogICAgICAgICAgICAgICAgbWFwX3BvbmRfVFNNX2Z1dHVyZTJDICsNCiAgICAgICAgICAgICAgICBtYXBfcG9uZF9UU01fZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICBsYXRfcG9uZF9hbGwgKyANCiAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkpDQpgYGANCg0KDQojIyMjIyMgKipBYm92ZS1ncm91bmQgdmVnZXRhdGlvbioqDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDZ9DQojIEN1cnJlbnQNCm1hcF9hcmJfVFNNX2N1cnJlbnQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gY29tbXVuaXR5X1RTTSksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiVFNNIiwNCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgNDAsIGJ5ID0gNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWModHNtX21pbiwgdHNtX21heCksIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW49MCwgZW5kPTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KIyBGdXR1cmUgKzJDIA0KbWFwX2FyYl9UU01fZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHRzbV9taW4sIHRzbV9tYXgpLCANCiAgICAgICAgICAgICAgICAgICAgIGJlZ2luPTAsIGVuZD0xKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjEsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRkFBNDNBIikpDQoNCiMgRnV0dXJlICs0Qw0KbWFwX2FyYl9UU01fZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGNvbW11bml0eV9UU00pLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lID0gIlRTTSIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDQwLCBieSA9IDEwKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyh0c21fbWluLCB0c21fbWF4KSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbj0wLCBlbmQ9MSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiI0VGNDE4NyIpKQ0KDQojIExhdGl0dWRpbmFsIHBhdHRlcm5zDQpwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX2FyYm9yZWFsX2N1cnJlbnQucmRzIikNCnByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9Nb2RlbHMvVFNNL3ByZWRpY3Rpb25zX2NvbW11bml0eV9sYXRfVFNNX2FyYm9yZWFsX2Z1dHVyZTJDLnJkcyIpDQpwcmVkX2NvbW11bml0eV9hcmJfZnV0dXJlNEMgPC0gcmVhZFJEUygiUkRhdGEvTW9kZWxzL1RTTS9wcmVkaWN0aW9uc19jb21tdW5pdHlfbGF0X1RTTV9hcmJvcmVhbF9mdXR1cmU0Qy5yZHMiKQ0KDQpsYXRfYXJiX2FsbCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfZnV0dXJlNEMsIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gY29tbXVuaXR5X1RTTSwgc2l6ZSA9IDEvY29tbXVuaXR5X1RTTV9zZSksIA0KICAgICAgICAgICAgIGFscGhhID0gMC43LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gY29tbXVuaXR5X2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplID0gMS9jb21tdW5pdHlfVFNNX3NlKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBjb21tdW5pdHlfVFNNLCBzaXplID0gMS9jb21tdW5pdHlfVFNNX3NlKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsDQogICAgICAgICAgICAgZmlsbCA9ICIjNURDOEQ5IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2NvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmUyQywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNGQUE0M0EiLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfY29tbXVuaXR5X2FyYl9mdXR1cmU0QywgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgc2l6ZSA9IDAuMSkgKyANCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlPWMoMC4wMDEsIDEuNzUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAibm9uZSIpKw0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCA0MCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiVFNNIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwgICAgICAgIA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyKSkNCg0KYXJib3JlYWxfcGxvdCA8LSAobWFwX2FyYl9UU01fY3VycmVudCArIA0KICAgICAgICAgICAgICAgICAgbWFwX2FyYl9UU01fZnV0dXJlMkMgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9hcmJfVFNNX2Z1dHVyZTRDICsgDQogICAgICAgICAgICAgICAgICBsYXRfYXJiX2FsbCArIA0KICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQobmNvbCA9IDQpKQ0KYGBgDQoNCg0KIyMjIyMjICoqQWxsIGhhYml0YXRzKiogDQoNCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDd9DQoNCmZpZ19TNCA8LSAoc3Vic3RyYXRlX3Bsb3QvcG9uZF9wbG90L2FyYm9yZWFsX3Bsb3QvcGxvdF9sYXlvdXQobmNvbCA9IDEpKQ0KDQpmaWdfUzQNCg0KZ2dzYXZlKGZpZ19TNCwgZmlsZSA9ICJmaWcvRmlndXJlX0E0LnBuZyIsIHdpZHRoPTE1LCBoZWlnaHQ9NywgZHBpID0gNTAwKQ0KYGBgDQoNCkZpZy4gUzQgfCBDb21tdW5pdHktbGV2ZWwgcGF0dGVybnMgaW4gdGhlcm1hbCBzYWZldHkgbWFyZ2luIGZvciBhbXBoaWJpYW5zIG9uIHRlcnJlc3RyaWFsICh0b3Agcm93KSwgYXF1YXRpYyAobWlkZGxlIHJvdyksIG9yIGFyYm9yZWFsIChib3R0b20gcm93KSBtaWNyb2hhYml0YXRzLiBUaGVybWFsIHNhZmV0eSBtYXJnaW5zIChUU00pIHdlcmUgY2FsY3VsYXRlZCBhcyB0aGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ1RtYXggYW5kIHRoZSBwcmVkaWN0ZWQgb3BlcmF0aXZlIGJvZHkgdGVtcGVyYXR1cmUgaW4gZnVsbCBzaGFkZSBkdXJpbmcgdGhlIHdhcm1lc3QgcXVhcnRlcnMgb2YgMjAwNi0yMDE1IGluIGVhY2ggY29tbXVuaXR5ICgxLWRlZ3JlZSBncmlkIGNlbGwpLiBCbGFjayBjb2xvciBkZXBpY3RzIGFyZWFzIHdpdGggbm8gZGF0YS4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gVFNNIGluIGN1cnJlbnQgY2xpbWF0ZXMgKGJsdWUpIG9yIGFzc3VtaW5nIDLCsEMgKG9yYW5nZSkgb3IgNMKwQyBvZiBnbG9iYWwgd2FybWluZyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHMgKHBpbmspLCBhcyBwcmVkaWN0ZWQgZnJvbSBnZW5lcmFsaXplZCBhZGRpdGl2ZSBtaXhlZCBtb2RlbHMuIERhc2hlZCBsaW5lcyByZXByZXNlbnQgdGhlIGVxdWF0b3IgYW5kIHRyb3BpY3MuDQoNCiMjICoqRmlnLiBTNSAtIE51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nKiogDQoNCiMjIyAqKkxvYWQgZGF0YSoqIA0KDQpgYGB7cn0NCiMgU3Vic3RyYXRlIGRhdGENCmNvbW11bml0eV9zdWJfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2N1cnJlbnRfY2xpcHBlZF9jZWxscy5yZHMiKQ0KY29tbXVuaXR5X3N1Yl9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvU3Vic3RyYXRlL2Z1dHVyZTJDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3N1YnN0cmF0ZV9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfc3ViX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9TdWJzdHJhdGUvZnV0dXJlNEMvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfc3Vic3RyYXRlX21lYW5fYWNjX2Z1dHVyZTRDX2NsaXBwZWRfY2VsbHMucmRzIikgDQoNCiMgUG9uZCBkYXRhIA0KY29tbXVuaXR5X3BvbmRfY3VycmVudCA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9jdXJyZW50L2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfcG9uZF9mdXR1cmUyQyA8LSByZWFkUkRTKCJSRGF0YS9DbGltYXRlX3Z1bG5lcmFiaWxpdHkvUG9uZC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9wb25kX21lYW5fYWNjX2Z1dHVyZTJDX2NsaXBwZWRfY2VsbHMucmRzIikNCmNvbW11bml0eV9wb25kX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9Qb25kL2Z1dHVyZTRDL2NvbW11bml0eV92dWxuZXJhYmlsaXR5X3BvbmRfbWVhbl9hY2NfZnV0dXJlNENfY2xpcHBlZF9jZWxscy5yZHMiKQ0KDQojIEFib3ZlLWdyb3VuZCB2ZWdldGF0aW9uDQpjb21tdW5pdHlfYXJiX2N1cnJlbnQgPC0gcmVhZFJEUygiUkRhdGEvQ2xpbWF0ZV92dWxuZXJhYmlsaXR5L0FyYm9yZWFsL2N1cnJlbnQvY29tbXVuaXR5X3Z1bG5lcmFiaWxpdHlfYXJib3JlYWxfbWVhbl9hY2NfY3VycmVudF9jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTJDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmUyQy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmUyQ19jbGlwcGVkX2NlbGxzLnJkcyIpDQpjb21tdW5pdHlfYXJiX2Z1dHVyZTRDIDwtIHJlYWRSRFMoIlJEYXRhL0NsaW1hdGVfdnVsbmVyYWJpbGl0eS9BcmJvcmVhbC9mdXR1cmU0Qy9jb21tdW5pdHlfdnVsbmVyYWJpbGl0eV9hcmJvcmVhbF9tZWFuX2FjY19mdXR1cmU0Q19jbGlwcGVkX2NlbGxzLnJkcyIpDQoNCg0KIyBVcGxvYWQgaGlnaCByZXNvbHV0aW9uIEVhcnRoIGRhdGENCndvcmxkIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkIDwtIHdvcmxkICU+JSANCiAgZmlsdGVyKCFncmVwbCgiQW50YXJjdGljYSIsIG5hbWUpKQ0Kc3RfY3JzKHdvcmxkKSA8LSBzdF9jcnMoY29tbXVuaXR5X3N1Yl9jdXJyZW50KQ0KYGBgDQoNCiMjIyMgKipWZWdldGF0ZWQgU3Vic3RyYXRlKiogDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0NCiMgU2V0IGNvbG91cnMNCmNvbG9yX3BhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShjb2xvcnMgPSBjKCIjRkFGMjE4IiwgIiNFRjQxODciLCAiI2Q5MDQyOSIpKQ0KY29sb3JzIDwtIGNvbG9yX3BhbGV0dGUoMTAwKQ0KY29sb3JfZnVuYyA8LSBjb2xvclJhbXBQYWxldHRlKGMoImdyYXk2NSIsIGNvbG9ycykpDQpjb2xvcl9wYWxldHRlIDwtIGNvbG9yX2Z1bmMoMTAwKQ0KDQpzcF9taW4gPC0gbWluKG1pbihjb21tdW5pdHlfc3ViX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtaW4oY29tbXVuaXR5X3N1Yl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfcG9uZF9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9wb25kX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWluKGNvbW11bml0eV9hcmJfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1pbihjb21tdW5pdHlfYXJiX2Z1dHVyZTRDJG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSkNCg0Kc3BfbWF4IDwtIG1heChtYXgoY29tbXVuaXR5X3N1Yl9jdXJyZW50JG5fc3BlY2llc19vdmVyaGVhdGluZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgbWF4KGNvbW11bml0eV9zdWJfZnV0dXJlNEMkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X3BvbmRfY3VycmVudCRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfcG9uZF9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIG1heChjb21tdW5pdHlfYXJiX2N1cnJlbnQkbl9zcGVjaWVzX292ZXJoZWF0aW5nLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICBtYXgoY29tbXVuaXR5X2FyYl9mdXR1cmU0QyRuX3NwZWNpZXNfb3ZlcmhlYXRpbmcsIG5hLnJtID0gVFJVRSkpDQoNCiMgU3Vic3RyYXRlIChjdXJyZW50KQ0KbWFwX3N1Yl9zcF9jdXJyZW50IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9jdXJyZW50LCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjNURDOEQ5IikpDQoNCiMgU3Vic3RyYXRlIChGdXR1cmUgKzJDKQ0KbWFwX3N1Yl9zcF9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhzcF9taW4sIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAuMSwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNGQUE0M0EiKSkNCg0KIyBTdWJzdHJhdGUgKEZ1dHVyZSArNEMpDQptYXBfc3ViX3NwX2Z1dHVyZTRDIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIzLjQzNjYzLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9zZihkYXRhID0gd29ybGQsIA0KICAgICAgICAgIGZpbGwgPSAiYmxhY2siLCAgDQogICAgICAgICAgY29sPSJibGFjayIpICsNCiAgZ2VvbV9zZihkYXRhID0gY29tbXVuaXR5X3N1Yl9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KbGF0X3N1YiA8LSBnZ3Bsb3QoKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfc3ViX2Z1dHVyZTRDLCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0VGNDE4NyIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9zdWJfZnV0dXJlMkMsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRkFBNDNBIiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X3N1Yl9jdXJyZW50LCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiIzVEQzhEOSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgMzgpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIiIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBhc3BlY3QucmF0aW8gPSAxLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLCAgICAgICAgDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQpzdWJzdHJhdGVfcGxvdCA8LSBtYXBfc3ViX3NwX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9zdWJfc3BfZnV0dXJlMkMgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9zdWJfc3BfZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgIGxhdF9zdWIgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KQ0KDQpgYGANCg0KDQojIyMjICoqUG9uZCBvciB3ZXRsYW5kKiogDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0NCg0KIyBQb25kIChjdXJyZW50KQ0KbWFwX3BvbmRfc3BfY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9wb25kX2N1cnJlbnQsIA0KICAgICAgICAgIGFlcyhmaWxsID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgY29sb3IgPSBOQSwgDQogICAgICAgICAgYWxwaGEgPSAxKSArDQogIGNvb3JkX3NmKHlsaW0gPSBjKC01NS4wMDA5OSwgNzIuMDAwNjQpLCANCiAgICAgICAgICAgeGxpbSA9IGMoLTE2Ni44MjkwNSwgMTc4LjU2NjE3KSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gY29sb3JfcGFsZXR0ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXkxIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3BlY2llcyBvdmVyaGVhdGluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YyhzcF9taW4sIHNwX21heCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiM1REM4RDkiKSkNCg0KIyBTdWJzdHJhdGUgKEZ1dHVyZSArMkMpDQptYXBfcG9uZF9zcF9mdXR1cmUyQyA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9wb25kX2Z1dHVyZTJDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjEsIDAsIDApLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRkFBNDNBIikpDQoNCiMgU3Vic3RyYXRlIChGdXR1cmUgKzRDKQ0KbWFwX3BvbmRfc3BfZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfcG9uZF9mdXR1cmU0QywgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNFRjQxODciKSkNCg0KIyBMYXRpdHVkaW5hbCBwYXR0ZXJucw0KbGF0X3BvbmQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X3BvbmRfZnV0dXJlNEMsIG5fc3BlY2llc19vdmVyaGVhdGluZz4wKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsYXQsIHkgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICAgICBhbHBoYSA9IDAuODUsDQogICAgICAgICAgICAgZmlsbCA9ICIjRUY0MTg3IiwNCiAgICAgICAgICAgICBjb2wgPSAidHJhbnNwYXJlbnQiLA0KICAgICAgICAgICAgIHNoYXBlID0gMjIsDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgc3Ryb2tlID0gMC4xKSArIA0KICB4bGltKC01NS4wMDA5OSwgNzIuMDAwNjQpICsNCiAgeWxpbSgwLCAzOCkrDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksDQogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMSksICAgICAgICANCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMikpDQoNCnBvbmRfcGxvdCAgICAgIDwtIG1hcF9wb25kX3NwX2N1cnJlbnQgKyANCiAgICAgICAgICAgICAgICAgIG1hcF9wb25kX3NwX2Z1dHVyZTJDICsgDQogICAgICAgICAgICAgICAgICBtYXBfcG9uZF9zcF9mdXR1cmU0QyArIA0KICAgICAgICAgICAgICAgICAgbGF0X3BvbmQgKyANCiAgICAgICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSA0KQ0KDQpgYGANCg0KDQojIyMjICoqQWJvdmUtZ3JvdW5kIHZlZ2V0YXRpb24qKg0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9DQojIEN1cnJlbnQNCm1hcF9hcmJfc3BfY3VycmVudCA8LSBnZ3Bsb3QoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0yMy40MzY2MywgDQogICAgICAgICAgICAgY29sb3VyID0gImdyYXkiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBzaXplID0gMC41KSArDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkLCANCiAgICAgICAgICBmaWxsID0gImJsYWNrIiwgIA0KICAgICAgICAgIGNvbD0iYmxhY2siKSArDQogIGdlb21fc2YoZGF0YSA9IGNvbW11bml0eV9hcmJfY3VycmVudCwgDQogICAgICAgICAgYWVzKGZpbGwgPSBuX3NwZWNpZXNfb3ZlcmhlYXRpbmcpLCANCiAgICAgICAgICBjb2xvciA9IE5BLCANCiAgICAgICAgICBhbHBoYSA9IDEpICsNCiAgY29vcmRfc2YoeWxpbSA9IGMoLTU1LjAwMDk5LCA3Mi4wMDA2NCksIA0KICAgICAgICAgICB4bGltID0gYygtMTY2LjgyOTA1LCAxNzguNTY2MTcpKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjb2xvcl9wYWxldHRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTcGVjaWVzIG92ZXJoZWF0aW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKHNwX21pbiwgc3BfbWF4KSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLjEsIDAsIDApLCAiY20iKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGw9TkEsIHNpemUgPSAyLCBjb2xvdXIgPSAiIzVEQzhEOSIpKQ0KDQojIEZ1dHVyZSArMkMNCm1hcF9hcmJfc3BfZnV0dXJlMkMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuNSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDEsICJjbSIpLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMC4xLCAwLCAwKSwgImNtIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsPU5BLCBzaXplID0gMiwgY29sb3VyID0gIiNGQUE0M0EiKSkNCg0KDQojIEZ1dHVyZSArNEMNCm1hcF9hcmJfc3BfZnV0dXJlNEMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgDQogICAgICAgICAgZmlsbCA9ICJibGFjayIsICANCiAgICAgICAgICBjb2w9ImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBjb21tdW5pdHlfYXJiX2Z1dHVyZTRDLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgIGNvbG9yID0gTkEsIA0KICAgICAgICAgIGFscGhhID0gMSkgKw0KICBjb29yZF9zZih5bGltID0gYygtNTUuMDAwOTksIDcyLjAwMDY0KSwgDQogICAgICAgICAgIHhsaW0gPSBjKC0xNjYuODI5MDUsIDE3OC41NjYxNykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGNvbG9yX3BhbGV0dGUsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5MSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNwZWNpZXMgb3ZlcmhlYXRpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoc3BfbWluLCBzcF9tYXgpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuNSwgImNtIiksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDEsICJjbSIpLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIsIGNvbG91ciA9ICIjRUY0MTg3IikpDQoNCiMgTGF0aXR1ZGluYWwgcGF0dGVybnMNCmxhdF9hcmIgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCANCiAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JheSIsIA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIA0KICAgICAgICAgICAgIHNpemUgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjMuNDM2NjMsIA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmF5IiwgDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgDQogICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBmaWx0ZXIoY29tbXVuaXR5X2FyYl9mdXR1cmU0Qywgbl9zcGVjaWVzX292ZXJoZWF0aW5nPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiNFRjQxODciLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihjb21tdW5pdHlfYXJiX2Z1dHVyZTJDLCBuX3NwZWNpZXNfb3ZlcmhlYXRpbmc+MCksIA0KICAgICAgICAgICAgIGFlcyh4ID0gbGF0LCB5ID0gbl9zcGVjaWVzX292ZXJoZWF0aW5nKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAwLjg1LA0KICAgICAgICAgICAgIGZpbGwgPSAiI0ZBQTQzQSIsDQogICAgICAgICAgICAgY29sID0gInRyYW5zcGFyZW50IiwNCiAgICAgICAgICAgICBzaGFwZSA9IDIyLA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIHN0cm9rZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGNvbW11bml0eV9hcmJfY3VycmVudCwgbl9zcGVjaWVzX292ZXJoZWF0aW5nPjApLCANCiAgICAgICAgICAgICBhZXMoeCA9IGxhdCwgeSA9IG5fc3BlY2llc19vdmVyaGVhdGluZyksIA0KICAgICAgICAgICAgIGFscGhhID0gMC44NSwNCiAgICAgICAgICAgICBmaWxsID0gIiM1REM4RDkiLA0KICAgICAgICAgICAgIGNvbCA9ICJ0cmFuc3BhcmVudCIsDQogICAgICAgICAgICAgc2hhcGUgPSAyMiwNCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBzdHJva2UgPSAwLjEpICsNCiAgeGxpbSgtNTUuMDAwOTksIDcyLjAwMDY0KSArDQogIHlsaW0oMCwgMzgpKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlNwZWNpZXMgb3ZlcmhlYXRpbmciKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDExKSwNCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTEpLA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjYsICJjbSIpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjUsICJjbSIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSwgc2l6ZSA9IDIpKQ0KDQphcmJvcmVhbF9wbG90IDwtIG1hcF9hcmJfc3BfY3VycmVudCArIA0KICAgICAgICAgICAgICAgICBtYXBfYXJiX3NwX2Z1dHVyZTJDICsgDQogICAgICAgICAgICAgICAgIG1hcF9hcmJfc3BfZnV0dXJlNEMgKyANCiAgICAgICAgICAgICAgICAgbGF0X2FyYiArIA0KICAgICAgICAgICAgICAgICBwbG90X2xheW91dChuY29sID0gNCkNCmBgYA0KDQojIyMjICoqRmluYWwgcGxvdCoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9NX0NCg0KZmlnX1M1ICAgPC0gKHN1YnN0cmF0ZV9wbG90IC8NCiAgICAgICAgICAgICBwb25kX3Bsb3QgLw0KICAgICAgICAgICAgIGFyYm9yZWFsX3Bsb3QgLw0KICAgICAgICAgICAgIHBsb3RfbGF5b3V0KG5jb2wgPSAxKSkNCg0KZmlnX1M1DQoNCmdnc2F2ZShmaWdfUzUsIGZpbGU9ImZpZy9GaWd1cmVfUzUucG5nIiwgd2lkdGg9MTQsIGhlaWdodD03LCBkcGkgPSA1MDApDQpgYGANCg0KRmlnLiBTNSB8IE51bWJlciBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiB0ZXJyZXN0cmlhbCAodG9wIHJvdyksIGFxdWF0aWMgKG1pZGRsZSByb3cpIGFuZCBhcmJvcmVhbCAoYm90dG9tIHJvdykgbWljcm9oYWJpdGF0cy4gVGhlIG51bWJlciBvZiBzcGVjaWVzIG92ZXJoZWF0aW5nIHdhcyBhc3Nlc3NlZCBhcyB0aGUgc3VtIG9mIHNwZWNpZXMgb3ZlcmhlYXRpbmcgYXQgbGVhc3Qgb25jZSBpbiB0aGUgcGVyaW9kIHN1cnZleWVkICh3YXJtZXN0IHF1YXJ0ZXJzIG9mIDIwMDYtMjAxNSkgaW4gZWFjaCBjb21tdW5pdHkgKDEtZGVncmVlIGdyaWQgY2VsbCkuIEJsYWNrIGNvbG9yIGRlcGljdHMgYXJlYXMgd2l0aCBubyBkYXRhLCBhbmQgZ3JheSBjb2xvciBjb21tdW5pdGllcyB3aXRob3V0IHNwZWNpZXMgYXQgcmlzay4gVGhlIHJpZ2h0IHBhbmVsIGRlcGljdHMgbGF0aXR1ZGluYWwgcGF0dGVybnMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIHByZWRpY3RlZCB0byBvdmVyaGVhdCBpbiBjdXJyZW50IGNsaW1hdGVzIChibHVlKSBvciBhc3N1bWluZyAywrBDIChvcmFuZ2UpIG9yIDTCsEMgb2YgZ2xvYmFsIHdhcm1pbmcgYWJvdmUgcHJlLWluZHVzdHJpYWwgbGV2ZWxzIChwaW5rKS4gRGFzaGVkIGxpbmVzIHJlcHJlc2VudCB0aGUgZXF1YXRvciBhbmQgdHJvcGljcy4gTm8gc3BlY2llcyB3ZXJlIHByZWRpY3RlZCB0byBleHBlcmllbmNlIG92ZXJoZWF0aW5nIGV2ZW50cyBpbiB3YXRlciBib2RpZXMsIGFuZCBoZW5jZSBhcmUgbm90IGRpc3BsYXllZC4NCg0KIyAqKlBhY2thZ2UgdmVyc2lvbnMqKiANCg0KYGBge3J9DQpzZXNzaW9uSW5mbygpDQpgYGANCg0K